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

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: Add missing dependency. 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 MockBluetoothDeviceWithServiceData : public device::MockBluetoothDevice {
58 public:
59 MockBluetoothDeviceWithServiceData(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 int kExpectedDiscoveryRSSI = -90;
79 const size_t kMinNumBytesInServiceData = 4;
80
81 const std::string fake_local_public_key = "fakeLocalPublicKey";
82
83 const std::string current_eid_data = "currentEidData";
84 const int64_t current_eid_start_ms = 1000L;
85 const int64_t current_eid_end_ms = 2000L;
86
87 const std::string adjacent_eid_data = "adjacentEidData";
88 const int64_t adjacent_eid_start_ms = 2000L;
89 const int64_t adjacent_eid_end_ms = 3000L;
90
91 const std::string fake_beacon_seed1_data = "fakeBeaconSeed1Data";
92 const int64_t fake_beacon_seed1_start_ms = current_eid_start_ms;
93 const int64_t fake_beacon_seed1_end_ms = current_eid_end_ms;
94
95 const std::string fake_beacon_seed2_data = "fakeBeaconSeed2Data";
96 const int64_t fake_beacon_seed2_start_ms = adjacent_eid_start_ms;
97 const int64_t fake_beacon_seed2_end_ms = adjacent_eid_end_ms;
98
99 std::unique_ptr<cryptauth::EidGenerator::EidData>
100 CreateFakeBackgroundScanFilter() {
101 cryptauth::EidGenerator::DataWithTimestamp current(
102 current_eid_data, current_eid_start_ms, current_eid_end_ms);
103
104 std::unique_ptr<cryptauth::EidGenerator::DataWithTimestamp> adjacent =
105 base::MakeUnique<cryptauth::EidGenerator::DataWithTimestamp>(
106 adjacent_eid_data, adjacent_eid_start_ms, adjacent_eid_end_ms);
107
108 return base::MakeUnique<cryptauth::EidGenerator::EidData>(
109 current, std::move(adjacent));
110 }
111
112 std::vector<cryptauth::BeaconSeed> CreateFakeBeaconSeeds() {
113 cryptauth::BeaconSeed seed1;
114 seed1.set_data(fake_beacon_seed1_data);
115 seed1.set_start_time_millis(fake_beacon_seed1_start_ms);
116 seed1.set_start_time_millis(fake_beacon_seed1_end_ms);
117
118 cryptauth::BeaconSeed seed2;
119 seed2.set_data(fake_beacon_seed2_data);
120 seed2.set_start_time_millis(fake_beacon_seed2_start_ms);
121 seed2.set_start_time_millis(fake_beacon_seed2_end_ms);
122
123 std::vector<cryptauth::BeaconSeed> seeds = {seed1, seed2};
124 return seeds;
125 }
126 } // namespace
127
128 class BleScannerTest : public testing::Test {
129 protected:
130 class TestDelegate : public BleScanner::Delegate {
131 public:
132 TestDelegate()
133 : is_bluetooth_adapter_available_(true),
134 last_get_adapter_callback_(nullptr) {}
135
136 ~TestDelegate() override {}
137
138 bool IsBluetoothAdapterAvailable() const override {
139 return is_bluetooth_adapter_available_;
140 }
141
142 void set_is_bluetooth_adapter_available(
143 bool is_bluetooth_adapter_available) {
144 is_bluetooth_adapter_available_ = is_bluetooth_adapter_available;
145 }
146
147 void GetAdapter(const device::BluetoothAdapterFactory::AdapterCallback&
148 callback) override {
149 last_get_adapter_callback_ = callback;
150 }
151
152 const device::BluetoothAdapterFactory::AdapterCallback
153 last_get_adapter_callback() {
154 return last_get_adapter_callback_;
155 }
156
157 const std::vector<uint8_t>* GetServiceDataForUUID(
158 const device::BluetoothUUID& service_uuid,
159 device::BluetoothDevice* bluetooth_device) override {
160 if (device::BluetoothUUID(kAdvertisingServiceUuid) == service_uuid) {
161 return reinterpret_cast<MockBluetoothDeviceWithServiceData*>(
162 bluetooth_device)
163 ->service_data();
164 }
165
166 return nullptr;
167 }
168
169 private:
170 bool is_bluetooth_adapter_available_;
171 device::BluetoothAdapterFactory::AdapterCallback last_get_adapter_callback_;
172 };
173
174 BleScannerTest()
175 : test_devices_(cryptauth::GenerateTestRemoteDevices(3)),
176 test_beacon_seeds_(CreateFakeBeaconSeeds()) {}
177
178 void SetUp() override {
179 test_delegate_ = new TestDelegate();
180 EXPECT_TRUE(test_delegate_->IsBluetoothAdapterAvailable());
181 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
182
183 mock_eid_generator_ = base::MakeUnique<cryptauth::MockEidGenerator>();
184 mock_eid_generator_->set_background_scan_filter(
185 CreateFakeBackgroundScanFilter());
186
187 mock_local_device_data_provider_ =
188 base::MakeUnique<MockLocalDeviceDataProvider>();
189 mock_local_device_data_provider_->SetPublicKey(
190 base::MakeUnique<std::string>(fake_local_public_key));
191 mock_local_device_data_provider_->SetBeaconSeeds(
192 base::MakeUnique<std::vector<cryptauth::BeaconSeed>>(
193 test_beacon_seeds_));
194
195 mock_adapter_ =
196 make_scoped_refptr(new NiceMock<device::MockBluetoothAdapter>());
197 stored_discovery_filter_.reset();
198 stored_discovery_callback_.Reset();
199 stored_discovery_errback_.Reset();
200 ON_CALL(*mock_adapter_, StartDiscoverySessionWithFilterRaw(_, _, _))
201 .WillByDefault(Invoke(
202 this, &BleScannerTest::SaveStartDiscoverySessionWithFilterArgs));
203 ON_CALL(*mock_adapter_, IsPowered()).WillByDefault(Return(true));
204
205 mock_discovery_session_ = nullptr;
206
207 ble_scanner_ = base::WrapUnique(new BleScanner(
208 base::WrapUnique(test_delegate_), mock_eid_generator_.get(),
209 mock_local_device_data_provider_.get()));
210
211 mock_observer_ = base::MakeUnique<MockBleScannerObserver>();
212 ble_scanner_->AddObserver(mock_observer_.get());
213 }
214
215 void SaveStartDiscoverySessionWithFilterArgs(
216 const device::BluetoothDiscoveryFilter* discovery_filter,
217 const device::BluetoothAdapter::DiscoverySessionCallback& callback,
218 const device::BluetoothAdapter::ErrorCallback& errback) {
219 stored_discovery_filter_ =
220 base::MakeUnique<device::BluetoothDiscoveryFilter>(
221 device::BluetoothTransport::BLUETOOTH_TRANSPORT_LE);
222 stored_discovery_filter_->CopyFrom(*discovery_filter);
223 stored_discovery_callback_ = callback;
224 stored_discovery_errback_ = errback;
225 }
226
227 void InvokeAdapterCallback() {
228 const device::BluetoothAdapterFactory::AdapterCallback
229 last_get_adapter_callback = test_delegate_->last_get_adapter_callback();
230 ASSERT_TRUE(last_get_adapter_callback);
231
232 // Because the adapter has just been initialized, the discovery session
233 // should not have been started yet.
234 EXPECT_FALSE(stored_discovery_filter_);
235 EXPECT_TRUE(stored_discovery_callback_.is_null());
236 EXPECT_TRUE(stored_discovery_errback_.is_null());
237
238 EXPECT_CALL(*mock_adapter_, AddObserver(ble_scanner_.get()));
239 last_get_adapter_callback.Run(mock_adapter_);
240
241 // Once the adapter callback is returned, a discovery session should be
242 // started via that adapter.
243 AssertDiscoverySessionRequested();
244 }
245
246 void AssertDiscoverySessionRequested() {
247 // First, ensure that the correct discovery filter was passed.
248 EXPECT_TRUE(stored_discovery_filter_);
249 EXPECT_EQ(device::BluetoothTransport::BLUETOOTH_TRANSPORT_LE,
250 stored_discovery_filter_->GetTransport());
251 int16_t observed_rssi;
252 ASSERT_TRUE(stored_discovery_filter_->GetRSSI(&observed_rssi));
253 EXPECT_EQ(kExpectedDiscoveryRSSI, observed_rssi);
254
255 // Now, ensure that both a callback and errback were passed.
256 EXPECT_FALSE(stored_discovery_callback_.is_null());
257 EXPECT_FALSE(stored_discovery_errback_.is_null());
258 }
259
260 void InvokeDiscoveryStartedCallback() {
261 EXPECT_FALSE(stored_discovery_callback_.is_null());
262
263 mock_discovery_session_ = new device::MockBluetoothDiscoverySession();
264 stored_discovery_callback_.Run(base::WrapUnique(mock_discovery_session_));
265 }
266
267 std::vector<cryptauth::RemoteDevice> test_devices_;
268 std::vector<cryptauth::BeaconSeed> test_beacon_seeds_;
269
270 std::unique_ptr<MockBleScannerObserver> mock_observer_;
271
272 TestDelegate* test_delegate_;
273 std::unique_ptr<cryptauth::MockEidGenerator> mock_eid_generator_;
274 std::unique_ptr<MockLocalDeviceDataProvider> mock_local_device_data_provider_;
275
276 scoped_refptr<NiceMock<device::MockBluetoothAdapter>> mock_adapter_;
277 device::MockBluetoothDiscoverySession* mock_discovery_session_;
278
279 std::unique_ptr<device::BluetoothDiscoveryFilter> stored_discovery_filter_;
280 device::BluetoothAdapter::DiscoverySessionCallback stored_discovery_callback_;
281 device::BluetoothAdapter::ErrorCallback stored_discovery_errback_;
282
283 std::unique_ptr<BleScanner> ble_scanner_;
284
285 private:
286 DISALLOW_COPY_AND_ASSIGN(BleScannerTest);
287 };
288
289 TEST_F(BleScannerTest, TestNoBluetoothAdapter) {
290 test_delegate_->set_is_bluetooth_adapter_available(false);
291 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
292 EXPECT_FALSE(
293 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
294 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
295 EXPECT_FALSE(mock_observer_->GetNumCalls());
296 }
297
298 TEST_F(BleScannerTest, TestNoLocalBeaconSeeds) {
299 mock_local_device_data_provider_->SetBeaconSeeds(nullptr);
300 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
301 EXPECT_FALSE(
302 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
303 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
304 EXPECT_FALSE(mock_observer_->GetNumCalls());
305 }
306
307 TEST_F(BleScannerTest, TestNoBackgroundScanFilter) {
308 mock_eid_generator_->set_background_scan_filter(nullptr);
309 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
310 EXPECT_FALSE(
311 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
312 EXPECT_FALSE(test_delegate_->last_get_adapter_callback());
313 EXPECT_FALSE(mock_observer_->GetNumCalls());
314 }
315
316 TEST_F(BleScannerTest, TestAdapterDoesNotInitialize) {
317 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
318 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
319 EXPECT_TRUE(test_delegate_->last_get_adapter_callback());
320
321 // Do not call the last GetAdapter() callback. The device should still be able
322 // to be unregistered.
323 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
324 EXPECT_FALSE(
325 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
326 EXPECT_FALSE(mock_observer_->GetNumCalls());
327 }
328
329 TEST_F(BleScannerTest, TestAdapterDoesNotInitialize_MultipleDevicesRegistered) {
330 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
331 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[1]));
332 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
333 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
334 EXPECT_TRUE(test_delegate_->last_get_adapter_callback());
335
336 // Do not call the last GetAdapter() callback. The devices should still be
337 // able to be unregistered.
338 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
339 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[1]));
340 EXPECT_FALSE(
341 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
342 EXPECT_FALSE(
343 ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
344 EXPECT_FALSE(mock_observer_->GetNumCalls());
345 }
346
347 TEST_F(BleScannerTest, TestDiscoverySessionFailsToStart) {
348 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
349 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
350
351 InvokeAdapterCallback();
352 stored_discovery_errback_.Run();
353
354 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
355 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
356 EXPECT_FALSE(mock_observer_->GetNumCalls());
357 }
358
359 TEST_F(BleScannerTest, TestDiscoveryStartsButNoDevicesFound) {
360 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
361 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
362
363 InvokeAdapterCallback();
364 InvokeDiscoveryStartedCallback();
365
366 // No devices found.
367
368 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
369 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
370 EXPECT_FALSE(mock_observer_->GetNumCalls());
371 }
372
373 TEST_F(BleScannerTest, TestDiscovery_NoServiceData) {
374 std::string empty_service_data = "";
375
376 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
377 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
378
379 InvokeAdapterCallback();
380 InvokeDiscoveryStartedCallback();
381
382 // Device with no service data connected. Service data is required to identify
383 // the advertising device.
384 MockBluetoothDeviceWithServiceData device1(mock_adapter_.get(),
385 empty_service_data);
386 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device1);
387 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
388 EXPECT_FALSE(mock_observer_->GetNumCalls());
389 }
390
391 TEST_F(BleScannerTest, TestDiscovery_ServiceDataTooShort) {
392 std::string short_service_data = "abc";
393 ASSERT_TRUE(short_service_data.size() < kMinNumBytesInServiceData);
394
395 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
396 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
397
398 InvokeAdapterCallback();
399 InvokeDiscoveryStartedCallback();
400
401 // Device with short service data connected. Service data of at least 4 bytes
402 // is required to identify the advertising device.
403 MockBluetoothDeviceWithServiceData device2(mock_adapter_.get(),
404 short_service_data);
405 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device2);
406 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
407 EXPECT_FALSE(mock_observer_->GetNumCalls());
408 }
409
410 TEST_F(BleScannerTest, TestDiscovery_LocalDeviceDataCannotBeFetched) {
411 std::string valid_service_data_for_other_device = "abcd";
412 ASSERT_TRUE(valid_service_data_for_other_device.size() >=
413 kMinNumBytesInServiceData);
414
415 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
416 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
417
418 InvokeAdapterCallback();
419 InvokeDiscoveryStartedCallback();
420
421 // Device with valid service data connected, but the local device data
422 // cannot be fetched.
423 mock_local_device_data_provider_->SetPublicKey(nullptr);
424 mock_local_device_data_provider_->SetBeaconSeeds(nullptr);
425 MockBluetoothDeviceWithServiceData device3(
426 mock_adapter_.get(), valid_service_data_for_other_device);
427 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device3);
428 EXPECT_FALSE(mock_eid_generator_->num_identify_calls());
429 EXPECT_FALSE(mock_observer_->GetNumCalls());
430 }
431
432 TEST_F(BleScannerTest, TestDiscovery_ScanSuccessfulButNoRegisteredDevice) {
433 std::string valid_service_data_for_other_device = "abcd";
434 ASSERT_TRUE(valid_service_data_for_other_device.size() >=
435 kMinNumBytesInServiceData);
436
437 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
438 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
439
440 InvokeAdapterCallback();
441 InvokeDiscoveryStartedCallback();
442
443 // Device with valid service data connected, but there was no registered
444 // device corresponding to the one that just connected.
445 mock_local_device_data_provider_->SetPublicKey(
446 base::MakeUnique<std::string>(fake_local_public_key));
447 mock_local_device_data_provider_->SetBeaconSeeds(
448 base::MakeUnique<std::vector<cryptauth::BeaconSeed>>(test_beacon_seeds_));
449 MockBluetoothDeviceWithServiceData device4(
450 mock_adapter_.get(), valid_service_data_for_other_device);
451 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device4);
452 EXPECT_EQ(1, mock_eid_generator_->num_identify_calls());
453 EXPECT_FALSE(mock_observer_->GetNumCalls());
454 }
455
456 TEST_F(BleScannerTest, TestDiscovery_Success) {
457 std::string valid_service_data_for_registered_device = "abcde";
458 ASSERT_TRUE(valid_service_data_for_registered_device.size() >=
459 kMinNumBytesInServiceData);
460
461 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
462 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
463
464 InvokeAdapterCallback();
465 InvokeDiscoveryStartedCallback();
466
467 // Registered device connects.
468 MockBluetoothDeviceWithServiceData device5(
469 mock_adapter_.get(), valid_service_data_for_registered_device);
470 mock_eid_generator_->set_identified_device(&test_devices_[0]);
471 ble_scanner_->DeviceAdded(mock_adapter_.get(), &device5);
472 EXPECT_EQ(1, mock_eid_generator_->num_identify_calls());
473 EXPECT_EQ(1, mock_observer_->GetNumCalls());
474 EXPECT_EQ(1, static_cast<int>(mock_observer_->bluetooth_devices().size()));
475 EXPECT_EQ(&device5, mock_observer_->bluetooth_devices()[0]);
476 EXPECT_EQ(1, static_cast<int>(mock_observer_->remote_devices().size()));
477 EXPECT_EQ(test_devices_[0], mock_observer_->remote_devices()[0]);
478
479 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
480 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
481 EXPECT_EQ(1, mock_eid_generator_->num_identify_calls());
482 EXPECT_EQ(1, mock_observer_->GetNumCalls());
483 }
484
485 TEST_F(BleScannerTest, TestDiscovery_MultipleObservers) {
486 MockBleScannerObserver extra_observer;
487 ble_scanner_->AddObserver(&extra_observer);
488
489 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
490 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
491
492 InvokeAdapterCallback();
493 InvokeDiscoveryStartedCallback();
494
495 MockBluetoothDeviceWithServiceData mock_bluetooth_device(mock_adapter_.get(),
496 "fakeServiceData");
497 mock_eid_generator_->set_identified_device(&test_devices_[0]);
498 ble_scanner_->DeviceAdded(mock_adapter_.get(), &mock_bluetooth_device);
499
500 EXPECT_EQ(1, mock_observer_->GetNumCalls());
501 EXPECT_EQ(1, static_cast<int>(mock_observer_->bluetooth_devices().size()));
502 EXPECT_EQ(&mock_bluetooth_device, mock_observer_->bluetooth_devices()[0]);
503 EXPECT_EQ(1, static_cast<int>(mock_observer_->remote_devices().size()));
504 EXPECT_EQ(test_devices_[0], mock_observer_->remote_devices()[0]);
505
506 EXPECT_EQ(1, extra_observer.GetNumCalls());
507 EXPECT_EQ(1, static_cast<int>(extra_observer.bluetooth_devices().size()));
508 EXPECT_EQ(&mock_bluetooth_device, extra_observer.bluetooth_devices()[0]);
509 EXPECT_EQ(1, static_cast<int>(extra_observer.remote_devices().size()));
510 EXPECT_EQ(test_devices_[0], extra_observer.remote_devices()[0]);
511
512 // Now, unregister both observers.
513 ble_scanner_->RemoveObserver(mock_observer_.get());
514 ble_scanner_->RemoveObserver(&extra_observer);
515
516 // Now, simulate another scan being received. The observers should not be
517 // notified since they are unregistered, so they should still have a call
518 // count of 1.
519 ble_scanner_->DeviceAdded(mock_adapter_.get(), &mock_bluetooth_device);
520 EXPECT_EQ(1, mock_observer_->GetNumCalls());
521 EXPECT_EQ(1, extra_observer.GetNumCalls());
522
523 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
524 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
525 }
526
527 TEST_F(BleScannerTest, TestRegistrationLimit) {
528 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
529 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
530 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[1]));
531 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
532
533 // Attempt to register another device. Registration should fail since the
534 // maximum number of devices have already been registered.
535 ASSERT_EQ(2, kMaxConcurrentAdvertisements);
536 EXPECT_FALSE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[2]));
537 EXPECT_FALSE(
538 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
539
540 // Unregistering a device which is not registered should also return false.
541 EXPECT_FALSE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[2]));
542 EXPECT_FALSE(
543 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
544
545 // Unregister device 0.
546 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
547 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
548 EXPECT_FALSE(
549 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
550
551 // Now, device 2 can be registered.
552 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[2]));
553 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
554
555 // Now, unregister the devices.
556 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
557 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[1]));
558 EXPECT_FALSE(
559 ble_scanner_->IsDeviceRegistered(test_devices_[1].GetDeviceId()));
560
561 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
562 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[2]));
563 EXPECT_FALSE(
564 ble_scanner_->IsDeviceRegistered(test_devices_[2].GetDeviceId()));
565 }
566
567 TEST_F(BleScannerTest, TestAdapterPoweredChanged) {
568 // This test starts with the adapter powered on, then turns power off before
569 // discovery starts, then turns power back on and allows discovery to
570 // complete, then turns power back off again, and finally turns it back on to
571 // complete another discovery session.
572 EXPECT_CALL(*mock_adapter_, IsPowered())
573 .WillOnce(Return(true))
574 .WillOnce(Return(false))
575 .WillOnce(Return(true))
576 .WillOnce(Return(false))
577 .WillOnce(Return(true));
578
579 EXPECT_TRUE(ble_scanner_->RegisterScanFilterForDevice(test_devices_[0]));
580 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
581 InvokeAdapterCallback();
582
583 // The discovery session should have been requested but not yet initialized.
584 EXPECT_TRUE(stored_discovery_filter_.get());
585 EXPECT_FALSE(mock_discovery_session_);
586
587 // Turn the adapter off before the discovery session starts.
588 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), false);
589
590 // Turn the adapter back on, and finish initializing discovery this time.
591 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), true);
592 InvokeDiscoveryStartedCallback();
593
594 // The session should have been started.
595 device::MockBluetoothDiscoverySession* session1 = mock_discovery_session_;
596 EXPECT_NE(nullptr, session1);
597
598 // Now turn the adapter off again.
599 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), false);
600
601 // Turn the adapter back on.
602 ble_scanner_->AdapterPoweredChanged(mock_adapter_.get(), true);
603 InvokeDiscoveryStartedCallback();
604
605 // A new session should have started, so the session objects should not be the
606 // same.
607 device::MockBluetoothDiscoverySession* session2 = mock_discovery_session_;
608 EXPECT_NE(nullptr, session2);
609 EXPECT_NE(session1, session2);
610
611 // Unregister device.
612 EXPECT_TRUE(ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
613 EXPECT_TRUE(ble_scanner_->UnregisterScanFilterForDevice(test_devices_[0]));
614 EXPECT_FALSE(
615 ble_scanner_->IsDeviceRegistered(test_devices_[0].GetDeviceId()));
616 }
617
618 } // namespace tether
619
620 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/components/tether/ble_scanner.cc ('k') | chromeos/components/tether/local_device_data_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698