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