1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 #include "base/memory/ref_counted.h"
9 #include "base/test/test_simple_task_runner.h"
10 #include "device/bluetooth/bluetooth_adapter.h"
11 #include "device/bluetooth/bluetooth_adapter_win.h"
12 #include "device/bluetooth/bluetooth_device.h"
13 #include "device/bluetooth/bluetooth_task_manager_win.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 const char kAdapterAddress
[] = "A1:B2:C3:D4:E5:F6";
19 const char kAdapterName
[] = "Bluetooth Adapter Name";
22 void MakeDeviceState(const std::string
& name
,
23 const std::string
& address
,
24 device::BluetoothTaskManagerWin::DeviceState
* state
) {
26 state
->address
= address
;
27 state
->bluetooth_class
= 0;
28 state
->authenticated
= false;
29 state
->connected
= false;
32 class AdapterObserver
: public device::BluetoothAdapter::Observer
{
35 : num_present_changed_(0),
36 num_powered_changed_(0),
37 num_discovering_changed_(0),
38 num_device_added_(0) {
41 virtual void AdapterPresentChanged(
42 device::BluetoothAdapter
* adapter
, bool present
) OVERRIDE
{
43 num_present_changed_
++;
46 virtual void AdapterPoweredChanged(
47 device::BluetoothAdapter
* adapter
, bool powered
) OVERRIDE
{
48 num_powered_changed_
++;
51 virtual void AdapterDiscoveringChanged(
52 device::BluetoothAdapter
* adapter
, bool discovering
) OVERRIDE
{
53 num_discovering_changed_
++;
56 virtual void DeviceAdded(
57 device::BluetoothAdapter
* adapter
,
58 device::BluetoothDevice
* device
) OVERRIDE
{
62 int num_present_changed() const {
63 return num_present_changed_
;
66 int num_powered_changed() const {
67 return num_powered_changed_
;
70 int num_discovering_changed() const {
71 return num_discovering_changed_
;
74 int num_device_added() const {
75 return num_device_added_
;
79 int num_present_changed_
;
80 int num_powered_changed_
;
81 int num_discovering_changed_
;
82 int num_device_added_
;
89 class BluetoothAdapterWinTest
: public testing::Test
{
91 BluetoothAdapterWinTest()
92 : ui_task_runner_(new base::TestSimpleTaskRunner()),
93 bluetooth_task_runner_(new base::TestSimpleTaskRunner()),
94 adapter_(new BluetoothAdapterWin(
95 base::Bind(&BluetoothAdapterWinTest::RunInitCallback
,
96 base::Unretained(this)))),
97 adapter_win_(static_cast<BluetoothAdapterWin
*>(adapter_
.get())),
98 init_callback_called_(false) {
99 adapter_win_
->InitForTest(ui_task_runner_
, bluetooth_task_runner_
);
102 virtual void SetUp() OVERRIDE
{
103 adapter_win_
->AddObserver(&adapter_observer_
);
104 num_start_discovery_callbacks_
= 0;
105 num_start_discovery_error_callbacks_
= 0;
106 num_stop_discovery_callbacks_
= 0;
107 num_stop_discovery_error_callbacks_
= 0;
110 virtual void TearDown() OVERRIDE
{
111 adapter_win_
->RemoveObserver(&adapter_observer_
);
114 void RunInitCallback() {
115 init_callback_called_
= true;
118 void IncrementNumStartDiscoveryCallbacks() {
119 num_start_discovery_callbacks_
++;
122 void IncrementNumStartDiscoveryErrorCallbacks() {
123 num_start_discovery_error_callbacks_
++;
126 void IncrementNumStopDiscoveryCallbacks() {
127 num_stop_discovery_callbacks_
++;
130 void IncrementNumStopDiscoveryErrorCallbacks() {
131 num_stop_discovery_error_callbacks_
++;
134 void CallAddDiscoverySession(
135 const base::Closure
& callback
,
136 const BluetoothAdapter::ErrorCallback
& error_callback
) {
137 adapter_win_
->AddDiscoverySession(callback
, error_callback
);
140 void CallRemoveDiscoverySession(
141 const base::Closure
& callback
,
142 const BluetoothAdapter::ErrorCallback
& error_callback
) {
143 adapter_win_
->RemoveDiscoverySession(callback
, error_callback
);
147 scoped_refptr
<base::TestSimpleTaskRunner
> ui_task_runner_
;
148 scoped_refptr
<base::TestSimpleTaskRunner
> bluetooth_task_runner_
;
149 scoped_refptr
<BluetoothAdapter
> adapter_
;
150 BluetoothAdapterWin
* adapter_win_
;
151 AdapterObserver adapter_observer_
;
152 bool init_callback_called_
;
153 int num_start_discovery_callbacks_
;
154 int num_start_discovery_error_callbacks_
;
155 int num_stop_discovery_callbacks_
;
156 int num_stop_discovery_error_callbacks_
;
159 TEST_F(BluetoothAdapterWinTest
, AdapterNotPresent
) {
160 BluetoothTaskManagerWin::AdapterState state
;
161 adapter_win_
->AdapterStateChanged(state
);
162 EXPECT_FALSE(adapter_win_
->IsPresent());
165 TEST_F(BluetoothAdapterWinTest
, AdapterPresent
) {
166 BluetoothTaskManagerWin::AdapterState state
;
167 state
.address
= kAdapterAddress
;
168 state
.name
= kAdapterName
;
169 adapter_win_
->AdapterStateChanged(state
);
170 EXPECT_TRUE(adapter_win_
->IsPresent());
173 TEST_F(BluetoothAdapterWinTest
, AdapterPresentChanged
) {
174 BluetoothTaskManagerWin::AdapterState state
;
175 state
.address
= kAdapterAddress
;
176 state
.name
= kAdapterName
;
177 adapter_win_
->AdapterStateChanged(state
);
178 EXPECT_EQ(1, adapter_observer_
.num_present_changed());
179 adapter_win_
->AdapterStateChanged(state
);
180 EXPECT_EQ(1, adapter_observer_
.num_present_changed());
181 BluetoothTaskManagerWin::AdapterState empty_state
;
182 adapter_win_
->AdapterStateChanged(empty_state
);
183 EXPECT_EQ(2, adapter_observer_
.num_present_changed());
186 TEST_F(BluetoothAdapterWinTest
, AdapterPoweredChanged
) {
187 BluetoothTaskManagerWin::AdapterState state
;
188 state
.powered
= true;
189 adapter_win_
->AdapterStateChanged(state
);
190 EXPECT_EQ(1, adapter_observer_
.num_powered_changed());
191 adapter_win_
->AdapterStateChanged(state
);
192 EXPECT_EQ(1, adapter_observer_
.num_powered_changed());
193 state
.powered
= false;
194 adapter_win_
->AdapterStateChanged(state
);
195 EXPECT_EQ(2, adapter_observer_
.num_powered_changed());
198 TEST_F(BluetoothAdapterWinTest
, AdapterInitialized
) {
199 EXPECT_FALSE(adapter_win_
->IsInitialized());
200 EXPECT_FALSE(init_callback_called_
);
201 BluetoothTaskManagerWin::AdapterState state
;
202 adapter_win_
->AdapterStateChanged(state
);
203 EXPECT_TRUE(adapter_win_
->IsInitialized());
204 EXPECT_TRUE(init_callback_called_
);
207 TEST_F(BluetoothAdapterWinTest
, SingleStartDiscovery
) {
208 bluetooth_task_runner_
->ClearPendingTasks();
209 CallAddDiscoverySession(
210 base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
211 base::Unretained(this)),
212 BluetoothAdapter::ErrorCallback());
213 EXPECT_TRUE(ui_task_runner_
->GetPendingTasks().empty());
214 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
215 EXPECT_FALSE(adapter_
->IsDiscovering());
216 EXPECT_EQ(0, num_start_discovery_callbacks_
);
217 adapter_win_
->DiscoveryStarted(true);
218 ui_task_runner_
->RunPendingTasks();
219 EXPECT_TRUE(adapter_
->IsDiscovering());
220 EXPECT_EQ(1, num_start_discovery_callbacks_
);
221 EXPECT_EQ(1, adapter_observer_
.num_discovering_changed());
224 TEST_F(BluetoothAdapterWinTest
, SingleStartDiscoveryFailure
) {
225 CallAddDiscoverySession(
228 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks
,
229 base::Unretained(this)));
230 adapter_win_
->DiscoveryStarted(false);
231 ui_task_runner_
->RunPendingTasks();
232 EXPECT_FALSE(adapter_
->IsDiscovering());
233 EXPECT_EQ(1, num_start_discovery_error_callbacks_
);
234 EXPECT_EQ(0, adapter_observer_
.num_discovering_changed());
237 TEST_F(BluetoothAdapterWinTest
, MultipleStartDiscoveries
) {
238 bluetooth_task_runner_
->ClearPendingTasks();
239 int num_discoveries
= 5;
240 for (int i
= 0; i
< num_discoveries
; i
++) {
241 CallAddDiscoverySession(
243 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
244 base::Unretained(this)),
245 BluetoothAdapter::ErrorCallback());
246 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
248 EXPECT_TRUE(ui_task_runner_
->GetPendingTasks().empty());
249 EXPECT_FALSE(adapter_
->IsDiscovering());
250 EXPECT_EQ(0, num_start_discovery_callbacks_
);
251 adapter_win_
->DiscoveryStarted(true);
252 ui_task_runner_
->RunPendingTasks();
253 EXPECT_TRUE(adapter_
->IsDiscovering());
254 EXPECT_EQ(num_discoveries
, num_start_discovery_callbacks_
);
255 EXPECT_EQ(1, adapter_observer_
.num_discovering_changed());
258 TEST_F(BluetoothAdapterWinTest
, MultipleStartDiscoveriesFailure
) {
259 int num_discoveries
= 5;
260 for (int i
= 0; i
< num_discoveries
; i
++) {
261 CallAddDiscoverySession(
264 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks
,
265 base::Unretained(this)));
267 adapter_win_
->DiscoveryStarted(false);
268 ui_task_runner_
->RunPendingTasks();
269 EXPECT_FALSE(adapter_
->IsDiscovering());
270 EXPECT_EQ(num_discoveries
, num_start_discovery_error_callbacks_
);
271 EXPECT_EQ(0, adapter_observer_
.num_discovering_changed());
274 TEST_F(BluetoothAdapterWinTest
, MultipleStartDiscoveriesAfterDiscovering
) {
275 CallAddDiscoverySession(
276 base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
277 base::Unretained(this)),
278 BluetoothAdapter::ErrorCallback());
279 adapter_win_
->DiscoveryStarted(true);
280 ui_task_runner_
->RunPendingTasks();
281 EXPECT_TRUE(adapter_
->IsDiscovering());
282 EXPECT_EQ(1, num_start_discovery_callbacks_
);
284 bluetooth_task_runner_
->ClearPendingTasks();
285 for (int i
= 0; i
< 5; i
++) {
286 int num_start_discovery_callbacks
= num_start_discovery_callbacks_
;
287 CallAddDiscoverySession(
289 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
290 base::Unretained(this)),
291 BluetoothAdapter::ErrorCallback());
292 EXPECT_TRUE(adapter_
->IsDiscovering());
293 EXPECT_TRUE(bluetooth_task_runner_
->GetPendingTasks().empty());
294 EXPECT_TRUE(ui_task_runner_
->GetPendingTasks().empty());
295 EXPECT_EQ(num_start_discovery_callbacks
+ 1,
296 num_start_discovery_callbacks_
);
298 EXPECT_EQ(1, adapter_observer_
.num_discovering_changed());
301 TEST_F(BluetoothAdapterWinTest
, StartDiscoveryAfterDiscoveringFailure
) {
302 CallAddDiscoverySession(
305 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks
,
306 base::Unretained(this)));
307 adapter_win_
->DiscoveryStarted(false);
308 ui_task_runner_
->RunPendingTasks();
309 EXPECT_FALSE(adapter_
->IsDiscovering());
310 EXPECT_EQ(1, num_start_discovery_error_callbacks_
);
312 CallAddDiscoverySession(
313 base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
314 base::Unretained(this)),
315 BluetoothAdapter::ErrorCallback());
316 adapter_win_
->DiscoveryStarted(true);
317 ui_task_runner_
->RunPendingTasks();
318 EXPECT_TRUE(adapter_
->IsDiscovering());
319 EXPECT_EQ(1, num_start_discovery_callbacks_
);
322 TEST_F(BluetoothAdapterWinTest
, SingleStopDiscovery
) {
323 CallAddDiscoverySession(
324 base::Closure(), BluetoothAdapter::ErrorCallback());
325 adapter_win_
->DiscoveryStarted(true);
326 ui_task_runner_
->ClearPendingTasks();
327 CallRemoveDiscoverySession(
328 base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
329 base::Unretained(this)),
330 BluetoothAdapter::ErrorCallback());
331 EXPECT_TRUE(adapter_
->IsDiscovering());
332 EXPECT_EQ(0, num_stop_discovery_callbacks_
);
333 bluetooth_task_runner_
->ClearPendingTasks();
334 adapter_win_
->DiscoveryStopped();
335 ui_task_runner_
->RunPendingTasks();
336 EXPECT_FALSE(adapter_
->IsDiscovering());
337 EXPECT_EQ(1, num_stop_discovery_callbacks_
);
338 EXPECT_TRUE(bluetooth_task_runner_
->GetPendingTasks().empty());
339 EXPECT_EQ(2, adapter_observer_
.num_discovering_changed());
342 TEST_F(BluetoothAdapterWinTest
, MultipleStopDiscoveries
) {
343 int num_discoveries
= 5;
344 for (int i
= 0; i
< num_discoveries
; i
++) {
345 CallAddDiscoverySession(
346 base::Closure(), BluetoothAdapter::ErrorCallback());
348 adapter_win_
->DiscoveryStarted(true);
349 ui_task_runner_
->ClearPendingTasks();
350 bluetooth_task_runner_
->ClearPendingTasks();
351 for (int i
= 0; i
< num_discoveries
- 1; i
++) {
352 CallRemoveDiscoverySession(
353 base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
354 base::Unretained(this)),
355 BluetoothAdapter::ErrorCallback());
356 EXPECT_TRUE(bluetooth_task_runner_
->GetPendingTasks().empty());
357 ui_task_runner_
->RunPendingTasks();
358 EXPECT_EQ(i
+ 1, num_stop_discovery_callbacks_
);
360 CallRemoveDiscoverySession(
361 base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
362 base::Unretained(this)),
363 BluetoothAdapter::ErrorCallback());
364 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
365 EXPECT_TRUE(adapter_
->IsDiscovering());
366 adapter_win_
->DiscoveryStopped();
367 ui_task_runner_
->RunPendingTasks();
368 EXPECT_FALSE(adapter_
->IsDiscovering());
369 EXPECT_EQ(num_discoveries
, num_stop_discovery_callbacks_
);
370 EXPECT_EQ(2, adapter_observer_
.num_discovering_changed());
373 TEST_F(BluetoothAdapterWinTest
,
374 StartDiscoveryAndStartDiscoveryAndStopDiscoveries
) {
375 CallAddDiscoverySession(
376 base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
377 base::Unretained(this)),
378 BluetoothAdapter::ErrorCallback());
379 adapter_win_
->DiscoveryStarted(true);
380 CallAddDiscoverySession(
381 base::Bind(&BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
382 base::Unretained(this)),
383 BluetoothAdapter::ErrorCallback());
384 ui_task_runner_
->ClearPendingTasks();
385 bluetooth_task_runner_
->ClearPendingTasks();
386 CallRemoveDiscoverySession(
387 base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
388 base::Unretained(this)),
389 BluetoothAdapter::ErrorCallback());
390 EXPECT_TRUE(bluetooth_task_runner_
->GetPendingTasks().empty());
391 CallRemoveDiscoverySession(
392 base::Bind(&BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
393 base::Unretained(this)),
394 BluetoothAdapter::ErrorCallback());
395 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
398 TEST_F(BluetoothAdapterWinTest
,
399 StartDiscoveryAndStopDiscoveryAndStartDiscovery
) {
400 CallAddDiscoverySession(
401 base::Closure(), BluetoothAdapter::ErrorCallback());
402 adapter_win_
->DiscoveryStarted(true);
403 EXPECT_TRUE(adapter_
->IsDiscovering());
404 CallRemoveDiscoverySession(
405 base::Closure(), BluetoothAdapter::ErrorCallback());
406 adapter_win_
->DiscoveryStopped();
407 EXPECT_FALSE(adapter_
->IsDiscovering());
408 CallAddDiscoverySession(
409 base::Closure(), BluetoothAdapter::ErrorCallback());
410 adapter_win_
->DiscoveryStarted(true);
411 EXPECT_TRUE(adapter_
->IsDiscovering());
414 TEST_F(BluetoothAdapterWinTest
, StartDiscoveryBeforeDiscoveryStopped
) {
415 CallAddDiscoverySession(
416 base::Closure(), BluetoothAdapter::ErrorCallback());
417 adapter_win_
->DiscoveryStarted(true);
418 CallRemoveDiscoverySession(
419 base::Closure(), BluetoothAdapter::ErrorCallback());
420 CallAddDiscoverySession(
421 base::Closure(), BluetoothAdapter::ErrorCallback());
422 bluetooth_task_runner_
->ClearPendingTasks();
423 adapter_win_
->DiscoveryStopped();
424 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
427 TEST_F(BluetoothAdapterWinTest
, StopDiscoveryWithoutStartDiscovery
) {
428 CallRemoveDiscoverySession(
431 &BluetoothAdapterWinTest::IncrementNumStopDiscoveryErrorCallbacks
,
432 base::Unretained(this)));
433 EXPECT_EQ(1, num_stop_discovery_error_callbacks_
);
436 TEST_F(BluetoothAdapterWinTest
, StopDiscoveryBeforeDiscoveryStarted
) {
437 CallAddDiscoverySession(
438 base::Closure(), BluetoothAdapter::ErrorCallback());
439 CallRemoveDiscoverySession(
440 base::Closure(), BluetoothAdapter::ErrorCallback());
441 bluetooth_task_runner_
->ClearPendingTasks();
442 adapter_win_
->DiscoveryStarted(true);
443 EXPECT_EQ(1, bluetooth_task_runner_
->GetPendingTasks().size());
446 TEST_F(BluetoothAdapterWinTest
, StartAndStopBeforeDiscoveryStarted
) {
447 int num_expected_start_discoveries
= 3;
448 int num_expected_stop_discoveries
= 2;
449 for (int i
= 0; i
< num_expected_start_discoveries
; i
++) {
450 CallAddDiscoverySession(
452 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryCallbacks
,
453 base::Unretained(this)),
454 BluetoothAdapter::ErrorCallback());
456 for (int i
= 0; i
< num_expected_stop_discoveries
; i
++) {
457 CallRemoveDiscoverySession(
459 &BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
460 base::Unretained(this)),
461 BluetoothAdapter::ErrorCallback());
463 bluetooth_task_runner_
->ClearPendingTasks();
464 adapter_win_
->DiscoveryStarted(true);
465 EXPECT_TRUE(bluetooth_task_runner_
->GetPendingTasks().empty());
466 ui_task_runner_
->RunPendingTasks();
467 EXPECT_EQ(num_expected_start_discoveries
, num_start_discovery_callbacks_
);
468 EXPECT_EQ(num_expected_stop_discoveries
, num_stop_discovery_callbacks_
);
471 TEST_F(BluetoothAdapterWinTest
, StopDiscoveryBeforeDiscoveryStartedAndFailed
) {
472 CallAddDiscoverySession(
475 &BluetoothAdapterWinTest::IncrementNumStartDiscoveryErrorCallbacks
,
476 base::Unretained(this)));
477 CallRemoveDiscoverySession(
479 &BluetoothAdapterWinTest::IncrementNumStopDiscoveryCallbacks
,
480 base::Unretained(this)),
481 BluetoothAdapter::ErrorCallback());
482 ui_task_runner_
->ClearPendingTasks();
483 adapter_win_
->DiscoveryStarted(false);
484 ui_task_runner_
->RunPendingTasks();
485 EXPECT_EQ(1, num_start_discovery_error_callbacks_
);
486 EXPECT_EQ(1, num_stop_discovery_callbacks_
);
487 EXPECT_EQ(0, adapter_observer_
.num_discovering_changed());
490 TEST_F(BluetoothAdapterWinTest
, DevicesDiscovered
) {
491 BluetoothTaskManagerWin::DeviceState
* android_phone_state
=
492 new BluetoothTaskManagerWin::DeviceState();
493 MakeDeviceState("phone", "android phone address", android_phone_state
);
494 BluetoothTaskManagerWin::DeviceState
* laptop_state
=
495 new BluetoothTaskManagerWin::DeviceState();
496 MakeDeviceState("laptop", "laptop address", laptop_state
);
497 BluetoothTaskManagerWin::DeviceState
* iphone_state
=
498 new BluetoothTaskManagerWin::DeviceState();
499 MakeDeviceState("phone", "iphone address", iphone_state
);
500 ScopedVector
<BluetoothTaskManagerWin::DeviceState
> devices
;
501 devices
.push_back(android_phone_state
);
502 devices
.push_back(laptop_state
);
503 devices
.push_back(iphone_state
);
505 adapter_win_
->DevicesDiscovered(devices
);
506 EXPECT_EQ(3, adapter_observer_
.num_device_added());
509 } // namespace device