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
19namespace bluetooth {
20namespace hal {
21
22namespace {
23
24FakeBluetoothInterface::Manager g_hal_manager;
25
26int FakeHALEnable(bool start_restricted) {
27  return g_hal_manager.enable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
28}
29
30int FakeHALDisable() {
31  return g_hal_manager.disable_succeed ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
32}
33
34int FakeHALGetAdapterProperties() { return BT_STATUS_SUCCESS; }
35
36int 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
42bt_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
80FakeBluetoothInterface::Manager* FakeBluetoothInterface::GetManager() {
81  return &g_hal_manager;
82}
83
84FakeBluetoothInterface::Manager::Manager()
85    : enable_succeed(false),
86      disable_succeed(false),
87      set_property_succeed(false) {}
88
89void FakeBluetoothInterface::NotifyAdapterStateChanged(bt_state_t state) {
90  FOR_EACH_OBSERVER(Observer, observers_, AdapterStateChangedCallback(state));
91}
92
93void 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
100void 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
115void 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
125void 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
135void 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
142void FakeBluetoothInterface::AddObserver(Observer* observer) {
143  observers_.AddObserver(observer);
144}
145
146void FakeBluetoothInterface::RemoveObserver(Observer* observer) {
147  observers_.RemoveObserver(observer);
148}
149
150const bt_interface_t* FakeBluetoothInterface::GetHALInterface() const {
151  return &fake_bt_iface;
152}
153
154bt_callbacks_t* FakeBluetoothInterface::GetHALCallbacks() const {
155  return nullptr;
156}
157
158const 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