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 |