OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/bluetooth/bluez/bluetooth_service_record_bluez.h" | 5 #include "device/bluetooth/bluez/bluetooth_service_record_bluez.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "device/bluetooth/bluetooth_adapter_factory.h" | 15 #include "device/bluetooth/bluetooth_adapter_factory.h" |
16 #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h" | 16 #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h" |
| 17 #include "device/bluetooth/bluez/bluetooth_device_bluez.h" |
17 #include "device/bluetooth/dbus/bluez_dbus_manager.h" | 18 #include "device/bluetooth/dbus/bluez_dbus_manager.h" |
| 19 #include "device/bluetooth/dbus/fake_bluetooth_device_client.h" |
| 20 #include "device/bluetooth/test/bluetooth_test_bluez.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
19 | 22 |
20 namespace bluez { | 23 namespace bluez { |
21 | 24 |
22 namespace { | 25 namespace { |
23 | 26 |
24 constexpr uint16_t kServiceUuidAttributeId = 0x0003; | 27 constexpr uint16_t kServiceUuidAttributeId = 0x0003; |
25 | 28 |
26 constexpr char kServiceUuid1[] = "00001801-0000-1000-8000-00805f9b34fb"; | 29 constexpr char kServiceUuid1[] = "00001801-0000-1000-8000-00805f9b34fb"; |
27 constexpr char kServiceUuid2[] = "00001801-0000-1000-7000-00805f9b34fb"; | 30 constexpr char kServiceUuid2[] = "00001801-0000-1000-7000-00805f9b34fb"; |
28 constexpr char kServiceUuid3[] = "00001801-0000-1000-3000-00805f9b34fb"; | 31 constexpr char kServiceUuid3[] = "00001801-0000-1000-3000-00805f9b34fb"; |
29 | 32 |
30 } // namespace | 33 } // namespace |
31 | 34 |
32 class BluetoothServiceRecordBlueZTest : public testing::Test { | 35 class BluetoothServiceRecordBlueZTest : public device::BluetoothTestBlueZ { |
33 public: | 36 public: |
34 BluetoothServiceRecordBlueZTest() | 37 BluetoothServiceRecordBlueZTest() |
35 : adapter_bluez_(nullptr), | 38 : adapter_bluez_(nullptr), |
36 success_callbacks_(0), | 39 success_callbacks_(0), |
37 error_callbacks_(0), | 40 error_callbacks_(0), |
38 run_loop_(nullptr), | |
39 last_seen_handle_(0) {} | 41 last_seen_handle_(0) {} |
40 | 42 |
41 void SetUp() override { | 43 void SetUp() override { |
42 std::unique_ptr<bluez::BluezDBusManagerSetter> dbus_setter = | 44 BluetoothTestBlueZ::SetUp(); |
43 bluez::BluezDBusManager::GetSetterForTesting(); | 45 InitWithFakeAdapter(); |
44 | 46 adapter_bluez_ = static_cast<bluez::BluetoothAdapterBlueZ*>(adapter_.get()); |
45 device::BluetoothAdapterFactory::GetAdapter( | |
46 base::Bind(&BluetoothServiceRecordBlueZTest::AdapterCallback, | |
47 base::Unretained(this))); | |
48 RunRunLoop(); | |
49 } | |
50 | |
51 void TearDown() override { | |
52 device::BluetoothAdapterFactory::Shutdown(); | |
53 bluez::BluezDBusManager::Shutdown(); | |
54 } | 47 } |
55 | 48 |
56 uint32_t CreateServiceRecordWithCallbacks( | 49 uint32_t CreateServiceRecordWithCallbacks( |
57 const BluetoothServiceRecordBlueZ& record) { | 50 const BluetoothServiceRecordBlueZ& record) { |
58 const size_t old_success_callbacks = success_callbacks_; | 51 const size_t old_success_callbacks = success_callbacks_; |
59 const size_t old_error_callbacks = error_callbacks_; | 52 const size_t old_error_callbacks = error_callbacks_; |
60 // Note: Our fake implementation will never give us a handle of 0, so we | 53 // Note: Our fake implementation will never give us a handle of 0, so we |
61 // can know that we will never have a record with the handle 0. Hence using | 54 // can know that we will never have a record with the handle 0. Hence using |
62 // 0 as an invalid handle return value is okay. | 55 // 0 as an invalid handle return value is okay. |
63 last_seen_handle_ = 0; | 56 last_seen_handle_ = 0; |
(...skipping 18 matching lines...) Expand all Loading... |
82 base::Bind( | 75 base::Bind( |
83 &BluetoothServiceRecordBlueZTest::RemoveServiceSuccessCallback, | 76 &BluetoothServiceRecordBlueZTest::RemoveServiceSuccessCallback, |
84 base::Unretained(this)), | 77 base::Unretained(this)), |
85 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback, | 78 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback, |
86 base::Unretained(this))); | 79 base::Unretained(this))); |
87 size_t success = expect_success ? 1 : 0; | 80 size_t success = expect_success ? 1 : 0; |
88 EXPECT_EQ(old_success_callbacks + success, success_callbacks_); | 81 EXPECT_EQ(old_success_callbacks + success, success_callbacks_); |
89 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_); | 82 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_); |
90 } | 83 } |
91 | 84 |
| 85 void GetServiceRecords(BluetoothDeviceBlueZ* device, bool expect_success) { |
| 86 const size_t old_success_callbacks = success_callbacks_; |
| 87 const size_t old_error_callbacks = error_callbacks_; |
| 88 records_.clear(); |
| 89 device->GetServiceRecords( |
| 90 base::Bind(&BluetoothServiceRecordBlueZTest::GetServiceRecordsCallback, |
| 91 base::Unretained(this)), |
| 92 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback, |
| 93 base::Unretained(this))); |
| 94 size_t success = expect_success ? 1 : 0; |
| 95 EXPECT_EQ(old_success_callbacks + success, success_callbacks_); |
| 96 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_); |
| 97 } |
| 98 |
| 99 void VerifyRecords() { |
| 100 EXPECT_EQ(2u, records_.size()); |
| 101 |
| 102 std::vector<uint16_t> ids0 = records_[0].GetAttributeIds(); |
| 103 EXPECT_EQ(2u, ids0.size()); |
| 104 |
| 105 BluetoothServiceAttributeValueBlueZ service_handle0 = |
| 106 records_[0].GetAttributeValue(ids0[0]); |
| 107 int32_t int_value; |
| 108 EXPECT_TRUE(service_handle0.value().GetAsInteger(&int_value)); |
| 109 EXPECT_EQ(0x1337, int_value); |
| 110 |
| 111 BluetoothServiceAttributeValueBlueZ service_class_list = |
| 112 records_[0].GetAttributeValue(ids0[1]); |
| 113 std::string str_value; |
| 114 EXPECT_TRUE( |
| 115 service_class_list.sequence()[0].value().GetAsString(&str_value)); |
| 116 EXPECT_EQ("1802", str_value); |
| 117 |
| 118 std::vector<uint16_t> ids1 = records_[1].GetAttributeIds(); |
| 119 EXPECT_EQ(1u, ids1.size()); |
| 120 |
| 121 BluetoothServiceAttributeValueBlueZ service_handle1 = |
| 122 records_[1].GetAttributeValue(ids1[0]); |
| 123 EXPECT_TRUE(service_handle1.value().GetAsInteger(&int_value)); |
| 124 EXPECT_EQ(0xffffffff, static_cast<uint32_t>(int_value)); |
| 125 } |
| 126 |
92 protected: | 127 protected: |
93 BluetoothServiceRecordBlueZ CreateaServiceRecord(const std::string uuid) { | 128 BluetoothServiceRecordBlueZ CreateaServiceRecord(const std::string uuid) { |
94 std::map<uint16_t, BluetoothServiceAttributeValueBlueZ> attributes; | 129 BluetoothServiceRecordBlueZ record; |
95 attributes.insert(std::pair<uint16_t, BluetoothServiceAttributeValueBlueZ>( | 130 record.AddRecordEntry(kServiceUuidAttributeId, |
96 kServiceUuidAttributeId, | 131 BluetoothServiceAttributeValueBlueZ( |
97 BluetoothServiceAttributeValueBlueZ( | 132 BluetoothServiceAttributeValueBlueZ::UUID, 16, |
98 BluetoothServiceAttributeValueBlueZ::UUID, 16, | 133 base::MakeUnique<base::StringValue>(uuid))); |
99 base::MakeUnique<base::StringValue>(uuid)))); | 134 return record; |
100 return BluetoothServiceRecordBlueZ(attributes); | |
101 } | 135 } |
102 | 136 |
103 scoped_refptr<device::BluetoothAdapter> adapter_; | |
104 BluetoothAdapterBlueZ* adapter_bluez_; | 137 BluetoothAdapterBlueZ* adapter_bluez_; |
105 size_t success_callbacks_; | 138 size_t success_callbacks_; |
106 size_t error_callbacks_; | 139 size_t error_callbacks_; |
107 | 140 |
108 private: | 141 private: |
109 void RunRunLoop() { | |
110 run_loop_ = base::MakeUnique<base::RunLoop>(); | |
111 run_loop_->Run(); | |
112 } | |
113 | |
114 void QuitRunLoop() { | |
115 if (run_loop_) | |
116 run_loop_->Quit(); | |
117 } | |
118 | |
119 void AdapterCallback(scoped_refptr<device::BluetoothAdapter> adapter) { | |
120 adapter_ = adapter; | |
121 adapter_bluez_ = static_cast<BluetoothAdapterBlueZ*>(adapter_.get()); | |
122 QuitRunLoop(); | |
123 } | |
124 | |
125 void CreateServiceSuccessCallback(uint32_t handle) { | 142 void CreateServiceSuccessCallback(uint32_t handle) { |
126 last_seen_handle_ = handle; | 143 last_seen_handle_ = handle; |
127 ++success_callbacks_; | 144 ++success_callbacks_; |
128 } | 145 } |
129 | 146 |
130 void RemoveServiceSuccessCallback() { ++success_callbacks_; } | 147 void RemoveServiceSuccessCallback() { ++success_callbacks_; } |
131 | 148 |
132 void ErrorCallback(BluetoothServiceRecordBlueZ::ErrorCode code) { | 149 void ErrorCallback(BluetoothServiceRecordBlueZ::ErrorCode code) { |
133 ++error_callbacks_; | 150 ++error_callbacks_; |
134 } | 151 } |
135 | 152 |
136 base::MessageLoop message_loop_; | 153 void GetServiceRecordsCallback( |
137 std::unique_ptr<base::RunLoop> run_loop_; | 154 const std::vector<BluetoothServiceRecordBlueZ>& records) { |
| 155 records_ = records; |
| 156 ++success_callbacks_; |
| 157 } |
| 158 |
138 uint32_t last_seen_handle_; | 159 uint32_t last_seen_handle_; |
| 160 std::vector<BluetoothServiceRecordBlueZ> records_; |
139 | 161 |
140 DISALLOW_COPY_AND_ASSIGN(BluetoothServiceRecordBlueZTest); | 162 DISALLOW_COPY_AND_ASSIGN(BluetoothServiceRecordBlueZTest); |
141 }; | 163 }; |
142 | 164 |
143 TEST_F(BluetoothServiceRecordBlueZTest, CreateAndRemove) { | 165 TEST_F(BluetoothServiceRecordBlueZTest, CreateAndRemove) { |
144 uint32_t handle1 = | 166 uint32_t handle1 = |
145 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); | 167 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); |
146 uint32_t handle2 = | 168 uint32_t handle2 = |
147 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid2)); | 169 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid2)); |
148 uint32_t handle3 = | 170 uint32_t handle3 = |
149 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); | 171 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); |
150 uint32_t handle4 = | 172 uint32_t handle4 = |
151 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid3)); | 173 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid3)); |
152 | 174 |
153 RemoveServiceRecordWithCallbacks(handle1, true); | 175 RemoveServiceRecordWithCallbacks(handle1, true); |
154 RemoveServiceRecordWithCallbacks(handle3, true); | 176 RemoveServiceRecordWithCallbacks(handle3, true); |
155 RemoveServiceRecordWithCallbacks(handle1, false); | 177 RemoveServiceRecordWithCallbacks(handle1, false); |
156 RemoveServiceRecordWithCallbacks(handle4, true); | 178 RemoveServiceRecordWithCallbacks(handle4, true); |
157 RemoveServiceRecordWithCallbacks(handle2, true); | 179 RemoveServiceRecordWithCallbacks(handle2, true); |
158 } | 180 } |
159 | 181 |
| 182 TEST_F(BluetoothServiceRecordBlueZTest, GetServiceRecords) { |
| 183 BluetoothDeviceBlueZ* device = |
| 184 static_cast<BluetoothDeviceBlueZ*>(adapter_->GetDevice( |
| 185 bluez::FakeBluetoothDeviceClient::kPairedDeviceAddress)); |
| 186 GetServiceRecords(device, false); |
| 187 device->Connect(nullptr, GetCallback(Call::EXPECTED), |
| 188 GetConnectErrorCallback(Call::NOT_EXPECTED)); |
| 189 GetServiceRecords(device, true); |
| 190 VerifyRecords(); |
| 191 } |
| 192 |
160 } // namespace bluez | 193 } // namespace bluez |
OLD | NEW |