OLD | NEW |
(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 |
OLD | NEW |