| 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/bind.h" |
| 8 #include "base/callback_forward.h" |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "chromeos/components/tether/ble_constants.h" | 10 #include "chromeos/components/tether/ble_constants.h" |
| 9 #include "components/cryptauth/mock_foreground_eid_generator.h" | 11 #include "components/cryptauth/mock_foreground_eid_generator.h" |
| 10 #include "components/cryptauth/mock_local_device_data_provider.h" | 12 #include "components/cryptauth/mock_local_device_data_provider.h" |
| 11 #include "components/cryptauth/mock_remote_beacon_seed_fetcher.h" | 13 #include "components/cryptauth/mock_remote_beacon_seed_fetcher.h" |
| 12 #include "components/cryptauth/proto/cryptauth_api.pb.h" | 14 #include "components/cryptauth/proto/cryptauth_api.pb.h" |
| 13 #include "components/cryptauth/remote_device_test_util.h" | 15 #include "components/cryptauth/remote_device_test_util.h" |
| 16 #include "device/bluetooth/bluetooth_advertisement.h" |
| 14 #include "device/bluetooth/test/mock_bluetooth_adapter.h" | 17 #include "device/bluetooth/test/mock_bluetooth_adapter.h" |
| 15 #include "device/bluetooth/test/mock_bluetooth_advertisement.h" | |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 19 |
| 18 using testing::Invoke; | 20 using testing::Invoke; |
| 19 using testing::Return; | 21 using testing::Return; |
| 20 using testing::StrictMock; | 22 using testing::StrictMock; |
| 21 using testing::_; | 23 using testing::_; |
| 22 | 24 |
| 23 namespace chromeos { | 25 namespace chromeos { |
| 24 | 26 |
| 25 namespace tether { | 27 namespace tether { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 RegisterAdvertisementWithArgsStruct( | 75 RegisterAdvertisementWithArgsStruct( |
| 74 make_scoped_refptr(new RegisterAdvertisementArgs( | 76 make_scoped_refptr(new RegisterAdvertisementArgs( |
| 75 *advertisement_data->service_data(), | 77 *advertisement_data->service_data(), |
| 76 *advertisement_data->service_uuids(), callback, errback))); | 78 *advertisement_data->service_uuids(), callback, errback))); |
| 77 } | 79 } |
| 78 | 80 |
| 79 protected: | 81 protected: |
| 80 ~MockBluetoothAdapterWithAdvertisements() override {} | 82 ~MockBluetoothAdapterWithAdvertisements() override {} |
| 81 }; | 83 }; |
| 82 | 84 |
| 85 class FakeBluetoothAdvertisement : public device::BluetoothAdvertisement { |
| 86 public: |
| 87 // |unregister_callback| should be called with the success callback passed to |
| 88 // Unregister() whenever an Unregister() call occurs. |
| 89 FakeBluetoothAdvertisement( |
| 90 const base::Callback< |
| 91 void(const device::BluetoothAdvertisement::SuccessCallback&)>& |
| 92 unregister_callback) |
| 93 : unregister_callback_(unregister_callback) {} |
| 94 |
| 95 // BluetoothAdvertisement: |
| 96 void Unregister( |
| 97 const device::BluetoothAdvertisement::SuccessCallback& success_callback, |
| 98 const device::BluetoothAdvertisement::ErrorCallback& error_callback) |
| 99 override { |
| 100 unregister_callback_.Run(success_callback); |
| 101 } |
| 102 |
| 103 private: |
| 104 ~FakeBluetoothAdvertisement() override {} |
| 105 |
| 106 base::Callback<void(const device::BluetoothAdvertisement::SuccessCallback&)> |
| 107 unregister_callback_; |
| 108 |
| 109 DISALLOW_COPY_AND_ASSIGN(FakeBluetoothAdvertisement); |
| 110 }; |
| 111 |
| 83 std::vector<cryptauth::DataWithTimestamp> GenerateFakeAdvertisements() { | 112 std::vector<cryptauth::DataWithTimestamp> GenerateFakeAdvertisements() { |
| 84 cryptauth::DataWithTimestamp advertisement1("advertisement1", 1000L, 2000L); | 113 cryptauth::DataWithTimestamp advertisement1("advertisement1", 1000L, 2000L); |
| 85 cryptauth::DataWithTimestamp advertisement2("advertisement2", 2000L, 3000L); | 114 cryptauth::DataWithTimestamp advertisement2("advertisement2", 2000L, 3000L); |
| 86 | 115 |
| 87 std::vector<cryptauth::DataWithTimestamp> advertisements = {advertisement1, | 116 std::vector<cryptauth::DataWithTimestamp> advertisements = {advertisement1, |
| 88 advertisement2}; | 117 advertisement2}; |
| 89 return advertisements; | 118 return advertisements; |
| 90 } | 119 } |
| 91 | 120 |
| 92 std::vector<cryptauth::BeaconSeed> CreateFakeBeaconSeedsForDevice( | 121 std::vector<cryptauth::BeaconSeed> CreateFakeBeaconSeedsForDevice( |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 ble_advertiser_ = base::WrapUnique(new BleAdvertiser( | 185 ble_advertiser_ = base::WrapUnique(new BleAdvertiser( |
| 157 mock_adapter_, std::move(eid_generator), mock_seed_fetcher_.get(), | 186 mock_adapter_, std::move(eid_generator), mock_seed_fetcher_.get(), |
| 158 mock_local_data_provider_.get())); | 187 mock_local_data_provider_.get())); |
| 159 } | 188 } |
| 160 | 189 |
| 161 void TearDown() override { | 190 void TearDown() override { |
| 162 // Delete the advertiser to ensure that cleanup happens properly. | 191 // Delete the advertiser to ensure that cleanup happens properly. |
| 163 ble_advertiser_.reset(); | 192 ble_advertiser_.reset(); |
| 164 | 193 |
| 165 // All observers should have been removed. | 194 // All observers should have been removed. |
| 166 EXPECT_FALSE(individual_advertisements_.size()); | 195 EXPECT_TRUE(individual_advertisements_.empty()); |
| 167 } | 196 } |
| 168 | 197 |
| 169 void OnAdapterAddObserver(device::BluetoothAdapter::Observer* observer) { | 198 void OnAdapterAddObserver(device::BluetoothAdapter::Observer* observer) { |
| 170 individual_advertisements_.push_back( | 199 individual_advertisements_.push_back( |
| 171 reinterpret_cast<BleAdvertiser::IndividualAdvertisement*>(observer)); | 200 reinterpret_cast<BleAdvertiser::IndividualAdvertisement*>(observer)); |
| 172 } | 201 } |
| 173 | 202 |
| 174 void OnAdapterRemoveObserver(device::BluetoothAdapter::Observer* observer) { | 203 void OnAdapterRemoveObserver(device::BluetoothAdapter::Observer* observer) { |
| 175 individual_advertisements_.erase(std::find( | 204 individual_advertisements_.erase(std::find( |
| 176 individual_advertisements_.begin(), individual_advertisements_.end(), | 205 individual_advertisements_.begin(), individual_advertisements_.end(), |
| 177 reinterpret_cast<BleAdvertiser::IndividualAdvertisement*>(observer))); | 206 reinterpret_cast<BleAdvertiser::IndividualAdvertisement*>(observer))); |
| 178 } | 207 } |
| 179 | 208 |
| 180 void OnAdapterRegisterAdvertisement( | 209 void OnAdapterRegisterAdvertisement( |
| 181 scoped_refptr<RegisterAdvertisementArgs> args) { | 210 scoped_refptr<RegisterAdvertisementArgs> args) { |
| 182 register_advertisement_args_.push_back(args); | 211 register_advertisement_args_.push_back(args); |
| 183 } | 212 } |
| 184 | 213 |
| 185 void VerifyServiceDataMatches( | 214 void VerifyServiceDataMatches( |
| 186 scoped_refptr<RegisterAdvertisementArgs> args, | 215 scoped_refptr<RegisterAdvertisementArgs> args, |
| 187 const BleAdvertiser::IndividualAdvertisement* advertisement) { | 216 const BleAdvertiser::IndividualAdvertisement* advertisement) { |
| 188 // First, verify that the service UUID list is correct. | 217 // First, verify that the service UUID list is correct. |
| 189 EXPECT_EQ(static_cast<size_t>(1), args->service_uuids.size()); | 218 EXPECT_EQ(1u, args->service_uuids.size()); |
| 190 EXPECT_EQ(std::string(kAdvertisingServiceUuid), args->service_uuids[0]); | 219 EXPECT_EQ(std::string(kAdvertisingServiceUuid), args->service_uuids[0]); |
| 191 | 220 |
| 192 // Then, verify that the service data is correct. | 221 // Then, verify that the service data is correct. |
| 193 EXPECT_EQ(static_cast<size_t>(1), args->service_data.size()); | 222 EXPECT_EQ(1u, args->service_data.size()); |
| 194 std::vector<uint8_t> service_data_from_args = | 223 std::vector<uint8_t> service_data_from_args = |
| 195 args->service_data[std::string(kAdvertisingServiceUuid)]; | 224 args->service_data[std::string(kAdvertisingServiceUuid)]; |
| 196 EXPECT_EQ(service_data_from_args.size(), | 225 EXPECT_EQ(service_data_from_args.size(), |
| 197 advertisement->advertisement_data_->data.size() + 1); | 226 advertisement->advertisement_data_->data.size() + 1); |
| 198 EXPECT_FALSE(memcmp(advertisement->advertisement_data_->data.data(), | 227 EXPECT_FALSE(memcmp(advertisement->advertisement_data_->data.data(), |
| 199 service_data_from_args.data(), | 228 service_data_from_args.data(), |
| 200 args->service_data.size())); | 229 args->service_data.size())); |
| 201 EXPECT_EQ(kInvertedConnectionFlag, | 230 EXPECT_EQ(kInvertedConnectionFlag, |
| 202 service_data_from_args[service_data_from_args.size() - 1]); | 231 service_data_from_args[service_data_from_args.size() - 1]); |
| 203 } | 232 } |
| 204 | 233 |
| 205 void VerifyAdvertisementHasNotStarted( | 234 void VerifyAdvertisementHasNotStarted( |
| 206 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { | 235 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { |
| 207 EXPECT_FALSE(individual_advertisement->advertisement_.get()); | 236 EXPECT_FALSE(individual_advertisement->advertisement_.get()); |
| 208 } | 237 } |
| 209 | 238 |
| 210 void VerifyAdvertisementHasStarted( | 239 void VerifyAdvertisementHasStarted( |
| 211 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { | 240 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { |
| 212 EXPECT_TRUE(individual_advertisement->advertisement_.get()); | 241 EXPECT_TRUE(individual_advertisement->advertisement_.get()); |
| 213 } | 242 } |
| 214 | 243 |
| 215 void InvokeErrback(scoped_refptr<RegisterAdvertisementArgs> args) { | 244 void InvokeErrback(scoped_refptr<RegisterAdvertisementArgs> args) { |
| 216 args->errback.Run(device::BluetoothAdvertisement::ErrorCode:: | 245 args->errback.Run(device::BluetoothAdvertisement::ErrorCode:: |
| 217 INVALID_ADVERTISEMENT_ERROR_CODE); | 246 INVALID_ADVERTISEMENT_ERROR_CODE); |
| 218 } | 247 } |
| 219 | 248 |
| 220 void InvokeCallback(scoped_refptr<RegisterAdvertisementArgs> args) { | 249 void InvokeCallback(scoped_refptr<RegisterAdvertisementArgs> args) { |
| 221 args->callback.Run( | 250 args->callback.Run(make_scoped_refptr(new FakeBluetoothAdvertisement( |
| 222 make_scoped_refptr(new device::MockBluetoothAdvertisement)); | 251 base::Bind(&BleAdvertiserTest::OnAdvertisementUnregistered, |
| 252 base::Unretained(this))))); |
| 223 } | 253 } |
| 224 | 254 |
| 225 void ReleaseAdvertisement( | 255 void ReleaseAdvertisement( |
| 226 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { | 256 BleAdvertiser::IndividualAdvertisement* individual_advertisement) { |
| 227 individual_advertisement->AdvertisementReleased( | 257 individual_advertisement->AdvertisementReleased( |
| 228 individual_advertisement->advertisement_.get()); | 258 individual_advertisement->advertisement_.get()); |
| 229 } | 259 } |
| 230 | 260 |
| 261 void OnAdvertisementUnregistered( |
| 262 const device::BluetoothAdvertisement::SuccessCallback& success_callback) { |
| 263 unregister_callbacks_.push_back(success_callback); |
| 264 } |
| 265 |
| 266 void InvokeLastUnregisterCallbackAndRemove() { |
| 267 DCHECK(!unregister_callbacks_.empty()); |
| 268 unregister_callbacks_[unregister_callbacks_.size() - 1].Run(); |
| 269 unregister_callbacks_.erase(unregister_callbacks_.begin() + |
| 270 unregister_callbacks_.size() - 1); |
| 271 } |
| 272 |
| 231 std::unique_ptr<BleAdvertiser> ble_advertiser_; | 273 std::unique_ptr<BleAdvertiser> ble_advertiser_; |
| 232 | 274 |
| 233 scoped_refptr<StrictMock<MockBluetoothAdapterWithAdvertisements>> | 275 scoped_refptr<StrictMock<MockBluetoothAdapterWithAdvertisements>> |
| 234 mock_adapter_; | 276 mock_adapter_; |
| 235 cryptauth::MockForegroundEidGenerator* mock_eid_generator_; | 277 cryptauth::MockForegroundEidGenerator* mock_eid_generator_; |
| 236 std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_; | 278 std::unique_ptr<cryptauth::MockRemoteBeaconSeedFetcher> mock_seed_fetcher_; |
| 237 std::unique_ptr<cryptauth::MockLocalDeviceDataProvider> | 279 std::unique_ptr<cryptauth::MockLocalDeviceDataProvider> |
| 238 mock_local_data_provider_; | 280 mock_local_data_provider_; |
| 239 | 281 |
| 240 std::vector<scoped_refptr<RegisterAdvertisementArgs>> | 282 std::vector<scoped_refptr<RegisterAdvertisementArgs>> |
| 241 register_advertisement_args_; | 283 register_advertisement_args_; |
| 242 std::vector<BleAdvertiser::IndividualAdvertisement*> | 284 std::vector<BleAdvertiser::IndividualAdvertisement*> |
| 243 individual_advertisements_; | 285 individual_advertisements_; |
| 286 std::vector<device::BluetoothAdvertisement::SuccessCallback> |
| 287 unregister_callbacks_; |
| 244 | 288 |
| 245 const std::vector<cryptauth::RemoteDevice> fake_devices_; | 289 const std::vector<cryptauth::RemoteDevice> fake_devices_; |
| 246 const std::vector<cryptauth::DataWithTimestamp> fake_advertisements_; | 290 const std::vector<cryptauth::DataWithTimestamp> fake_advertisements_; |
| 247 | 291 |
| 248 private: | 292 private: |
| 249 DISALLOW_COPY_AND_ASSIGN(BleAdvertiserTest); | 293 DISALLOW_COPY_AND_ASSIGN(BleAdvertiserTest); |
| 250 }; | 294 }; |
| 251 | 295 |
| 252 TEST_F(BleAdvertiserTest, TestCannotFetchPublicKey) { | 296 TEST_F(BleAdvertiserTest, TestCannotFetchPublicKey) { |
| 253 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(0); | 297 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(0); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 336 |
| 293 TEST_F(BleAdvertiserTest, AdapterPoweredOffWhenAdvertisementRegistered) { | 337 TEST_F(BleAdvertiserTest, AdapterPoweredOffWhenAdvertisementRegistered) { |
| 294 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); | 338 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); |
| 295 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); | 339 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); |
| 296 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1).WillOnce(Return(false)); | 340 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1).WillOnce(Return(false)); |
| 297 | 341 |
| 298 mock_eid_generator_->set_advertisement( | 342 mock_eid_generator_->set_advertisement( |
| 299 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 343 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 300 | 344 |
| 301 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 345 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 302 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 346 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 303 | 347 |
| 304 // RegisterAdvertisement() should not have been called. | 348 // RegisterAdvertisement() should not have been called. |
| 305 EXPECT_FALSE(register_advertisement_args_.size()); | 349 EXPECT_TRUE(register_advertisement_args_.empty()); |
| 306 } | 350 } |
| 307 | 351 |
| 308 TEST_F(BleAdvertiserTest, RegisteringAdvertisementFails) { | 352 TEST_F(BleAdvertiserTest, RegisteringAdvertisementFails) { |
| 309 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); | 353 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); |
| 310 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); | 354 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); |
| 311 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1); | 355 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1); |
| 312 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); | 356 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); |
| 313 | 357 |
| 314 mock_eid_generator_->set_advertisement( | 358 mock_eid_generator_->set_advertisement( |
| 315 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 359 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 316 | 360 |
| 317 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 361 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 318 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 362 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 319 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 363 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 320 VerifyServiceDataMatches(register_advertisement_args_[0], | 364 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 321 individual_advertisements_[0]); | 365 individual_advertisements_[0]); |
| 322 | 366 |
| 323 InvokeErrback(register_advertisement_args_[0]); | 367 InvokeErrback(register_advertisement_args_[0]); |
| 324 VerifyAdvertisementHasNotStarted(individual_advertisements_[0]); | 368 VerifyAdvertisementHasNotStarted(individual_advertisements_[0]); |
| 325 } | 369 } |
| 326 | 370 |
| 327 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully) { | 371 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully) { |
| 328 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); | 372 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); |
| 329 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); | 373 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); |
| 330 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1); | 374 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(1); |
| 331 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); | 375 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); |
| 332 | 376 |
| 333 mock_eid_generator_->set_advertisement( | 377 mock_eid_generator_->set_advertisement( |
| 334 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 378 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 335 | 379 |
| 336 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 380 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 337 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 381 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 338 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 382 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 339 VerifyServiceDataMatches(register_advertisement_args_[0], | 383 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 340 individual_advertisements_[0]); | 384 individual_advertisements_[0]); |
| 341 | 385 |
| 342 InvokeCallback(register_advertisement_args_[0]); | 386 InvokeCallback(register_advertisement_args_[0]); |
| 343 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 387 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 344 | 388 |
| 345 // Now, unregister. | 389 // Now, unregister. |
| 346 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 390 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 347 EXPECT_FALSE(individual_advertisements_.size()); | 391 InvokeLastUnregisterCallbackAndRemove(); |
| 392 EXPECT_TRUE(individual_advertisements_.empty()); |
| 348 } | 393 } |
| 349 | 394 |
| 350 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully_TwoDevices) { | 395 TEST_F(BleAdvertiserTest, AdvertisementRegisteredSuccessfully_TwoDevices) { |
| 351 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(2); | 396 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(2); |
| 352 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(2); | 397 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(2); |
| 353 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); | 398 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); |
| 354 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); | 399 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); |
| 355 | 400 |
| 356 // First device. | 401 // First device. |
| 357 mock_eid_generator_->set_advertisement( | 402 mock_eid_generator_->set_advertisement( |
| 358 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 403 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 359 | 404 |
| 360 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 405 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 361 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 406 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 362 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 407 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 363 VerifyServiceDataMatches(register_advertisement_args_[0], | 408 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 364 individual_advertisements_[0]); | 409 individual_advertisements_[0]); |
| 365 | 410 |
| 366 InvokeCallback(register_advertisement_args_[0]); | 411 InvokeCallback(register_advertisement_args_[0]); |
| 367 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 412 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 368 | 413 |
| 369 // Second device. | 414 // Second device. |
| 370 mock_eid_generator_->set_advertisement( | 415 mock_eid_generator_->set_advertisement( |
| 371 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[1])); | 416 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[1])); |
| 372 | 417 |
| 373 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[1])); | 418 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[1])); |
| 374 EXPECT_EQ(static_cast<size_t>(2), individual_advertisements_.size()); | 419 EXPECT_EQ(2u, individual_advertisements_.size()); |
| 375 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); | 420 EXPECT_EQ(2u, register_advertisement_args_.size()); |
| 376 VerifyServiceDataMatches(register_advertisement_args_[1], | 421 VerifyServiceDataMatches(register_advertisement_args_[1], |
| 377 individual_advertisements_[1]); | 422 individual_advertisements_[1]); |
| 378 | 423 |
| 379 InvokeCallback(register_advertisement_args_[1]); | 424 InvokeCallback(register_advertisement_args_[1]); |
| 380 VerifyAdvertisementHasStarted(individual_advertisements_[1]); | 425 VerifyAdvertisementHasStarted(individual_advertisements_[1]); |
| 381 | 426 |
| 382 // Now, unregister. | 427 // Now, unregister. |
| 383 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 428 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 384 EXPECT_EQ(1u, individual_advertisements_.size()); | 429 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 430 InvokeLastUnregisterCallbackAndRemove(); |
| 385 | 431 |
| 386 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[1])); | 432 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[1])); |
| 387 EXPECT_EQ(0u, individual_advertisements_.size()); | 433 EXPECT_TRUE(individual_advertisements_.empty()); |
| 434 InvokeLastUnregisterCallbackAndRemove(); |
| 388 } | 435 } |
| 389 | 436 |
| 390 TEST_F(BleAdvertiserTest, TooManyDevicesRegistered) { | 437 TEST_F(BleAdvertiserTest, TooManyDevicesRegistered) { |
| 391 ASSERT_EQ(2, kMaxConcurrentAdvertisements); | 438 ASSERT_EQ(2, kMaxConcurrentAdvertisements); |
| 392 | 439 |
| 393 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(3); | 440 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(3); |
| 394 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(3); | 441 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(3); |
| 395 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(3); | 442 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(3); |
| 396 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(3); | 443 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(3); |
| 397 | 444 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 417 EXPECT_CALL(*mock_adapter_, IsPowered()) | 464 EXPECT_CALL(*mock_adapter_, IsPowered()) |
| 418 .Times(2) | 465 .Times(2) |
| 419 .WillOnce(Return(false)) // First, the adapter is powered off. | 466 .WillOnce(Return(false)) // First, the adapter is powered off. |
| 420 .WillOnce(Return(true)); // Then, the adapter is powered back on. | 467 .WillOnce(Return(true)); // Then, the adapter is powered back on. |
| 421 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); | 468 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(1); |
| 422 | 469 |
| 423 mock_eid_generator_->set_advertisement( | 470 mock_eid_generator_->set_advertisement( |
| 424 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 471 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 425 | 472 |
| 426 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 473 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 427 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 474 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 428 | 475 |
| 429 // RegisterAdvertisement() should not have been called. | 476 // RegisterAdvertisement() should not have been called. |
| 430 EXPECT_FALSE(register_advertisement_args_.size()); | 477 EXPECT_TRUE(register_advertisement_args_.empty()); |
| 431 | 478 |
| 432 // Now, simulate power being changed. Since the power is now on, | 479 // Now, simulate power being changed. Since the power is now on, |
| 433 // RegisterAdvertisement() should have been called. | 480 // RegisterAdvertisement() should have been called. |
| 434 individual_advertisements_[0]->AdapterPoweredChanged(mock_adapter_.get(), | 481 individual_advertisements_[0]->AdapterPoweredChanged(mock_adapter_.get(), |
| 435 true); | 482 true); |
| 436 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 483 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 437 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 484 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 438 VerifyServiceDataMatches(register_advertisement_args_[0], | 485 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 439 individual_advertisements_[0]); | 486 individual_advertisements_[0]); |
| 440 } | 487 } |
| 441 | 488 |
| 442 TEST_F(BleAdvertiserTest, AdvertisementReleased) { | 489 TEST_F(BleAdvertiserTest, AdvertisementReleased) { |
| 443 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); | 490 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(1); |
| 444 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); | 491 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(1); |
| 445 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); | 492 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(2); |
| 446 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); | 493 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); |
| 447 | 494 |
| 448 mock_eid_generator_->set_advertisement( | 495 mock_eid_generator_->set_advertisement( |
| 449 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); | 496 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 450 | 497 |
| 451 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); | 498 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 452 EXPECT_EQ(static_cast<size_t>(1), individual_advertisements_.size()); | 499 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 453 EXPECT_EQ(static_cast<size_t>(1), register_advertisement_args_.size()); | 500 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 454 VerifyServiceDataMatches(register_advertisement_args_[0], | 501 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 455 individual_advertisements_[0]); | 502 individual_advertisements_[0]); |
| 456 | 503 |
| 457 InvokeCallback(register_advertisement_args_[0]); | 504 InvokeCallback(register_advertisement_args_[0]); |
| 458 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 505 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 459 | 506 |
| 460 // Now, simulate the advertisement being released. A new advertisement should | 507 // Now, simulate the advertisement being released. A new advertisement should |
| 461 // have been created. | 508 // have been created. |
| 462 ReleaseAdvertisement(individual_advertisements_[0]); | 509 ReleaseAdvertisement(individual_advertisements_[0]); |
| 463 EXPECT_EQ(static_cast<size_t>(2), register_advertisement_args_.size()); | 510 EXPECT_EQ(2u, register_advertisement_args_.size()); |
| 464 VerifyServiceDataMatches(register_advertisement_args_[1], | 511 VerifyServiceDataMatches(register_advertisement_args_[1], |
| 465 individual_advertisements_[0]); | 512 individual_advertisements_[0]); |
| 466 | 513 |
| 467 InvokeCallback(register_advertisement_args_[1]); | 514 InvokeCallback(register_advertisement_args_[1]); |
| 468 VerifyAdvertisementHasStarted(individual_advertisements_[0]); | 515 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 469 | 516 |
| 470 // Now, unregister. | 517 // Now, unregister. |
| 471 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); | 518 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 472 EXPECT_FALSE(individual_advertisements_.size()); | 519 InvokeLastUnregisterCallbackAndRemove(); |
| 520 EXPECT_TRUE(individual_advertisements_.empty()); |
| 521 } |
| 522 |
| 523 // Regression test for crbug.com/739883. This issue arises when the following |
| 524 // occurs: |
| 525 // (1) BleAdvertiser starts advertising to device A. |
| 526 // (2) BleAdvertiser stops advertising to device A. The advertisement starts |
| 527 // its asynchyronous unregistration flow. |
| 528 // (3) BleAdvertiser starts advertising to device A again, but the previous |
| 529 // advertisement has not yet been fully unregistered. |
| 530 // Before the fix for crbug.com/739883, this would cause an error of type |
| 531 // ERROR_ADVERTISEMENT_ALREADY_EXISTS. However, the fix for this issue ensures |
| 532 // that the new advertisement in step (3) above does not start until the |
| 533 // previous one has been finished. |
| 534 TEST_F(BleAdvertiserTest, SameAdvertisementAdded_FirstHasNotBeenUnregistered) { |
| 535 EXPECT_CALL(*mock_adapter_, AddObserver(_)).Times(2); |
| 536 EXPECT_CALL(*mock_adapter_, RemoveObserver(_)).Times(2); |
| 537 EXPECT_CALL(*mock_adapter_, IsPowered()).Times(3); |
| 538 EXPECT_CALL(*mock_adapter_, RegisterAdvertisementWithArgsStruct(_)).Times(2); |
| 539 |
| 540 mock_eid_generator_->set_advertisement( |
| 541 base::MakeUnique<cryptauth::DataWithTimestamp>(fake_advertisements_[0])); |
| 542 |
| 543 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 544 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 545 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 546 VerifyServiceDataMatches(register_advertisement_args_[0], |
| 547 individual_advertisements_[0]); |
| 548 |
| 549 InvokeCallback(register_advertisement_args_[0]); |
| 550 VerifyAdvertisementHasStarted(individual_advertisements_[0]); |
| 551 |
| 552 // Unregister, but do not invoke the last unregister callback. |
| 553 EXPECT_TRUE(ble_advertiser_->StopAdvertisingToDevice(fake_devices_[0])); |
| 554 EXPECT_TRUE(individual_advertisements_.empty()); |
| 555 |
| 556 // Start advertising again, to the same device. A new IndividualAdvertisement |
| 557 // should have been created, but a call to RegisterAdvertisement() should NOT |
| 558 // have occurred, since the previous advertisement has not yet been |
| 559 // unregistered. |
| 560 EXPECT_TRUE(ble_advertiser_->StartAdvertisingToDevice(fake_devices_[0])); |
| 561 EXPECT_EQ(1u, individual_advertisements_.size()); |
| 562 // Should still be only one set of RegisterAdvertisement() args. |
| 563 EXPECT_EQ(1u, register_advertisement_args_.size()); |
| 564 |
| 565 // Now, complete the previous unregistration. |
| 566 InvokeLastUnregisterCallbackAndRemove(); |
| 567 |
| 568 // RegisterAdvertisement() should be called for the new advertisement. |
| 569 EXPECT_EQ(2u, register_advertisement_args_.size()); |
| 570 |
| 571 VerifyServiceDataMatches(register_advertisement_args_[1], |
| 572 individual_advertisements_[0]); |
| 473 } | 573 } |
| 474 | 574 |
| 475 } // namespace tether | 575 } // namespace tether |
| 476 | 576 |
| 477 } // namespace chromeos | 577 } // namespace chromeos |
| OLD | NEW |