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 "adapter/bluetooth_test.h"
20 #include "gatt/gatt_test.h"
21 
22 extern "C" {
23 #include "btcore/include/bdaddr.h"
24 }
25 
26 namespace bttest {
27 
SetUp()28 void GattTest::SetUp() {
29   gatt_client_interface_ = nullptr;
30   gatt_server_interface_ = nullptr;
31 
32   client_interface_id_ = 0;
33   server_interface_id_ = 0;
34   service_handle_ = 0;
35   characteristic_handle_ = 0;
36   descriptor_handle_ = 0;
37   status_ = 0;
38 
39   BluetoothTest::SetUp();
40   ASSERT_EQ(bt_interface()->enable(false), BT_STATUS_SUCCESS);
41   semaphore_wait(adapter_state_changed_callback_sem_);
42   EXPECT_TRUE(GetState() == BT_STATE_ON);
43 
44   register_client_callback_sem_ = semaphore_new(0);
45   scan_result_callback_sem_ = semaphore_new(0);
46   listen_callback_sem_ = semaphore_new(0);
47 
48   register_server_callback_sem_ = semaphore_new(0);
49   service_added_callback_sem_ = semaphore_new(0);
50   characteristic_added_callback_sem_ = semaphore_new(0);
51   descriptor_added_callback_sem_ = semaphore_new(0);
52   service_started_callback_sem_ = semaphore_new(0);
53   service_stopped_callback_sem_ = semaphore_new(0);
54   service_deleted_callback_sem_ = semaphore_new(0);
55 
56   bluetooth::hal::BluetoothGattInterface::Initialize();
57   ASSERT_TRUE(bluetooth::hal::BluetoothGattInterface::IsInitialized());
58   auto gatt_interface = bluetooth::hal::BluetoothGattInterface::Get();
59   gatt_interface->AddClientObserver(this);
60   gatt_interface->AddServerObserver(this);
61 
62   gatt_client_interface_ = gatt_interface->GetClientHALInterface();
63   gatt_server_interface_ = gatt_interface->GetServerHALInterface();
64 
65   ASSERT_NE(nullptr, gatt_client_interface_);
66   ASSERT_NE(nullptr, gatt_server_interface_);
67 }
68 
TearDown()69 void GattTest::TearDown() {
70   gatt_client_interface_ = nullptr;
71   gatt_server_interface_ = nullptr;
72 
73   semaphore_free(register_client_callback_sem_);
74   semaphore_free(scan_result_callback_sem_);
75   semaphore_free(listen_callback_sem_);
76 
77   semaphore_free(register_server_callback_sem_);
78   semaphore_free(service_added_callback_sem_);
79   semaphore_free(characteristic_added_callback_sem_);
80   semaphore_free(descriptor_added_callback_sem_);
81   semaphore_free(service_started_callback_sem_);
82   semaphore_free(service_stopped_callback_sem_);
83   semaphore_free(service_deleted_callback_sem_);
84 
85   bluetooth::hal::BluetoothGattInterface::CleanUp();
86 
87   ASSERT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
88   semaphore_wait(adapter_state_changed_callback_sem_);
89   BluetoothTest::TearDown();
90 }
91 
gatt_client_interface()92 const btgatt_client_interface_t* GattTest::gatt_client_interface() {
93   return gatt_client_interface_;
94 }
95 
gatt_server_interface()96 const btgatt_server_interface_t* GattTest::gatt_server_interface() {
97   return gatt_server_interface_;
98 }
99 
RegisterClientCallback(bluetooth::hal::BluetoothGattInterface *,int status,int clientIf,const bt_uuid_t & app_uuid)100 void GattTest::RegisterClientCallback(
101     bluetooth::hal::BluetoothGattInterface* /* unused */,
102     int status, int clientIf, const bt_uuid_t& app_uuid) {
103   status_ = status;
104   client_interface_id_ = clientIf;
105   semaphore_post(register_client_callback_sem_);
106 }
107 
ScanResultCallback(bluetooth::hal::BluetoothGattInterface *,const bt_bdaddr_t & bda,int rssi,uint8_t * adv_data)108 void GattTest::ScanResultCallback(
109     bluetooth::hal::BluetoothGattInterface* /* unused */,
110     const bt_bdaddr_t& bda, int rssi, uint8_t* adv_data) {
111   semaphore_post(scan_result_callback_sem_);
112 }
113 
ListenCallback(bluetooth::hal::BluetoothGattInterface *,int status,int client_if)114 void GattTest::ListenCallback(
115     bluetooth::hal::BluetoothGattInterface* /* unused */,
116     int status, int client_if) {
117   status_ = status;
118   client_interface_id_ = client_if;
119   semaphore_post(listen_callback_sem_);
120 }
121 
122 // GATT server callbacks
RegisterServerCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,const bt_uuid_t & uuid)123 void GattTest::RegisterServerCallback(
124     bluetooth::hal::BluetoothGattInterface* /* unused */,
125     int status, int server_if, const bt_uuid_t& uuid) {
126   status_ = status;
127   server_interface_id_ = server_if;
128   semaphore_post(register_server_callback_sem_);
129 }
130 
ServiceAddedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,const btgatt_srvc_id_t & srvc_id,int srvc_handle)131 void GattTest::ServiceAddedCallback(
132     bluetooth::hal::BluetoothGattInterface* /* unused */,
133     int status, int server_if, const btgatt_srvc_id_t& srvc_id,
134     int srvc_handle) {
135   status_ = status;
136   server_interface_id_ = server_if;
137   service_handle_ = srvc_handle;
138   semaphore_post(service_added_callback_sem_);
139 }
140 
CharacteristicAddedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,const bt_uuid_t & char_id,int srvc_handle,int char_handle)141 void GattTest::CharacteristicAddedCallback(
142     bluetooth::hal::BluetoothGattInterface* /* unused */,
143     int status, int server_if, const bt_uuid_t& char_id,
144     int srvc_handle, int char_handle) {
145   status_ = status;
146   server_interface_id_ = server_if;
147   service_handle_ = srvc_handle;
148   characteristic_handle_ = char_handle;
149   semaphore_post(characteristic_added_callback_sem_);
150 }
151 
DescriptorAddedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,const bt_uuid_t & descr_id,int srvc_handle,int descr_handle)152 void GattTest::DescriptorAddedCallback(
153     bluetooth::hal::BluetoothGattInterface* /* unused */,
154     int status, int server_if, const bt_uuid_t& descr_id,
155     int srvc_handle, int descr_handle) {
156   status_ = status;
157   server_interface_id_ = server_if;
158   service_handle_ = srvc_handle;
159   descriptor_handle_ = descr_handle;
160   semaphore_post(descriptor_added_callback_sem_);
161 }
162 
ServiceStartedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,int srvc_handle)163 void GattTest::ServiceStartedCallback(
164     bluetooth::hal::BluetoothGattInterface* /* unused */,
165     int status, int server_if, int srvc_handle) {
166   status_ = status;
167   server_interface_id_ = server_if;
168   service_handle_ = srvc_handle;
169   semaphore_post(service_started_callback_sem_);
170 }
171 
ServiceStoppedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,int srvc_handle)172 void GattTest::ServiceStoppedCallback(
173     bluetooth::hal::BluetoothGattInterface* /* unused */,
174     int status, int server_if, int srvc_handle) {
175   status_ = status;
176   server_interface_id_ = server_if;
177   service_handle_ = srvc_handle;
178   semaphore_post(service_stopped_callback_sem_);
179 }
180 
ServiceDeletedCallback(bluetooth::hal::BluetoothGattInterface *,int status,int server_if,int srvc_handle)181 void GattTest::ServiceDeletedCallback(
182     bluetooth::hal::BluetoothGattInterface* /* unused */,
183     int status, int server_if, int srvc_handle) {
184   status_ = status;
185   server_interface_id_ = server_if;
186   service_handle_ = srvc_handle;
187   semaphore_post(service_deleted_callback_sem_);
188 }
189 
190 }  // bttest
191