1 //
2 // Copyright (C) 2015 Google, Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at:
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "service/hal/fake_bluetooth_gatt_interface.h"
18
19 namespace bluetooth {
20 namespace hal {
21 namespace {
22
23 // The global test handler instances. We have to have globals since the HAL
24 // interface methods all have to be global and their signatures don't allow us
25 // to pass in user_data.
26 std::shared_ptr<FakeBluetoothGattInterface::TestClientHandler> g_client_handler;
27 std::shared_ptr<FakeBluetoothGattInterface::TestServerHandler> g_server_handler;
28
FakeRegisterClient(bt_uuid_t * app_uuid)29 bt_status_t FakeRegisterClient(bt_uuid_t* app_uuid) {
30 if (g_client_handler)
31 return g_client_handler->RegisterClient(app_uuid);
32
33 return BT_STATUS_FAIL;
34 }
35
FakeUnregisterClient(int client_if)36 bt_status_t FakeUnregisterClient(int client_if) {
37 if (g_client_handler)
38 return g_client_handler->UnregisterClient(client_if);
39
40 return BT_STATUS_FAIL;
41 }
42
FakeScan(bool start)43 bt_status_t FakeScan(bool start) {
44 if (g_client_handler)
45 return g_client_handler->Scan(start);
46
47 return BT_STATUS_FAIL;
48 }
49
FakeConnect(int client_if,const bt_bdaddr_t * bd_addr,bool is_direct,int transport)50 bt_status_t FakeConnect(int client_if, const bt_bdaddr_t *bd_addr,
51 bool is_direct, int transport) {
52 if (g_client_handler)
53 return g_client_handler->Connect(client_if, bd_addr, is_direct, transport);
54
55 return BT_STATUS_FAIL;
56 }
57
FakeDisconnect(int client_if,const bt_bdaddr_t * bd_addr,int conn_id)58 bt_status_t FakeDisconnect(int client_if, const bt_bdaddr_t *bd_addr,
59 int conn_id) {
60 if (g_client_handler)
61 return g_client_handler->Disconnect(client_if, bd_addr, conn_id);
62
63 return BT_STATUS_FAIL;
64 }
65
FakeMultiAdvEnable(int client_if,int min_interval,int max_interval,int adv_type,int chnl_map,int tx_power,int timeout_s)66 bt_status_t FakeMultiAdvEnable(
67 int client_if, int min_interval, int max_interval, int adv_type,
68 int chnl_map, int tx_power, int timeout_s) {
69 if (g_client_handler)
70 return g_client_handler->MultiAdvEnable(client_if, min_interval, max_interval,
71 adv_type, chnl_map, tx_power, timeout_s);
72
73 return BT_STATUS_FAIL;
74 }
75
FakeMultiAdvSetInstData(int client_if,bool set_scan_rsp,bool include_name,bool incl_txpower,int appearance,int manufacturer_len,char * manufacturer_data,int service_data_len,char * service_data,int service_uuid_len,char * service_uuid)76 bt_status_t FakeMultiAdvSetInstData(
77 int client_if, bool set_scan_rsp, bool include_name,
78 bool incl_txpower, int appearance,
79 int manufacturer_len, char* manufacturer_data,
80 int service_data_len, char* service_data,
81 int service_uuid_len, char* service_uuid) {
82 if (g_client_handler)
83 return g_client_handler->MultiAdvSetInstData(
84 client_if, set_scan_rsp, include_name,
85 incl_txpower, appearance,
86 manufacturer_len, manufacturer_data,
87 service_data_len, service_data,
88 service_uuid_len, service_uuid);
89
90 return BT_STATUS_FAIL;
91 }
92
FakeMultiAdvDisable(int client_if)93 bt_status_t FakeMultiAdvDisable(int client_if) {
94 if (g_client_handler)
95 return g_client_handler->MultiAdvDisable(client_if);
96
97 return BT_STATUS_FAIL;
98 }
99
FakeRegisterServer(bt_uuid_t * app_uuid)100 bt_status_t FakeRegisterServer(bt_uuid_t* app_uuid) {
101 if (g_server_handler)
102 return g_server_handler->RegisterServer(app_uuid);
103
104 return BT_STATUS_FAIL;
105 }
106
FakeUnregisterServer(int server_if)107 bt_status_t FakeUnregisterServer(int server_if) {
108 if (g_server_handler)
109 return g_server_handler->UnregisterServer(server_if);
110
111 return BT_STATUS_FAIL;
112 }
113
FakeAddService(int server_if,btgatt_srvc_id_t * srvc_id,int num_handles)114 bt_status_t FakeAddService(
115 int server_if, btgatt_srvc_id_t* srvc_id, int num_handles) {
116 if (g_server_handler)
117 return g_server_handler->AddService(server_if, srvc_id, num_handles);
118
119 return BT_STATUS_FAIL;
120 }
121
FakeAddCharacteristic(int server_if,int srvc_handle,bt_uuid_t * uuid,int properties,int permissions)122 bt_status_t FakeAddCharacteristic(int server_if, int srvc_handle,
123 bt_uuid_t *uuid,
124 int properties, int permissions) {
125 if (g_server_handler)
126 return g_server_handler->AddCharacteristic(server_if, srvc_handle, uuid,
127 properties, permissions);
128
129 return BT_STATUS_FAIL;
130 }
131
FakeAddDescriptor(int server_if,int srvc_handle,bt_uuid_t * uuid,int permissions)132 bt_status_t FakeAddDescriptor(int server_if, int srvc_handle,
133 bt_uuid_t* uuid,
134 int permissions) {
135 if (g_server_handler)
136 return g_server_handler->AddDescriptor(
137 server_if, srvc_handle, uuid, permissions);
138
139 return BT_STATUS_FAIL;
140 }
141
FakeStartService(int server_if,int srvc_handle,int transport)142 bt_status_t FakeStartService(
143 int server_if, int srvc_handle, int transport) {
144 if (g_server_handler)
145 return g_server_handler->StartService(server_if, srvc_handle, transport);
146
147 return BT_STATUS_FAIL;
148 }
149
FakeDeleteService(int server_if,int srvc_handle)150 bt_status_t FakeDeleteService(int server_if, int srvc_handle) {
151 if (g_server_handler)
152 return g_server_handler->DeleteService(server_if, srvc_handle);
153
154 return BT_STATUS_FAIL;
155 }
156
FakeSendIndication(int server_if,int attribute_handle,int conn_id,int len,int confirm,char * value)157 bt_status_t FakeSendIndication(int server_if, int attribute_handle,
158 int conn_id, int len, int confirm,
159 char* value) {
160 if (g_server_handler)
161 return g_server_handler->SendIndication(server_if, attribute_handle,
162 conn_id, len, confirm, value);
163
164 return BT_STATUS_FAIL;
165 }
166
FakeSendResponse(int conn_id,int trans_id,int status,btgatt_response_t * response)167 bt_status_t FakeSendResponse(int conn_id, int trans_id, int status,
168 btgatt_response_t* response) {
169 if (g_server_handler)
170 return g_server_handler->SendResponse(conn_id, trans_id, status, response);
171
172 return BT_STATUS_FAIL;
173 }
174
175 btgatt_client_interface_t fake_btgattc_iface = {
176 FakeRegisterClient,
177 FakeUnregisterClient,
178 FakeScan,
179 FakeConnect,
180 FakeDisconnect,
181 nullptr, // listen
182 nullptr, // refresh
183 nullptr, // search_service
184 nullptr, // read_characteristic
185 nullptr, // write_characteristic
186 nullptr, // read_descriptor
187 nullptr, // write_descriptor
188 nullptr, // execute_write
189 nullptr, // register_for_notification
190 nullptr, // deregister_for_notification
191 nullptr, // read_remote_rssi
192 nullptr, // scan_filter_param_setup
193 nullptr, // scan_filter_add_remove
194 nullptr, // scan_filter_clear
195 nullptr, // scan_filter_enable
196 nullptr, // get_device_type
197 nullptr, // set_adv_data
198 nullptr, // configure_mtu
199 nullptr, // conn_parameter_update
200 nullptr, // set_scan_parameters
201 FakeMultiAdvEnable,
202 nullptr, // multi_adv_update
203 FakeMultiAdvSetInstData,
204 FakeMultiAdvDisable,
205 nullptr, // batchscan_cfg_storate
206 nullptr, // batchscan_enb_batch_scan
207 nullptr, // batchscan_dis_batch_scan
208 nullptr, // batchscan_read_reports
209 nullptr, // test_command
210 nullptr, // get_gatt_db
211 };
212
213 btgatt_server_interface_t fake_btgatts_iface = {
214 FakeRegisterServer,
215 FakeUnregisterServer,
216 nullptr, // connect
217 nullptr, // disconnect
218 FakeAddService,
219 nullptr, // add_included_service
220 FakeAddCharacteristic,
221 FakeAddDescriptor,
222 FakeStartService,
223 nullptr, // stop_service
224 FakeDeleteService,
225 FakeSendIndication,
226 FakeSendResponse,
227 };
228
229 } // namespace
230
FakeBluetoothGattInterface(std::shared_ptr<TestClientHandler> client_handler,std::shared_ptr<TestServerHandler> server_handler)231 FakeBluetoothGattInterface::FakeBluetoothGattInterface(
232 std::shared_ptr<TestClientHandler> client_handler,
233 std::shared_ptr<TestServerHandler> server_handler)
234 : client_handler_(client_handler) {
235 CHECK(!g_client_handler);
236 CHECK(!g_server_handler);
237
238 // We allow passing NULL. In this case all calls we fail by default.
239 if (client_handler)
240 g_client_handler = client_handler;
241
242 if (server_handler)
243 g_server_handler = server_handler;
244 }
245
~FakeBluetoothGattInterface()246 FakeBluetoothGattInterface::~FakeBluetoothGattInterface() {
247 if (g_client_handler)
248 g_client_handler = nullptr;
249
250 if (g_server_handler)
251 g_server_handler = nullptr;
252 }
253
254 // The methods below can be used to notify observers with certain events and
255 // given parameters.
NotifyRegisterClientCallback(int status,int client_if,const bt_uuid_t & app_uuid)256 void FakeBluetoothGattInterface::NotifyRegisterClientCallback(
257 int status, int client_if,
258 const bt_uuid_t& app_uuid) {
259 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
260 RegisterClientCallback(this, status, client_if, app_uuid));
261 }
262
NotifyConnectCallback(int conn_id,int status,int client_if,const bt_bdaddr_t & bda)263 void FakeBluetoothGattInterface::NotifyConnectCallback(
264 int conn_id, int status, int client_if, const bt_bdaddr_t& bda) {
265 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
266 ConnectCallback(this, conn_id, status, client_if, bda));
267 }
268
NotifyDisconnectCallback(int conn_id,int status,int client_if,const bt_bdaddr_t & bda)269 void FakeBluetoothGattInterface::NotifyDisconnectCallback(
270 int conn_id, int status, int client_if, const bt_bdaddr_t& bda) {
271 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
272 DisconnectCallback(this, conn_id, status, client_if, bda));
273 }
274
NotifyScanResultCallback(const bt_bdaddr_t & bda,int rssi,uint8_t * adv_data)275 void FakeBluetoothGattInterface::NotifyScanResultCallback(
276 const bt_bdaddr_t& bda, int rssi, uint8_t* adv_data) {
277 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
278 ScanResultCallback(this, bda, rssi, adv_data));
279 }
280
NotifyMultiAdvEnableCallback(int client_if,int status)281 void FakeBluetoothGattInterface::NotifyMultiAdvEnableCallback(
282 int client_if, int status) {
283 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
284 MultiAdvEnableCallback(this, client_if, status));
285 }
286
NotifyMultiAdvDataCallback(int client_if,int status)287 void FakeBluetoothGattInterface::NotifyMultiAdvDataCallback(
288 int client_if, int status) {
289 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
290 MultiAdvDataCallback(this, client_if, status));
291 }
292
NotifyMultiAdvDisableCallback(int client_if,int status)293 void FakeBluetoothGattInterface::NotifyMultiAdvDisableCallback(
294 int client_if, int status) {
295 FOR_EACH_OBSERVER(ClientObserver, client_observers_,
296 MultiAdvDisableCallback(this, client_if, status));
297 }
298
NotifyRegisterServerCallback(int status,int server_if,const bt_uuid_t & app_uuid)299 void FakeBluetoothGattInterface::NotifyRegisterServerCallback(
300 int status, int server_if,
301 const bt_uuid_t& app_uuid) {
302 FOR_EACH_OBSERVER(ServerObserver, server_observers_,
303 RegisterServerCallback(this, status, server_if, app_uuid));
304 }
305
NotifyServerConnectionCallback(int conn_id,int server_if,int connected,const bt_bdaddr_t & bda)306 void FakeBluetoothGattInterface::NotifyServerConnectionCallback(
307 int conn_id, int server_if, int connected, const bt_bdaddr_t& bda) {
308 FOR_EACH_OBSERVER(
309 ServerObserver, server_observers_,
310 ConnectionCallback(this, conn_id, server_if, connected, bda));
311 }
312
NotifyServiceAddedCallback(int status,int server_if,const btgatt_srvc_id_t & srvc_id,int srvc_handle)313 void FakeBluetoothGattInterface::NotifyServiceAddedCallback(
314 int status, int server_if,
315 const btgatt_srvc_id_t& srvc_id,
316 int srvc_handle) {
317 FOR_EACH_OBSERVER(
318 ServerObserver, server_observers_,
319 ServiceAddedCallback(this, status, server_if, srvc_id, srvc_handle));
320 }
321
NotifyCharacteristicAddedCallback(int status,int server_if,const bt_uuid_t & uuid,int srvc_handle,int char_handle)322 void FakeBluetoothGattInterface::NotifyCharacteristicAddedCallback(
323 int status, int server_if,
324 const bt_uuid_t& uuid,
325 int srvc_handle, int char_handle) {
326 FOR_EACH_OBSERVER(
327 ServerObserver, server_observers_,
328 CharacteristicAddedCallback(
329 this, status, server_if, uuid, srvc_handle, char_handle));
330 }
331
NotifyDescriptorAddedCallback(int status,int server_if,const bt_uuid_t & uuid,int srvc_handle,int desc_handle)332 void FakeBluetoothGattInterface::NotifyDescriptorAddedCallback(
333 int status, int server_if,
334 const bt_uuid_t& uuid,
335 int srvc_handle, int desc_handle) {
336 FOR_EACH_OBSERVER(
337 ServerObserver, server_observers_,
338 DescriptorAddedCallback(
339 this, status, server_if, uuid, srvc_handle, desc_handle));
340 }
341
NotifyServiceStartedCallback(int status,int server_if,int srvc_handle)342 void FakeBluetoothGattInterface::NotifyServiceStartedCallback(
343 int status, int server_if, int srvc_handle) {
344 FOR_EACH_OBSERVER(
345 ServerObserver, server_observers_,
346 ServiceStartedCallback(this, status, server_if, srvc_handle));
347 }
348
NotifyRequestReadCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,bool is_long)349 void FakeBluetoothGattInterface::NotifyRequestReadCallback(
350 int conn_id, int trans_id, const bt_bdaddr_t& bda, int attr_handle,
351 int offset, bool is_long) {
352 FOR_EACH_OBSERVER(
353 ServerObserver, server_observers_,
354 RequestReadCallback(
355 this, conn_id, trans_id, bda, attr_handle, offset, is_long));
356 }
357
NotifyRequestWriteCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,int length,bool need_rsp,bool is_prep,uint8_t * value)358 void FakeBluetoothGattInterface::NotifyRequestWriteCallback(
359 int conn_id, int trans_id,
360 const bt_bdaddr_t& bda, int attr_handle,
361 int offset, int length,
362 bool need_rsp, bool is_prep, uint8_t* value) {
363 FOR_EACH_OBSERVER(
364 ServerObserver, server_observers_,
365 RequestWriteCallback(
366 this, conn_id, trans_id, bda, attr_handle, offset, length, need_rsp,
367 is_prep, value));
368 }
369
NotifyRequestExecWriteCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int exec_write)370 void FakeBluetoothGattInterface::NotifyRequestExecWriteCallback(
371 int conn_id, int trans_id, const bt_bdaddr_t& bda, int exec_write) {
372 FOR_EACH_OBSERVER(
373 ServerObserver, server_observers_,
374 RequestExecWriteCallback(this, conn_id, trans_id, bda, exec_write));
375 }
376
NotifyIndicationSentCallback(int conn_id,int status)377 void FakeBluetoothGattInterface::NotifyIndicationSentCallback(
378 int conn_id, int status) {
379 FOR_EACH_OBSERVER(ServerObserver, server_observers_,
380 IndicationSentCallback(this, conn_id, status));
381 }
382
AddClientObserver(ClientObserver * observer)383 void FakeBluetoothGattInterface::AddClientObserver(ClientObserver* observer) {
384 CHECK(observer);
385 client_observers_.AddObserver(observer);
386 }
387
RemoveClientObserver(ClientObserver * observer)388 void FakeBluetoothGattInterface::RemoveClientObserver(
389 ClientObserver* observer) {
390 CHECK(observer);
391 client_observers_.RemoveObserver(observer);
392 }
393
AddServerObserver(ServerObserver * observer)394 void FakeBluetoothGattInterface::AddServerObserver(ServerObserver* observer) {
395 CHECK(observer);
396 server_observers_.AddObserver(observer);
397 }
398
RemoveServerObserver(ServerObserver * observer)399 void FakeBluetoothGattInterface::RemoveServerObserver(
400 ServerObserver* observer) {
401 CHECK(observer);
402 server_observers_.RemoveObserver(observer);
403 }
404
405 const btgatt_client_interface_t*
GetClientHALInterface() const406 FakeBluetoothGattInterface::GetClientHALInterface() const {
407 return &fake_btgattc_iface;
408 }
409
410 const btgatt_server_interface_t*
GetServerHALInterface() const411 FakeBluetoothGattInterface::GetServerHALInterface() const {
412 return &fake_btgatts_iface;
413 }
414
415 } // namespace hal
416 } // namespace bluetooth
417