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