low_energy_client_unittest.cpp revision ff651b7fd11daaa29732cb8735d248910d9248f9
1// 2// Copyright (C) 2015 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/hal/fake_bluetooth_gatt_interface.h" 22#include "service/low_energy_client.h" 23#include "stack/include/bt_types.h" 24#include "stack/include/hcidefs.h" 25 26using ::testing::_; 27using ::testing::Return; 28 29namespace bluetooth { 30namespace { 31 32class MockGattHandler 33 : public hal::FakeBluetoothGattInterface::TestClientHandler { 34 public: 35 MockGattHandler() = default; 36 ~MockGattHandler() override = default; 37 38 MOCK_METHOD1(RegisterClient, bt_status_t(bt_uuid_t*)); 39 MOCK_METHOD1(UnregisterClient, bt_status_t(int)); 40 MOCK_METHOD7(MultiAdvEnable, bt_status_t(int, int, int, int, int, int, int)); 41 MOCK_METHOD10( 42 MultiAdvSetInstDataMock, 43 bt_status_t(bool, bool, bool, int, int, char*, int, char*, int, char*)); 44 MOCK_METHOD1(MultiAdvDisable, bt_status_t(int)); 45 46 // GMock has macros for up to 10 arguments (11 is really just too many...). 47 // For now we forward this call to a 10 argument mock, omitting the 48 // |client_if| argument. 49 bt_status_t MultiAdvSetInstData( 50 int /* client_if */, 51 bool set_scan_rsp, bool include_name, 52 bool incl_txpower, int appearance, 53 int manufacturer_len, char* manufacturer_data, 54 int service_data_len, char* service_data, 55 int service_uuid_len, char* service_uuid) override { 56 return MultiAdvSetInstDataMock( 57 set_scan_rsp, include_name, incl_txpower, appearance, 58 manufacturer_len, manufacturer_data, 59 service_data_len, service_data, 60 service_uuid_len, service_uuid); 61 } 62 63 private: 64 DISALLOW_COPY_AND_ASSIGN(MockGattHandler); 65}; 66 67// Created this class for testing Advertising Data Setting 68// It provides a work around in order to verify the arguments 69// in the arrays passed to MultiAdvSetInstData due to mocks 70// not having an easy way to verify entire arrays 71class AdvertiseDataHandler : public MockGattHandler { 72 public: 73 AdvertiseDataHandler() : call_count_(0) {} 74 ~AdvertiseDataHandler() override = default; 75 76 bt_status_t MultiAdvSetInstData( 77 int /* client_if */, 78 bool set_scan_rsp, bool include_name, 79 bool incl_txpower, int appearance, 80 int manufacturer_len, char* manufacturer_data, 81 int service_data_len, char* service_data, 82 int service_uuid_len, char* service_uuid) override { 83 call_count_++; 84 service_data_.assign( 85 service_data, service_data+service_data_len); 86 manufacturer_data_.assign( 87 manufacturer_data, manufacturer_data+manufacturer_len); 88 uuid_data_.assign( 89 service_uuid, service_uuid+service_uuid_len); 90 return BT_STATUS_SUCCESS; 91 } 92 93 const std::vector<uint8_t>& manufacturer_data() const { 94 return manufacturer_data_; 95 } 96 const std::vector<uint8_t>& service_data() const { return service_data_; } 97 const std::vector<uint8_t>& uuid_data() const { return uuid_data_; } 98 int call_count() const { return call_count_; } 99 100 private: 101 int call_count_; 102 std::vector<uint8_t> manufacturer_data_; 103 std::vector<uint8_t> service_data_; 104 std::vector<uint8_t> uuid_data_; 105 106 107}; 108 109class LowEnergyClientTest : public ::testing::Test { 110 public: 111 LowEnergyClientTest() = default; 112 ~LowEnergyClientTest() override = default; 113 114 void SetUp() override { 115 // Only set |mock_handler_| if a test hasn't set it. 116 if (!mock_handler_) 117 mock_handler_.reset(new MockGattHandler()); 118 fake_hal_gatt_iface_ = new hal::FakeBluetoothGattInterface( 119 std::static_pointer_cast< 120 hal::FakeBluetoothGattInterface::TestClientHandler>(mock_handler_), 121 nullptr); 122 hal::BluetoothGattInterface::InitializeForTesting(fake_hal_gatt_iface_); 123 ble_factory_.reset(new LowEnergyClientFactory()); 124 } 125 126 void TearDown() override { 127 ble_factory_.reset(); 128 hal::BluetoothGattInterface::CleanUp(); 129 } 130 131 protected: 132 hal::FakeBluetoothGattInterface* fake_hal_gatt_iface_; 133 std::shared_ptr<MockGattHandler> mock_handler_; 134 std::unique_ptr<LowEnergyClientFactory> ble_factory_; 135 136 private: 137 DISALLOW_COPY_AND_ASSIGN(LowEnergyClientTest); 138}; 139 140// Used for tests that operate on a pre-registered client. 141class LowEnergyClientPostRegisterTest : public LowEnergyClientTest { 142 public: 143 LowEnergyClientPostRegisterTest() = default; 144 ~LowEnergyClientPostRegisterTest() override = default; 145 146 void SetUp() override { 147 LowEnergyClientTest::SetUp(); 148 UUID uuid = UUID::GetRandom(); 149 auto callback = [&](BLEStatus status, const UUID& in_uuid, 150 std::unique_ptr<BluetoothClientInstance> in_client) { 151 CHECK(in_uuid == uuid); 152 CHECK(in_client.get()); 153 CHECK(status == BLE_STATUS_SUCCESS); 154 155 le_client_ = std::unique_ptr<LowEnergyClient>( 156 static_cast<LowEnergyClient*>(in_client.release())); 157 }; 158 159 EXPECT_CALL(*mock_handler_, RegisterClient(_)) 160 .Times(1) 161 .WillOnce(Return(BT_STATUS_SUCCESS)); 162 163 ble_factory_->RegisterClient(uuid, callback); 164 165 bt_uuid_t hal_uuid = uuid.GetBlueDroid(); 166 fake_hal_gatt_iface_->NotifyRegisterClientCallback(0, 0, hal_uuid); 167 testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 168 } 169 170 void TearDown() override { 171 EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 172 .Times(1) 173 .WillOnce(Return(BT_STATUS_SUCCESS)); 174 EXPECT_CALL(*mock_handler_, UnregisterClient(_)) 175 .Times(1) 176 .WillOnce(Return(BT_STATUS_SUCCESS)); 177 le_client_.reset(); 178 LowEnergyClientTest::TearDown(); 179 } 180 181 void StartAdvertising() { 182 ASSERT_FALSE(le_client_->IsAdvertisingStarted()); 183 ASSERT_FALSE(le_client_->IsStartingAdvertising()); 184 ASSERT_FALSE(le_client_->IsStoppingAdvertising()); 185 186 EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 187 .Times(1) 188 .WillOnce(Return(BT_STATUS_SUCCESS)); 189 EXPECT_CALL(*mock_handler_, 190 MultiAdvSetInstDataMock(_, _, _, _, _, _, _, _, _, _)) 191 .Times(1) 192 .WillOnce(Return(BT_STATUS_SUCCESS)); 193 194 AdvertiseSettings settings; 195 AdvertiseData adv, scan_rsp; 196 ASSERT_TRUE(le_client_->StartAdvertising( 197 settings, adv, scan_rsp, LowEnergyClient::StatusCallback())); 198 ASSERT_TRUE(le_client_->IsStartingAdvertising()); 199 200 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 201 le_client_->GetClientId(), BT_STATUS_SUCCESS); 202 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 203 le_client_->GetClientId(), BT_STATUS_SUCCESS); 204 205 ASSERT_TRUE(le_client_->IsAdvertisingStarted()); 206 ASSERT_FALSE(le_client_->IsStartingAdvertising()); 207 ASSERT_FALSE(le_client_->IsStoppingAdvertising()); 208 } 209 210 void AdvertiseDataTestHelper(AdvertiseData data, std::function<void(BLEStatus)> callback){ 211 AdvertiseSettings settings; 212 EXPECT_TRUE(le_client_->StartAdvertising( 213 settings, data, AdvertiseData(), callback)); 214 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 215 le_client_->GetClientId(), BT_STATUS_SUCCESS); 216 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 217 le_client_->GetClientId(), BT_STATUS_SUCCESS); 218 EXPECT_TRUE(le_client_->StopAdvertising(LowEnergyClient::StatusCallback())); 219 fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 220 le_client_->GetClientId(), BT_STATUS_SUCCESS); 221 } 222 223 protected: 224 std::unique_ptr<LowEnergyClient> le_client_; 225 226 private: 227 DISALLOW_COPY_AND_ASSIGN(LowEnergyClientPostRegisterTest); 228}; 229 230TEST_F(LowEnergyClientTest, RegisterClient) { 231 EXPECT_CALL(*mock_handler_, RegisterClient(_)) 232 .Times(2) 233 .WillOnce(Return(BT_STATUS_FAIL)) 234 .WillOnce(Return(BT_STATUS_SUCCESS)); 235 236 // These will be asynchronously populated with a result when the callback 237 // executes. 238 BLEStatus status = BLE_STATUS_SUCCESS; 239 UUID cb_uuid; 240 std::unique_ptr<LowEnergyClient> client; 241 int callback_count = 0; 242 243 auto callback = [&](BLEStatus in_status, const UUID& uuid, 244 std::unique_ptr<BluetoothClientInstance> in_client) { 245 status = in_status; 246 cb_uuid = uuid; 247 client = std::unique_ptr<LowEnergyClient>( 248 static_cast<LowEnergyClient*>(in_client.release())); 249 callback_count++; 250 }; 251 252 UUID uuid0 = UUID::GetRandom(); 253 254 // HAL returns failure. 255 EXPECT_FALSE(ble_factory_->RegisterClient(uuid0, callback)); 256 EXPECT_EQ(0, callback_count); 257 258 // HAL returns success. 259 EXPECT_TRUE(ble_factory_->RegisterClient(uuid0, callback)); 260 EXPECT_EQ(0, callback_count); 261 262 // Calling twice with the same UUID should fail with no additional call into 263 // the stack. 264 EXPECT_FALSE(ble_factory_->RegisterClient(uuid0, callback)); 265 266 testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 267 268 // Call with a different UUID while one is pending. 269 UUID uuid1 = UUID::GetRandom(); 270 EXPECT_CALL(*mock_handler_, RegisterClient(_)) 271 .Times(1) 272 .WillOnce(Return(BT_STATUS_SUCCESS)); 273 EXPECT_TRUE(ble_factory_->RegisterClient(uuid1, callback)); 274 275 // Trigger callback with an unknown UUID. This should get ignored. 276 UUID uuid2 = UUID::GetRandom(); 277 bt_uuid_t hal_uuid = uuid2.GetBlueDroid(); 278 fake_hal_gatt_iface_->NotifyRegisterClientCallback(0, 0, hal_uuid); 279 EXPECT_EQ(0, callback_count); 280 281 // |uuid0| succeeds. 282 int client_if0 = 2; // Pick something that's not 0. 283 hal_uuid = uuid0.GetBlueDroid(); 284 fake_hal_gatt_iface_->NotifyRegisterClientCallback( 285 BT_STATUS_SUCCESS, client_if0, hal_uuid); 286 287 EXPECT_EQ(1, callback_count); 288 ASSERT_TRUE(client.get() != nullptr); // Assert to terminate in case of error 289 EXPECT_EQ(BLE_STATUS_SUCCESS, status); 290 EXPECT_EQ(client_if0, client->GetClientId()); 291 EXPECT_EQ(uuid0, client->GetAppIdentifier()); 292 EXPECT_EQ(uuid0, cb_uuid); 293 294 // The client should unregister itself when deleted. 295 EXPECT_CALL(*mock_handler_, MultiAdvDisable(client_if0)) 296 .Times(1) 297 .WillOnce(Return(BT_STATUS_SUCCESS)); 298 EXPECT_CALL(*mock_handler_, UnregisterClient(client_if0)) 299 .Times(1) 300 .WillOnce(Return(BT_STATUS_SUCCESS)); 301 client.reset(); 302 testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 303 304 // |uuid1| fails. 305 int client_if1 = 3; 306 hal_uuid = uuid1.GetBlueDroid(); 307 fake_hal_gatt_iface_->NotifyRegisterClientCallback( 308 BT_STATUS_FAIL, client_if1, hal_uuid); 309 310 EXPECT_EQ(2, callback_count); 311 ASSERT_TRUE(client.get() == nullptr); // Assert to terminate in case of error 312 EXPECT_EQ(BLE_STATUS_FAILURE, status); 313 EXPECT_EQ(uuid1, cb_uuid); 314} 315 316TEST_F(LowEnergyClientPostRegisterTest, StartAdvertisingBasic) { 317 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 318 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 319 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 320 321 // Use default advertising settings and data. 322 AdvertiseSettings settings; 323 AdvertiseData adv_data, scan_rsp; 324 int callback_count = 0; 325 BLEStatus last_status = BLE_STATUS_FAILURE; 326 auto callback = [&](BLEStatus status) { 327 last_status = status; 328 callback_count++; 329 }; 330 331 EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 332 .Times(5) 333 .WillOnce(Return(BT_STATUS_FAIL)) 334 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 335 336 // Stack call returns failure. 337 EXPECT_FALSE(le_client_->StartAdvertising( 338 settings, adv_data, scan_rsp, callback)); 339 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 340 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 341 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 342 EXPECT_EQ(0, callback_count); 343 344 // Stack call returns success. 345 EXPECT_TRUE(le_client_->StartAdvertising( 346 settings, adv_data, scan_rsp, callback)); 347 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 348 EXPECT_TRUE(le_client_->IsStartingAdvertising()); 349 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 350 EXPECT_EQ(0, callback_count); 351 352 // Already starting. 353 EXPECT_FALSE(le_client_->StartAdvertising( 354 settings, adv_data, scan_rsp, callback)); 355 356 // Notify failure. 357 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 358 le_client_->GetClientId(), BT_STATUS_FAIL); 359 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 360 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 361 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 362 EXPECT_EQ(1, callback_count); 363 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 364 365 // Try again. 366 EXPECT_TRUE(le_client_->StartAdvertising( 367 settings, adv_data, scan_rsp, callback)); 368 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 369 EXPECT_TRUE(le_client_->IsStartingAdvertising()); 370 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 371 EXPECT_EQ(1, callback_count); 372 373 // Success notification should trigger advertise data update. 374 EXPECT_CALL(*mock_handler_, 375 MultiAdvSetInstDataMock( 376 false, // set_scan_rsp 377 false, // include_name 378 false, // incl_txpower 379 _, _, _, _, _, _, _)) 380 .Times(3) 381 .WillOnce(Return(BT_STATUS_FAIL)) 382 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 383 384 // Notify success for enable. The procedure will fail since setting data will 385 // fail. 386 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 387 le_client_->GetClientId(), BT_STATUS_SUCCESS); 388 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 389 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 390 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 391 EXPECT_EQ(2, callback_count); 392 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 393 394 // Try again. 395 EXPECT_TRUE(le_client_->StartAdvertising( 396 settings, adv_data, scan_rsp, callback)); 397 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 398 EXPECT_TRUE(le_client_->IsStartingAdvertising()); 399 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 400 EXPECT_EQ(2, callback_count); 401 402 // Notify success for enable. the advertise data call should succeed but 403 // operation will remain pending. 404 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 405 le_client_->GetClientId(), BT_STATUS_SUCCESS); 406 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 407 EXPECT_TRUE(le_client_->IsStartingAdvertising()); 408 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 409 EXPECT_EQ(2, callback_count); 410 411 // Notify failure from advertising call. 412 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 413 le_client_->GetClientId(), BT_STATUS_FAIL); 414 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 415 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 416 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 417 EXPECT_EQ(3, callback_count); 418 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 419 420 // Try again. Make everything succeed. 421 EXPECT_TRUE(le_client_->StartAdvertising( 422 settings, adv_data, scan_rsp, callback)); 423 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 424 EXPECT_TRUE(le_client_->IsStartingAdvertising()); 425 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 426 EXPECT_EQ(3, callback_count); 427 428 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 429 le_client_->GetClientId(), BT_STATUS_SUCCESS); 430 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 431 le_client_->GetClientId(), BT_STATUS_SUCCESS); 432 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 433 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 434 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 435 EXPECT_EQ(4, callback_count); 436 EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 437 438 // Already started. 439 EXPECT_FALSE(le_client_->StartAdvertising( 440 settings, adv_data, scan_rsp, callback)); 441} 442 443TEST_F(LowEnergyClientPostRegisterTest, StopAdvertisingBasic) { 444 AdvertiseSettings settings; 445 446 // Not enabled. 447 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 448 EXPECT_FALSE(le_client_->StopAdvertising(LowEnergyClient::StatusCallback())); 449 450 // Start advertising for testing. 451 StartAdvertising(); 452 453 int callback_count = 0; 454 BLEStatus last_status = BLE_STATUS_FAILURE; 455 auto callback = [&](BLEStatus status) { 456 last_status = status; 457 callback_count++; 458 }; 459 460 EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 461 .Times(3) 462 .WillOnce(Return(BT_STATUS_FAIL)) 463 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 464 465 // Stack call returns failure. 466 EXPECT_FALSE(le_client_->StopAdvertising(callback)); 467 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 468 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 469 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 470 EXPECT_EQ(0, callback_count); 471 472 // Stack returns success. 473 EXPECT_TRUE(le_client_->StopAdvertising(callback)); 474 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 475 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 476 EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 477 EXPECT_EQ(0, callback_count); 478 479 // Already disabling. 480 EXPECT_FALSE(le_client_->StopAdvertising(callback)); 481 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 482 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 483 EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 484 EXPECT_EQ(0, callback_count); 485 486 // Notify failure. 487 fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 488 le_client_->GetClientId(), BT_STATUS_FAIL); 489 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 490 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 491 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 492 EXPECT_EQ(1, callback_count); 493 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 494 495 // Try again. 496 EXPECT_TRUE(le_client_->StopAdvertising(callback)); 497 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 498 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 499 EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 500 EXPECT_EQ(1, callback_count); 501 502 // Notify success. 503 fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 504 le_client_->GetClientId(), BT_STATUS_SUCCESS); 505 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 506 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 507 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 508 EXPECT_EQ(2, callback_count); 509 EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 510 511 // Already stopped. 512 EXPECT_FALSE(le_client_->StopAdvertising(callback)); 513} 514 515TEST_F(LowEnergyClientPostRegisterTest, InvalidAdvertiseData) { 516 const std::vector<uint8_t> data0{ 0x02, HCI_EIR_FLAGS_TYPE, 0x00 }; 517 const std::vector<uint8_t> data1{ 518 0x04, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE, 0x01, 0x02, 0x00 519 }; 520 AdvertiseData invalid_adv(data0); 521 AdvertiseData valid_adv(data1); 522 523 AdvertiseSettings settings; 524 525 EXPECT_FALSE(le_client_->StartAdvertising( 526 settings, valid_adv, invalid_adv, LowEnergyClient::StatusCallback())); 527 EXPECT_FALSE(le_client_->StartAdvertising( 528 settings, invalid_adv, valid_adv, LowEnergyClient::StatusCallback())); 529 530 // Manufacturer data not correctly formatted according to spec. We let the 531 // stack handle this case. 532 const std::vector<uint8_t> data2{ 0x01, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE }; 533 AdvertiseData invalid_mfc(data2); 534 535 EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 536 .Times(1) 537 .WillOnce(Return(BT_STATUS_SUCCESS)); 538 EXPECT_TRUE(le_client_->StartAdvertising( 539 settings, invalid_mfc, valid_adv, LowEnergyClient::StatusCallback())); 540} 541 542TEST_F(LowEnergyClientPostRegisterTest, ScanResponse) { 543 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 544 EXPECT_FALSE(le_client_->IsStartingAdvertising()); 545 EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 546 547 AdvertiseSettings settings( 548 AdvertiseSettings::MODE_LOW_POWER, 549 base::TimeDelta::FromMilliseconds(300), 550 AdvertiseSettings::TX_POWER_LEVEL_MEDIUM, 551 false /* connectable */); 552 553 const std::vector<uint8_t> data0; 554 const std::vector<uint8_t> data1{ 555 0x04, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE, 0x01, 0x02, 0x00 556 }; 557 558 int callback_count = 0; 559 BLEStatus last_status = BLE_STATUS_FAILURE; 560 auto callback = [&](BLEStatus status) { 561 last_status = status; 562 callback_count++; 563 }; 564 565 AdvertiseData adv0(data0); 566 adv0.set_include_tx_power_level(true); 567 568 AdvertiseData adv1(data1); 569 adv1.set_include_device_name(true); 570 571 EXPECT_CALL(*mock_handler_, 572 MultiAdvEnable(le_client_->GetClientId(), _, _, 573 kAdvertisingEventTypeScannable, 574 _, _, _)) 575 .Times(2) 576 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 577 EXPECT_CALL( 578 *mock_handler_, 579 MultiAdvSetInstDataMock( 580 false, // set_scan_rsp 581 false, // include_name 582 true, // incl_txpower, 583 _, 584 0, // 0 bytes 585 _, _, _, _, _)) 586 .Times(2) 587 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 588 EXPECT_CALL( 589 *mock_handler_, 590 MultiAdvSetInstDataMock( 591 true, // set_scan_rsp 592 true, // include_name 593 false, // incl_txpower, 594 _, 595 data1.size() - 2, // Mfc. Specific data field bytes. 596 _, _, _, _, _)) 597 .Times(2) 598 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 599 600 // Enable success; Adv. data success; Scan rsp. fail. 601 EXPECT_TRUE(le_client_->StartAdvertising(settings, adv0, adv1, callback)); 602 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 603 le_client_->GetClientId(), BT_STATUS_SUCCESS); 604 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 605 le_client_->GetClientId(), BT_STATUS_SUCCESS); 606 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 607 le_client_->GetClientId(), BT_STATUS_FAIL); 608 609 EXPECT_EQ(1, callback_count); 610 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 611 EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 612 613 // Second time everything succeeds. 614 EXPECT_TRUE(le_client_->StartAdvertising(settings, adv0, adv1, callback)); 615 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 616 le_client_->GetClientId(), BT_STATUS_SUCCESS); 617 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 618 le_client_->GetClientId(), BT_STATUS_SUCCESS); 619 fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 620 le_client_->GetClientId(), BT_STATUS_SUCCESS); 621 622 EXPECT_EQ(2, callback_count); 623 EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 624 EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 625} 626 627TEST_F(LowEnergyClientPostRegisterTest, AdvertiseDataParsing) { 628 // Re-initialize the test with our own custom handler. 629 TearDown(); 630 std::shared_ptr<AdvertiseDataHandler> adv_handler(new AdvertiseDataHandler()); 631 mock_handler_ = std::static_pointer_cast<MockGattHandler>(adv_handler); 632 SetUp(); 633 634 const std::vector<uint8_t> kUUID16BitData{ 635 0x03, HCI_EIR_COMPLETE_16BITS_UUID_TYPE, 0xDE, 0xAD, 636 }; 637 638 const std::vector<uint8_t> kUUID32BitData{ 639 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02 640 }; 641 642 const std::vector<uint8_t> kUUID128BitData{ 643 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 644 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 645 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E 646 }; 647 648 const std::vector<uint8_t> kMultiUUIDData{ 649 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 650 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 651 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 652 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 653 }; 654 655 const std::vector<uint8_t> kServiceData16Bit{ 656 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 657 }; 658 659 const std::vector<uint8_t> kServiceData32Bit{ 660 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 661 }; 662 663 const std::vector<uint8_t> kServiceData128Bit{ 664 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 665 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 666 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xBE, 0xEF 667 }; 668 669 const std::vector<uint8_t> kMultiServiceData{ 670 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 671 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xBE, 0xEF, 672 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 673 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 674 }; 675 676 const std::vector<uint8_t> kServiceUUIDMatch{ 677 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 678 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 679 }; 680 681 const std::vector<uint8_t> kServiceUUIDMismatch{ 682 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x01, 683 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 684 }; 685 686 AdvertiseData uuid_16bit_adv(kUUID16BitData); 687 AdvertiseData uuid_32bit_adv(kUUID32BitData); 688 AdvertiseData uuid_128bit_adv(kUUID128BitData); 689 AdvertiseData multi_uuid_adv(kMultiUUIDData); 690 691 AdvertiseData service_16bit_adv(kServiceData16Bit); 692 AdvertiseData service_32bit_adv(kServiceData32Bit); 693 AdvertiseData service_128bit_adv(kServiceData128Bit); 694 AdvertiseData multi_service_adv(kMultiServiceData); 695 696 AdvertiseData service_uuid_match(kServiceUUIDMatch); 697 AdvertiseData service_uuid_mismatch(kServiceUUIDMismatch); 698 699 AdvertiseSettings settings; 700 701 int callback_count = 0; 702 BLEStatus last_status = BLE_STATUS_FAILURE; 703 auto callback = [&](BLEStatus status) { 704 last_status = status; 705 callback_count++; 706 }; 707 708 EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 709 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 710 EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 711 .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 712 713 // Multiple UUID test, should fail due to only one UUID allowed 714 EXPECT_TRUE(le_client_->StartAdvertising( 715 settings, multi_uuid_adv, AdvertiseData(), callback)); 716 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 717 le_client_->GetClientId(), BT_STATUS_SUCCESS); 718 EXPECT_EQ(1, callback_count); 719 EXPECT_EQ(0, adv_handler->call_count()); 720 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 721 722 // Multiple Service Data test, should fail due to only one service data allowed 723 EXPECT_TRUE(le_client_->StartAdvertising( 724 settings, multi_uuid_adv, AdvertiseData(), callback)); 725 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 726 le_client_->GetClientId(), BT_STATUS_SUCCESS); 727 EXPECT_EQ(2, callback_count); 728 EXPECT_EQ(0, adv_handler->call_count()); 729 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 730 731 // 16bit uuid test, should succeed with correctly parsed uuid 732 AdvertiseDataTestHelper(uuid_16bit_adv, callback); 733 EXPECT_EQ(3, callback_count); 734 EXPECT_EQ(1, adv_handler->call_count()); 735 const std::vector<uint8_t> uuid_16bit{0xDE, 0xAD}; 736 EXPECT_EQ(uuid_16bit, adv_handler->uuid_data()); 737 738 // 32bit uuid test, should succeed with correctly parsed uuid 739 AdvertiseDataTestHelper(uuid_32bit_adv, callback); 740 EXPECT_EQ(4, callback_count); 741 EXPECT_EQ(2, adv_handler->call_count()); 742 const std::vector<uint8_t> uuid_32bit{0xDE, 0xAD, 0x01, 0x02}; 743 EXPECT_EQ(uuid_32bit, adv_handler->uuid_data()); 744 745 // 128bit uuid test, should succeed with correctly parsed uuid 746 AdvertiseDataTestHelper(uuid_128bit_adv, callback); 747 EXPECT_EQ(5, callback_count); 748 EXPECT_EQ(3, adv_handler->call_count()); 749 const std::vector<uint8_t> uuid_128bit{ 750 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 751 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E 752 }; 753 EXPECT_EQ(uuid_128bit, adv_handler->uuid_data()); 754 755 const std::vector<uint8_t> service_data{ 0xBE, 0xEF }; 756 757 // Service data with 16bit uuid included, should succede with 758 // uuid and service data parsed out 759 AdvertiseDataTestHelper(service_16bit_adv, callback); 760 EXPECT_EQ(6, callback_count); 761 EXPECT_EQ(4, adv_handler->call_count()); 762 EXPECT_EQ(service_data, adv_handler->service_data()); 763 EXPECT_EQ(uuid_16bit, adv_handler->uuid_data()); 764 765 // Service data with 32bit uuid included, should succede with 766 // uuid and service data parsed out 767 AdvertiseDataTestHelper(service_32bit_adv, callback); 768 EXPECT_EQ(7, callback_count); 769 EXPECT_EQ(5, adv_handler->call_count()); 770 EXPECT_EQ(service_data, adv_handler->service_data()); 771 EXPECT_EQ(uuid_32bit, adv_handler->uuid_data()); 772 773 // Service data with 128bit uuid included, should succede with 774 // uuid and service data parsed out 775 AdvertiseDataTestHelper(service_128bit_adv, callback); 776 EXPECT_EQ(8, callback_count); 777 EXPECT_EQ(6, adv_handler->call_count()); 778 EXPECT_EQ(service_data, adv_handler->service_data()); 779 EXPECT_EQ(uuid_128bit, adv_handler->uuid_data()); 780 781 // Service data and UUID where the UUID for both match, should succede 782 AdvertiseDataTestHelper(service_uuid_match, callback); 783 EXPECT_EQ(9, callback_count); 784 EXPECT_EQ(7, adv_handler->call_count()); 785 EXPECT_EQ(service_data, adv_handler->service_data()); 786 const std::vector<uint8_t> uuid_32bit_matcher{ 0xDE, 0xAD, 0x01, 0x02 }; 787 EXPECT_EQ(uuid_32bit_matcher, adv_handler->uuid_data()); 788 789 //Service data and UUID where the UUID for dont match, should fail 790 EXPECT_TRUE(le_client_->StartAdvertising( 791 settings, service_uuid_mismatch, AdvertiseData(), callback)); 792 fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 793 le_client_->GetClientId(), BT_STATUS_SUCCESS); 794 EXPECT_EQ(10, callback_count); 795 EXPECT_EQ(7, adv_handler->call_count()); 796 EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 797} 798 799} // namespace 800} // namespace bluetooth 801