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>(&reg_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>(&reg_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>(&reg_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