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