1 /******************************************************************************
2  *
3  *  Copyright 2015 Google, Inc.
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #include "adapter/bluetooth_test.h"
20 #include "btcore/include/property.h"
21 #include "types/bt_transport.h"
22 #include "types/raw_address.h"
23 
24 namespace {
25 
26 // Each iteration of the test takes about 2 seconds to run, so choose a value
27 // that matches your time constraints. For example, 5 iterations would take
28 // about 10 seconds to run
29 const int kTestRepeatCount = 5;
30 
31 }  // namespace
32 
33 namespace bttest {
34 
TEST_F(BluetoothTest,AdapterEnableDisable)35 TEST_F(BluetoothTest, AdapterEnableDisable) {
36   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Test should be run with Adapter disabled";
37 
38   EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
39   semaphore_wait(adapter_state_changed_callback_sem_);
40   EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on.";
41 
42   EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
43   semaphore_wait(adapter_state_changed_callback_sem_);
44   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
45 }
46 
TEST_F(BluetoothTest,AdapterRepeatedEnableDisable)47 TEST_F(BluetoothTest, AdapterRepeatedEnableDisable) {
48   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Test should be run with Adapter disabled";
49 
50   for (int i = 0; i < kTestRepeatCount; ++i) {
51     EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
52     semaphore_wait(adapter_state_changed_callback_sem_);
53     EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on.";
54 
55     EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
56     semaphore_wait(adapter_state_changed_callback_sem_);
57     EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
58   }
59 }
60 
TEST_F(BluetoothTest,AdapterSetGetName)61 TEST_F(BluetoothTest, AdapterSetGetName) {
62   bt_property_t* new_name = property_new_name("BluetoothTestName1");
63 
64   EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
65   semaphore_wait(adapter_state_changed_callback_sem_);
66   EXPECT_EQ(GetState(), BT_STATE_ON) << "Test should be run with Adapter enabled";
67 
68   // Enabling the interface will call the properties callback twice before
69   // ever reaching this point.
70   ClearSemaphore(adapter_properties_callback_sem_);
71 
72   EXPECT_EQ(bt_interface()->get_adapter_property(BT_PROPERTY_BDNAME), BT_STATUS_SUCCESS);
73   semaphore_wait(adapter_properties_callback_sem_);
74   EXPECT_GT(GetPropertiesChangedCount(), 0) << "Expected at least one adapter property to change";
75   bt_property_t* name_property = GetProperty(BT_PROPERTY_BDNAME);
76   EXPECT_NE(name_property, nullptr);
77   if (property_equals(name_property, new_name)) {
78     property_free(new_name);
79     new_name = property_new_name("BluetoothTestName2");
80   }
81   std::string old_name((const char*)property_as_name(name_property)->name, name_property->len);
82 
83   EXPECT_EQ(bt_interface()->set_adapter_property(new_name), BT_STATUS_SUCCESS);
84   semaphore_wait(adapter_properties_callback_sem_);
85   EXPECT_GT(GetPropertiesChangedCount(), 0) << "Expected at least one adapter property to change";
86   EXPECT_TRUE(GetProperty(BT_PROPERTY_BDNAME)) << "The Bluetooth name property did not change.";
87   EXPECT_TRUE(property_equals(GetProperty(BT_PROPERTY_BDNAME), new_name))
88           << "Bluetooth name " << property_as_name(GetProperty(BT_PROPERTY_BDNAME))->name
89           << " does not match test value " << property_as_name(new_name)->name;
90 
91   bt_property_t* old_name_property = property_new_name(old_name.c_str());
92   EXPECT_EQ(bt_interface()->set_adapter_property(old_name_property), BT_STATUS_SUCCESS);
93   semaphore_wait(adapter_properties_callback_sem_);
94   EXPECT_TRUE(property_equals(GetProperty(BT_PROPERTY_BDNAME), old_name_property))
95           << "Bluetooth name " << property_as_name(GetProperty(BT_PROPERTY_BDNAME))->name
96           << " does not match original name" << old_name;
97 
98   EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
99   semaphore_wait(adapter_state_changed_callback_sem_);
100   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
101   property_free(new_name);
102   property_free(old_name_property);
103 }
104 
TEST_F(BluetoothTest,AdapterStartDiscovery)105 TEST_F(BluetoothTest, AdapterStartDiscovery) {
106   EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
107   semaphore_wait(adapter_state_changed_callback_sem_);
108   EXPECT_EQ(GetState(), BT_STATE_ON) << "Test should be run with Adapter enabled";
109 
110   EXPECT_EQ(bt_interface()->start_discovery(), BT_STATUS_SUCCESS);
111   semaphore_wait(discovery_state_changed_callback_sem_);
112   EXPECT_EQ(GetDiscoveryState(), BT_DISCOVERY_STARTED) << "Unable to start discovery.";
113 
114   EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
115   semaphore_wait(adapter_state_changed_callback_sem_);
116   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
117 }
118 
TEST_F(BluetoothTest,AdapterCancelDiscovery)119 TEST_F(BluetoothTest, AdapterCancelDiscovery) {
120   EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
121   semaphore_wait(adapter_state_changed_callback_sem_);
122   EXPECT_EQ(GetState(), BT_STATE_ON) << "Test should be run with Adapter enabled";
123 
124   EXPECT_EQ(bt_interface()->start_discovery(), BT_STATUS_SUCCESS);
125   semaphore_wait(discovery_state_changed_callback_sem_);
126   EXPECT_EQ(bt_interface()->cancel_discovery(), BT_STATUS_SUCCESS);
127   semaphore_wait(discovery_state_changed_callback_sem_);
128 
129   EXPECT_EQ(GetDiscoveryState(), BT_DISCOVERY_STOPPED) << "Unable to stop discovery.";
130 
131   EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
132   semaphore_wait(adapter_state_changed_callback_sem_);
133   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
134 }
135 
TEST_F(BluetoothTest,AdapterDisableDuringBonding)136 TEST_F(BluetoothTest, AdapterDisableDuringBonding) {
137   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Test should be run with Adapter disabled";
138 
139   RawAddress bdaddr = {{0x22, 0x22, 0x22, 0x22, 0x22, 0x22}};
140 
141   for (int i = 0; i < kTestRepeatCount; ++i) {
142     EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
143     semaphore_wait(adapter_state_changed_callback_sem_);
144     EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on.";
145 
146     EXPECT_EQ(bt_interface()->create_bond(&bdaddr, BT_TRANSPORT_BR_EDR), BT_STATUS_SUCCESS);
147 
148     EXPECT_EQ(bt_interface()->cancel_bond(&bdaddr), BT_STATUS_SUCCESS);
149 
150     EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
151     semaphore_wait(adapter_state_changed_callback_sem_);
152     EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
153   }
154 }
155 
TEST_F(BluetoothTest,AdapterCleanupDuringDiscovery)156 TEST_F(BluetoothTest, AdapterCleanupDuringDiscovery) {
157   EXPECT_EQ(GetState(), BT_STATE_OFF) << "Test should be run with Adapter disabled";
158 
159   bt_callbacks_t* callbacks = bt_callbacks();
160   ASSERT_TRUE(callbacks != nullptr);
161 
162   for (int i = 0; i < kTestRepeatCount; ++i) {
163     bt_interface()->init(callbacks, false, false, 0, false);
164     EXPECT_EQ(bt_interface()->enable(), BT_STATUS_SUCCESS);
165     semaphore_wait(adapter_state_changed_callback_sem_);
166     EXPECT_EQ(GetState(), BT_STATE_ON) << "Adapter did not turn on.";
167 
168     EXPECT_EQ(bt_interface()->start_discovery(), BT_STATUS_SUCCESS);
169 
170     EXPECT_EQ(bt_interface()->disable(), BT_STATUS_SUCCESS);
171     semaphore_wait(adapter_state_changed_callback_sem_);
172     EXPECT_EQ(GetState(), BT_STATE_OFF) << "Adapter did not turn off.";
173     bt_interface()->cleanup();
174   }
175 }
176 
177 }  // namespace bttest
178