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<BleAdvertiserInterface> g_advertiser_handler;
27 std::shared_ptr<BleScannerInterface> g_scanner_handler;
28 std::shared_ptr<FakeBluetoothGattInterface::TestClientHandler> g_client_handler;
29 std::shared_ptr<FakeBluetoothGattInterface::TestServerHandler> g_server_handler;
30 
FakeRegisterClient(bt_uuid_t * app_uuid)31 bt_status_t FakeRegisterClient(bt_uuid_t* app_uuid) {
32   if (g_client_handler) return g_client_handler->RegisterClient(app_uuid);
33 
34   return BT_STATUS_FAIL;
35 }
36 
FakeUnregisterClient(int client_if)37 bt_status_t FakeUnregisterClient(int client_if) {
38   if (g_client_handler) return g_client_handler->UnregisterClient(client_if);
39 
40   return BT_STATUS_FAIL;
41 }
42 
FakeConnect(int client_if,const bt_bdaddr_t * bd_addr,bool is_direct,int transport,int phy)43 bt_status_t FakeConnect(int client_if, const bt_bdaddr_t* bd_addr,
44                         bool is_direct, int transport, int phy) {
45   if (g_client_handler)
46     return g_client_handler->Connect(client_if, bd_addr, is_direct, transport);
47 
48   return BT_STATUS_FAIL;
49 }
50 
FakeDisconnect(int client_if,const bt_bdaddr_t * bd_addr,int conn_id)51 bt_status_t FakeDisconnect(int client_if, const bt_bdaddr_t* bd_addr,
52                            int conn_id) {
53   if (g_client_handler)
54     return g_client_handler->Disconnect(client_if, bd_addr, conn_id);
55 
56   return BT_STATUS_FAIL;
57 }
58 
FakeRegisterServer(bt_uuid_t * app_uuid)59 bt_status_t FakeRegisterServer(bt_uuid_t* app_uuid) {
60   if (g_server_handler) return g_server_handler->RegisterServer(app_uuid);
61 
62   return BT_STATUS_FAIL;
63 }
64 
FakeUnregisterServer(int server_if)65 bt_status_t FakeUnregisterServer(int server_if) {
66   if (g_server_handler) return g_server_handler->UnregisterServer(server_if);
67 
68   return BT_STATUS_FAIL;
69 }
70 
FakeAddService(int server_if,std::vector<btgatt_db_element_t> service)71 bt_status_t FakeAddService(int server_if,
72                            std::vector<btgatt_db_element_t> service) {
73   if (g_server_handler)
74     return g_server_handler->AddService(server_if, std::move(service));
75 
76   return BT_STATUS_FAIL;
77 }
78 
FakeDeleteService(int server_if,int srvc_handle)79 bt_status_t FakeDeleteService(int server_if, int srvc_handle) {
80   if (g_server_handler)
81     return g_server_handler->DeleteService(server_if, srvc_handle);
82 
83   return BT_STATUS_FAIL;
84 }
85 
FakeSendIndication(int server_if,int attribute_handle,int conn_id,int confirm,std::vector<uint8_t> value)86 bt_status_t FakeSendIndication(int server_if, int attribute_handle, int conn_id,
87                                int confirm, std::vector<uint8_t> value) {
88   if (g_server_handler)
89     return g_server_handler->SendIndication(server_if, attribute_handle,
90                                             conn_id, confirm, std::move(value));
91 
92   return BT_STATUS_FAIL;
93 }
94 
FakeSendResponse(int conn_id,int trans_id,int status,btgatt_response_t * response)95 bt_status_t FakeSendResponse(int conn_id, int trans_id, int status,
96                              btgatt_response_t* response) {
97   if (g_server_handler)
98     return g_server_handler->SendResponse(conn_id, trans_id, status, response);
99 
100   return BT_STATUS_FAIL;
101 }
102 
103 btgatt_client_interface_t fake_btgattc_iface = {
104     FakeRegisterClient,
105     FakeUnregisterClient,
106     FakeConnect,
107     FakeDisconnect,
108     nullptr,  // refresh
109     nullptr,  // search_service
110     nullptr,  // discover_service_by_uuid
111     nullptr,  // read_characteristic
112     nullptr,  // read_using_characteristic_uuid
113     nullptr,  // write_characteristic
114     nullptr,  // read_descriptor
115     nullptr,  // write_descriptor
116     nullptr,  // execute_write
117     nullptr,  // register_for_notification
118     nullptr,  // deregister_for_notification
119     nullptr,  // read_remote_rssi
120     nullptr,  // get_device_type
121     nullptr,  // configure_mtu
122     nullptr,  // conn_parameter_update
123     nullptr,  // set_phy
124     nullptr,  // read_phy
125     nullptr,  // test_command
126     nullptr,  // get_gatt_db
127 };
128 
129 btgatt_server_interface_t fake_btgatts_iface = {
130     FakeRegisterServer,
131     FakeUnregisterServer,
132     nullptr,  // connect
133     nullptr,  // disconnect
134     FakeAddService,
135     nullptr,  // stop_service
136     FakeDeleteService,
137     FakeSendIndication,
138     FakeSendResponse,
139     nullptr,  // set_phy
140     nullptr,  // read_phy
141 };
142 
143 }  // namespace
144 
FakeBluetoothGattInterface(std::shared_ptr<BleAdvertiserInterface> advertiser_handler,std::shared_ptr<BleScannerInterface> scanner_handler,std::shared_ptr<TestClientHandler> client_handler,std::shared_ptr<TestServerHandler> server_handler)145 FakeBluetoothGattInterface::FakeBluetoothGattInterface(
146     std::shared_ptr<BleAdvertiserInterface> advertiser_handler,
147     std::shared_ptr<BleScannerInterface> scanner_handler,
148     std::shared_ptr<TestClientHandler> client_handler,
149     std::shared_ptr<TestServerHandler> server_handler)
150     : client_handler_(client_handler) {
151   CHECK(!g_advertiser_handler);
152   CHECK(!g_scanner_handler);
153   CHECK(!g_client_handler);
154   CHECK(!g_server_handler);
155 
156   // We allow passing NULL. In this case all calls we fail by default.
157   if (advertiser_handler) g_advertiser_handler = advertiser_handler;
158 
159   if (scanner_handler) g_scanner_handler = scanner_handler;
160 
161   if (client_handler) g_client_handler = client_handler;
162 
163   if (server_handler) g_server_handler = server_handler;
164 }
165 
~FakeBluetoothGattInterface()166 FakeBluetoothGattInterface::~FakeBluetoothGattInterface() {
167   if (g_advertiser_handler) g_advertiser_handler = nullptr;
168 
169   if (g_scanner_handler) g_scanner_handler = nullptr;
170 
171   if (g_client_handler) g_client_handler = nullptr;
172 
173   if (g_server_handler) g_server_handler = nullptr;
174 }
175 
176 // The methods below can be used to notify observers with certain events and
177 // given parameters.
NotifyScanResultCallback(const bt_bdaddr_t & bda,int rssi,std::vector<uint8_t> adv_data)178 void FakeBluetoothGattInterface::NotifyScanResultCallback(
179     const bt_bdaddr_t& bda, int rssi, std::vector<uint8_t> adv_data) {
180   FOR_EACH_OBSERVER(ScannerObserver, scanner_observers_,
181                     ScanResultCallback(this, bda, rssi, adv_data));
182 }
183 
NotifyRegisterClientCallback(int status,int client_if,const bt_uuid_t & app_uuid)184 void FakeBluetoothGattInterface::NotifyRegisterClientCallback(
185     int status, int client_if, const bt_uuid_t& app_uuid) {
186   FOR_EACH_OBSERVER(ClientObserver, client_observers_,
187                     RegisterClientCallback(this, status, client_if, app_uuid));
188 }
189 
NotifyConnectCallback(int conn_id,int status,int client_if,const bt_bdaddr_t & bda)190 void FakeBluetoothGattInterface::NotifyConnectCallback(int conn_id, int status,
191                                                        int client_if,
192                                                        const bt_bdaddr_t& bda) {
193   FOR_EACH_OBSERVER(ClientObserver, client_observers_,
194                     ConnectCallback(this, conn_id, status, client_if, bda));
195 }
196 
NotifyDisconnectCallback(int conn_id,int status,int client_if,const bt_bdaddr_t & bda)197 void FakeBluetoothGattInterface::NotifyDisconnectCallback(
198     int conn_id, int status, int client_if, const bt_bdaddr_t& bda) {
199   FOR_EACH_OBSERVER(ClientObserver, client_observers_,
200                     DisconnectCallback(this, conn_id, status, client_if, bda));
201 }
202 
NotifyRegisterServerCallback(int status,int server_if,const bt_uuid_t & app_uuid)203 void FakeBluetoothGattInterface::NotifyRegisterServerCallback(
204     int status, int server_if, const bt_uuid_t& app_uuid) {
205   FOR_EACH_OBSERVER(ServerObserver, server_observers_,
206                     RegisterServerCallback(this, status, server_if, app_uuid));
207 }
208 
NotifyServerConnectionCallback(int conn_id,int server_if,int connected,const bt_bdaddr_t & bda)209 void FakeBluetoothGattInterface::NotifyServerConnectionCallback(
210     int conn_id, int server_if, int connected, const bt_bdaddr_t& bda) {
211   FOR_EACH_OBSERVER(
212       ServerObserver, server_observers_,
213       ConnectionCallback(this, conn_id, server_if, connected, bda));
214 }
215 
NotifyServiceAddedCallback(int status,int server_if,std::vector<btgatt_db_element_t> service)216 void FakeBluetoothGattInterface::NotifyServiceAddedCallback(
217     int status, int server_if, std::vector<btgatt_db_element_t> service) {
218   FOR_EACH_OBSERVER(ServerObserver, server_observers_,
219                     ServiceAddedCallback(this, status, server_if, service));
220 }
221 
NotifyRequestReadCharacteristicCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,bool is_long)222 void FakeBluetoothGattInterface::NotifyRequestReadCharacteristicCallback(
223     int conn_id, int trans_id, const bt_bdaddr_t& bda, int attr_handle,
224     int offset, bool is_long) {
225   FOR_EACH_OBSERVER(
226       ServerObserver, server_observers_,
227       RequestReadCharacteristicCallback(this, conn_id, trans_id, bda,
228                                         attr_handle, offset, is_long));
229 }
230 
NotifyRequestReadDescriptorCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,bool is_long)231 void FakeBluetoothGattInterface::NotifyRequestReadDescriptorCallback(
232     int conn_id, int trans_id, const bt_bdaddr_t& bda, int attr_handle,
233     int offset, bool is_long) {
234   FOR_EACH_OBSERVER(
235       ServerObserver, server_observers_,
236       RequestReadDescriptorCallback(this, conn_id, trans_id, bda, attr_handle,
237                                     offset, is_long));
238 }
239 
NotifyRequestWriteCharacteristicCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,bool need_rsp,bool is_prep,std::vector<uint8_t> value)240 void FakeBluetoothGattInterface::NotifyRequestWriteCharacteristicCallback(
241     int conn_id, int trans_id, const bt_bdaddr_t& bda, int attr_handle,
242     int offset, bool need_rsp, bool is_prep, std::vector<uint8_t> value) {
243   FOR_EACH_OBSERVER(ServerObserver, server_observers_,
244                     RequestWriteCharacteristicCallback(
245                         this, conn_id, trans_id, bda, attr_handle, offset,
246                         need_rsp, is_prep, value));
247 }
248 
NotifyRequestWriteDescriptorCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int attr_handle,int offset,bool need_rsp,bool is_prep,std::vector<uint8_t> value)249 void FakeBluetoothGattInterface::NotifyRequestWriteDescriptorCallback(
250     int conn_id, int trans_id, const bt_bdaddr_t& bda, int attr_handle,
251     int offset, bool need_rsp, bool is_prep, std::vector<uint8_t> value) {
252   FOR_EACH_OBSERVER(
253       ServerObserver, server_observers_,
254       RequestWriteDescriptorCallback(this, conn_id, trans_id, bda, attr_handle,
255                                      offset, need_rsp, is_prep, value));
256 }
257 
NotifyRequestExecWriteCallback(int conn_id,int trans_id,const bt_bdaddr_t & bda,int exec_write)258 void FakeBluetoothGattInterface::NotifyRequestExecWriteCallback(
259     int conn_id, int trans_id, const bt_bdaddr_t& bda, int exec_write) {
260   FOR_EACH_OBSERVER(
261       ServerObserver, server_observers_,
262       RequestExecWriteCallback(this, conn_id, trans_id, bda, exec_write));
263 }
264 
NotifyIndicationSentCallback(int conn_id,int status)265 void FakeBluetoothGattInterface::NotifyIndicationSentCallback(int conn_id,
266                                                               int status) {
267   FOR_EACH_OBSERVER(ServerObserver, server_observers_,
268                     IndicationSentCallback(this, conn_id, status));
269 }
270 
AddScannerObserver(ScannerObserver * observer)271 void FakeBluetoothGattInterface::AddScannerObserver(ScannerObserver* observer) {
272   CHECK(observer);
273   scanner_observers_.AddObserver(observer);
274 }
275 
RemoveScannerObserver(ScannerObserver * observer)276 void FakeBluetoothGattInterface::RemoveScannerObserver(
277     ScannerObserver* observer) {
278   CHECK(observer);
279   scanner_observers_.RemoveObserver(observer);
280 }
281 
AddClientObserver(ClientObserver * observer)282 void FakeBluetoothGattInterface::AddClientObserver(ClientObserver* observer) {
283   CHECK(observer);
284   client_observers_.AddObserver(observer);
285 }
286 
RemoveClientObserver(ClientObserver * observer)287 void FakeBluetoothGattInterface::RemoveClientObserver(
288     ClientObserver* observer) {
289   CHECK(observer);
290   client_observers_.RemoveObserver(observer);
291 }
292 
AddServerObserver(ServerObserver * observer)293 void FakeBluetoothGattInterface::AddServerObserver(ServerObserver* observer) {
294   CHECK(observer);
295   server_observers_.AddObserver(observer);
296 }
297 
RemoveServerObserver(ServerObserver * observer)298 void FakeBluetoothGattInterface::RemoveServerObserver(
299     ServerObserver* observer) {
300   CHECK(observer);
301   server_observers_.RemoveObserver(observer);
302 }
303 
GetAdvertiserHALInterface() const304 BleAdvertiserInterface* FakeBluetoothGattInterface::GetAdvertiserHALInterface()
305     const {
306   return g_advertiser_handler.get();
307 }
308 
GetScannerHALInterface() const309 BleScannerInterface* FakeBluetoothGattInterface::GetScannerHALInterface()
310     const {
311   return g_scanner_handler.get();
312 }
313 
314 const btgatt_client_interface_t*
GetClientHALInterface() const315 FakeBluetoothGattInterface::GetClientHALInterface() const {
316   return &fake_btgattc_iface;
317 }
318 
319 const btgatt_server_interface_t*
GetServerHALInterface() const320 FakeBluetoothGattInterface::GetServerHALInterface() const {
321   return &fake_btgatts_iface;
322 }
323 
324 }  // namespace hal
325 }  // namespace bluetooth
326