Home | History | Annotate | Download | only in hal
      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_interface.h"
     18 
     19 namespace bluetooth {
     20 namespace hal {
     21 
     22 namespace {
     23 
     24 FakeBluetoothInterface::Manager g_hal_manager;
     25 
     26 int FakeHALEnable(bool start_restricted) {
     27   return g_hal_manager.enable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
     28 }
     29 
     30 int FakeHALDisable() {
     31   return g_hal_manager.disable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
     32 }
     33 
     34 int FakeHALGetAdapterProperties() { return BT_STATUS_SUCCESS; }
     35 
     36 int FakeHALSetAdapterProperty(const bt_property_t* /* property */) {
     37   LOG(INFO) << __func__;
     38   return (g_hal_manager.set_property_succeed ? BT_STATUS_SUCCESS
     39                                              : BT_STATUS_FAIL);
     40 }
     41 
     42 bt_interface_t fake_bt_iface = {
     43     sizeof(bt_interface_t),
     44     nullptr, /* init */
     45     FakeHALEnable,
     46     FakeHALDisable,
     47     nullptr, /* cleanup */
     48     FakeHALGetAdapterProperties,
     49     nullptr, /* get_adapter_property */
     50     FakeHALSetAdapterProperty,
     51     nullptr, /* get_remote_device_properties */
     52     nullptr, /* get_remote_device_property */
     53     nullptr, /* set_remote_device_property */
     54     nullptr, /* get_remote_service_record */
     55     nullptr, /* get_remote_services */
     56     nullptr, /* start_discovery */
     57     nullptr, /* cancel_discovery */
     58     nullptr, /* create_bond */
     59     nullptr, /* create_bond_out_of_band */
     60     nullptr, /* remove_bond */
     61     nullptr, /* cancel_bond */
     62     nullptr, /* get_connection_state */
     63     nullptr, /* pin_reply */
     64     nullptr, /* ssp_reply */
     65     nullptr, /* get_profile_interface */
     66     nullptr, /* dut_mode_configure */
     67     nullptr, /* dut_more_send */
     68     nullptr, /* le_test_mode */
     69     nullptr, /* set_os_callouts */
     70     nullptr, /* read_energy_info */
     71     nullptr, /* dump */
     72     nullptr, /* config clear */
     73     nullptr, /* interop_database_clear */
     74     nullptr  /* interop_database_add */
     75 };
     76 
     77 }  // namespace
     78 
     79 // static
     80 FakeBluetoothInterface::Manager* FakeBluetoothInterface::GetManager() {
     81   return &g_hal_manager;
     82 }
     83 
     84 FakeBluetoothInterface::Manager::Manager()
     85     : enable_succeed(false),
     86       disable_succeed(false),
     87       set_property_succeed(false) {}
     88 
     89 void FakeBluetoothInterface::NotifyAdapterStateChanged(bt_state_t state) {
     90   FOR_EACH_OBSERVER(Observer, observers_, AdapterStateChangedCallback(state));
     91 }
     92 
     93 void FakeBluetoothInterface::NotifyAdapterPropertiesChanged(
     94     int num_properties, bt_property_t* properties) {
     95   FOR_EACH_OBSERVER(
     96       Observer, observers_,
     97       AdapterPropertiesCallback(BT_STATUS_SUCCESS, num_properties, properties));
     98 }
     99 
    100 void FakeBluetoothInterface::NotifyAdapterNamePropertyChanged(
    101     const std::string& name) {
    102   bt_bdname_t hal_name;
    103   strncpy(reinterpret_cast<char*>(hal_name.name), name.c_str(),
    104           std::min(sizeof(hal_name) - 1, name.length()));
    105   reinterpret_cast<char*>(hal_name.name)[name.length()] = '\0';
    106 
    107   bt_property_t property;
    108   property.len = sizeof(hal_name);
    109   property.val = &hal_name;
    110   property.type = BT_PROPERTY_BDNAME;
    111 
    112   NotifyAdapterPropertiesChanged(1, &property);
    113 }
    114 
    115 void FakeBluetoothInterface::NotifyAdapterAddressPropertyChanged(
    116     const bt_bdaddr_t* address) {
    117   bt_property_t property;
    118   property.len = sizeof(bt_bdaddr_t);
    119   property.val = (void*)address;
    120   property.type = BT_PROPERTY_BDADDR;
    121 
    122   NotifyAdapterPropertiesChanged(1, &property);
    123 }
    124 
    125 void FakeBluetoothInterface::NotifyAdapterLocalLeFeaturesPropertyChanged(
    126     const bt_local_le_features_t* features) {
    127   bt_property_t property;
    128   property.len = sizeof(*features);
    129   property.val = (void*)features;
    130   property.type = BT_PROPERTY_LOCAL_LE_FEATURES;
    131 
    132   NotifyAdapterPropertiesChanged(1, &property);
    133 }
    134 
    135 void FakeBluetoothInterface::NotifyAclStateChangedCallback(
    136     bt_status_t status, const bt_bdaddr_t& remote_bdaddr,
    137     bt_acl_state_t state) {
    138   FOR_EACH_OBSERVER(Observer, observers_,
    139                     AclStateChangedCallback(status, remote_bdaddr, state));
    140 }
    141 
    142 void FakeBluetoothInterface::AddObserver(Observer* observer) {
    143   observers_.AddObserver(observer);
    144 }
    145 
    146 void FakeBluetoothInterface::RemoveObserver(Observer* observer) {
    147   observers_.RemoveObserver(observer);
    148 }
    149 
    150 const bt_interface_t* FakeBluetoothInterface::GetHALInterface() const {
    151   return &fake_bt_iface;
    152 }
    153 
    154 bt_callbacks_t* FakeBluetoothInterface::GetHALCallbacks() const {
    155   return nullptr;
    156 }
    157 
    158 const bluetooth_device_t* FakeBluetoothInterface::GetHALAdapter() const {
    159   // TODO(armansito): Do something meaningful here to simulate test behavior.
    160   return nullptr;
    161 }
    162 
    163 }  // namespace hal
    164 }  // namespace bluetooth
    165