1c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 25b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski// Copyright 2016 The Android Open Source Project 3c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 4c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Licensed under the Apache License, Version 2.0 (the "License"); 5c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// you may not use this file except in compliance with the License. 6c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// You may obtain a copy of the License at: 7c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 8c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// http://www.apache.org/licenses/LICENSE-2.0 9c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 10c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Unless required by applicable law or agreed to in writing, software 11c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// distributed under the License is distributed on an "AS IS" BASIS, 12c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// See the License for the specific language governing permissions and 14c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// limitations under the License. 15c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// 16c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 17c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <base/macros.h> 18c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <gmock/gmock.h> 19c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <gtest/gtest.h> 20709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski#include <memory> 21c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 22c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/adapter.h" 23c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/hal/fake_bluetooth_gatt_interface.h" 24c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/low_energy_scanner.h" 25c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "stack/include/bt_types.h" 26c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "stack/include/hcidefs.h" 27c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "test/mock_adapter.h" 28c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 29c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing ::testing::_; 30c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing ::testing::Return; 31c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing ::testing::Pointee; 32c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing ::testing::DoAll; 33c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing ::testing::Invoke; 3483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowskiusing ::testing::SaveArg; 35c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 36c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace bluetooth { 37c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace { 38c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 3983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowskiclass MockScannerHandler : public BleScannerInterface { 40c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski public: 4183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski MockScannerHandler() {} 4283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski ~MockScannerHandler() override = default; 43c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 4483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski MOCK_METHOD1(RegisterScanner, void(BleScannerInterface::RegisterCallback)); 4583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski MOCK_METHOD1(Unregister, void(int)); 4683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski MOCK_METHOD1(Scan, void(bool)); 47c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 48119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski MOCK_METHOD5(ScanFilterParamSetupImpl, 49709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski void(uint8_t client_if, uint8_t action, uint8_t filt_index, 50119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski btgatt_filt_param_setup_t* filt_param, 51119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FilterParamSetupCallback cb)); 52119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski MOCK_METHOD2(ScanFilterClear, void(int filt_index, FilterConfigCallback cb)); 53119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski MOCK_METHOD2(ScanFilterEnable, void(bool enable, EnableCallback cb)); 54808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski MOCK_METHOD3(SetScanParameters, 55119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void(int scan_interval, int scan_window, Callback cb)); 5683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 57119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski MOCK_METHOD5(BatchscanConfigStorage, 58808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski void(int client_if, int batch_scan_full_max, 59119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski int batch_scan_trunc_max, int batch_scan_notify_threshold, 60119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski Callback cb)); 6183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 62808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski MOCK_METHOD6(BatchscanEnable, 63119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void(int scan_mode, int scan_interval, int scan_window, 64119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski int addr_type, int discard_rule, Callback cb)); 6583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 66119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski MOCK_METHOD1(BatchscanDisable, void(Callback cb)); 6783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 68808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski MOCK_METHOD2(BatchscanReadReports, void(int client_if, int scan_mode)); 6983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 70a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski MOCK_METHOD7(StartSync, void(uint8_t, RawAddress, uint16_t, uint16_t, 71f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski StartSyncCb, SyncReportCb, SyncLostCb)); 72f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski MOCK_METHOD1(StopSync, void(uint16_t)); 73f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski 740ddfae721af17fee6897382f0aa9dabd774ca074Jakub Pawlowski void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters, 750ddfae721af17fee6897382f0aa9dabd774ca074Jakub Pawlowski FilterConfigCallback cb){}; 76709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski 77709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski void ScanFilterParamSetup( 78709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski uint8_t client_if, uint8_t action, uint8_t filt_index, 79119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski std::unique_ptr<btgatt_filt_param_setup_t> filt_param, 80119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FilterParamSetupCallback cb) { 81119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski ScanFilterParamSetupImpl(client_if, action, filt_index, filt_param.get(), 82119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski std::move(cb)); 83709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski } 84c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}; 85c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 86c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiclass TestDelegate : public LowEnergyScanner::Delegate { 87c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski public: 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson TestDelegate() : scan_result_count_(0) {} 89c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 90c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ~TestDelegate() override = default; 91c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 92c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scan_result_count() const { return scan_result_count_; } 93c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const ScanResult& last_scan_result() const { return last_scan_result_; } 94c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 95c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void OnScanResult(LowEnergyScanner* scanner, const ScanResult& scan_result) { 96c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ASSERT_TRUE(scanner); 97c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski scan_result_count_++; 98c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski last_scan_result_ = scan_result; 99c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 100c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 101c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski private: 102c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scan_result_count_; 103c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ScanResult last_scan_result_; 104c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 105c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski DISALLOW_COPY_AND_ASSIGN(TestDelegate); 106c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}; 107c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 108c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiclass LowEnergyScannerTest : public ::testing::Test { 109c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski public: 110c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LowEnergyScannerTest() = default; 111c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ~LowEnergyScannerTest() override = default; 112c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 113c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void SetUp() override { 114c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // Only set |mock_handler_| if a test hasn't set it. 11583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski if (!mock_handler_) mock_handler_.reset(new MockScannerHandler()); 116c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski fake_hal_gatt_iface_ = new hal::FakeBluetoothGattInterface( 11783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski nullptr, std::static_pointer_cast<BleScannerInterface>(mock_handler_), 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson nullptr, nullptr); 119c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski hal::BluetoothGattInterface::InitializeForTesting(fake_hal_gatt_iface_); 120c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ble_factory_.reset(new LowEnergyScannerFactory(mock_adapter_)); 121c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 122c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 123c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void TearDown() override { 124c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ble_factory_.reset(); 125c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski hal::BluetoothGattInterface::CleanUp(); 126c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 127c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 128c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski protected: 129c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski hal::FakeBluetoothGattInterface* fake_hal_gatt_iface_; 130c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski testing::MockAdapter mock_adapter_; 13183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski std::shared_ptr<MockScannerHandler> mock_handler_; 132c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::unique_ptr<LowEnergyScannerFactory> ble_factory_; 133c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 134c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski private: 135c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski DISALLOW_COPY_AND_ASSIGN(LowEnergyScannerTest); 136c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}; 137c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 138c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski// Used for tests that operate on a pre-registered scanner. 139c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiclass LowEnergyScannerPostRegisterTest : public LowEnergyScannerTest { 140c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski public: 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LowEnergyScannerPostRegisterTest() : next_scanner_id_(0) {} 142c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ~LowEnergyScannerPostRegisterTest() override = default; 143c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 144c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void SetUp() override { 145c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LowEnergyScannerTest::SetUp(); 146c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski auto callback = [&](std::unique_ptr<LowEnergyScanner> scanner) { 147c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski le_scanner_ = std::move(scanner); 148c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski }; 149c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski RegisterTestScanner(callback); 150c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 151c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 152c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void TearDown() override { 15383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski EXPECT_CALL(*mock_handler_, Unregister(_)).Times(1).WillOnce(Return()); 154c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski le_scanner_.reset(); 155c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LowEnergyScannerTest::TearDown(); 156c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 157c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 158c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski void RegisterTestScanner( 159c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const std::function<void(std::unique_ptr<LowEnergyScanner> scanner)> 160c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski callback) { 161819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski Uuid uuid = Uuid::GetRandom(); 162819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski auto api_callback = [&](BLEStatus status, const Uuid& in_uuid, 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson std::unique_ptr<BluetoothInstance> in_scanner) { 164c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski CHECK(in_uuid == uuid); 165c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski CHECK(in_scanner.get()); 166c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski CHECK(status == BLE_STATUS_SUCCESS); 167c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 168c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski callback(std::unique_ptr<LowEnergyScanner>( 169c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski static_cast<LowEnergyScanner*>(in_scanner.release()))); 170c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski }; 171c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 17283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BleScannerInterface::RegisterCallback reg_scanner_cb; 173c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_CALL(*mock_handler_, RegisterScanner(_)) 174c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .Times(1) 17583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(SaveArg<0>(®_scanner_cb)); 176c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 177c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ble_factory_->RegisterInstance(uuid, api_callback); 178c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 17983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski reg_scanner_cb.Run(next_scanner_id_++, BT_STATUS_SUCCESS); 180c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 181c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 182c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 183c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski protected: 184c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::unique_ptr<LowEnergyScanner> le_scanner_; 185c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 186c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski private: 187c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int next_scanner_id_; 188c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 189c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski DISALLOW_COPY_AND_ASSIGN(LowEnergyScannerPostRegisterTest); 190c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}; 191c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 192c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiTEST_F(LowEnergyScannerTest, RegisterInstance) { 19383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BleScannerInterface::RegisterCallback reg_scanner_cb1; 194c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_CALL(*mock_handler_, RegisterScanner(_)) 19583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .Times(1) 19683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(SaveArg<0>(®_scanner_cb1)); 197c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 198c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // These will be asynchronously populated with a result when the callback 199c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // executes. 200c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski BLEStatus status = BLE_STATUS_SUCCESS; 201819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski Uuid cb_uuid; 202c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::unique_ptr<LowEnergyScanner> scanner; 203c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int callback_count = 0; 204c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 205819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski auto callback = [&](BLEStatus in_status, const Uuid& uuid, 206c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::unique_ptr<BluetoothInstance> in_scanner) { 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = in_status; 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cb_uuid = uuid; 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scanner = std::unique_ptr<LowEnergyScanner>( 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson static_cast<LowEnergyScanner*>(in_scanner.release())); 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback_count++; 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson }; 213c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 214819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski Uuid uuid0 = Uuid::GetRandom(); 215c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 216c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // HAL returns success. 217c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_TRUE(ble_factory_->RegisterInstance(uuid0, callback)); 218c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(0, callback_count); 219c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 220819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski // Calling twice with the same Uuid should fail with no additional call into 221c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // the stack. 222c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_FALSE(ble_factory_->RegisterInstance(uuid0, callback)); 223c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 224c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 225c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 226819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski // Call with a different Uuid while one is pending. 227819e2ecb84a22d6e03ec9ed67b3260c0dd7e8abaJakub Pawlowski Uuid uuid1 = Uuid::GetRandom(); 22883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BleScannerInterface::RegisterCallback reg_scanner_cb2; 229c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_CALL(*mock_handler_, RegisterScanner(_)) 230c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .Times(1) 23183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(SaveArg<0>(®_scanner_cb2)); 232c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_TRUE(ble_factory_->RegisterInstance(uuid1, callback)); 233c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 234c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // |uuid0| succeeds. 235c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scanner_if0 = 2; // Pick something that's not 0. 23683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski reg_scanner_cb1.Run(scanner_if0, BT_STATUS_SUCCESS); 237c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 238c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(1, callback_count); 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ASSERT_TRUE(scanner.get() != 240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson nullptr); // Assert to terminate in case of error 241c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(BLE_STATUS_SUCCESS, status); 242c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(scanner_if0, scanner->GetInstanceId()); 243c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(uuid0, scanner->GetAppIdentifier()); 244c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(uuid0, cb_uuid); 245c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 246c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // The scanner should unregister itself when deleted. 24783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski EXPECT_CALL(*mock_handler_, Unregister(scanner_if0)) 248c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .Times(1) 24983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(Return()); 250c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski scanner.reset(); 251c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 252c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 253c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // |uuid1| fails. 254c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int scanner_if1 = 3; 25583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski reg_scanner_cb2.Run(scanner_if1, BT_STATUS_FAIL); 256c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 257c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(2, callback_count); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ASSERT_TRUE(scanner.get() == 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson nullptr); // Assert to terminate in case of error 260c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(BLE_STATUS_FAILURE, status); 261c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(uuid1, cb_uuid); 262c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 263c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 264c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiTEST_F(LowEnergyScannerPostRegisterTest, ScanSettings) { 265c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_CALL(mock_adapter_, IsEnabled()) 266c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .WillOnce(Return(false)) 267c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .WillRepeatedly(Return(true)); 268c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 269c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ScanSettings settings; 270c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::vector<ScanFilter> filters; 271c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 272c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // Adapter is not enabled. 273c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_FALSE(le_scanner_->StartScan(settings, filters)); 274c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 275c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // TODO(jpawlowski): add tests checking settings and filter parsing when 276c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // implemented 277c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 278c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // These should succeed and result in a HAL call 27983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski EXPECT_CALL(*mock_handler_, Scan(true)).Times(1).WillOnce(Return()); 280c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_TRUE(le_scanner_->StartScan(settings, filters)); 281c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 282c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // These should succeed and result in a HAL call 28383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski EXPECT_CALL(*mock_handler_, Scan(false)).Times(1).WillOnce(Return()); 284c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_TRUE(le_scanner_->StopScan()); 285c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 286c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ::testing::Mock::VerifyAndClearExpectations(mock_handler_.get()); 287c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 288c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 289c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiTEST_F(LowEnergyScannerPostRegisterTest, ScanRecord) { 290c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski TestDelegate delegate; 291c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski le_scanner_->SetDelegate(&delegate); 292c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 293c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(0, delegate.scan_result_count()); 294c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 295b324a8d0b719065cec10379ad6855852724d9004Pavlin Radoslavov std::vector<uint8_t> kTestRecord0({0x02, 0x01, 0x00, 0x00}); 296b324a8d0b719065cec10379ad6855852724d9004Pavlin Radoslavov std::vector<uint8_t> kTestRecord1({0x00}); 297b324a8d0b719065cec10379ad6855852724d9004Pavlin Radoslavov std::vector<uint8_t> kTestRecord2( 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson {0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00}); 304a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski const RawAddress kTestAddress = {{0x01, 0x02, 0x03, 0x0A, 0x0B, 0x0C}}; 305c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const char kTestAddressStr[] = "01:02:03:0A:0B:0C"; 306c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski const int kTestRssi = 64; 307c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 308c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // Scan wasn't started. Result should be ignored. 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fake_hal_gatt_iface_->NotifyScanResultCallback(kTestAddress, kTestRssi, 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson kTestRecord0); 311c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(0, delegate.scan_result_count()); 312c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 313c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski // Start a scan session for |le_scanner_|. 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson EXPECT_CALL(mock_adapter_, IsEnabled()).Times(1).WillOnce(Return(true)); 315c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_CALL(*mock_handler_, Scan(_)) 316c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski .Times(2) 31783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(Return()) 31883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski .WillOnce(Return()); 319c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ScanSettings settings; 320c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski std::vector<ScanFilter> filters; 321c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ASSERT_TRUE(le_scanner_->StartScan(settings, filters)); 322c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fake_hal_gatt_iface_->NotifyScanResultCallback(kTestAddress, kTestRssi, 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson kTestRecord0); 325c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(1, delegate.scan_result_count()); 326c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 327c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 328c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(3U, delegate.last_scan_result().scan_record().size()); 329c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fake_hal_gatt_iface_->NotifyScanResultCallback(kTestAddress, kTestRssi, 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson kTestRecord1); 332c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(2, delegate.scan_result_count()); 333c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 334c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 335c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_TRUE(delegate.last_scan_result().scan_record().empty()); 336c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson fake_hal_gatt_iface_->NotifyScanResultCallback(kTestAddress, kTestRssi, 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson kTestRecord2); 339c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(3, delegate.scan_result_count()); 340c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestAddressStr, delegate.last_scan_result().device_address()); 341c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(kTestRssi, delegate.last_scan_result().rssi()); 342c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski EXPECT_EQ(62U, delegate.last_scan_result().scan_record().size()); 343c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 344c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski le_scanner_->SetDelegate(nullptr); 345c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 346c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 347c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} // namespace 348c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} // namespace bluetooth 349