| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/components/tether/ble_advertiser.h" | 5 #include "chromeos/components/tether/ble_advertiser.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chromeos/components/tether/ble_constants.h" | 8 #include "chromeos/components/tether/ble_constants.h" |
| 9 #include "chromeos/components/tether/mock_local_device_data_provider.h" | 9 #include "chromeos/components/tether/mock_local_device_data_provider.h" |
| 10 #include "components/cryptauth/mock_eid_generator.h" | 10 #include "components/cryptauth/mock_eid_generator.h" |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 seed2.set_start_time_millis(3000L); | 105 seed2.set_start_time_millis(3000L); |
| 106 | 106 |
| 107 std::vector<cryptauth::BeaconSeed> seeds = {seed1, seed2}; | 107 std::vector<cryptauth::BeaconSeed> seeds = {seed1, seed2}; |
| 108 return seeds; | 108 return seeds; |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 } // namespace | 111 } // namespace |
| 112 | 112 |
| 113 class BleAdvertiserTest : public testing::Test { | 113 class BleAdvertiserTest : public testing::Test { |
| 114 protected: | 114 protected: |
| 115 class TestBleAdvertisementUnregisterHandler |
| 116 : public BleAdvertiser::BleAdvertisementUnregisterHandler { |
| 117 public: |
| 118 TestBleAdvertisementUnregisterHandler() |
| 119 : num_advertisements_unregistered_(0) {} |
| 120 ~TestBleAdvertisementUnregisterHandler() {} |
| 121 |
| 122 size_t num_advertisements_unregistered() { |
| 123 return num_advertisements_unregistered_; |
| 124 } |
| 125 |
| 126 // BleAdvertiser::BleAdvertisementUnregisterHandler: |
| 127 void OnAdvertisementUnregisterSuccess() override { |
| 128 num_advertisements_unregistered_++; |
| 129 } |
| 130 |
| 131 void OnAdvertisementUnregisterFailure( |
| 132 device::BluetoothAdvertisement::ErrorCode error_code) override {} |
| 133 |
| 134 private: |
| 135 size_t num_advertisements_unregistered_; |
| 136 }; |
| 137 |
| 115 BleAdvertiserTest() | 138 BleAdvertiserTest() |
| 116 : fake_devices_(cryptauth::GenerateTestRemoteDevices(3)), | 139 : fake_devices_(cryptauth::GenerateTestRemoteDevices(3)), |
| 117 fake_advertisements_(GenerateFakeAdvertisements()) {} | 140 fake_advertisements_(GenerateFakeAdvertisements()) {} |
| 118 | 141 |
| 119 void SetUp() override { | 142 void SetUp() override { |
| 120 individual_advertisements_.clear(); | 143 individual_advertisements_.clear(); |
| 121 register_advertisement_args_.clear(); | 144 register_advertisement_args_.clear(); |
| 122 | 145 |
| 123 mock_adapter_ = make_scoped_refptr( | 146 mock_adapter_ = make_scoped_refptr( |
| 124 new StrictMock<MockBluetoothAdapterWithAdvertisements>()); | 147 new StrictMock<MockBluetoothAdapterWithAdvertisements>()); |
| 125 ON_CALL(*mock_adapter_, AddObserver(_)) | 148 ON_CALL(*mock_adapter_, AddObserver(_)) |
| 126 .WillByDefault(Invoke(this, &BleAdvertiserTest::OnAdapterAddObserver)); | 149 .WillByDefault(Invoke(this, &BleAdvertiserTest::OnAdapterAddObserver)); |
| 127 ON_CALL(*mock_adapter_, RemoveObserver(_)) | 150 ON_CALL(*mock_adapter_, RemoveObserver(_)) |
| 128 .WillByDefault( | 151 .WillByDefault( |
| 129 Invoke(this, &BleAdvertiserTest::OnAdapterRemoveObserver)); | 152 Invoke(this, &BleAdvertiserTest::OnAdapterRemoveObserver)); |
| 130 ON_CALL(*mock_adapter_, IsPowered()).WillByDefault(Return(true)); | 153 ON_CALL(*mock_adapter_, IsPowered()).WillByDefault(Return(true)); |
| 131 ON_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)) | 154 ON_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)) |
| 132 .WillByDefault( | 155 .WillByDefault( |
| 133 Invoke(this, &BleAdvertiserTest::OnAdapterRegisterAdvertisement)); | 156 Invoke(this, &BleAdvertiserTest::OnAdapterRegisterAdvertisement)); |
| 134 | 157 |
| 158 test_unregister_handler_ = new TestBleAdvertisementUnregisterHandler(); |
| 159 |
| 135 mock_eid_generator_ = base::MakeUnique<cryptauth::MockEidGenerator>(); | 160 mock_eid_generator_ = base::MakeUnique<cryptauth::MockEidGenerator>(); |
| 136 | 161 |
| 137 mock_seed_fetcher_ = | 162 mock_seed_fetcher_ = |
| 138 base::MakeUnique<cryptauth::MockRemoteBeaconSeedFetcher>(); | 163 base::MakeUnique<cryptauth::MockRemoteBeaconSeedFetcher>(); |
| 139 std::vector<cryptauth::BeaconSeed> device_0_beacon_seeds = | 164 std::vector<cryptauth::BeaconSeed> device_0_beacon_seeds = |
| 140 CreateFakeBeaconSeedsForDevice(fake_devices_[0]); | 165 CreateFakeBeaconSeedsForDevice(fake_devices_[0]); |
| 141 std::vector<cryptauth::BeaconSeed> device_1_beacon_seeds = | 166 std::vector<cryptauth::BeaconSeed> device_1_beacon_seeds = |
| 142 CreateFakeBeaconSeedsForDevice(fake_devices_[1]); | 167 CreateFakeBeaconSeedsForDevice(fake_devices_[1]); |
| 143 std::vector<cryptauth::BeaconSeed> device_2_beacon_seeds = | 168 std::vector<cryptauth::BeaconSeed> device_2_beacon_seeds = |
| 144 CreateFakeBeaconSeedsForDevice(fake_devices_[2]); | 169 CreateFakeBeaconSeedsForDevice(fake_devices_[2]); |
| 145 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[0], | 170 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[0], |
| 146 &device_0_beacon_seeds); | 171 &device_0_beacon_seeds); |
| 147 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[1], | 172 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[1], |
| 148 &device_1_beacon_seeds); | 173 &device_1_beacon_seeds); |
| 149 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[2], | 174 mock_seed_fetcher_->SetSeedsForDevice(fake_devices_[2], |
| 150 &device_2_beacon_seeds); | 175 &device_2_beacon_seeds); |
| 151 | 176 |
| 152 mock_local_data_provider_ = base::MakeUnique<MockLocalDeviceDataProvider>(); | 177 mock_local_data_provider_ = base::MakeUnique<MockLocalDeviceDataProvider>(); |
| 153 mock_local_data_provider_->SetPublicKey( | 178 mock_local_data_provider_->SetPublicKey( |
| 154 base::MakeUnique<std::string>(fake_public_key)); | 179 base::MakeUnique<std::string>(fake_public_key)); |
| 155 | 180 |
| 156 ble_advertiser_ = base::WrapUnique(new BleAdvertiser( | 181 ble_advertiser_ = base::WrapUnique(new BleAdvertiser( |
| 157 mock_adapter_, mock_eid_generator_.get(), mock_seed_fetcher_.get(), | 182 mock_adapter_, base::WrapUnique(test_unregister_handler_), |
| 183 mock_eid_generator_.get(), mock_seed_fetcher_.get(), |
| 158 mock_local_data_provider_.get())); | 184 mock_local_data_provider_.get())); |
| 159 } | 185 } |
| 160 | 186 |
| 161 void TearDown() override { | 187 void TearDown() override { |
| 162 // Delete the advertiser to ensure that cleanup happens properly. | 188 // Delete the advertiser to ensure that cleanup happens properly. |
| 163 ble_advertiser_.reset(); | 189 ble_advertiser_.reset(); |
| 164 | 190 |
| 165 // All observers should have been removed. | 191 // All observers should have been removed. |
| 166 EXPECT_FALSE(individual_advertisements_.size()); | 192 EXPECT_FALSE(individual_advertisements_.size()); |
| 167 } | 193 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 void ReleaseAdvertisement( | 251 void ReleaseAdvertisement( |
| 226 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { | 252 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { |
| 227 individual_advertisement->AdvertisementReleased( | 253 individual_advertisement->AdvertisementReleased( |
| 228 individual_advertisement->advertisement_.get()); | 254 individual_advertisement->advertisement_.get()); |
| 229 } | 255 } |
| 230 | 256 |
| 231 std::unique_ptr<BleAdvertiser> ble_advertiser_; | 257 std::unique_ptr<BleAdvertiser> ble_advertiser_; |
| 232 | 258 |
| 233 scoped_refptr<StrictMock<MockBluetoothAdapterWithAdvertisements>> | 259 scoped_refptr<StrictMock<MockBluetoothAdapterWithAdvertisements>> |
| 234 mock_adapter_; | 260 mock_adapter_; |
| 261 TestBleAdvertisementUnregisterHandler* test_unregister_handler_; |
| 235 std::unique_ptr<cryptauth::MockEidGenerator> mock_eid_generator_; | 262 std::unique_ptr<cryptauth::MockEidGenerator> mock_eid_generator_; |
| 236 std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_; | 263 std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_; |
| 237 std::unique_ptr<MockLocalDeviceDataProvider> mock_local_data_provider_; | 264 std::unique_ptr<MockLocalDeviceDataProvider> mock_local_data_provider_; |
| 238 | 265 |
| 239 std::vector<scoped_refptr<RegisterAdvertisementArgs>> | 266 std::vector<scoped_refptr<RegisterAdvertisementArgs>> |
| 240 register_advertisement_args_; | 267 register_advertisement_args_; |
| 241 std::vector<BleAdvertiser::IndividualAdvertisement*> | 268 std::vector<BleAdvertiser::IndividualAdvertisement*> |
| 242 individual_advertisements_; | 269 individual_advertisements_; |
| 243 | 270 |
| 244 const std::vector<cryptauth::RemoteDevice> fake_devices_; | 271 const std::vector<cryptauth::RemoteDevice> fake_devices_; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 368 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); |
| 342 VerifyServiceDataMatches(register_advertisement_args_[0], | 369 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 343 individual_advertisements_[0]); | 370 individual_advertisements_[0]); |
| 344 | 371 |
| 345 InvokeCallback(register_advertisement_args_[0]); | 372 InvokeCallback(register_advertisement_args_[0]); |
| 346 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 373 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 347 | 374 |
| 348 // Now, unregister. | 375 // Now, unregister. |
| 349 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 376 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 350 EXPECT_FALSE(individual_advertisements_.size()); | 377 EXPECT_FALSE(individual_advertisements_.size()); |
| 378 EXPECT_EQ(1u, test_unregister_handler_->num_advertisements_unregistered()); |
| 351 } | 379 } |
| 352 | 380 |
| 353 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully_TwoDevices) { | 381 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully_TwoDevices) { |
| 354 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(2); | 382 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(2); |
| 355 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(2); | 383 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(2); |
| 356 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); | 384 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); |
| 357 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); | 385 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); |
| 358 | 386 |
| 359 // First device. | 387 // First device. |
| 360 mock_eid_generator_->set_advertisement( | 388 mock_eid_generator_->set_advertisement( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 379 EXPECT_EQ(static_cast<size_t>(2), individual_advertisements_.size()); | 407 EXPECT_EQ(static_cast<size_t>(2), individual_advertisements_.size()); |
| 380 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); | 408 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); |
| 381 VerifyServiceDataMatches(register_advertisement_args_[1], | 409 VerifyServiceDataMatches(register_advertisement_args_[1], |
| 382 individual_advertisements_[1]); | 410 individual_advertisements_[1]); |
| 383 | 411 |
| 384 InvokeCallback(register_advertisement_args_[1]); | 412 InvokeCallback(register_advertisement_args_[1]); |
| 385 VerifyAdvertisementHasStarted(individual_advertisements_[1]); | 413 VerifyAdvertisementHasStarted(individual_advertisements_[1]); |
| 386 | 414 |
| 387 // Now, unregister. | 415 // Now, unregister. |
| 388 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 416 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 417 EXPECT_EQ(1u, test_unregister_handler_->num_advertisements_unregistered()); |
| 418 |
| 389 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[1])); | 419 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[1])); |
| 420 EXPECT_EQ(2u, test_unregister_handler_->num_advertisements_unregistered()); |
| 421 |
| 390 EXPECT_FALSE(individual_advertisements_.size()); | 422 EXPECT_FALSE(individual_advertisements_.size()); |
| 391 } | 423 } |
| 392 | 424 |
| 393 TEST_F(BleAdvertiserTest, TooManyDevicesRegistered) { | 425 TEST_F(BleAdvertiserTest, TooManyDevicesRegistered) { |
| 394 ASSERT_EQ(2, kMaxConcurrentAdvertisements); | 426 ASSERT_EQ(2, kMaxConcurrentAdvertisements); |
| 395 | 427 |
| 396 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(3); | 428 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(3); |
| 397 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(3); | 429 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(3); |
| 398 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(3); | 430 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(3); |
| 399 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(3); | 431 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(3); |
| 400 | 432 |
| 401 mock_eid_generator_->set_advertisement( | 433 mock_eid_generator_->set_advertisement( |
| 402 base::MakeUnique<cryptauth::EidGenerator::DataWithTimestamp>( | 434 base::MakeUnique<cryptauth::EidGenerator::DataWithTimestamp>( |
| 403 fake_advertisements_[0])); | 435 fake_advertisements_[0])); |
| 404 | 436 |
| 405 // Should succeed for the first two devices. | 437 // Should succeed for the first two devices. |
| 406 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 438 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 407 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[1])); | 439 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[1])); |
| 408 | 440 |
| 409 // Should fail on the third device. | 441 // Should fail on the third device. |
| 410 EXPECT_FALSE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[2])); | 442 EXPECT_FALSE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[2])); |
| 411 | 443 |
| 412 // Now, unregister one; registering the third device should succeed at this | 444 // Now, stop advertising to one; registering the third device should succeed |
| 413 // point. | 445 // at this point. |
| 414 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 446 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 447 |
| 448 // Because the advertisement was never registered to begin with, it also |
| 449 // should never have been unregistered. |
| 450 EXPECT_EQ(0u, test_unregister_handler_->num_advertisements_unregistered()); |
| 451 |
| 415 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[2])); | 452 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[2])); |
| 416 } | 453 } |
| 417 | 454 |
| 418 TEST_F(BleAdvertiserTest, AdapterPowerChange_StartsOffThenTurnsOn) { | 455 TEST_F(BleAdvertiserTest, AdapterPowerChange_StartsOffThenTurnsOn) { |
| 419 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); | 456 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); |
| 420 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); | 457 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); |
| 421 EXPECT_CALL(*mock_adapter_, IsPowered()) | 458 EXPECT_CALL(*mock_adapter_, IsPowered()) |
| 422 .Times(2) | 459 .Times(2) |
| 423 .WillOnce(Return(false)) // First, the adapter is powered off. | 460 .WillOnce(Return(false)) // First, the adapter is powered off. |
| 424 .WillOnce(Return(true)); // Then, the adapter is powered back on. | 461 .WillOnce(Return(true)); // Then, the adapter is powered back on. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 ReleaseAdvertisement(individual_advertisements_[0]); | 505 ReleaseAdvertisement(individual_advertisements_[0]); |
| 469 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); | 506 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); |
| 470 VerifyServiceDataMatches(register_advertisement_args_[1], | 507 VerifyServiceDataMatches(register_advertisement_args_[1], |
| 471 individual_advertisements_[0]); | 508 individual_advertisements_[0]); |
| 472 | 509 |
| 473 InvokeCallback(register_advertisement_args_[1]); | 510 InvokeCallback(register_advertisement_args_[1]); |
| 474 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 511 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 475 | 512 |
| 476 // Now, unregister. | 513 // Now, unregister. |
| 477 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 514 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 515 EXPECT_EQ(1u, test_unregister_handler_->num_advertisements_unregistered()); |
| 478 EXPECT_FALSE(individual_advertisements_.size()); | 516 EXPECT_FALSE(individual_advertisements_.size()); |
| 479 } | 517 } |
| 480 | 518 |
| 481 } // namespace tether | 519 } // namespace tether |
| 482 | 520 |
| 483 } // namespace cryptauth | 521 } // namespace cryptauth |
| OLD | NEW |