1/******************************************************************************
2 *
3 *  Copyright 2015 Google, Inc.
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19#include "adapter/bluetooth_test.h"
20#include "service/hal/bluetooth_gatt_interface.h"
21
22namespace bttest {
23
24// This class represents the Bluetooth GATT testing framework and provides
25// helpers and callbacks for GUnit to use for testing gatt.
26class GattTest : public BluetoothTest,
27                 public bluetooth::hal::BluetoothGattInterface::ClientObserver,
28                 public bluetooth::hal::BluetoothGattInterface::ScannerObserver,
29                 public bluetooth::hal::BluetoothGattInterface::ServerObserver {
30 protected:
31  GattTest() = default;
32  virtual ~GattTest() = default;
33
34  // Gets the gatt_scanner_interface
35  const BleScannerInterface* gatt_scanner_interface();
36
37  // Gets the gatt_client_interface
38  const btgatt_client_interface_t* gatt_client_interface();
39
40  // Gets the gatt_server_interface
41  const btgatt_server_interface_t* gatt_server_interface();
42
43  // Getters for variables that track GATT-related state
44  int client_interface_id() const { return client_interface_id_; }
45  int server_interface_id() const { return server_interface_id_; }
46  int service_handle() const { return service_handle_; }
47  int characteristic_handle() const { return characteristic_handle_; }
48  int descriptor_handle() const { return descriptor_handle_; }
49  int status() const { return status_; }
50
51  // SetUp initializes the Bluetooth interfaces and the GATT Interface as well
52  // as registers the callbacks and initializes the semaphores before every test
53  virtual void SetUp();
54
55  // TearDown cleans up the Bluetooth and GATT interfaces and destroys the
56  // callback semaphores at the end of every test
57  virtual void TearDown();
58
59  // bluetooth::hal::BluetoothGattInterface::ClientObserver overrides
60  void RegisterClientCallback(
61      bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
62      int clientIf, const bluetooth::Uuid& app_uuid) override;
63  void ScanResultCallback(bluetooth::hal::BluetoothGattInterface* /* unused */,
64                          const RawAddress& bda, int rssi,
65                          std::vector<uint8_t> adv_data) override;
66
67  // bluetooth::hal::BluetoothGattInterface::ServerObserver overrides
68  void RegisterServerCallback(
69      bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
70      int server_if, const bluetooth::Uuid& uuid) override;
71  void ServiceAddedCallback(
72      bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
73      int server_if, std::vector<btgatt_db_element_t> service) override;
74  void ServiceStoppedCallback(
75      bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
76      int server_if, int srvc_handle) override;
77  void ServiceDeletedCallback(
78      bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
79      int server_if, int srvc_handle) override;
80
81  // Semaphores used to wait for specific callback execution. Each callback
82  // has its own semaphore associated with it
83  semaphore_t* register_client_callback_sem_;
84  semaphore_t* scan_result_callback_sem_;
85  semaphore_t* listen_callback_sem_;
86
87  semaphore_t* register_server_callback_sem_;
88  semaphore_t* service_added_callback_sem_;
89  semaphore_t* characteristic_added_callback_sem_;
90  semaphore_t* descriptor_added_callback_sem_;
91  semaphore_t* service_started_callback_sem_;
92  semaphore_t* service_stopped_callback_sem_;
93  semaphore_t* service_deleted_callback_sem_;
94
95 private:
96  // The btgatt_scanner_interface_t that all the tests use to interact with the
97  // HAL
98  const BleScannerInterface* gatt_scanner_interface_;
99
100  // The gatt_client_interface that all the tests use to interact with the HAL
101  const btgatt_client_interface_t* gatt_client_interface_;
102
103  // The gatt_server_interface that all the tests use to interact with the HAL
104  const btgatt_server_interface_t* gatt_server_interface_;
105
106  // No mutex needed for these as the semaphores should ensure
107  // synchronous access
108
109  // An ID that is used as a handle for each gatt client.
110  int client_interface_id_;
111
112  // An ID that is used as a handle for each gatt server.
113  int server_interface_id_;
114
115  // A handle to the last used service.
116  int service_handle_;
117
118  // A handle to the last characteristic added.
119  int characteristic_handle_;
120
121  // A handle to the last descriptor added.
122  int descriptor_handle_;
123
124  // The status of the last callback. Is BT_STATUS_SUCCESS if no issues.
125  int status_;
126
127  DISALLOW_COPY_AND_ASSIGN(GattTest);
128};
129
130}  // bttest
131