1 // 2 // Copyright (C) 2016 Google, Inc. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include <base/macros.h> 18 #include <gmock/gmock.h> 19 #include <gtest/gtest.h> 20 21 #include "service/adapter.h" 22 #include "service/hal/fake_bluetooth_gatt_interface.h" 23 #include "service/low_energy_advertiser.h" 24 #include "stack/include/bt_types.h" 25 #include "stack/include/hcidefs.h" 26 #include "test/mock_adapter.h" 27 28 using ::testing::_; 29 using ::testing::DoAll; 30 using ::testing::Exactly; 31 using ::testing::Invoke; 32 using ::testing::Pointee; 33 using ::testing::Return; 34 using ::testing::SaveArg; 35 using ::testing::Matcher; 36 using status_cb = base::Callback<void(uint8_t)>; 37 using reg_cb = 38 base::Callback<void(uint8_t /* advertiser_id */, uint8_t /* status */)>; 39 40 namespace bluetooth { 41 namespace { 42 43 class MockAdvertiserHandler : public BleAdvertiserInterface { 44 public: 45 MockAdvertiserHandler() {} 46 ~MockAdvertiserHandler() override = default; 47 48 MOCK_METHOD1(RegisterAdvertiser, void(IdStatusCallback)); 49 MOCK_METHOD1(Unregister, void(uint8_t)); 50 MOCK_METHOD2(GetOwnAddress, void(uint8_t, GetAddressCallback)); 51 MOCK_METHOD3(SetParameters, 52 void(uint8_t, AdvertiseParameters, ParametersCallback)); 53 MOCK_METHOD4(SetData, void(int, bool, std::vector<uint8_t>, StatusCallback)); 54 MOCK_METHOD6(Enable, void(uint8_t, bool, StatusCallback, uint16_t, uint8_t, 55 StatusCallback)); 56 MOCK_METHOD7(StartAdvertising, 57 void(uint8_t advertiser_id, StatusCallback cb, 58 AdvertiseParameters, std::vector<uint8_t>, 59 std::vector<uint8_t>, int, StatusCallback)); 60 MOCK_METHOD9(StartAdvertisingSet, 61 void(IdTxPowerStatusCallback cb, AdvertiseParameters params, 62 std::vector<uint8_t> advertise_data, 63 std::vector<uint8_t> scan_response_data, 64 PeriodicAdvertisingParameters periodic_params, 65 std::vector<uint8_t> periodic_data, uint16_t duration, 66 uint8_t maxExtAdvEvents, IdStatusCallback timeout_cb)); 67 MOCK_METHOD3(SetPeriodicAdvertisingParameters, 68 void(int, PeriodicAdvertisingParameters, StatusCallback)); 69 MOCK_METHOD3(SetPeriodicAdvertisingData, 70 void(int, std::vector<uint8_t>, StatusCallback)); 71 MOCK_METHOD3(SetPeriodicAdvertisingEnable, void(int, bool, StatusCallback)); 72 73 private: 74 DISALLOW_COPY_AND_ASSIGN(MockAdvertiserHandler); 75 }; 76 77 class LowEnergyAdvertiserTest : public ::testing::Test { 78 public: 79 LowEnergyAdvertiserTest() = default; 80 ~LowEnergyAdvertiserTest() override = default; 81 82 void SetUp() override { 83 // Only set |mock_handler_| if a test hasn't set it. 84 if (!mock_handler_) mock_handler_.reset(new MockAdvertiserHandler()); 85 hal::BluetoothGattInterface::InitializeForTesting( 86 new hal::FakeBluetoothGattInterface( 87 std::static_pointer_cast<BleAdvertiserInterface>(mock_handler_), 88 nullptr, nullptr, nullptr)); 89 ble_advertiser_factory_.reset(new LowEnergyAdvertiserFactory()); 90 } 91 92 void TearDown() override { 93 ble_advertiser_factory_.reset(); 94 hal::BluetoothGattInterface::CleanUp(); 95 } 96 97 protected: 98 std::shared_ptr<MockAdvertiserHandler> mock_handler_; 99 std::unique_ptr<LowEnergyAdvertiserFactory> ble_advertiser_factory_; 100 101 private: 102 DISALLOW_COPY_AND_ASSIGN(LowEnergyAdvertiserTest); 103 }; 104 105 // Used for tests that operate on a pre-registered advertiser. 106 class LowEnergyAdvertiserPostRegisterTest : public LowEnergyAdvertiserTest { 107 public: 108 LowEnergyAdvertiserPostRegisterTest() : next_client_id_(0) {} 109 ~LowEnergyAdvertiserPostRegisterTest() override = default; 110 111 void SetUp() override { 112 LowEnergyAdvertiserTest::SetUp(); 113 auto callback = [&](std::unique_ptr<LowEnergyAdvertiser> advertiser) { 114 le_advertiser_ = std::move(advertiser); 115 }; 116 RegisterTestAdvertiser(callback); 117 } 118 119 void TearDown() override { 120 EXPECT_CALL(*mock_handler_, Enable(_, false, _, _, _, _)).Times(1); 121 EXPECT_CALL(*mock_handler_, Unregister(_)).Times(1); 122 le_advertiser_.reset(); 123 LowEnergyAdvertiserTest::TearDown(); 124 } 125 126 void RegisterTestAdvertiser( 127 const std::function<void(std::unique_ptr<LowEnergyAdvertiser> advertiser)> 128 callback) { 129 UUID uuid = UUID::GetRandom(); 130 auto api_callback = [&](BLEStatus status, const UUID& in_uuid, 131 std::unique_ptr<BluetoothInstance> in_client) { 132 CHECK(in_uuid == uuid); 133 CHECK(in_client.get()); 134 CHECK(status == BLE_STATUS_SUCCESS); 135 136 callback(std::unique_ptr<LowEnergyAdvertiser>( 137 static_cast<LowEnergyAdvertiser*>(in_client.release()))); 138 }; 139 140 reg_cb reg_adv_cb; 141 EXPECT_CALL(*mock_handler_, RegisterAdvertiser(_)) 142 .Times(1) 143 .WillOnce(SaveArg<0>(®_adv_cb)); 144 145 ble_advertiser_factory_->RegisterInstance(uuid, api_callback); 146 147 reg_adv_cb.Run(next_client_id_++, BT_STATUS_SUCCESS); 148 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 149 } 150 151 void StartAdvertising() { 152 ASSERT_FALSE(le_advertiser_->IsAdvertisingStarted()); 153 ASSERT_FALSE(le_advertiser_->IsStartingAdvertising()); 154 ASSERT_FALSE(le_advertiser_->IsStoppingAdvertising()); 155 156 status_cb start_advertising_cb; 157 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 158 .Times(1) 159 .WillOnce(SaveArg<1>(&start_advertising_cb)); 160 status_cb set_data_cb; 161 162 AdvertiseSettings settings; 163 AdvertiseData adv, scan_rsp; 164 ASSERT_TRUE(le_advertiser_->StartAdvertising( 165 settings, adv, scan_rsp, LowEnergyAdvertiser::StatusCallback())); 166 ASSERT_TRUE(le_advertiser_->IsStartingAdvertising()); 167 168 start_advertising_cb.Run(BT_STATUS_SUCCESS); 169 170 ASSERT_TRUE(le_advertiser_->IsAdvertisingStarted()); 171 ASSERT_FALSE(le_advertiser_->IsStartingAdvertising()); 172 ASSERT_FALSE(le_advertiser_->IsStoppingAdvertising()); 173 } 174 175 void AdvertiseDataTestHelper(AdvertiseData data, 176 std::function<void(BLEStatus)> callback, 177 status_cb* set_data_cb) { 178 AdvertiseSettings settings; 179 180 LOG_ASSERT(set_data_cb) << "set_data_cb must be set"; 181 182 EXPECT_TRUE(le_advertiser_->StartAdvertising(settings, data, 183 AdvertiseData(), callback)); 184 185 set_data_cb->Run(BT_STATUS_SUCCESS); 186 187 status_cb disable_cb; 188 EXPECT_CALL(*mock_handler_, Enable(_, false, _, _, _, _)) 189 .Times(1) 190 .WillOnce(SaveArg<2>(&disable_cb)); 191 192 EXPECT_TRUE( 193 le_advertiser_->StopAdvertising(LowEnergyAdvertiser::StatusCallback())); 194 disable_cb.Run(BT_STATUS_SUCCESS); 195 } 196 197 protected: 198 std::unique_ptr<LowEnergyAdvertiser> le_advertiser_; 199 200 private: 201 int next_client_id_; 202 203 DISALLOW_COPY_AND_ASSIGN(LowEnergyAdvertiserPostRegisterTest); 204 }; 205 206 TEST_F(LowEnergyAdvertiserTest, RegisterInstance) { 207 // These will be asynchronously populated with a result when the callback 208 // executes. 209 BLEStatus status = BLE_STATUS_SUCCESS; 210 UUID cb_uuid; 211 std::unique_ptr<LowEnergyAdvertiser> advertiser; 212 int callback_count = 0; 213 214 auto callback = [&](BLEStatus in_status, const UUID& uuid, 215 std::unique_ptr<BluetoothInstance> in_client) { 216 status = in_status; 217 cb_uuid = uuid; 218 advertiser = std::unique_ptr<LowEnergyAdvertiser>( 219 static_cast<LowEnergyAdvertiser*>(in_client.release())); 220 callback_count++; 221 }; 222 223 UUID uuid0 = UUID::GetRandom(); 224 225 reg_cb reg_adv1_cb; 226 EXPECT_CALL(*mock_handler_, RegisterAdvertiser(_)) 227 .Times(1) 228 .WillOnce(SaveArg<0>(®_adv1_cb)); 229 230 // Success. 231 EXPECT_TRUE(ble_advertiser_factory_->RegisterInstance(uuid0, callback)); 232 EXPECT_EQ(0, callback_count); 233 234 // Calling twice with the same UUID should fail with no additional call into 235 // the stack. 236 EXPECT_FALSE(ble_advertiser_factory_->RegisterInstance(uuid0, callback)); 237 238 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 239 240 // Call with a different UUID while one is pending. 241 UUID uuid1 = UUID::GetRandom(); 242 reg_cb reg_adv2_cb; 243 EXPECT_CALL(*mock_handler_, RegisterAdvertiser(_)) 244 .Times(1) 245 .WillOnce(SaveArg<0>(®_adv2_cb)); 246 EXPECT_TRUE(ble_advertiser_factory_->RegisterInstance(uuid1, callback)); 247 248 // |uuid0| succeeds. 249 int client_if0 = 2; // Pick something that's not 0. 250 reg_adv1_cb.Run(client_if0, BT_STATUS_SUCCESS); 251 252 EXPECT_EQ(1, callback_count); 253 ASSERT_TRUE(advertiser.get() != 254 nullptr); // Assert to terminate in case of error 255 EXPECT_EQ(BLE_STATUS_SUCCESS, status); 256 EXPECT_EQ(client_if0, advertiser->GetInstanceId()); 257 EXPECT_EQ(uuid0, advertiser->GetAppIdentifier()); 258 EXPECT_EQ(uuid0, cb_uuid); 259 260 // The advertiser should unregister itself when deleted. 261 EXPECT_CALL(*mock_handler_, Enable(client_if0, false, _, _, _, _)).Times(1); 262 EXPECT_CALL(*mock_handler_, Unregister(client_if0)).Times(1); 263 advertiser.reset(); 264 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 265 266 // |uuid1| fails. 267 uint8_t client_if1 = 10; 268 reg_adv2_cb.Run(client_if1, BT_STATUS_FAIL); 269 270 EXPECT_EQ(2, callback_count); 271 ASSERT_TRUE(advertiser.get() == 272 nullptr); // Assert to terminate in case of error 273 EXPECT_EQ(BLE_STATUS_FAILURE, status); 274 EXPECT_EQ(uuid1, cb_uuid); 275 } 276 277 TEST_F(LowEnergyAdvertiserPostRegisterTest, StartAdvertisingBasic) { 278 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 279 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 280 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 281 282 // Use default advertising settings and data. 283 AdvertiseSettings settings; 284 AdvertiseData adv_data, scan_rsp; 285 int callback_count = 0; 286 BLEStatus last_status = BLE_STATUS_FAILURE; 287 auto callback = [&](BLEStatus status) { 288 last_status = status; 289 callback_count++; 290 }; 291 292 status_cb start_advertising_cb; 293 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 294 .Times(2) 295 .WillRepeatedly(SaveArg<1>(&start_advertising_cb)); 296 297 // Stack call returns success. 298 EXPECT_TRUE( 299 le_advertiser_->StartAdvertising(settings, adv_data, scan_rsp, callback)); 300 301 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 302 EXPECT_TRUE(le_advertiser_->IsStartingAdvertising()); 303 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 304 EXPECT_EQ(0, callback_count); 305 306 // Already starting. 307 EXPECT_FALSE( 308 le_advertiser_->StartAdvertising(settings, adv_data, scan_rsp, callback)); 309 310 // Notify failure. 311 start_advertising_cb.Run(BT_STATUS_FAIL); 312 313 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 314 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 315 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 316 EXPECT_EQ(1, callback_count); 317 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 318 319 // Try again. 320 EXPECT_TRUE( 321 le_advertiser_->StartAdvertising(settings, adv_data, scan_rsp, callback)); 322 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 323 EXPECT_TRUE(le_advertiser_->IsStartingAdvertising()); 324 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 325 EXPECT_EQ(1, callback_count); 326 327 start_advertising_cb.Run(BT_STATUS_SUCCESS); 328 329 EXPECT_TRUE(le_advertiser_->IsAdvertisingStarted()); 330 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 331 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 332 EXPECT_EQ(2, callback_count); 333 EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 334 335 // Already started. 336 EXPECT_FALSE( 337 le_advertiser_->StartAdvertising(settings, adv_data, scan_rsp, callback)); 338 } 339 340 TEST_F(LowEnergyAdvertiserPostRegisterTest, StopAdvertisingBasic) { 341 AdvertiseSettings settings; 342 343 // Not enabled. 344 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 345 EXPECT_FALSE( 346 le_advertiser_->StopAdvertising(LowEnergyAdvertiser::StatusCallback())); 347 348 // Start advertising for testing. 349 StartAdvertising(); 350 351 int callback_count = 0; 352 BLEStatus last_status = BLE_STATUS_FAILURE; 353 auto callback = [&](BLEStatus status) { 354 last_status = status; 355 callback_count++; 356 }; 357 358 status_cb enable_cb; 359 EXPECT_CALL(*mock_handler_, Enable(_, false, _, _, _, _)) 360 .Times(2) 361 .WillRepeatedly(SaveArg<2>(&enable_cb)); 362 363 // Stack returns success. 364 EXPECT_TRUE(le_advertiser_->StopAdvertising(callback)); 365 EXPECT_TRUE(le_advertiser_->IsAdvertisingStarted()); 366 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 367 EXPECT_TRUE(le_advertiser_->IsStoppingAdvertising()); 368 EXPECT_EQ(0, callback_count); 369 370 // Already disabling. 371 EXPECT_FALSE(le_advertiser_->StopAdvertising(callback)); 372 EXPECT_TRUE(le_advertiser_->IsAdvertisingStarted()); 373 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 374 EXPECT_TRUE(le_advertiser_->IsStoppingAdvertising()); 375 EXPECT_EQ(0, callback_count); 376 377 // Notify failure. 378 enable_cb.Run(BT_STATUS_FAIL); 379 EXPECT_TRUE(le_advertiser_->IsAdvertisingStarted()); 380 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 381 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 382 EXPECT_EQ(1, callback_count); 383 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 384 385 // Try again. 386 EXPECT_TRUE(le_advertiser_->StopAdvertising(callback)); 387 EXPECT_TRUE(le_advertiser_->IsAdvertisingStarted()); 388 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 389 EXPECT_TRUE(le_advertiser_->IsStoppingAdvertising()); 390 EXPECT_EQ(1, callback_count); 391 392 // Notify success. 393 enable_cb.Run(BT_STATUS_SUCCESS); 394 EXPECT_FALSE(le_advertiser_->IsAdvertisingStarted()); 395 EXPECT_FALSE(le_advertiser_->IsStartingAdvertising()); 396 EXPECT_FALSE(le_advertiser_->IsStoppingAdvertising()); 397 EXPECT_EQ(2, callback_count); 398 EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 399 400 // Already stopped. 401 EXPECT_FALSE(le_advertiser_->StopAdvertising(callback)); 402 } 403 404 TEST_F(LowEnergyAdvertiserPostRegisterTest, InvalidAdvertiseData) { 405 const std::vector<uint8_t> data0{0x02, HCI_EIR_FLAGS_TYPE, 0x00}; 406 const std::vector<uint8_t> data1{0x04, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE, 407 0x01, 0x02, 0x00}; 408 AdvertiseData invalid_adv(data0); 409 AdvertiseData valid_adv(data1); 410 411 AdvertiseSettings settings; 412 413 EXPECT_FALSE(le_advertiser_->StartAdvertising( 414 settings, valid_adv, invalid_adv, LowEnergyAdvertiser::StatusCallback())); 415 EXPECT_FALSE(le_advertiser_->StartAdvertising( 416 settings, invalid_adv, valid_adv, LowEnergyAdvertiser::StatusCallback())); 417 418 // Manufacturer data not correctly formatted according to spec. We let the 419 // stack handle this case. 420 const std::vector<uint8_t> data2{0x01, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE}; 421 AdvertiseData invalid_mfc(data2); 422 423 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)).Times(1); 424 EXPECT_TRUE(le_advertiser_->StartAdvertising( 425 settings, invalid_mfc, valid_adv, LowEnergyAdvertiser::StatusCallback())); 426 } 427 428 TEST_F(LowEnergyAdvertiserPostRegisterTest, AdvertiseDataParsing) { 429 const std::vector<uint8_t> kUUID16BitData{ 430 0x03, HCI_EIR_COMPLETE_16BITS_UUID_TYPE, 0xDE, 0xAD, 431 }; 432 433 const std::vector<uint8_t> kUUID32BitData{ 434 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02}; 435 436 const std::vector<uint8_t> kUUID128BitData{ 437 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 438 0xDE, 0xAD, 439 0x01, 0x02, 440 0x03, 0x04, 441 0x05, 0x06, 442 0x07, 0x08, 443 0x09, 0x0A, 444 0x0B, 0x0C, 445 0x0D, 0x0E}; 446 447 const std::vector<uint8_t> kMultiUUIDData{ 448 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 449 0xDE, 0xAD, 450 0x01, 0x02, 451 0x03, 0x04, 452 0x05, 0x06, 453 0x07, 0x08, 454 0x09, 0x0A, 455 0x0B, 0x0C, 456 0x0D, 0x0E, 457 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 458 0xDE, 0xAD, 459 0xBE, 0xEF}; 460 461 const std::vector<uint8_t> kServiceData16Bit{ 462 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF}; 463 464 const std::vector<uint8_t> kServiceData32Bit{ 465 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 466 0xEF}; 467 468 const std::vector<uint8_t> kServiceData128Bit{ 469 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 470 0xDE, 0xAD, 471 0x01, 0x02, 472 0x03, 0x04, 473 0x05, 0x06, 474 0x07, 0x08, 475 0x09, 0x0A, 476 0x0B, 0x0C, 477 0x0D, 0x0E, 478 0xBE, 0xEF}; 479 480 const std::vector<uint8_t> kMultiServiceData{ 481 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 482 0xDE, 0xAD, 483 0x01, 0x02, 484 0x03, 0x04, 485 0x05, 0x06, 486 0xBE, 0xEF, 487 0xDE, 0xAD, 488 0x01, 0x02, 489 0x03, 0x04, 490 0x05, 0x06, 491 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 492 0xDE, 0xAD, 493 0xBE, 0xEF}; 494 495 const std::vector<uint8_t> kServiceUUIDMatch{ 496 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 497 0xDE, 0xAD, 498 0x01, 0x02, 499 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 500 0xDE, 0xAD, 501 0x01, 0x02, 502 0xBE, 0xEF}; 503 504 const std::vector<uint8_t> kServiceUUIDMismatch{ 505 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 506 0xDE, 0xAD, 507 0x01, 0x01, 508 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 509 0xDE, 0xAD, 510 0x01, 0x02, 511 0xBE, 0xEF}; 512 513 AdvertiseData uuid_16bit_adv(kUUID16BitData); 514 AdvertiseData uuid_32bit_adv(kUUID32BitData); 515 AdvertiseData uuid_128bit_adv(kUUID128BitData); 516 AdvertiseData multi_uuid_adv(kMultiUUIDData); 517 518 AdvertiseData service_16bit_adv(kServiceData16Bit); 519 AdvertiseData service_32bit_adv(kServiceData32Bit); 520 AdvertiseData service_128bit_adv(kServiceData128Bit); 521 AdvertiseData multi_service_adv(kMultiServiceData); 522 523 AdvertiseData service_uuid_match(kServiceUUIDMatch); 524 AdvertiseData service_uuid_mismatch(kServiceUUIDMismatch); 525 526 AdvertiseSettings settings; 527 528 int callback_count = 0; 529 BLEStatus last_status = BLE_STATUS_FAILURE; 530 auto callback = [&](BLEStatus status) { 531 last_status = status; 532 callback_count++; 533 }; 534 535 status_cb start_advertising_cb; 536 // Multiple UUID test 537 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 538 .Times(1) 539 .WillOnce(SaveArg<1>(&start_advertising_cb)); 540 AdvertiseDataTestHelper(multi_uuid_adv, callback, &start_advertising_cb); 541 EXPECT_EQ(1, callback_count); 542 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 543 544 // Multiple Service Data test 545 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 546 .Times(1) 547 .WillOnce(SaveArg<1>(&start_advertising_cb)); 548 AdvertiseDataTestHelper(multi_service_adv, callback, &start_advertising_cb); 549 EXPECT_EQ(2, callback_count); 550 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 551 552 // 16bit uuid test, should succeed with correctly parsed uuid in little-endian 553 // 128-bit format. 554 const std::vector<uint8_t> uuid_16bit_canonical{ 555 0xFB, 0x34, 0x9b, 0x5F, 0x80, 0x00, 0x00, 0x80, 556 0x00, 0x10, 0x00, 0x00, 0xDE, 0xAD, 0x00, 0x00}; 557 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 558 .Times(1) 559 .WillOnce(SaveArg<1>(&start_advertising_cb)); 560 AdvertiseDataTestHelper(uuid_16bit_adv, callback, &start_advertising_cb); 561 EXPECT_EQ(3, callback_count); 562 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 563 564 // 32bit uuid test, should succeed with correctly parsed uuid 565 const std::vector<uint8_t> uuid_32bit_canonical{ 566 0xFB, 0x34, 0x9b, 0x5F, 0x80, 0x00, 0x00, 0x80, 567 0x00, 0x10, 0x00, 0x00, 0xDE, 0xAD, 0x01, 0x02}; 568 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 569 .Times(1) 570 .WillOnce(SaveArg<1>(&start_advertising_cb)); 571 AdvertiseDataTestHelper(uuid_32bit_adv, callback, &start_advertising_cb); 572 EXPECT_EQ(4, callback_count); 573 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 574 575 // 128bit uuid test, should succeed with correctly parsed uuid 576 const std::vector<uint8_t> uuid_128bit{0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 577 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 578 0x0B, 0x0C, 0x0D, 0x0E}; 579 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 580 .Times(1) 581 .WillOnce(SaveArg<1>(&start_advertising_cb)); 582 AdvertiseDataTestHelper(uuid_128bit_adv, callback, &start_advertising_cb); 583 EXPECT_EQ(5, callback_count); 584 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 585 586 const std::vector<uint8_t> service_data{0xBE, 0xEF}; 587 588 // Service data with 16bit uuid included, should succeed with 589 // uuid and service data parsed out 590 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 591 .Times(1) 592 .WillOnce(SaveArg<1>(&start_advertising_cb)); 593 AdvertiseDataTestHelper(service_16bit_adv, callback, &start_advertising_cb); 594 EXPECT_EQ(6, callback_count); 595 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 596 597 // Service data with 32bit uuid included, should succeed with 598 // uuid and service data parsed out 599 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 600 .Times(1) 601 .WillOnce(SaveArg<1>(&start_advertising_cb)); 602 AdvertiseDataTestHelper(service_32bit_adv, callback, &start_advertising_cb); 603 EXPECT_EQ(7, callback_count); 604 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 605 606 // Service data with 128bit uuid included, should succeed with 607 // uuid and service data parsed out 608 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 609 .Times(1) 610 .WillOnce(SaveArg<1>(&start_advertising_cb)); 611 AdvertiseDataTestHelper(service_128bit_adv, callback, &start_advertising_cb); 612 EXPECT_EQ(8, callback_count); 613 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 614 615 // Service data and UUID where the UUID for both match, should succeed. 616 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 617 .Times(1) 618 .WillOnce(SaveArg<1>(&start_advertising_cb)); 619 AdvertiseDataTestHelper(service_uuid_match, callback, &start_advertising_cb); 620 EXPECT_EQ(9, callback_count); 621 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 622 623 // Service data and UUID where the UUID for dont match, should fail 624 EXPECT_CALL(*mock_handler_, StartAdvertising(_, _, _, _, _, _, _)) 625 .Times(1) 626 .WillOnce(SaveArg<1>(&start_advertising_cb)); 627 AdvertiseDataTestHelper(service_uuid_match, callback, &start_advertising_cb); 628 EXPECT_EQ(10, callback_count); 629 ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 630 } 631 632 MATCHER_P(BitEq, x, std::string(negation ? "isn't" : "is") + 633 " bitwise equal to " + ::testing::PrintToString(x)) { 634 static_assert(sizeof(x) == sizeof(arg), "Size mismatch"); 635 return std::memcmp(&arg, &x, sizeof(x)) == 0; 636 } 637 638 } // namespace 639 } // namespace bluetooth 640