| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "device/bluetooth/bluetooth_low_energy_win.h" |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| const char kValidDeviceAddress[] = "BC6A29AB5FB0"; |
| const char kShortDeviceAddress[] = "BC6A29AB5FB"; |
| |
| void ExtractValidBluetoothAddress(const char* format) { |
| BLUETOOTH_ADDRESS btha; |
| std::string error; |
| bool success = |
| device::win::ExtractBluetoothAddressFromDeviceInstanceIdForTesting( |
| base::StringPrintf(format, kValidDeviceAddress), &btha, &error); |
| |
| EXPECT_TRUE(success); |
| EXPECT_TRUE(error.empty()); |
| EXPECT_EQ(0xbc, btha.rgBytes[5]); |
| EXPECT_EQ(0x6a, btha.rgBytes[4]); |
| EXPECT_EQ(0x29, btha.rgBytes[3]); |
| EXPECT_EQ(0xab, btha.rgBytes[2]); |
| EXPECT_EQ(0x5f, btha.rgBytes[1]); |
| EXPECT_EQ(0xb0, btha.rgBytes[0]); |
| } |
| |
| void ExtractInvalidBluetoothAddress(const char* format, const char* address) { |
| BLUETOOTH_ADDRESS btha; |
| std::string error; |
| bool success = |
| device::win::ExtractBluetoothAddressFromDeviceInstanceIdForTesting( |
| base::StringPrintf(format, address), &btha, &error); |
| |
| EXPECT_FALSE(success); |
| EXPECT_FALSE(error.empty()); |
| } |
| |
| } // namespace |
| |
| namespace device { |
| |
| class BluetoothLowEnergyWinTest : public testing::Test {}; |
| |
| TEST_F(BluetoothLowEnergyWinTest, ExtractBluetoothAddress_Valid) { |
| // Short form |
| ExtractValidBluetoothAddress(R"(BTHLE\DEV_%s\8&31038925&0&BC6A29AB5FB0)"); |
| // Long form |
| ExtractValidBluetoothAddress( |
| R"(BTHLEDEVICE\{0000180F-0000-1000-8000-00805F9B34FB}_DEV_VID&)" |
| R"(01000A_PID&014C_REV&0100_%s\8&4C387F7&0&0020)"); |
| } |
| |
| TEST_F(BluetoothLowEnergyWinTest, ExtractBluetoothAddress_Invalid) { |
| // No opening underscore |
| ExtractInvalidBluetoothAddress(R"(%s\)", kValidDeviceAddress); |
| // No trailing slash |
| ExtractInvalidBluetoothAddress(R"(_%s)", kValidDeviceAddress); |
| // An extra character |
| ExtractInvalidBluetoothAddress(R"(_%sA\)", kValidDeviceAddress); |
| // A missing character |
| ExtractInvalidBluetoothAddress(R"(_%s\)", kShortDeviceAddress); |
| // A lowercase character |
| ExtractInvalidBluetoothAddress(R"(_%sa\)", kShortDeviceAddress); |
| // A non-hex character |
| ExtractInvalidBluetoothAddress(R"(_%sG\)", kShortDeviceAddress); |
| // A non-alphanumeric character |
| ExtractInvalidBluetoothAddress(R"(_%s?\)", kShortDeviceAddress); |
| } |
| |
| TEST_F(BluetoothLowEnergyWinTest, DeviceRegistryPropertyValueAsString) { |
| std::string test_value = "String used for round trip test."; |
| std::wstring wide_value = base::SysUTF8ToWide(test_value); |
| size_t buffer_size = (wide_value.size() + 1) * sizeof(wchar_t); |
| std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| memcpy(buffer.get(), wide_value.c_str(), buffer_size); |
| std::unique_ptr<device::win::DeviceRegistryPropertyValue> value = |
| device::win::DeviceRegistryPropertyValue::Create( |
| REG_SZ, std::move(buffer), buffer_size); |
| EXPECT_EQ(test_value, value->AsString()); |
| } |
| |
| TEST_F(BluetoothLowEnergyWinTest, DeviceRegistryPropertyValueAsDWORD) { |
| DWORD test_value = 5u; |
| size_t buffer_size = sizeof(DWORD); |
| std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| memcpy(buffer.get(), &test_value, buffer_size); |
| std::unique_ptr<device::win::DeviceRegistryPropertyValue> value = |
| device::win::DeviceRegistryPropertyValue::Create( |
| REG_DWORD, std::move(buffer), buffer_size); |
| EXPECT_EQ(test_value, value->AsDWORD()); |
| } |
| |
| TEST_F(BluetoothLowEnergyWinTest, DevicePropertyValueAsUint32) { |
| uint32_t test_value = 5u; |
| size_t buffer_size = sizeof(uint32_t); |
| std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]); |
| memcpy(buffer.get(), &test_value, buffer_size); |
| std::unique_ptr<device::win::DevicePropertyValue> value( |
| new device::win::DevicePropertyValue(DEVPROP_TYPE_UINT32, |
| std::move(buffer), buffer_size)); |
| EXPECT_EQ(test_value, value->AsUint32()); |
| } |
| |
| } // namespace device |