Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(655)

Side by Side Diff: device/bluetooth/bluez/bluetooth_service_record_bluez_unittest.cc

Issue 2102093003: Implement BluetoothDeviceBlueZ::GetServiceRecords. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
33 class TestPairingDelegate : public device::BluetoothDevice::PairingDelegate {
34 public:
35 void RequestPinCode(device::BluetoothDevice* device) override {
36 LOG(ERROR) << "RKC: 1";
xiyuan 2016/06/29 22:43:08 remove debugging log, here and other places?
rkc 2016/06/30 20:02:24 Whoops. Done.
37 }
38 void RequestPasskey(device::BluetoothDevice* device) override {
39 LOG(ERROR) << "RKC: 2";
40 }
41 void DisplayPinCode(device::BluetoothDevice* device,
42 const std::string& pincode) override {
43 LOG(ERROR) << "RKC: 3";
44 }
45 void DisplayPasskey(device::BluetoothDevice* device,
46 uint32_t passkey) override {
47 LOG(ERROR) << "RKC: 4";
48 }
49 void KeysEntered(device::BluetoothDevice* device, uint32_t entered) override {
50 LOG(ERROR) << "RKC: 5";
51 }
52 void ConfirmPasskey(device::BluetoothDevice* device,
53 uint32_t passkey) override {
54 LOG(ERROR) << "RKC: 6";
55 }
56 void AuthorizePairing(device::BluetoothDevice* device) override {
57 LOG(ERROR) << "RKC: 7";
58 }
59 };
60
30 } // namespace 61 } // namespace
31 62
32 class BluetoothServiceRecordBlueZTest : public testing::Test { 63 class BluetoothServiceRecordBlueZTest : public device::BluetoothTestBlueZ {
33 public: 64 public:
34 BluetoothServiceRecordBlueZTest() 65 BluetoothServiceRecordBlueZTest()
35 : adapter_bluez_(nullptr), 66 : adapter_bluez_(nullptr),
36 success_callbacks_(0), 67 success_callbacks_(0),
37 error_callbacks_(0), 68 error_callbacks_(0),
38 run_loop_(nullptr),
39 last_seen_handle_(0) {} 69 last_seen_handle_(0) {}
40 70
41 void SetUp() override { 71 void SetUp() override {
42 std::unique_ptr<bluez::BluezDBusManagerSetter> dbus_setter = 72 BluetoothTestBlueZ::SetUp();
43 bluez::BluezDBusManager::GetSetterForTesting(); 73 InitWithFakeAdapter();
44 74 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 } 75 }
55 76
56 uint32_t CreateServiceRecordWithCallbacks( 77 uint32_t CreateServiceRecordWithCallbacks(
57 const BluetoothServiceRecordBlueZ& record) { 78 const BluetoothServiceRecordBlueZ& record) {
58 const size_t old_success_callbacks = success_callbacks_; 79 const size_t old_success_callbacks = success_callbacks_;
59 const size_t old_error_callbacks = error_callbacks_; 80 const size_t old_error_callbacks = error_callbacks_;
60 // Note: Our fake implementation will never give us a handle of 0, so we 81 // 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 82 // 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. 83 // 0 as an invalid handle return value is okay.
63 last_seen_handle_ = 0; 84 last_seen_handle_ = 0;
(...skipping 18 matching lines...) Expand all
82 base::Bind( 103 base::Bind(
83 &BluetoothServiceRecordBlueZTest::RemoveServiceSuccessCallback, 104 &BluetoothServiceRecordBlueZTest::RemoveServiceSuccessCallback,
84 base::Unretained(this)), 105 base::Unretained(this)),
85 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback, 106 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback,
86 base::Unretained(this))); 107 base::Unretained(this)));
87 size_t success = expect_success ? 1 : 0; 108 size_t success = expect_success ? 1 : 0;
88 EXPECT_EQ(old_success_callbacks + success, success_callbacks_); 109 EXPECT_EQ(old_success_callbacks + success, success_callbacks_);
89 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_); 110 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_);
90 } 111 }
91 112
113 void GetServiceRecords(BluetoothDeviceBlueZ* device, bool expect_success) {
114 const size_t old_success_callbacks = success_callbacks_;
115 const size_t old_error_callbacks = error_callbacks_;
116 records_.clear();
117 device->GetServiceRecords(
118 base::Bind(&BluetoothServiceRecordBlueZTest::GetServiceRecordsCallback,
119 base::Unretained(this)),
120 base::Bind(&BluetoothServiceRecordBlueZTest::ErrorCallback,
121 base::Unretained(this)));
122 size_t success = expect_success ? 1 : 0;
Miao 2016/06/30 04:55:59 Instead of passing an extra |bool expect_success|
rkc 2016/06/30 20:02:24 I expect us to have more tests :)
123 EXPECT_EQ(old_success_callbacks + success, success_callbacks_);
124 EXPECT_EQ(old_error_callbacks + 1 - success, error_callbacks_);
125 }
126
127 void VerifyRecords() {
128 EXPECT_EQ(2u, records_.size());
129
130 std::vector<uint16_t> ids0 = records_[0].GetAttributeIds();
131 EXPECT_EQ(2u, ids0.size());
132
133 BluetoothServiceAttributeValueBlueZ service_handle0 =
134 records_[0].GetAttributeValue(ids0[0]);
135 int32_t int_value;
136 EXPECT_TRUE(service_handle0.value().GetAsInteger(&int_value));
137 EXPECT_EQ(0x1337, int_value);
138
139 BluetoothServiceAttributeValueBlueZ service_class_list =
140 records_[0].GetAttributeValue(ids0[1]);
141 std::string str_value;
142 EXPECT_TRUE(
143 service_class_list.sequence()[0].value().GetAsString(&str_value));
144 EXPECT_EQ("1802", str_value);
145
146 std::vector<uint16_t> ids1 = records_[1].GetAttributeIds();
147 EXPECT_EQ(1u, ids1.size());
148
149 BluetoothServiceAttributeValueBlueZ service_handle1 =
150 records_[1].GetAttributeValue(ids1[0]);
151 EXPECT_TRUE(service_handle1.value().GetAsInteger(&int_value));
152 EXPECT_EQ(0xffffffff, static_cast<uint32_t>(int_value));
153 }
154
92 protected: 155 protected:
93 BluetoothServiceRecordBlueZ CreateaServiceRecord(const std::string uuid) { 156 BluetoothServiceRecordBlueZ CreateaServiceRecord(const std::string uuid) {
94 std::map<uint16_t, BluetoothServiceAttributeValueBlueZ> attributes; 157 BluetoothServiceRecordBlueZ record;
95 attributes.insert(std::pair<uint16_t, BluetoothServiceAttributeValueBlueZ>( 158 record.AddRecordEntry(kServiceUuidAttributeId,
96 kServiceUuidAttributeId, 159 BluetoothServiceAttributeValueBlueZ(
97 BluetoothServiceAttributeValueBlueZ( 160 BluetoothServiceAttributeValueBlueZ::UUID, 16,
98 BluetoothServiceAttributeValueBlueZ::UUID, 16, 161 base::MakeUnique<base::StringValue>(uuid)));
99 base::MakeUnique<base::StringValue>(uuid)))); 162 return record;
100 return BluetoothServiceRecordBlueZ(attributes);
101 } 163 }
102 164
103 scoped_refptr<device::BluetoothAdapter> adapter_;
104 BluetoothAdapterBlueZ* adapter_bluez_; 165 BluetoothAdapterBlueZ* adapter_bluez_;
105 size_t success_callbacks_; 166 size_t success_callbacks_;
106 size_t error_callbacks_; 167 size_t error_callbacks_;
107 168
108 private: 169 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) { 170 void CreateServiceSuccessCallback(uint32_t handle) {
126 last_seen_handle_ = handle; 171 last_seen_handle_ = handle;
127 ++success_callbacks_; 172 ++success_callbacks_;
128 } 173 }
129 174
130 void RemoveServiceSuccessCallback() { ++success_callbacks_; } 175 void RemoveServiceSuccessCallback() { ++success_callbacks_; }
131 176
132 void ErrorCallback(BluetoothServiceRecordBlueZ::ErrorCode code) { 177 void ErrorCallback(BluetoothServiceRecordBlueZ::ErrorCode code) {
133 ++error_callbacks_; 178 ++error_callbacks_;
134 } 179 }
135 180
136 base::MessageLoop message_loop_; 181 void GetServiceRecordsCallback(
137 std::unique_ptr<base::RunLoop> run_loop_; 182 std::vector<BluetoothServiceRecordBlueZ> records) {
183 records_ = records;
184 ++success_callbacks_;
185 }
186
138 uint32_t last_seen_handle_; 187 uint32_t last_seen_handle_;
188 std::vector<BluetoothServiceRecordBlueZ> records_;
139 189
140 DISALLOW_COPY_AND_ASSIGN(BluetoothServiceRecordBlueZTest); 190 DISALLOW_COPY_AND_ASSIGN(BluetoothServiceRecordBlueZTest);
141 }; 191 };
142 192
143 TEST_F(BluetoothServiceRecordBlueZTest, CreateAndRemove) { 193 TEST_F(BluetoothServiceRecordBlueZTest, CreateAndRemove) {
144 uint32_t handle1 = 194 uint32_t handle1 =
145 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); 195 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1));
146 uint32_t handle2 = 196 uint32_t handle2 =
147 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid2)); 197 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid2));
148 uint32_t handle3 = 198 uint32_t handle3 =
149 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1)); 199 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid1));
150 uint32_t handle4 = 200 uint32_t handle4 =
151 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid3)); 201 CreateServiceRecordWithCallbacks(CreateaServiceRecord(kServiceUuid3));
152 202
153 RemoveServiceRecordWithCallbacks(handle1, true); 203 RemoveServiceRecordWithCallbacks(handle1, true);
154 RemoveServiceRecordWithCallbacks(handle3, true); 204 RemoveServiceRecordWithCallbacks(handle3, true);
155 RemoveServiceRecordWithCallbacks(handle1, false); 205 RemoveServiceRecordWithCallbacks(handle1, false);
156 RemoveServiceRecordWithCallbacks(handle4, true); 206 RemoveServiceRecordWithCallbacks(handle4, true);
157 RemoveServiceRecordWithCallbacks(handle2, true); 207 RemoveServiceRecordWithCallbacks(handle2, true);
158 } 208 }
159 209
210 TEST_F(BluetoothServiceRecordBlueZTest, GetServiceRecords) {
211 BluetoothDeviceBlueZ* device =
212 static_cast<BluetoothDeviceBlueZ*>(adapter_->GetDevice(
213 bluez::FakeBluetoothDeviceClient::kPairedDeviceAddress));
214 GetServiceRecords(device, false);
215 device->Connect(nullptr, GetCallback(Call::EXPECTED),
216 GetConnectErrorCallback(Call::NOT_EXPECTED));
217 GetServiceRecords(device, true);
218 VerifyRecords();
219 }
220
160 } // namespace bluez 221 } // namespace bluez
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698