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

Side by Side Diff: chromeos/components/tether/ble_advertiser_unittest.cc

Issue 2972263002: [CrOS Tether] Do not register a new Bluetooth advertisement until any previous identical advertisem… (Closed)
Patch Set: hansberry@ comment. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chromeos/components/tether/ble_advertiser.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « chromeos/components/tether/ble_advertiser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698