1 /******************************************************************************
2  *
3  *  Copyright (C) 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 "gatt/gatt_test.h"
20 #include "adapter/bluetooth_test.h"
21 #include "btcore/include/bdaddr.h"
22 
23 namespace bttest {
24 
SetUp()25 void GattTest::SetUp() {
26   gatt_client_interface_ = nullptr;
27   gatt_server_interface_ = nullptr;
28 
29   client_interface_id_ = 0;
30   server_interface_id_ = 0;
31   service_handle_ = 0;
32   characteristic_handle_ = 0;
33   descriptor_handle_ = 0;
34   status_ = 0;
35 
36   BluetoothTest::SetUp();
37   ASSERT_EQ(bt_interface()->enable(false), BT_STATUS_SUCCESS);
38   semaphore_wait(adapter_state_changed_callback_sem_);
39   EXPECT_TRUE(GetState() == BT_STATE_ON);
40 
41   register_client_callback_sem_ = semaphore_new(0);
42   scan_result_callback_sem_ = semaphore_new(0);
43 
44   register_server_callback_sem_ = semaphore_new(0);
45   service_added_callback_sem_ = semaphore_new(0);
46   service_stopped_callback_sem_ = semaphore_new(0);
47   service_deleted_callback_sem_ = semaphore_new(0);
48 
49   bluetooth::hal::BluetoothGattInterface::Initialize();
50   ASSERT_TRUE(bluetooth::hal::BluetoothGattInterface::IsInitialized());
51   auto gatt_interface = bluetooth::hal::BluetoothGattInterface::Get();
52   gatt_interface->AddClientObserver(this);
53   gatt_interface->AddServerObserver(this);
54 
55   gatt_client_interface_ = gatt_interface->GetClientHALInterface();
56   gatt_server_interface_ = gatt_interface->GetServerHALInterface();
57 
58   ASSERT_NE(nullptr, gatt_client_interface_);
59   ASSERT_NE(nullptr, gatt_server_interface_);
60 }
61 
TearDown()62 void GattTest::TearDown() {
63   gatt_client_interface_ = nullptr;
64   gatt_server_interface_ = nullptr;
65 
66   semaphore_free(register_client_callback_sem_);
67   semaphore_free(scan_result_callback_sem_);
68 
69   semaphore_free(register_server_callback_sem_);
70   semaphore_free(service_added_callback_sem_);
71   semaphore_free(service_stopped_callback_sem_);
72   semaphore_free(service_deleted_callback_sem_);
73 
74   bluetooth::hal::BluetoothGattInterface::CleanUp();
75 
76   ASSERT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
77   semaphore_wait(adapter_state_changed_callback_sem_);
78   BluetoothTest::TearDown();
79 }
80 
gatt_scanner_interface()81 const BleScannerInterface* GattTest::gatt_scanner_interface() {
82   return gatt_scanner_interface_;
83 }
84 
gatt_client_interface()85 const btgatt_client_interface_t* GattTest::gatt_client_interface() {
86   return gatt_client_interface_;
87 }
88 
gatt_server_interface()89 const btgatt_server_interface_t* GattTest::gatt_server_interface() {
90   return gatt_server_interface_;
91 }
92 
RegisterClientCallback(bluetooth::hal::BluetoothGattInterface *,int status,int clientIf,const bt_uuid_t & app_uuid)93 void GattTest::RegisterClientCallback(
94     bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
95     int clientIf, const bt_uuid_t& app_uuid) {
96   status_ = status;
97   client_interface_id_ = clientIf;
98   semaphore_post(register_client_callback_sem_);
99 }
100 
ScanResultCallback(bluetooth::hal::BluetoothGattInterface *,const bt_bdaddr_t & bda,int rssi,std::vector<uint8_t> adv_data)101 void GattTest::ScanResultCallback(
102     bluetooth::hal::BluetoothGattInterface* /* unused */,
103     const bt_bdaddr_t& bda, int rssi, std::vector<uint8_t> adv_data) {
104   semaphore_post(scan_result_callback_sem_);
105 }
106 
107 // GATT server callbacks
RegisterServerCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,const bt_uuid_t & uuid)108 void GattTest::RegisterServerCallback(
109     bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
110     int server_if, const bt_uuid_t& uuid) {
111   status_ = status;
112   server_interface_id_ = server_if;
113   semaphore_post(register_server_callback_sem_);
114 }
115 
ServiceAddedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,std::vector<btgatt_db_element_t> service)116 void GattTest::ServiceAddedCallback(
117     bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
118     int server_if, std::vector<btgatt_db_element_t> service) {
119   status_ = status;
120   server_interface_id_ = server_if;
121   service_handle_ = service[0].attribute_handle;
122   semaphore_post(service_added_callback_sem_);
123 }
124 
ServiceStoppedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,int srvc_handle)125 void GattTest::ServiceStoppedCallback(
126     bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
127     int server_if, int srvc_handle) {
128   status_ = status;
129   server_interface_id_ = server_if;
130   service_handle_ = srvc_handle;
131   semaphore_post(service_stopped_callback_sem_);
132 }
133 
ServiceDeletedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,int srvc_handle)134 void GattTest::ServiceDeletedCallback(
135     bluetooth::hal::BluetoothGattInterface* /* unused */, int status,
136     int server_if, int srvc_handle) {
137   status_ = status;
138   server_interface_id_ = server_if;
139   service_handle_ = srvc_handle;
140   semaphore_post(service_deleted_callback_sem_);
141 }
142 
143 }  // bttest
144