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