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

Side by Side Diff: chromeos/components/tether/ble_scanner_unittest.cc

Issue 2604063003: [CrOS Tether] Create BleScanner, a class which scan BLE advertisements and identifies nearby device… (Closed)
Patch Set: Adjusted comment. Created 3 years, 11 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chromeos/components/tether/ble_scanner.h"
6
7 #include "base/logging.h"
8 #include "chromeos/components/tether/ble_constants.h"
9 #include "chromeos/components/tether/mock_local_device_data_provider.h"
10 #include "components/cryptauth/mock_eid_generator.h"
11 #include "components/cryptauth/proto/cryptauth_api.pb.h"
12 #include "components/cryptauth/remote_device_test_util.h"
13 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
14 #include "device/bluetooth/test/mock_bluetooth_device.h"
15 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using testing::_;
19 using testing::DoAll;
20 using testing::Eq;
21 using testing::Invoke;
22 using testing::NiceMock;
23 using testing::SaveArg;
24 using testing::Return;
25
26 namespace chromeos {
27
28 namespace tether {
29
30 namespace {
31 class MockBleScannerObserver : public BleScanner::Observer {
32 public:
33 MockBleScannerObserver() {}
34
35 void OnReceivedAdvertisementFromDevice(
36 const device::BluetoothDevice* bluetooth_device,
37 cryptauth::RemoteDevice remote_device) override {
38 bluetooth_devices_.push_back(bluetooth_device);
39 remote_devices_.push_back(remote_device);
40 }
41
42 int GetNumCalls() { return static_cast<int>(bluetooth_devices_.size()); }
43
44 std::vector<const device::BluetoothDevice*>& bluetooth_devices() {
45 return bluetooth_devices_;
46 }
47
48 std::vector<cryptauth::RemoteDevice>& remote_devices() {
49 return remote_devices_;
50 }
51
52 private:
53 std::vector<const device::BluetoothDevice*> bluetooth_devices_;
54 std::vector<cryptauth::RemoteDevice> remote_devices_;
55 };
56
57 class MockServiceDataBluetoothDevice : public device::MockBluetoothDevice {
Ryan Hansberry 2017/01/04 00:01:04 nit: Maybe rename this MockBluetoothDeviceWithServ
Kyle Horimoto 2017/01/04 18:35:43 Done.
58 public:
59 MockServiceDataBluetoothDevice(device::MockBluetoothAdapter* adapter,
60 const std::string& service_data)
61 : device::MockBluetoothDevice(adapter,
62 /* bluetooth_class */ 0,
63 "name",
64 "11:22:33:44:55:66",
65 false,
66 false) {
67 for (size_t i = 0; i < service_data.size(); i++) {
68 service_data_.push_back(static_cast<uint8_t>(service_data[i]));
69 }
70 }
71
72 const std::vector<uint8_t>* service_data() { return &service_data_; }
73
74 private:
75 std::vector<uint8_t> service_data_;
76 };
77
78 const std::string fake_local_public_key = "fakeLocalPublicKey";
79
80 const std::string current_eid_data = "currentEidData";
81 const int64_t current_eid_start_ms = 1000L;
82 const int64_t current_eid_end_ms = 2000L;
83
84 const std::string adjacent_eid_data = "adjacentEidData";
85 const int64_t adjacent_eid_start_ms = 2000L;
86 const int64_t adjacent_eid_end_ms = 3000L;
87
88 const std::string fake_beacon_seed1_data = "fakeBeaconSeed1Data";
Ryan Hansberry 2017/01/04 00:01:04 nit: instead of '1' and '2', used 'current' and 'a
Kyle Horimoto 2017/01/04 18:35:43 I'm going to keep it as 1 and 2. There is no notio
89 const int64_t fake_beacon_seed1_start_ms = 1000L;
Ryan Hansberry 2017/01/04 00:01:04 Directly 'current_eid_start_ms' and etc. instead o
Kyle Horimoto 2017/01/04 18:35:43 Ditto.
Ryan Hansberry 2017/01/04 20:02:20 I understand your reasoning for not renaming the s
Kyle Horimoto 2017/01/04 20:06:56 Done.
90 const int64_t fake_beacon_seed1_end_ms = 2000L;
91
92 const std::string fake_beacon_seed2_data = "fakeBeaconSeed2Data";
93 const int64_t fake_beacon_seed2_start_ms = 2000L;
94 const int64_t fake_beacon_seed2_end_ms = 3000L;
95
96 std::unique_ptr<cryptauth::EidGenerator::EidData>
97 CreateFakeBackgroundScanFilter() {
98 cryptauth::EidGenerator::DataWithTimestamp current(
99 current_eid_data, current_eid_start_ms, current_eid_end_ms);
100
101 std::unique_ptr<cryptauth::EidGenerator::DataWithTimestamp> adjacent =
102 base::MakeUnique<cryptauth::EidGenerator::DataWithTimestamp>(
103 adjacent_eid_data, adjacent_eid_start_ms, adjacent_eid_end_ms);
104
105 return base::MakeUnique<cryptauth::EidGenerator::EidData>(
106 current, std::move(adjacent));
107 }
108
109 std::vector<cryptauth::BeaconSeed> CreateFakeBeaconSeeds() {
110 cryptauth::BeaconSeed seed1;
111 seed1.set_data(fake_beacon_seed1_data);
112 seed1.set_start_time_millis(fake_beacon_seed1_start_ms);
113 seed1.set_start_time_millis(fake_beacon_seed1_end_ms);
114
115 cryptauth::BeaconSeed seed2;
116 seed2.set_data(fake_beacon_seed2_data);
117 seed2.set_start_time_millis(fake_beacon_seed2_start_ms);
118 seed2.set_start_time_millis(fake_beacon_seed2_end_ms);
119
120 std::vector<cryptauth::BeaconSeed> seeds = {seed1, seed2};
121 return seeds;
122 }
123 } // namespace
124
125 class BleScannerTest : public testing::Test {
126 protected:
127 class TestDelegate : public BleScanner::Delegate {
128 public:
129 TestDelegate()
130 : is_bluetooth_adapter_available_(true),
131 last_get_adapter_callback_(nullptr) {}
132
133 ~TestDelegate() override {}
134
135 bool IsBluetoothAdapterAvailable() const override {
136 return is_bluetooth_adapter_available_;
137 }
138
139 void set_is_bluetooth_adapter_available(
140 bool is_bluetooth_adapter_available) {
141 is_bluetooth_adapter_available_ = is_bluetooth_adapter_available;
142 }
143
144 void GetAdapter(const device::BluetoothAdapterFactory::AdapterCallback&
145 callback) override {
146 last_get_adapter_callback_ = callback;
147 }
148
149 const device::BluetoothAdapterFactory::AdapterCallback
150 last_get_adapter_callback() {
151 return last_get_adapter_callback_;
152 }
153
154 const std::vector<uint8_t>* GetServiceDataForUUID(
155 const device::BluetoothUUID& service_uuid,
156 device::BluetoothDevice* device) override {
157 if (device::BluetoothUUID(kAdvertisingServiceUuid) == service_uuid) {
158 return reinterpret_cast<MockServiceDataBluetoothDevice*>(device)
Ryan Hansberry 2017/01/04 00:01:04 For my own learning: Why did you choose reinterpre
Kyle Horimoto 2017/01/04 18:35:44 reinterpret_cast should be used when we are conver
Ryan Hansberry 2017/01/04 20:02:20 Thanks!
159 ->service_data();
160 }
161
162 return nullptr;
163 }
164
165 private:
166 bool is_bluetooth_adapter_available_;
167 device::BluetoothAdapterFactory::AdapterCallback last_get_adapter_callback_;
168 };
169
170 BleScannerTest()
171 : test_devices_(cryptauth::GenerateTestRemoteDevices(3)),
172 test_beacon_seeds_(CreateFakeBeaconSeeds()) {}
173
174 void SetUp() override {
175 test_delegate_ = new TestDelegate();
176 EXPECT_TRUE(test_delegate_->IsBluetoothAdapterAvailable());
177 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
178
179 mock_eid_generator_ = base::MakeUnique<cryptauth::MockEidGenerator>();
180 mock_eid_generator_->set_background_scan_filter(
181 CreateFakeBackgroundScanFilter());
182
183 mock_local_device_data_provider_ =
184 base::MakeUnique<MockLocalDeviceDataProvider>();
185 mock_local_device_data_provider_->SetPublicKey(
186 base::MakeUnique<std::string>(fake_local_public_key));
187 mock_local_device_data_provider_->SetBeaconSeeds(
188 base::MakeUnique<std::vector<cryptauth::BeaconSeed>>(
189 test_beacon_seeds_));
190
191 mock_adapter_ =
192 make_scoped_refptr(new NiceMock<device::MockBluetoothAdapter>());
193 stored_discovery_filter_.reset();
194 stored_discovery_callback_.Reset();
195 stored_discovery_errback_.Reset();
196 ON_CALL(*mock_adapter_, StartDiscoverySessionWithFilterRaw(_, _, _))
197 .WillByDefault(Invoke(
198 this, &BleScannerTest::SaveStartDiscoverySessionWithFilterArgs));
199 ON_CALL(*mock_adapter_, IsPowered()).WillByDefault(Return(true));
200
201 mock_discovery_session_ = nullptr;
202
203 ble_scanner_ = base::WrapUnique(new BleScanner(
204 base::WrapUnique(test_delegate_), mock_eid_generator_.get(),
Ryan Hansberry 2017/01/04 00:01:04 nit: place this arg on a separate line.
Kyle Horimoto 2017/01/04 18:35:43 Same - this is what the Chromium lint tool chose.
Ryan Hansberry 2017/01/04 20:02:20 My bad, still getting used to the style.
205 mock_local_device_data_provider_.get()));
206
207 mock_observer_ = base::MakeUnique<MockBleScannerObserver>();
208 ble_scanner_->AddObserver(mock_observer_.get());
209 }
210
211 void SaveStartDiscoverySessionWithFilterArgs(
212 const device::BluetoothDiscoveryFilter* discovery_filter,
213 const device::BluetoothAdapter::DiscoverySessionCallback& callback,
214 const device::BluetoothAdapter::ErrorCallback& errback) {
215 stored_discovery_filter_ =
216 base::MakeUnique<device::BluetoothDiscoveryFilter>(
217 device::BluetoothTransport::BLUETOOTH_TRANSPORT_LE);
218 stored_discovery_filter_->CopyFrom(*discovery_filter);
219 stored_discovery_callback_ = callback;
220 stored_discovery_errback_ = errback;
221 }
222
223 void InvokeAdapterCallback() {
224 const device::BluetoothAdapterFactory::AdapterCallback
225 last_get_adapter_callback = test_delegate_->last_get_adapter_callback();
226 ASSERT_TRUE(last_get_adapter_callback);
Ryan Hansberry 2017/01/04 00:01:04 Is there any kind of ASSERT_NOT_NULL? This reads l
Kyle Horimoto 2017/01/04 18:35:44 No, this is the conventional approach within Chrom
227
228 // Because the adapter has just been initialized, the discovery session
229 // should not have been started yet.
230 EXPECT_FALSE(stored_discovery_filter_);
231 EXPECT_TRUE(stored_discovery_callback_.is_null());
232 EXPECT_TRUE(stored_discovery_errback_.is_null());
233
234 EXPECT_CALL(*mock_adapter_, AddObserver(ble_scanner_.get()));
235 last_get_adapter_callback.Run(mock_adapter_);
236
237 // Once the adapter callback is returned, a discovery session should be
238 // started via that adapter.
239 AssertDiscoverySessionRequested();
240 }
241
242 void AssertDiscoverySessionRequested() {
243 // First, ensure that the correct discovery filter was passed.
244 EXPECT_TRUE(stored_discovery_filter_);
245 EXPECT_EQ(device::BluetoothTransport::BLUETOOTH_TRANSPORT_LE,
246 stored_discovery_filter_->GetTransport());
247 int16_t observed_rssi;
248 ASSERT_TRUE(stored_discovery_filter_->GetRSSI(&observed_rssi));
249 EXPECT_EQ(-90, observed_rssi);
Ryan Hansberry 2017/01/04 00:01:04 Please use the constant defined in BleScanner.
Kyle Horimoto 2017/01/04 18:35:44 That is an implementation detail of the class, so
250
251 // Now, ensure that both a callback and errback were pased.
Ryan Hansberry 2017/01/04 00:01:04 passed*
Kyle Horimoto 2017/01/04 18:35:44 Done.
252 EXPECT_FALSE(stored_discovery_callback_.is_null());
253 EXPECT_FALSE(stored_discovery_errback_.is_null());
254 }
255
256 void InvokeDiscoveryStartedCallback() {
257 EXPECT_FALSE(stored_discovery_callback_.is_null());
258
259 mock_discovery_session_ = new device::MockBluetoothDiscoverySession();
260 stored_discovery_callback_.Run(base::WrapUnique(mock_discovery_session_));
261 }
262
263 std::vector<cryptauth::RemoteDevice> test_devices_;
264 std::vector<cryptauth::BeaconSeed> test_beacon_seeds_;
265
266 std::unique_ptr<MockBleScannerObserver> mock_observer_;
267
268 TestDelegate* test_delegate_;
269 std::unique_ptr<cryptauth::MockEidGenerator> mock_eid_generator_;
270 std::unique_ptr<MockLocalDeviceDataProvider> mock_local_device_data_provider_;
271
272 scoped_refptr<NiceMock<device::MockBluetoothAdapter>> mock_adapter_;
273 device::MockBluetoothDiscoverySession* mock_discovery_session_;
274
275 std::unique_ptr<device::BluetoothDiscoveryFilter> stored_discovery_filter_;
276 device::BluetoothAdapter::DiscoverySessionCallback stored_discovery_callback_;
277 device::BluetoothAdapter::ErrorCallback stored_discovery_errback_;
278
279 std::unique_ptr<BleScanner> ble_scanner_;
280
281 private:
282 DISALLOW_COPY_AND_ASSIGN(BleScannerTest);
283 };
284
285 TEST_F(BleScannerTest, TestNoBluetoothAdapter) {
286 test_delegate_->set_is_bluetooth_adapter_available(false);
287 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
288 EXPECT_FALSE(
289 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
290 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
291 EXPECT_FALSE(mock_observer_->GetNumCalls());
292 }
293
294 TEST_F(BleScannerTest, TestNoLocalBeaconSeeds) {
295 mock_local_device_data_provider_->SetBeaconSeeds(nullptr);
296 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
297 EXPECT_FALSE(
298 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
299 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
300 EXPECT_FALSE(mock_observer_->GetNumCalls());
301 }
302
303 TEST_F(BleScannerTest, TestNoBackgroundScanFilter) {
304 mock_eid_generator_->set_background_scan_filter(nullptr);
305 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
306 EXPECT_FALSE(
307 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
308 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
309 EXPECT_FALSE(mock_observer_->GetNumCalls());
310 }
311
312 TEST_F(BleScannerTest, TestAdapterDoesNotInitialize) {
313 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
314 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
315 EXPECT_TRUE(test_delegate_->last_get_adapter_callback());
316
317 // Do not call the last GetAdapter() callback. The device should still be able
318 // to be unregistered.
319 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
320 EXPECT_FALSE(
321 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
322 EXPECT_FALSE(mock_observer_->GetNumCalls());
323 }
324
325 TEST_F(BleScannerTest, TestAdapterDoesNotInitialize_MultipleDevicesRegistered) {
326 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
327 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[1]));
328 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
329 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
330 EXPECT_TRUE(test_delegate_->last_get_adapter_callback());
331
332 // Do not call the last GetAdapter() callback. The devices should still be
333 // able to be unregistered.
334 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
335 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[1]));
336 EXPECT_FALSE(
337 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
338 EXPECT_FALSE(
339 ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
340 EXPECT_FALSE(mock_observer_->GetNumCalls());
341 }
342
343 TEST_F(BleScannerTest, TestDiscoverySessionFailsToStart) {
344 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
345 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
346
347 InvokeAdapterCallback();
348 stored_discovery_errback_.Run();
349
350 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
351 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
352 EXPECT_FALSE(mock_observer_->GetNumCalls());
353 }
354
355 TEST_F(BleScannerTest, TestDiscoveryStartsButNoDevicesFound) {
356 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
357 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
358
359 InvokeAdapterCallback();
360 InvokeDiscoveryStartedCallback();
361
362 // No devices found.
363
364 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
365 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
366 EXPECT_FALSE(mock_observer_->GetNumCalls());
367 }
368
369 TEST_F(BleScannerTest, TestDiscovery) {
Ryan Hansberry 2017/01/04 00:01:04 nit: I think it would be very valuable to split th
Kyle Horimoto 2017/01/04 18:35:44 Done.
370 size_t kMinNumBytesInServiceData = 4;
371 std::string empty_service_data = "";
372 std::string short_service_data = "abc";
373 std::string valid_service_data_for_other_device = "abcd";
374 std::string valid_service_data_for_registered_device = "abcde";
375 ASSERT_TRUE(short_service_data.size() < kMinNumBytesInServiceData);
376 ASSERT_TRUE(valid_service_data_for_other_device.size() >=
377 kMinNumBytesInServiceData);
378 ASSERT_TRUE(valid_service_data_for_registered_device.size() >=
379 kMinNumBytesInServiceData);
380
381 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
382 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
383
384 InvokeAdapterCallback();
385 InvokeDiscoveryStartedCallback();
386
387 // Device with no service data connected. Service data is required to identify
388 // the advertising device.
389 MockServiceDataBluetoothDevice device1(mock_adapter_.get(),
390 empty_service_data);
391 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device1);
392 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
393 EXPECT_FALSE(mock_observer_->GetNumCalls());
Ryan Hansberry 2017/01/04 00:01:04 Please use EXPECT_EQ(0, ...) instead, for all thes
Kyle Horimoto 2017/01/04 18:35:44 EXPECT_TRUE/EXPECT_FALSE are the convention in Chr
394
395 // Device with short service data connected. Service data of at least 4 bytes
396 // is required to identify the advertising device.
397 MockServiceDataBluetoothDevice device2(mock_adapter_.get(),
398 short_service_data);
399 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device2);
400 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
401 EXPECT_FALSE(mock_observer_->GetNumCalls());
402
403 // Device with valid service data connected, but the local device data
404 // cannot be fetched.
405 mock_local_device_data_provider_->SetPublicKey(nullptr);
406 mock_local_device_data_provider_->SetBeaconSeeds(nullptr);
407 MockServiceDataBluetoothDevice device3(mock_adapter_.get(),
408 valid_service_data_for_other_device);
409 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device3);
410 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
411 EXPECT_FALSE(mock_observer_->GetNumCalls());
412
413 // Device with valid service data connected, but there was no registered
414 // device corresponding to
Ryan Hansberry 2017/01/04 00:01:04 Please complete this comment.
Kyle Horimoto 2017/01/04 18:35:44 Done.
415 mock_local_device_data_provider_->SetPublicKey(
416 base::MakeUnique<std::string>(fake_local_public_key));
417 mock_local_device_data_provider_->SetBeaconSeeds(
418 base::MakeUnique<std::vector<cryptauth::BeaconSeed>>(test_beacon_seeds_));
419 MockServiceDataBluetoothDevice device4(mock_adapter_.get(),
420 valid_service_data_for_other_device);
421 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device4);
422 EXPECT_EQ(1, mock_eid_generator_->num_identify_calls());
423 EXPECT_FALSE(mock_observer_->GetNumCalls());
424
425 // Registered device connects.
426 MockServiceDataBluetoothDevice device5(
427 mock_adapter_.get(), valid_service_data_for_registered_device);
428 mock_eid_generator_->set_identified_device(&test_devices_[0]);
429 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device5);
430 EXPECT_EQ(2, mock_eid_generator_->num_identify_calls());
431 EXPECT_EQ(1, mock_observer_->GetNumCalls());
432 EXPECT_EQ(1, static_cast<int>(mock_observer_->bluetooth_devices().size()));
433 EXPECT_EQ(&device5, mock_observer_->bluetooth_devices()[0]);
434 EXPECT_EQ(1, static_cast<int>(mock_observer_->remote_devices().size()));
435 EXPECT_EQ(test_devices_[0], mock_observer_->remote_devices()[0]);
436
437 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
438 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
439 EXPECT_EQ(2, mock_eid_generator_->num_identify_calls());
440 EXPECT_EQ(1, mock_observer_->GetNumCalls());
441 }
442
443 TEST_F(BleScannerTest, TestDiscovery_MultipleObservers) {
444 MockBleScannerObserver extra_observer;
445 ble_scanner_->AddObserver(&extra_observer);
446
447 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
448 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
449
450 InvokeAdapterCallback();
451 InvokeDiscoveryStartedCallback();
452
453 MockServiceDataBluetoothDevice device(mock_adapter_.get(), "fakeServiceData");
454 mock_eid_generator_->set_identified_device(&test_devices_[0]);
455 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device);
456
457 EXPECT_EQ(1, mock_observer_->GetNumCalls());
458 EXPECT_EQ(1, static_cast<int>(mock_observer_->bluetooth_devices().size()));
459 EXPECT_EQ(&device, mock_observer_->bluetooth_devices()[0]);
460 EXPECT_EQ(1, static_cast<int>(mock_observer_->remote_devices().size()));
461 EXPECT_EQ(test_devices_[0], mock_observer_->remote_devices()[0]);
462
463 EXPECT_EQ(1, extra_observer.GetNumCalls());
464 EXPECT_EQ(1, static_cast<int>(extra_observer.bluetooth_devices().size()));
465 EXPECT_EQ(&device, extra_observer.bluetooth_devices()[0]);
466 EXPECT_EQ(1, static_cast<int>(extra_observer.remote_devices().size()));
467 EXPECT_EQ(test_devices_[0], extra_observer.remote_devices()[0]);
468
469 // Now, unregister both observers.
470 ble_scanner_->RemoveObserver(mock_observer_.get());
471 ble_scanner_->RemoveObserver(&extra_observer);
472
473 // Now, simulate another scan being received. The observers should not be
474 // notified since they are unregistered, so they should still have a call
475 // count of 1.
476 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device);
477 EXPECT_EQ(1, mock_observer_->GetNumCalls());
478 EXPECT_EQ(1, extra_observer.GetNumCalls());
479
480 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
481 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
482 }
483
484 TEST_F(BleScannerTest, TestRegistrationLimit) {
485 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
486 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
487 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[1]));
488 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
489
490 // Attempt to register another device. Registration should fail since the
491 // maximum number of devices have already been registered.
492 ASSERT_EQ(2, kMaxConcurrentAdvertisements);
493 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[2]));
494 EXPECT_FALSE(
495 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
496
497 // Unregistering a device which is not registered should also return false.
498 EXPECT_FALSE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[2]));
499 EXPECT_FALSE(
500 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
501
502 // Unregister device 0.
503 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
504 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
505 EXPECT_FALSE(
506 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
507
508 // Now, device 2 can be registered.
509 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[2]));
510 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
511
512 // Now, unregister the devices.
513 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
514 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[1]));
515 EXPECT_FALSE(
516 ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
517
518 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
519 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[2]));
520 EXPECT_FALSE(
521 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
522 }
523
524 TEST_F(BleScannerTest, TestAdapterPoweredChanged) {
525 // This test starts with the adapter powered on, then turns power off before
526 // discovery starts, then turns power back on and allows discovery to
527 // complete, then turns power back off again, and finally turns it back on to
528 // complete another discovery session.
529 EXPECT_CALL(*mock_adapter_, IsPowered())
Ryan Hansberry 2017/01/04 00:01:04 This is pretty difficult to read. I can't easily t
Kyle Horimoto 2017/01/04 18:35:44 That's not valid to do within GoogleMock. Relevan
Ryan Hansberry 2017/01/04 20:02:20 Thanks for the link, that's really helpful.
530 .WillOnce(Return(true))
531 .WillOnce(Return(false))
532 .WillOnce(Return(true))
533 .WillOnce(Return(false))
534 .WillOnce(Return(true));
535
536 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
537 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
538 InvokeAdapterCallback();
539
540 // The discovery session should have been requested but not yet initialized.
541 EXPECT_TRUE(stored_discovery_filter_.get());
542 EXPECT_FALSE(mock_discovery_session_);
543
544 // Turn the adapter off before the discovery session starts.
545 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), false);
546
547 // Turn the adapter back on, and finish initializing discovery this time.
548 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), true);
549 InvokeDiscoveryStartedCallback();
550
551 // The session should have been started.
552 device::MockBluetoothDiscoverySession* session1 = mock_discovery_session_;
553 EXPECT_NE(nullptr, session1);
554
555 // Now turn the adapter off again.
556 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), false);
557
558 // Turn the adapter back on.
559 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), true);
560 InvokeDiscoveryStartedCallback();
561
562 // A new session should have started, so the session objects should not be the
563 // same.
564 device::MockBluetoothDiscoverySession* session2 = mock_discovery_session_;
565 EXPECT_NE(nullptr, session2);
566 EXPECT_NE(session1, session2);
567
568 // Unregister device.
569 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
570 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
571 EXPECT_FALSE(
572 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
573 }
574
575 } // namespace tether
576
577 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698