1c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// 2c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// Copyright (C) 2015 Google, Inc. 3c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// 4c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 5c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// you may not use this file except in compliance with the License. 6c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// You may obtain a copy of the License at: 7c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// 8c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// http://www.apache.org/licenses/LICENSE-2.0 9c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// 10c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// Unless required by applicable law or agreed to in writing, software 11c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 12c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// See the License for the specific language governing permissions and 14c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// limitations under the License. 15c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray// 16c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 17c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray#include <base/macros.h> 18c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray#include <gmock/gmock.h> 19c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray#include <gtest/gtest.h> 20c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 2160b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski#include "service/adapter.h" 22c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray#include "service/hal/fake_bluetooth_gatt_interface.h" 23c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray#include "service/low_energy_client.h" 2412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray#include "stack/include/bt_types.h" 2512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray#include "stack/include/hcidefs.h" 2660b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski#include "test/mock_adapter.h" 27c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 28c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Ugurayusing ::testing::_; 29c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Ugurayusing ::testing::Return; 30a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowskiusing ::testing::Pointee; 31a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowskiusing ::testing::DoAll; 32a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowskiusing ::testing::Invoke; 33c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 34c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguraynamespace bluetooth { 35c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguraynamespace { 36c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 379e5205368d61adf11e75c9e2bd9f6ff26b375bacArman Ugurayclass MockGattHandler 389e5205368d61adf11e75c9e2bd9f6ff26b375bacArman Uguray : public hal::FakeBluetoothGattInterface::TestClientHandler { 39c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray public: 40480174f874a664affda33831c904eb3574ae9389Arman Uguray MockGattHandler() { 41480174f874a664affda33831c904eb3574ae9389Arman Uguray ON_CALL(*this, Scan(false)) 42480174f874a664affda33831c904eb3574ae9389Arman Uguray .WillByDefault(Return(BT_STATUS_SUCCESS)); 43480174f874a664affda33831c904eb3574ae9389Arman Uguray } 44c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray ~MockGattHandler() override = default; 45c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 46c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray MOCK_METHOD1(RegisterClient, bt_status_t(bt_uuid_t*)); 47c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray MOCK_METHOD1(UnregisterClient, bt_status_t(int)); 483f6aa07299fd9db634274fd22821b349f18b5e0fArman Uguray MOCK_METHOD1(Scan, bt_status_t(bool)); 49ce021ddaafea0cdb78005fe08bc8510f9c75aca4Jakub Pawlowski MOCK_METHOD4(Connect, bt_status_t(int , const bt_bdaddr_t *, bool, int)); 50ce021ddaafea0cdb78005fe08bc8510f9c75aca4Jakub Pawlowski MOCK_METHOD3(Disconnect, bt_status_t(int , const bt_bdaddr_t *, int)); 5127650cd8f2473356351f3279177486971a0f9054Arman Uguray MOCK_METHOD7(MultiAdvEnable, bt_status_t(int, int, int, int, int, int, int)); 5212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MOCK_METHOD10( 5312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MultiAdvSetInstDataMock, 5412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray bt_status_t(bool, bool, bool, int, int, char*, int, char*, int, char*)); 5527650cd8f2473356351f3279177486971a0f9054Arman Uguray MOCK_METHOD1(MultiAdvDisable, bt_status_t(int)); 5627650cd8f2473356351f3279177486971a0f9054Arman Uguray 5712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // GMock has macros for up to 10 arguments (11 is really just too many...). 5812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // For now we forward this call to a 10 argument mock, omitting the 5912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // |client_if| argument. 6027650cd8f2473356351f3279177486971a0f9054Arman Uguray bt_status_t MultiAdvSetInstData( 6112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray int /* client_if */, 6212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray bool set_scan_rsp, bool include_name, 6327650cd8f2473356351f3279177486971a0f9054Arman Uguray bool incl_txpower, int appearance, 6427650cd8f2473356351f3279177486971a0f9054Arman Uguray int manufacturer_len, char* manufacturer_data, 6527650cd8f2473356351f3279177486971a0f9054Arman Uguray int service_data_len, char* service_data, 66ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int service_uuid_len, char* service_uuid) override { 6727650cd8f2473356351f3279177486971a0f9054Arman Uguray return MultiAdvSetInstDataMock( 6827650cd8f2473356351f3279177486971a0f9054Arman Uguray set_scan_rsp, include_name, incl_txpower, appearance, 6927650cd8f2473356351f3279177486971a0f9054Arman Uguray manufacturer_len, manufacturer_data, 7027650cd8f2473356351f3279177486971a0f9054Arman Uguray service_data_len, service_data, 7127650cd8f2473356351f3279177486971a0f9054Arman Uguray service_uuid_len, service_uuid); 7227650cd8f2473356351f3279177486971a0f9054Arman Uguray } 73c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 74c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray private: 75c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray DISALLOW_COPY_AND_ASSIGN(MockGattHandler); 76c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray}; 77c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 7882ea72f905565f83116f74d5ccbacea5d710a853Arman Ugurayclass TestDelegate : public LowEnergyClient::Delegate { 7982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray public: 80a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski TestDelegate() : scan_result_count_(0), connection_state_count_(0), 81a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski last_mtu_(0) { 8282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray } 8382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 8482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray ~TestDelegate() override = default; 8582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 8682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray int scan_result_count() const { return scan_result_count_; } 8782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const ScanResult& last_scan_result() const { return last_scan_result_; } 8882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 89a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski int connection_state_count() const { return connection_state_count_; } 90a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 91a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski void OnConnectionState(LowEnergyClient* client, int status, 92a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski const char* address, bool connected) { 93a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski ASSERT_TRUE(client); 94a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski connection_state_count_++; 95a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski } 96a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 97a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski void OnMtuChanged(LowEnergyClient* client, int status, const char* address, 98a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski int mtu) { 99a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski ASSERT_TRUE(client); 100a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski last_mtu_ = mtu; 101a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski } 102a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski 10382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray void OnScanResult(LowEnergyClient* client, const ScanResult& scan_result) { 10482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray ASSERT_TRUE(client); 10582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray scan_result_count_++; 10682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray last_scan_result_ = scan_result; 10782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray } 10882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 10982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray private: 11082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray int scan_result_count_; 11182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray ScanResult last_scan_result_; 11282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 113a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski int connection_state_count_; 114a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 115a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski int last_mtu_; 116a6551079fe71b1c76505ada0e4f758f6faf651e0Jakub Pawlowski 11782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray DISALLOW_COPY_AND_ASSIGN(TestDelegate); 11882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray}; 11982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 120ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker// Created this class for testing Advertising Data Setting 121ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker// It provides a work around in order to verify the arguments 122ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker// in the arrays passed to MultiAdvSetInstData due to mocks 123ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker// not having an easy way to verify entire arrays 124ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panickerclass AdvertiseDataHandler : public MockGattHandler { 125ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker public: 126ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataHandler() : call_count_(0) {} 127ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker ~AdvertiseDataHandler() override = default; 128ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 129ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker bt_status_t MultiAdvSetInstData( 130ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int /* client_if */, 131ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker bool set_scan_rsp, bool include_name, 132ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker bool incl_txpower, int appearance, 133ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int manufacturer_len, char* manufacturer_data, 134ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int service_data_len, char* service_data, 135ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int service_uuid_len, char* service_uuid) override { 136ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker call_count_++; 137ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker service_data_.assign( 138ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker service_data, service_data+service_data_len); 139ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker manufacturer_data_.assign( 140ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker manufacturer_data, manufacturer_data+manufacturer_len); 141ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker uuid_data_.assign( 142ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker service_uuid, service_uuid+service_uuid_len); 143ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker return BT_STATUS_SUCCESS; 144ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker } 145ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 146ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t>& manufacturer_data() const { 147ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker return manufacturer_data_; 148ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker } 149ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t>& service_data() const { return service_data_; } 150ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t>& uuid_data() const { return uuid_data_; } 151ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int call_count() const { return call_count_; } 152ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 153ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker private: 154ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int call_count_; 155ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker std::vector<uint8_t> manufacturer_data_; 156ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker std::vector<uint8_t> service_data_; 157ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker std::vector<uint8_t> uuid_data_; 158ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker}; 159ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 160c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Ugurayclass LowEnergyClientTest : public ::testing::Test { 161c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray public: 162c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray LowEnergyClientTest() = default; 163c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray ~LowEnergyClientTest() override = default; 164c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 165c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray void SetUp() override { 166ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // Only set |mock_handler_| if a test hasn't set it. 167ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker if (!mock_handler_) 168ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker mock_handler_.reset(new MockGattHandler()); 169c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray fake_hal_gatt_iface_ = new hal::FakeBluetoothGattInterface( 1709e5205368d61adf11e75c9e2bd9f6ff26b375bacArman Uguray std::static_pointer_cast< 1719e5205368d61adf11e75c9e2bd9f6ff26b375bacArman Uguray hal::FakeBluetoothGattInterface::TestClientHandler>(mock_handler_), 1729e5205368d61adf11e75c9e2bd9f6ff26b375bacArman Uguray nullptr); 173c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray hal::BluetoothGattInterface::InitializeForTesting(fake_hal_gatt_iface_); 17460b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski ble_factory_.reset(new LowEnergyClientFactory(mock_adapter_)); 175c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray } 176c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 177c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray void TearDown() override { 178c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray ble_factory_.reset(); 179c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray hal::BluetoothGattInterface::CleanUp(); 180c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray } 181c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 182c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray protected: 183c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray hal::FakeBluetoothGattInterface* fake_hal_gatt_iface_; 18460b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski testing::MockAdapter mock_adapter_; 185c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray std::shared_ptr<MockGattHandler> mock_handler_; 186c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray std::unique_ptr<LowEnergyClientFactory> ble_factory_; 187c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 188c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray private: 189c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray DISALLOW_COPY_AND_ASSIGN(LowEnergyClientTest); 190c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray}; 191c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 19212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray// Used for tests that operate on a pre-registered client. 19312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Ugurayclass LowEnergyClientPostRegisterTest : public LowEnergyClientTest { 19412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray public: 19553cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski LowEnergyClientPostRegisterTest() : next_client_id_(0) { 19653cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski } 19712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ~LowEnergyClientPostRegisterTest() override = default; 19812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 19912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray void SetUp() override { 20012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray LowEnergyClientTest::SetUp(); 20153cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski auto callback = [&](std::unique_ptr<LowEnergyClient> client) { 20253cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski le_client_ = std::move(client); 20353cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski }; 20453cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski RegisterTestClient(callback); 20553cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski } 20653cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski 20753cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski void TearDown() override { 20853cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 20953cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski .Times(1) 21053cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski .WillOnce(Return(BT_STATUS_SUCCESS)); 21153cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski EXPECT_CALL(*mock_handler_, UnregisterClient(_)) 21253cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski .Times(1) 21353cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski .WillOnce(Return(BT_STATUS_SUCCESS)); 21453cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski le_client_.reset(); 21553cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski LowEnergyClientTest::TearDown(); 21653cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski } 21753cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski 21853cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski void RegisterTestClient( 21953cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski const std::function<void(std::unique_ptr<LowEnergyClient> client)> 22053cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski callback) { 22112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray UUID uuid = UUID::GetRandom(); 22253cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski auto api_callback = [&](BLEStatus status, const UUID& in_uuid, 223bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray std::unique_ptr<BluetoothInstance> in_client) { 22412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray CHECK(in_uuid == uuid); 22512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray CHECK(in_client.get()); 22612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray CHECK(status == BLE_STATUS_SUCCESS); 22712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 22853cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski callback(std::unique_ptr<LowEnergyClient>( 22953cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski static_cast<LowEnergyClient*>(in_client.release()))); 23012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 23112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 23212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, RegisterClient(_)) 23312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(1) 23412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 23512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 23653cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski ble_factory_->RegisterInstance(uuid, api_callback); 23712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 23812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray bt_uuid_t hal_uuid = uuid.GetBlueDroid(); 23953cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski fake_hal_gatt_iface_->NotifyRegisterClientCallback( 24053cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski 0, next_client_id_++, hal_uuid); 24160b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 24212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray } 24312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 24412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray void StartAdvertising() { 24512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_FALSE(le_client_->IsAdvertisingStarted()); 24612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_FALSE(le_client_->IsStartingAdvertising()); 24712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_FALSE(le_client_->IsStoppingAdvertising()); 24812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 24912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 25012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(1) 25112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 25212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, 25312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MultiAdvSetInstDataMock(_, _, _, _, _, _, _, _, _, _)) 25412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(1) 25512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 25612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 25712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings settings; 25812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData adv, scan_rsp; 25912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_TRUE(le_client_->StartAdvertising( 26012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv, scan_rsp, LowEnergyClient::StatusCallback())); 26112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_TRUE(le_client_->IsStartingAdvertising()); 26212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 26312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 264bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 26512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 266bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 26712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 26812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_TRUE(le_client_->IsAdvertisingStarted()); 26912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_FALSE(le_client_->IsStartingAdvertising()); 27012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray ASSERT_FALSE(le_client_->IsStoppingAdvertising()); 27112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray } 27212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 273a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski void AdvertiseDataTestHelper(AdvertiseData data, std::function<void(BLEStatus)> callback) { 274ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseSettings settings; 275ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_TRUE(le_client_->StartAdvertising( 276ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker settings, data, AdvertiseData(), callback)); 277ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 278bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 279ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 280bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 281ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_TRUE(le_client_->StopAdvertising(LowEnergyClient::StatusCallback())); 282ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 283bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 284ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker } 285ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 28612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray protected: 28712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray std::unique_ptr<LowEnergyClient> le_client_; 28812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 28912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray private: 29053cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski int next_client_id_; 29153cfa7c612cda14aed96be45dced88b710b91df9Jakub Pawlowski 29212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray DISALLOW_COPY_AND_ASSIGN(LowEnergyClientPostRegisterTest); 29312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray}; 29412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 295bb18c41ffa0370d4eb0c4a15904b114355606466Arman UgurayTEST_F(LowEnergyClientTest, RegisterInstance) { 296c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_CALL(*mock_handler_, RegisterClient(_)) 297c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .Times(2) 298c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .WillOnce(Return(BT_STATUS_FAIL)) 299c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 300c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 301c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // These will be asynchronously populated with a result when the callback 302c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // executes. 303c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray BLEStatus status = BLE_STATUS_SUCCESS; 304c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray UUID cb_uuid; 305c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray std::unique_ptr<LowEnergyClient> client; 306c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray int callback_count = 0; 307c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 30808f80ebd5c714364cb76cc4e4a93454b42ed5669Arman Uguray auto callback = [&](BLEStatus in_status, const UUID& uuid, 309bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray std::unique_ptr<BluetoothInstance> in_client) { 310c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray status = in_status; 311c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray cb_uuid = uuid; 31208f80ebd5c714364cb76cc4e4a93454b42ed5669Arman Uguray client = std::unique_ptr<LowEnergyClient>( 31308f80ebd5c714364cb76cc4e4a93454b42ed5669Arman Uguray static_cast<LowEnergyClient*>(in_client.release())); 314c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray callback_count++; 315c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray }; 316c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 317c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray UUID uuid0 = UUID::GetRandom(); 318c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 319c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // HAL returns failure. 320bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray EXPECT_FALSE(ble_factory_->RegisterInstance(uuid0, callback)); 321c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(0, callback_count); 322c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 323c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // HAL returns success. 324bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray EXPECT_TRUE(ble_factory_->RegisterInstance(uuid0, callback)); 325c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(0, callback_count); 326c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 327c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // Calling twice with the same UUID should fail with no additional call into 328c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // the stack. 329bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray EXPECT_FALSE(ble_factory_->RegisterInstance(uuid0, callback)); 330c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 33160b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 332c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 333c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // Call with a different UUID while one is pending. 334c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray UUID uuid1 = UUID::GetRandom(); 335c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_CALL(*mock_handler_, RegisterClient(_)) 336c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .Times(1) 337c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 338bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray EXPECT_TRUE(ble_factory_->RegisterInstance(uuid1, callback)); 339c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 340c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // Trigger callback with an unknown UUID. This should get ignored. 341c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray UUID uuid2 = UUID::GetRandom(); 342c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray bt_uuid_t hal_uuid = uuid2.GetBlueDroid(); 343c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray fake_hal_gatt_iface_->NotifyRegisterClientCallback(0, 0, hal_uuid); 344c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(0, callback_count); 345c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 346c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // |uuid0| succeeds. 347c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray int client_if0 = 2; // Pick something that's not 0. 348c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray hal_uuid = uuid0.GetBlueDroid(); 349c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray fake_hal_gatt_iface_->NotifyRegisterClientCallback( 350c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray BT_STATUS_SUCCESS, client_if0, hal_uuid); 351c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 352c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(1, callback_count); 353c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray ASSERT_TRUE(client.get() != nullptr); // Assert to terminate in case of error 354c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(BLE_STATUS_SUCCESS, status); 355bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray EXPECT_EQ(client_if0, client->GetInstanceId()); 35608f80ebd5c714364cb76cc4e4a93454b42ed5669Arman Uguray EXPECT_EQ(uuid0, client->GetAppIdentifier()); 357c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(uuid0, cb_uuid); 358c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 359c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // The client should unregister itself when deleted. 36012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, MultiAdvDisable(client_if0)) 36112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(1) 36212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 363c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_CALL(*mock_handler_, UnregisterClient(client_if0)) 364c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .Times(1) 365c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 366c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray client.reset(); 36760b0e8f7ef14b1c0bd0e6d86656cd912dd4c4221Jakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 368c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 369c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray // |uuid1| fails. 370c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray int client_if1 = 3; 371c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray hal_uuid = uuid1.GetBlueDroid(); 372c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray fake_hal_gatt_iface_->NotifyRegisterClientCallback( 373c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray BT_STATUS_FAIL, client_if1, hal_uuid); 374c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 375c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(2, callback_count); 376c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray ASSERT_TRUE(client.get() == nullptr); // Assert to terminate in case of error 377c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, status); 378c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray EXPECT_EQ(uuid1, cb_uuid); 37912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray} 38012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 38112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman UgurayTEST_F(LowEnergyClientPostRegisterTest, StartAdvertisingBasic) { 38212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 38312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 38412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 38512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 38612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Use default advertising settings and data. 38712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings settings; 38812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData adv_data, scan_rsp; 38912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray int callback_count = 0; 39012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray BLEStatus last_status = BLE_STATUS_FAILURE; 39112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray auto callback = [&](BLEStatus status) { 39212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray last_status = status; 39312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray callback_count++; 39412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 39512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 39612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 39712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(5) 39812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_FAIL)) 39912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 40012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 40112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Stack call returns failure. 40212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StartAdvertising( 40312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 40412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 40512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 40612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 40712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(0, callback_count); 40812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 40912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Stack call returns success. 41012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising( 41112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 41212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 41312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStartingAdvertising()); 41412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 41512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(0, callback_count); 41612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 41712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Already starting. 41812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StartAdvertising( 41912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 42012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 42112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify failure. 42212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 423bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_FAIL); 42412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 42512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 42612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 42712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(1, callback_count); 42812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 42912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 43012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Try again. 43112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising( 43212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 43312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 43412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStartingAdvertising()); 43512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 43612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(1, callback_count); 43712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 43812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Success notification should trigger advertise data update. 43912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, 44012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MultiAdvSetInstDataMock( 44112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // set_scan_rsp 44212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // include_name 44312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // incl_txpower 44412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, _, _, _, _, _, _)) 44512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(3) 44612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_FAIL)) 44712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 44812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 44912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify success for enable. The procedure will fail since setting data will 45012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // fail. 45112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 452bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 45312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 45412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 45512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 45612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(2, callback_count); 45712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 45812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 45912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Try again. 46012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising( 46112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 46212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 46312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStartingAdvertising()); 46412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 46512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(2, callback_count); 46612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 46712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify success for enable. the advertise data call should succeed but 46812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // operation will remain pending. 46912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 470bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 47112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 47212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStartingAdvertising()); 47312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 47412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(2, callback_count); 47512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 47612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify failure from advertising call. 47712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 478bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_FAIL); 47912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 48012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 48112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 48212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(3, callback_count); 48312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 48412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 48512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Try again. Make everything succeed. 48612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising( 48712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 48812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 48912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStartingAdvertising()); 49012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 49112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(3, callback_count); 49212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 49312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 494bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 49512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 496bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 49712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 49812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 49912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 50012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(4, callback_count); 50112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 50212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 50312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Already started. 50412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StartAdvertising( 50512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, adv_data, scan_rsp, callback)); 50612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray} 50712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 50812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman UgurayTEST_F(LowEnergyClientPostRegisterTest, StopAdvertisingBasic) { 50912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings settings; 51012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 51112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Not enabled. 51212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 51312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StopAdvertising(LowEnergyClient::StatusCallback())); 514c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 51512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Start advertising for testing. 51612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray StartAdvertising(); 51712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 51812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray int callback_count = 0; 51912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray BLEStatus last_status = BLE_STATUS_FAILURE; 52012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray auto callback = [&](BLEStatus status) { 52112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray last_status = status; 52212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray callback_count++; 52312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 52412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 52512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 52612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(3) 52712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_FAIL)) 52812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 52912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 53012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Stack call returns failure. 53112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StopAdvertising(callback)); 53212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 53312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 53412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 53512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(0, callback_count); 53612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 53712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Stack returns success. 53812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StopAdvertising(callback)); 53912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 54012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 54112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 54212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(0, callback_count); 54312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 54412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Already disabling. 54512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StopAdvertising(callback)); 54612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 54712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 54812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 54912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(0, callback_count); 55012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 55112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify failure. 55212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 553bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_FAIL); 55412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 55512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 55612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 55712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(1, callback_count); 55812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 55912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 56012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Try again. 56112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StopAdvertising(callback)); 56212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 56312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 56412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsStoppingAdvertising()); 56512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(1, callback_count); 56612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 56712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Notify success. 56812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDisableCallback( 569bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 57012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 57112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 57212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 57312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(2, callback_count); 57412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 57512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 57612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Already stopped. 57712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StopAdvertising(callback)); 57812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray} 57912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 58012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman UgurayTEST_F(LowEnergyClientPostRegisterTest, InvalidAdvertiseData) { 58112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray const std::vector<uint8_t> data0{ 0x02, HCI_EIR_FLAGS_TYPE, 0x00 }; 58212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray const std::vector<uint8_t> data1{ 58312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 0x04, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE, 0x01, 0x02, 0x00 58412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 58512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData invalid_adv(data0); 58612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData valid_adv(data1); 58712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 58812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings settings; 58912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 59012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StartAdvertising( 59112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, valid_adv, invalid_adv, LowEnergyClient::StatusCallback())); 59212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->StartAdvertising( 59312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, invalid_adv, valid_adv, LowEnergyClient::StatusCallback())); 59412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 59512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Manufacturer data not correctly formatted according to spec. We let the 59612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // stack handle this case. 59712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray const std::vector<uint8_t> data2{ 0x01, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE }; 59812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData invalid_mfc(data2); 59912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 60012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 60112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(1) 60212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 60312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising( 60412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray settings, invalid_mfc, valid_adv, LowEnergyClient::StatusCallback())); 60512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray} 60612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 60712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman UgurayTEST_F(LowEnergyClientPostRegisterTest, ScanResponse) { 60812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 60912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStartingAdvertising()); 61012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsStoppingAdvertising()); 61112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 61212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings settings( 61312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings::MODE_LOW_POWER, 61412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray base::TimeDelta::FromMilliseconds(300), 61512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseSettings::TX_POWER_LEVEL_MEDIUM, 61612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false /* connectable */); 61712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 61812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray const std::vector<uint8_t> data0; 61912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray const std::vector<uint8_t> data1{ 62012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 0x04, HCI_EIR_MANUFACTURER_SPECIFIC_TYPE, 0x01, 0x02, 0x00 62112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 62212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 62312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray int callback_count = 0; 62412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray BLEStatus last_status = BLE_STATUS_FAILURE; 62512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray auto callback = [&](BLEStatus status) { 62612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray last_status = status; 62712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray callback_count++; 62812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray }; 62912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 63012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData adv0(data0); 63112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray adv0.set_include_tx_power_level(true); 63212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 63312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray AdvertiseData adv1(data1); 63412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray adv1.set_include_device_name(true); 63512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 63612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL(*mock_handler_, 637bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray MultiAdvEnable(le_client_->GetInstanceId(), _, _, 63812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray kAdvertisingEventTypeScannable, 63912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, _, _)) 64012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(2) 64112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 64212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL( 64312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray *mock_handler_, 64412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MultiAdvSetInstDataMock( 64512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // set_scan_rsp 64612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // include_name 64712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray true, // incl_txpower, 64812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, 64912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 0, // 0 bytes 65012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, _, _, _, _)) 65112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(2) 65212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 65312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_CALL( 65412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray *mock_handler_, 65512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray MultiAdvSetInstDataMock( 65612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray true, // set_scan_rsp 65712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray true, // include_name 65812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray false, // incl_txpower, 65912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, 66012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray data1.size() - 2, // Mfc. Specific data field bytes. 66112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray _, _, _, _, _)) 66212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .Times(2) 66312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 66412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 66512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Enable success; Adv. data success; Scan rsp. fail. 66612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising(settings, adv0, adv1, callback)); 66712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 668bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 66912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 670bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 67112338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 672bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_FAIL); 67312338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 67412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(1, callback_count); 67512338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 67612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_FALSE(le_client_->IsAdvertisingStarted()); 67712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 67812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray // Second time everything succeeds. 67912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->StartAdvertising(settings, adv0, adv1, callback)); 68012338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 681bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 68212338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 683bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 68412338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray fake_hal_gatt_iface_->NotifyMultiAdvDataCallback( 685bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 68612338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray 68712338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(2, callback_count); 68812338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_EQ(BLE_STATUS_SUCCESS, last_status); 68912338405e0d8d70573e650560ccc8e1ce7d8e8cdArman Uguray EXPECT_TRUE(le_client_->IsAdvertisingStarted()); 690c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray} 691c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray 692ff651b7fd11daaa29732cb8735d248910d9248f9Ajay PanickerTEST_F(LowEnergyClientPostRegisterTest, AdvertiseDataParsing) { 693ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // Re-initialize the test with our own custom handler. 694ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker TearDown(); 695ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker std::shared_ptr<AdvertiseDataHandler> adv_handler(new AdvertiseDataHandler()); 696ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker mock_handler_ = std::static_pointer_cast<MockGattHandler>(adv_handler); 697ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker SetUp(); 698ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 699ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kUUID16BitData{ 700ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x03, HCI_EIR_COMPLETE_16BITS_UUID_TYPE, 0xDE, 0xAD, 701ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 702ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 703ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kUUID32BitData{ 704ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02 705ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 706ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 707ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kUUID128BitData{ 708ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 709ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 710ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E 711ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 712ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 713ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kMultiUUIDData{ 714ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x11, HCI_EIR_COMPLETE_128BITS_UUID_TYPE, 715ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 716ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 717ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 718ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 719ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 720ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kServiceData16Bit{ 721ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 722ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 723ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 724ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kServiceData32Bit{ 725ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 726ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 727ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 728ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kServiceData128Bit{ 729ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 730ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 731ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xBE, 0xEF 732ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 733ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 734ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kMultiServiceData{ 735ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x13, HCI_EIR_SERVICE_DATA_128BITS_UUID_TYPE, 736ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xBE, 0xEF, 737ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 738ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_SERVICE_DATA_16BITS_UUID_TYPE, 0xDE, 0xAD, 0xBE, 0xEF 739ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 740ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 741ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kServiceUUIDMatch{ 742ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 743ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 744ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 745ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 746ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> kServiceUUIDMismatch{ 747ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x05, HCI_EIR_COMPLETE_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x01, 748ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, HCI_EIR_SERVICE_DATA_32BITS_UUID_TYPE, 0xDE, 0xAD, 0x01, 0x02, 0xBE, 0xEF 749ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 750ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 751ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData uuid_16bit_adv(kUUID16BitData); 752ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData uuid_32bit_adv(kUUID32BitData); 753ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData uuid_128bit_adv(kUUID128BitData); 754ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData multi_uuid_adv(kMultiUUIDData); 755ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 756ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData service_16bit_adv(kServiceData16Bit); 757ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData service_32bit_adv(kServiceData32Bit); 758ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData service_128bit_adv(kServiceData128Bit); 759ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData multi_service_adv(kMultiServiceData); 760ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 761ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData service_uuid_match(kServiceUUIDMatch); 762ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseData service_uuid_mismatch(kServiceUUIDMismatch); 763ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 764ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseSettings settings; 765ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 766ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker int callback_count = 0; 767ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker BLEStatus last_status = BLE_STATUS_FAILURE; 768ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker auto callback = [&](BLEStatus status) { 769ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker last_status = status; 770ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker callback_count++; 771ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 772ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 773ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_CALL(*mock_handler_, MultiAdvEnable(_, _, _, _, _, _, _)) 774ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 775ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_CALL(*mock_handler_, MultiAdvDisable(_)) 776ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker .WillRepeatedly(Return(BT_STATUS_SUCCESS)); 777ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 778ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // Multiple UUID test, should fail due to only one UUID allowed 779ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_TRUE(le_client_->StartAdvertising( 780ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker settings, multi_uuid_adv, AdvertiseData(), callback)); 781ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 782bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 783ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(1, callback_count); 784ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(0, adv_handler->call_count()); 785ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 786ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 787ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // Multiple Service Data test, should fail due to only one service data allowed 788ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_TRUE(le_client_->StartAdvertising( 789ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker settings, multi_uuid_adv, AdvertiseData(), callback)); 790ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 791bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 792ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(2, callback_count); 793ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(0, adv_handler->call_count()); 794ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 795ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 7969fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // 16bit uuid test, should succeed with correctly parsed uuid in little-endian 7979fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // 128-bit format. 798ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(uuid_16bit_adv, callback); 799ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(3, callback_count); 800ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(1, adv_handler->call_count()); 8019fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray const std::vector<uint8_t> uuid_16bit_canonical{ 8029fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray 0xFB, 0x34, 0x9b, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 8039fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray 0xDE, 0xAD, 0x00, 0x00 8049fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray }; 8059fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray EXPECT_EQ(uuid_16bit_canonical, adv_handler->uuid_data()); 806ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 807ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // 32bit uuid test, should succeed with correctly parsed uuid 808ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(uuid_32bit_adv, callback); 809ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(4, callback_count); 810ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(2, adv_handler->call_count()); 8119fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray const std::vector<uint8_t> uuid_32bit_canonical{ 8129fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray 0xFB, 0x34, 0x9b, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 8139fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray 0xDE, 0xAD, 0x01, 0x02 8149fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray }; 8159fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray EXPECT_EQ(uuid_32bit_canonical, adv_handler->uuid_data()); 816ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 817ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // 128bit uuid test, should succeed with correctly parsed uuid 818ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(uuid_128bit_adv, callback); 819ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(5, callback_count); 820ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(3, adv_handler->call_count()); 821ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> uuid_128bit{ 822ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0xDE, 0xAD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 823ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E 824ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker }; 825ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(uuid_128bit, adv_handler->uuid_data()); 826ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 827ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker const std::vector<uint8_t> service_data{ 0xBE, 0xEF }; 828ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 8299fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // Service data with 16bit uuid included, should succeed with 830ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // uuid and service data parsed out 831ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(service_16bit_adv, callback); 832ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(6, callback_count); 833ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(4, adv_handler->call_count()); 834ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(service_data, adv_handler->service_data()); 8359fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray EXPECT_EQ(uuid_16bit_canonical, adv_handler->uuid_data()); 836ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 8379fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // Service data with 32bit uuid included, should succeed with 838ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // uuid and service data parsed out 839ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(service_32bit_adv, callback); 840ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(7, callback_count); 841ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(5, adv_handler->call_count()); 842ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(service_data, adv_handler->service_data()); 8439fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray EXPECT_EQ(uuid_32bit_canonical, adv_handler->uuid_data()); 844ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 8459fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // Service data with 128bit uuid included, should succeed with 846ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker // uuid and service data parsed out 847ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(service_128bit_adv, callback); 848ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(8, callback_count); 849ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(6, adv_handler->call_count()); 850ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(service_data, adv_handler->service_data()); 851ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(uuid_128bit, adv_handler->uuid_data()); 852ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 8539fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray // Service data and UUID where the UUID for both match, should succeed. 854ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker AdvertiseDataTestHelper(service_uuid_match, callback); 855ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(9, callback_count); 856ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(7, adv_handler->call_count()); 857ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(service_data, adv_handler->service_data()); 8589fc7d81c2dfa3f9b7c4381cd83e5e8f788e235f3Arman Uguray EXPECT_EQ(uuid_32bit_canonical, adv_handler->uuid_data()); 859ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 860a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // Service data and UUID where the UUID for dont match, should fail 861ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_TRUE(le_client_->StartAdvertising( 862ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker settings, service_uuid_mismatch, AdvertiseData(), callback)); 863ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker fake_hal_gatt_iface_->NotifyMultiAdvEnableCallback( 864bb18c41ffa0370d4eb0c4a15904b114355606466Arman Uguray le_client_->GetInstanceId(), BT_STATUS_SUCCESS); 865ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(10, callback_count); 866ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(7, adv_handler->call_count()); 867ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker EXPECT_EQ(BLE_STATUS_FAILURE, last_status); 868ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker} 869ff651b7fd11daaa29732cb8735d248910d9248f9Ajay Panicker 870480174f874a664affda33831c904eb3574ae9389Arman UgurayTEST_F(LowEnergyClientPostRegisterTest, ScanSettings) { 871480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_CALL(mock_adapter_, IsEnabled()) 872480174f874a664affda33831c904eb3574ae9389Arman Uguray .WillOnce(Return(false)) 873480174f874a664affda33831c904eb3574ae9389Arman Uguray .WillRepeatedly(Return(true)); 874480174f874a664affda33831c904eb3574ae9389Arman Uguray 875480174f874a664affda33831c904eb3574ae9389Arman Uguray ScanSettings settings; 876480174f874a664affda33831c904eb3574ae9389Arman Uguray std::vector<ScanFilter> filters; 877480174f874a664affda33831c904eb3574ae9389Arman Uguray 878480174f874a664affda33831c904eb3574ae9389Arman Uguray // Adapter is not enabled. 879480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_FALSE(le_client_->StartScan(settings, filters)); 880480174f874a664affda33831c904eb3574ae9389Arman Uguray 881a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // TODO(jpawlowski): add tests checking settings and filter parsing when 882480174f874a664affda33831c904eb3574ae9389Arman Uguray // implemented 883480174f874a664affda33831c904eb3574ae9389Arman Uguray 884480174f874a664affda33831c904eb3574ae9389Arman Uguray // These should succeed and result in a HAL call 885480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_CALL(*mock_handler_, Scan(true)) 886480174f874a664affda33831c904eb3574ae9389Arman Uguray .Times(1) 887480174f874a664affda33831c904eb3574ae9389Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 888480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_TRUE(le_client_->StartScan(settings, filters)); 889480174f874a664affda33831c904eb3574ae9389Arman Uguray 890480174f874a664affda33831c904eb3574ae9389Arman Uguray // These should succeed and result in a HAL call 891480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_CALL(*mock_handler_, Scan(false)) 892480174f874a664affda33831c904eb3574ae9389Arman Uguray .Times(1) 893480174f874a664affda33831c904eb3574ae9389Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 894480174f874a664affda33831c904eb3574ae9389Arman Uguray EXPECT_TRUE(le_client_->StopScan()); 895480174f874a664affda33831c904eb3574ae9389Arman Uguray 896480174f874a664affda33831c904eb3574ae9389Arman Uguray ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 897480174f874a664affda33831c904eb3574ae9389Arman Uguray} 898480174f874a664affda33831c904eb3574ae9389Arman Uguray 89982ea72f905565f83116f74d5ccbacea5d710a853Arman UgurayTEST_F(LowEnergyClientPostRegisterTest, ScanRecord) { 90082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray TestDelegate delegate; 90182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray le_client_->SetDelegate(&delegate); 90282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 90382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(0, delegate.scan_result_count()); 90482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 90582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const uint8_t kTestRecord0[] = { 0x02, 0x01, 0x00, 0x00 }; 90682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const uint8_t kTestRecord1[] = { 0x00 }; 90782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const uint8_t kTestRecord2[] = { 90882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 90982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 91082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 91182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 91282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 91382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 0x01, 0x00 91482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray }; 91582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const bt_bdaddr_t kTestAddress = { 91682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray { 0x01, 0x02, 0x03, 0x0A, 0x0B, 0x0C } 91782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray }; 91882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const char kTestAddressStr[] = "01:02:03:0A:0B:0C"; 91982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray const int kTestRssi = 64; 92082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 92182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray // Scan wasn't started. Result should be ignored. 92282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray fake_hal_gatt_iface_->NotifyScanResultCallback( 92382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray kTestAddress, kTestRssi, (uint8_t*) kTestRecord0); 92482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(0, delegate.scan_result_count()); 92582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 92682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray // Start a scan session for |le_client_|. 92782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_CALL(mock_adapter_, IsEnabled()) 92882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray .Times(1) 92982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray .WillOnce(Return(true)); 93082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_CALL(*mock_handler_, Scan(_)) 93182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray .Times(2) 93282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)) 93382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray .WillOnce(Return(BT_STATUS_SUCCESS)); 93482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray ScanSettings settings; 93582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray std::vector<ScanFilter> filters; 93682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray ASSERT_TRUE(le_client_->StartScan(settings, filters)); 93782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 93882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray fake_hal_gatt_iface_->NotifyScanResultCallback( 93982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray kTestAddress, kTestRssi, (uint8_t*) kTestRecord0); 94082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(1, delegate.scan_result_count()); 94182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 94282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 94382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(3U, delegate.last_scan_result().scan_record().size()); 94482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 94582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray fake_hal_gatt_iface_->NotifyScanResultCallback( 94682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray kTestAddress, kTestRssi, (uint8_t*) kTestRecord1); 94782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(2, delegate.scan_result_count()); 94882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 94982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 95082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_TRUE(delegate.last_scan_result().scan_record().empty()); 95182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 95282ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray fake_hal_gatt_iface_->NotifyScanResultCallback( 95382ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray kTestAddress, kTestRssi, (uint8_t*) kTestRecord2); 95482ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(3, delegate.scan_result_count()); 95582ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 95682ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 95782ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray EXPECT_EQ(62U, delegate.last_scan_result().scan_record().size()); 95882ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 95982ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray le_client_->SetDelegate(nullptr); 96082ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray} 96182ea72f905565f83116f74d5ccbacea5d710a853Arman Uguray 962a6372e984aea35ffb451fca378046efbf280291cJakub PawlowskiMATCHER_P(BitEq, x, std::string(negation ? "isn't" : "is") + 963a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski " bitwise equal to " + ::testing::PrintToString(x)) { 964a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski static_assert(sizeof(x) == sizeof(arg), "Size mismatch"); 965a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski return std::memcmp(&arg, &x, sizeof(x)) == 0; 966a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski} 967a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 968a6372e984aea35ffb451fca378046efbf280291cJakub PawlowskiTEST_F(LowEnergyClientPostRegisterTest, Connect) { 969a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski const bt_bdaddr_t kTestAddress = { 970a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski { 0x01, 0x02, 0x03, 0x0A, 0x0B, 0x0C } 971a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski }; 972a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski const char kTestAddressStr[] = "01:02:03:0A:0B:0C"; 973a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski const bool kTestDirect = false; 974a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski const int connId = 12; 975a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 976a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski TestDelegate delegate; 977a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski le_client_->SetDelegate(&delegate); 978a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 979a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // TODO(jpawlowski): NotifyConnectCallback should be called after returning 980a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // success, fix it when it becomes important. 981a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // These should succeed and result in a HAL call 982a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_CALL(*mock_handler_, Connect(le_client_->GetInstanceId(), 983a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Pointee(BitEq(kTestAddress)), kTestDirect, BT_TRANSPORT_LE)) 984a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski .Times(1) 985a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski .WillOnce(DoAll( 986a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Invoke([&](int client_id, const bt_bdaddr_t *bd_addr, bool is_direct, 987a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski int transport){ 988a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski fake_hal_gatt_iface_->NotifyConnectCallback(connId, BT_STATUS_SUCCESS, 989a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski client_id, *bd_addr); 990a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski }), 991a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Return(BT_STATUS_SUCCESS))); 992a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 993a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_TRUE(le_client_->Connect(kTestAddressStr, kTestDirect)); 994a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_EQ(1, delegate.connection_state_count()); 995a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 996a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // TODO(jpawlowski): same as above 997a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski // These should succeed and result in a HAL call 998a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_CALL(*mock_handler_, Disconnect(le_client_->GetInstanceId(), 999a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Pointee(BitEq(kTestAddress)), connId)) 1000a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski .Times(1) 1001a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski .WillOnce(DoAll( 1002a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Invoke([&](int client_id, const bt_bdaddr_t *bd_addr, int connId){ 1003a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski fake_hal_gatt_iface_->NotifyDisconnectCallback(connId, 1004a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski BT_STATUS_SUCCESS, 1005a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski client_id, *bd_addr); 1006a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski }), 1007a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski Return(BT_STATUS_SUCCESS))); 1008a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 1009a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_TRUE(le_client_->Disconnect(kTestAddressStr)); 1010a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski EXPECT_EQ(2, delegate.connection_state_count()); 1011a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 1012a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski le_client_->SetDelegate(nullptr); 1013a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 1014a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski} 1015a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 1016a6372e984aea35ffb451fca378046efbf280291cJakub Pawlowski 1017c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray} // namespace 1018c2fc0f287f4dfaf206a51856b8d5dfa923af3c05Arman Uguray} // namespace bluetooth 1019