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