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 
FakeHALEnable(bool start_restricted)26 int FakeHALEnable(bool start_restricted) {
27   return g_hal_manager.enable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
28 }
29 
FakeHALDisable()30 int FakeHALDisable() {
31   return g_hal_manager.disable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
32 }
33 
FakeHALGetAdapterProperties()34 int FakeHALGetAdapterProperties() { return BT_STATUS_SUCCESS; }
35 
FakeHALSetAdapterProperty(const bt_property_t *)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
GetManager()80 FakeBluetoothInterface::Manager* FakeBluetoothInterface::GetManager() {
81   return &g_hal_manager;
82 }
83 
Manager()84 FakeBluetoothInterface::Manager::Manager()
85     : enable_succeed(false),
86       disable_succeed(false),
87       set_property_succeed(false) {}
88 
NotifyAdapterStateChanged(bt_state_t state)89 void FakeBluetoothInterface::NotifyAdapterStateChanged(bt_state_t state) {
90   FOR_EACH_OBSERVER(Observer, observers_, AdapterStateChangedCallback(state));
91 }
92 
NotifyAdapterPropertiesChanged(int num_properties,bt_property_t * properties)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 
NotifyAdapterNamePropertyChanged(const std::string & name)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 
NotifyAdapterAddressPropertyChanged(const bt_bdaddr_t * address)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 
NotifyAdapterLocalLeFeaturesPropertyChanged(const bt_local_le_features_t * features)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 
NotifyAclStateChangedCallback(bt_status_t status,const bt_bdaddr_t & remote_bdaddr,bt_acl_state_t state)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 
AddObserver(Observer * observer)142 void FakeBluetoothInterface::AddObserver(Observer* observer) {
143   observers_.AddObserver(observer);
144 }
145 
RemoveObserver(Observer * observer)146 void FakeBluetoothInterface::RemoveObserver(Observer* observer) {
147   observers_.RemoveObserver(observer);
148 }
149 
GetHALInterface() const150 const bt_interface_t* FakeBluetoothInterface::GetHALInterface() const {
151   return &fake_bt_iface;
152 }
153 
GetHALCallbacks() const154 bt_callbacks_t* FakeBluetoothInterface::GetHALCallbacks() const {
155   return nullptr;
156 }
157 
GetHALAdapter() const158 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