Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Side by Side Diff: device/bluetooth/bluetooth_experimental_chromeos_unittest.cc

Issue 13927010: Bluetooth: implement BlueZ 5 backend for Chrome OS (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed review comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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.
4
5 #include "base/command_line.h"
6 #include "base/message_loop.h"
7 #include "base/utf_string_conversions.h"
8 #include "chromeos/chromeos_switches.h"
9 #include "chromeos/dbus/fake_bluetooth_adapter_client.h"
10 #include "chromeos/dbus/fake_bluetooth_device_client.h"
11 #include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
12 #include "dbus/object_path.h"
13 #include "device/bluetooth/bluetooth_adapter.h"
14 #include "device/bluetooth/bluetooth_adapter_experimental_chromeos.h"
15 #include "device/bluetooth/bluetooth_adapter_factory.h"
16 #include "device/bluetooth/bluetooth_device.h"
17 #include "device/bluetooth/bluetooth_device_experimental_chromeos.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 using device::BluetoothAdapter;
21 using device::BluetoothAdapterFactory;
22 using device::BluetoothDevice;
23
24 namespace chromeos {
25
26 class TestObserver : public BluetoothAdapter::Observer {
27 public:
28 TestObserver(scoped_refptr<BluetoothAdapter> adapter)
29 : present_changed_count_(0),
30 powered_changed_count_(0),
31 discovering_changed_count_(0),
32 last_present_(false),
33 last_powered_(false),
34 last_discovering_(false),
35 device_added_count_(0),
36 device_changed_count_(0),
37 device_removed_count_(0),
38 last_device_(NULL),
39 adapter_(adapter) {
40 }
41 virtual ~TestObserver() {}
42
43 virtual void AdapterPresentChanged(BluetoothAdapter* adapter,
44 bool present) OVERRIDE {
45 EXPECT_EQ(adapter_, adapter);
46
47 ++present_changed_count_;
48 last_present_ = present;
49 }
50
51 virtual void AdapterPoweredChanged(BluetoothAdapter* adapter,
52 bool powered) OVERRIDE {
53 EXPECT_EQ(adapter_, adapter);
54
55 ++powered_changed_count_;
56 last_powered_ = powered;
57 }
58
59 virtual void AdapterDiscoveringChanged(BluetoothAdapter* adapter,
60 bool discovering) OVERRIDE {
61 EXPECT_EQ(adapter_, adapter);
62
63 ++discovering_changed_count_;
64 last_discovering_ = discovering;
65
66 QuitMessageLoop();
youngki 2013/04/17 16:23:45 Why does AdapterDiscoveringChanged break out of lo
keybuk 2013/04/17 17:46:31 mistake: deleted
67 }
68
69 virtual void DeviceAdded(BluetoothAdapter* adapter,
70 BluetoothDevice* device) OVERRIDE {
71 EXPECT_EQ(adapter_, adapter);
72
73 ++device_added_count_;
74 last_device_ = device;
75 last_device_address_ = device->GetAddress();
76
77 QuitMessageLoop();
78 }
79
80 virtual void DeviceChanged(BluetoothAdapter* adapter,
81 BluetoothDevice* device) OVERRIDE {
82 EXPECT_EQ(adapter_, adapter);
83
84 ++device_changed_count_;
85 last_device_ = device;
86 last_device_address_ = device->GetAddress();
87
88 QuitMessageLoop();
89 }
90
91 virtual void DeviceRemoved(BluetoothAdapter* adapter,
92 BluetoothDevice* device) OVERRIDE {
93 EXPECT_EQ(adapter_, adapter);
94
95 ++device_removed_count_;
96 // Can't save device, it may be freed
97 last_device_address_ = device->GetAddress();
98
99 QuitMessageLoop();
100 }
101
102 int present_changed_count_;
103 int powered_changed_count_;
104 int discovering_changed_count_;
105 bool last_present_;
106 bool last_powered_;
107 bool last_discovering_;
108 int device_added_count_;
109 int device_changed_count_;
110 int device_removed_count_;
111 BluetoothDevice* last_device_;
112 std::string last_device_address_;
113
114 private:
115 // Some tests use a message loop since background processing is simulated;
116 // break out of those loops.
117 void QuitMessageLoop() {
118 if (MessageLoop::current() && MessageLoop::current()->is_running())
119 MessageLoop::current()->Quit();
120 }
121
122 scoped_refptr<BluetoothAdapter> adapter_;
123 };
124
125 class TestPairingDelegate : public BluetoothDevice::PairingDelegate {
126 public:
127 TestPairingDelegate()
128 : call_count_(0),
129 request_pincode_count_(0),
130 request_passkey_count_(0),
131 display_pincode_count_(0),
132 display_passkey_count_(0),
133 confirm_passkey_count_(0),
134 dismiss_count_(0) {}
135 virtual ~TestPairingDelegate() {}
136
137 void RequestPinCode(BluetoothDevice* device) OVERRIDE {
138 ++call_count_;
139 ++request_pincode_count_;
140 QuitMessageLoop();
141 }
142
143 void RequestPasskey(BluetoothDevice* device) OVERRIDE {
144 ++call_count_;
145 ++request_passkey_count_;
146 QuitMessageLoop();
147 }
148
149 void DisplayPinCode(BluetoothDevice* device,
150 const std::string& pincode) OVERRIDE {
151 ++call_count_;
152 ++display_pincode_count_;
153 last_pincode_ = pincode;
154 QuitMessageLoop();
155 }
156
157 void DisplayPasskey(BluetoothDevice* device,
158 uint32 passkey) OVERRIDE {
159 ++call_count_;
160 ++display_passkey_count_;
161 last_passkey_ = passkey;
162 QuitMessageLoop();
163 }
164
165 void ConfirmPasskey(BluetoothDevice* device,
166 uint32 passkey) OVERRIDE {
167 ++call_count_;
168 ++confirm_passkey_count_;
169 last_passkey_ = passkey;
170 QuitMessageLoop();
171 }
172
173 void DismissDisplayOrConfirm() OVERRIDE {
174 ++call_count_;
175 ++dismiss_count_;
176 QuitMessageLoop();
177 }
178
179 int call_count_;
180 int request_pincode_count_;
181 int request_passkey_count_;
182 int display_pincode_count_;
183 int display_passkey_count_;
184 int confirm_passkey_count_;
185 int dismiss_count_;
186 uint32 last_passkey_;
187 std::string last_pincode_;
188
189 private:
190 // Some tests use a message loop since background processing is simulated;
191 // break out of those loops.
192 void QuitMessageLoop() {
193 if (MessageLoop::current() && MessageLoop::current()->is_running())
194 MessageLoop::current()->Quit();
195 }
196 };
197
198 class BluetoothExperimentalChromeOSTest : public testing::Test {
199 public:
200 virtual void SetUp() {
201 if (!CommandLine::ForCurrentProcess()->HasSwitch(
202 chromeos::switches::kEnableExperimentalBluetooth))
203 CommandLine::ForCurrentProcess()->AppendSwitch(
204 chromeos::switches::kEnableExperimentalBluetooth);
205
206 mock_dbus_thread_manager_ =
207 new MockDBusThreadManagerWithoutGMock();
208 DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager_);
209
210 fake_bluetooth_adapter_client_ =
211 mock_dbus_thread_manager_->fake_bluetooth_adapter_client();
212 fake_bluetooth_device_client_ =
213 mock_dbus_thread_manager_->fake_bluetooth_device_client();
214
215 callback_count_ = 0;
216 error_callback_count_ = 0;
217 last_connect_error_ = BluetoothDevice::ERROR_UNKNOWN;
218 }
219
220 virtual void TearDown() {
221 adapter_ = NULL;
222 DBusThreadManager::Shutdown();
223 }
224
225 // Generic callbacks
226 void Callback() {
227 ++callback_count_;
228 }
229
230 void ErrorCallback() {
231 ++error_callback_count_;
232 }
233
234 void ConnectErrorCallback(enum BluetoothDevice::ConnectErrorCode error) {
235 ++error_callback_count_;
236 last_connect_error_ = error;
237 }
238
239 // Call to fill the adapter_ member with a BluetoothAdapter instance.
240 void GetAdapter() {
241 BluetoothAdapterFactory::GetAdapter(
youngki 2013/04/17 16:23:45 Why don't you just create adapter directly by new
keybuk 2013/04/17 17:46:31 Done.
242 base::Bind(&BluetoothExperimentalChromeOSTest::SetAdapter,
243 base::Unretained(this)));
244 ASSERT_TRUE(adapter_ != NULL);
245 ASSERT_TRUE(adapter_->IsInitialized());
246 }
247
248 void SetAdapter(scoped_refptr<BluetoothAdapter> adapter) {
249 adapter_ = adapter;
250 }
251
252 // Run a discovery phase until the named device is detected.
253 void DiscoverDevice(const std::string& address) {
254 ASSERT_TRUE(adapter_ != NULL);
youngki 2013/04/17 16:23:45 Can we take out all the ASSERT* and EXPECT* and pu
keybuk 2013/04/17 17:46:31 There already is a separate testing case for these
255
256 if (MessageLoop::current() == NULL) {
257 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
258 DiscoverDevices();
259 return;
260 }
261
262 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
263
264 TestObserver observer(adapter_);
265 adapter_->AddObserver(&observer);
266
267 adapter_->SetPowered(
268 true,
269 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
270 base::Unretained(this)),
271 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
272 base::Unretained(this)));
273 adapter_->StartDiscovering(
274 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
275 base::Unretained(this)),
276 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
277 base::Unretained(this)));
278 EXPECT_EQ(2, callback_count_);
279 EXPECT_EQ(0, error_callback_count_);
280 callback_count_ = 0;
281
282 ASSERT_TRUE(adapter_->IsPowered());
283 ASSERT_TRUE(adapter_->IsDiscovering());
284
285 while (!observer.device_removed_count_ &&
286 observer.last_device_address_ != address)
287 MessageLoop::current()->Run();
288
289 adapter_->StopDiscovering(
290 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
291 base::Unretained(this)),
292 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
293 base::Unretained(this)));
294 EXPECT_EQ(1, callback_count_);
295 EXPECT_EQ(0, error_callback_count_);
296 callback_count_ = 0;
297
298 ASSERT_FALSE(adapter_->IsDiscovering());
299
300 adapter_->RemoveObserver(&observer);
301 }
302
303 // Run a discovery phase so we have devices that can be paired with.
304 void DiscoverDevices() {
305 DiscoverDevice("does not exist");
youngki 2013/04/17 16:23:45 why do we pass "does not exist"? And how does this
keybuk 2013/04/17 17:46:31 will add comment
306 }
307
308 protected:
309 FakeBluetoothAdapterClient* fake_bluetooth_adapter_client_;
310 FakeBluetoothDeviceClient* fake_bluetooth_device_client_;
311 MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_;
312 scoped_refptr<BluetoothAdapter> adapter_;
313
314 int callback_count_;
315 int error_callback_count_;
316 enum BluetoothDevice::ConnectErrorCode last_connect_error_;
317 };
318
319 TEST_F(BluetoothExperimentalChromeOSTest, AlreadyPresent) {
320 GetAdapter();
321
322 // This verifies that the class gets the list of adapters when created;
323 // and initializes with an existing adapter if there is one.
324 EXPECT_TRUE(adapter_->IsPresent());
325 EXPECT_FALSE(adapter_->IsPowered());
326 EXPECT_EQ(FakeBluetoothAdapterClient::kAdapterAddress,
327 adapter_->GetAddress());
328 EXPECT_EQ(FakeBluetoothAdapterClient::kAdapterName, adapter_->GetName());
329 EXPECT_FALSE(adapter_->IsDiscovering());
330
331 // There should be a device
332 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
333 EXPECT_EQ(1U, devices.size());
334 EXPECT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
335 devices[0]->GetAddress());
336 }
337
338 TEST_F(BluetoothExperimentalChromeOSTest, BecomePresent) {
339 fake_bluetooth_adapter_client_->SetVisible(false);
340 GetAdapter();
341 ASSERT_FALSE(adapter_->IsPresent());
342
343 // Install an observer; expect the AdapterPresentChanged to be called
344 // with true, and IsPresent() to return true.
345 TestObserver observer(adapter_);
346 adapter_->AddObserver(&observer);
347
348 fake_bluetooth_adapter_client_->SetVisible(true);
349
350 EXPECT_EQ(1, observer.present_changed_count_);
351 EXPECT_TRUE(observer.last_present_);
352
353 EXPECT_TRUE(adapter_->IsPresent());
354
355 // We should have had a device announced.
356 EXPECT_EQ(1, observer.device_added_count_);
357 EXPECT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
358 observer.last_device_address_);
359
360 // Other callbacks shouldn't be called if the values are false.
361 EXPECT_EQ(0, observer.powered_changed_count_);
362 EXPECT_EQ(0, observer.discovering_changed_count_);
363 EXPECT_FALSE(adapter_->IsPowered());
364 EXPECT_FALSE(adapter_->IsDiscovering());
365 }
366
367 TEST_F(BluetoothExperimentalChromeOSTest, BecomeNotPresent) {
368 GetAdapter();
369 ASSERT_TRUE(adapter_->IsPresent());
370
371 // Install an observer; expect the AdapterPresentChanged to be called
372 // with false, and IsPresent() to return false.
373 TestObserver observer(adapter_);
374 adapter_->AddObserver(&observer);
375
376 fake_bluetooth_adapter_client_->SetVisible(false);
377
378 EXPECT_EQ(1, observer.present_changed_count_);
379 EXPECT_FALSE(observer.last_present_);
380
381 EXPECT_FALSE(adapter_->IsPresent());
382
383 // We should have had a device removed.
384 EXPECT_EQ(1, observer.device_removed_count_);
385 EXPECT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
386 observer.last_device_address_);
387
388 // Other callbacks shouldn't be called since the values are false.
389 EXPECT_EQ(0, observer.powered_changed_count_);
390 EXPECT_EQ(0, observer.discovering_changed_count_);
391 EXPECT_FALSE(adapter_->IsPowered());
392 EXPECT_FALSE(adapter_->IsDiscovering());
393 }
394
395 TEST_F(BluetoothExperimentalChromeOSTest, SecondAdapter) {
396 GetAdapter();
397 ASSERT_TRUE(adapter_->IsPresent());
398
399 // Install an observer, then add a second adapter. Nothing should change,
400 // we ignore the second adapter.
401 TestObserver observer(adapter_);
402 adapter_->AddObserver(&observer);
403
404 fake_bluetooth_adapter_client_->SetSecondVisible(true);
405
406 EXPECT_EQ(0, observer.present_changed_count_);
407
408 EXPECT_TRUE(adapter_->IsPresent());
409 EXPECT_EQ(FakeBluetoothAdapterClient::kAdapterAddress,
410 adapter_->GetAddress());
411
412 // Try removing the first adapter, we should now act as if the adapter
413 // is no longer present rather than fall back to the second.
414 fake_bluetooth_adapter_client_->SetVisible(false);
415
416 EXPECT_EQ(1, observer.present_changed_count_);
417 EXPECT_FALSE(observer.last_present_);
418
419 EXPECT_FALSE(adapter_->IsPresent());
420
421 // We should have had a device removed.
422 EXPECT_EQ(1, observer.device_removed_count_);
423 EXPECT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
424 observer.last_device_address_);
425
426 // Other callbacks shouldn't be called since the values are false.
427 EXPECT_EQ(0, observer.powered_changed_count_);
428 EXPECT_EQ(0, observer.discovering_changed_count_);
429 EXPECT_FALSE(adapter_->IsPowered());
430 EXPECT_FALSE(adapter_->IsDiscovering());
431
432 observer.device_removed_count_ = 0;
433
434 // Removing the second adapter shouldn't set anything either.
435 fake_bluetooth_adapter_client_->SetSecondVisible(false);
436
437 EXPECT_EQ(0, observer.device_removed_count_);
438 EXPECT_EQ(0, observer.powered_changed_count_);
439 EXPECT_EQ(0, observer.discovering_changed_count_);
440 }
441
442 TEST_F(BluetoothExperimentalChromeOSTest, BecomePowered) {
443 GetAdapter();
444 ASSERT_FALSE(adapter_->IsPowered());
445
446 // Install an observer; expect the AdapterPoweredChanged to be called
447 // with true, and IsPowered() to return true.
448 TestObserver observer(adapter_);
449 adapter_->AddObserver(&observer);
450
451 adapter_->SetPowered(
452 true,
453 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
454 base::Unretained(this)),
455 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
456 base::Unretained(this)));
457 EXPECT_EQ(1, callback_count_);
458 EXPECT_EQ(0, error_callback_count_);
459
460 EXPECT_EQ(1, observer.powered_changed_count_);
461 EXPECT_TRUE(observer.last_powered_);
462
463 EXPECT_TRUE(adapter_->IsPowered());
464 }
465
466 TEST_F(BluetoothExperimentalChromeOSTest, BecomeNotPowered) {
467 GetAdapter();
468 adapter_->SetPowered(
469 true,
470 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
471 base::Unretained(this)),
472 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
473 base::Unretained(this)));
474 EXPECT_EQ(1, callback_count_);
475 EXPECT_EQ(0, error_callback_count_);
476 callback_count_ = 0;
477
478 ASSERT_TRUE(adapter_->IsPowered());
479
480 // Install an observer; expect the AdapterPoweredChanged to be called
481 // with false, and IsPowered() to return false.
482 TestObserver observer(adapter_);
483 adapter_->AddObserver(&observer);
484
485 adapter_->SetPowered(
486 false,
487 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
488 base::Unretained(this)),
489 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
490 base::Unretained(this)));
491 EXPECT_EQ(1, callback_count_);
492 EXPECT_EQ(0, error_callback_count_);
493
494 EXPECT_EQ(1, observer.powered_changed_count_);
495 EXPECT_FALSE(observer.last_powered_);
496
497 EXPECT_FALSE(adapter_->IsPowered());
498 }
499
500 TEST_F(BluetoothExperimentalChromeOSTest, StopDiscovery) {
501 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
502
503 GetAdapter();
504
505 adapter_->SetPowered(
506 true,
507 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
508 base::Unretained(this)),
509 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
510 base::Unretained(this)));
511 adapter_->StartDiscovering(
512 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
513 base::Unretained(this)),
514 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
515 base::Unretained(this)));
516 EXPECT_EQ(2, callback_count_);
517 EXPECT_EQ(0, error_callback_count_);
518 callback_count_ = 0;
519
520 ASSERT_TRUE(adapter_->IsPowered());
521 ASSERT_TRUE(adapter_->IsDiscovering());
522
523 // Install an observer; aside from the callback, expect the
524 // AdapterDiscoveringChanged method to be called and no longer to be
525 // discovering,
526 TestObserver observer(adapter_);
527 adapter_->AddObserver(&observer);
528
529 adapter_->StopDiscovering(
530 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
531 base::Unretained(this)),
532 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
533 base::Unretained(this)));
534 EXPECT_EQ(1, callback_count_);
535 EXPECT_EQ(0, error_callback_count_);
536
537 EXPECT_EQ(1, observer.discovering_changed_count_);
538 EXPECT_FALSE(observer.last_discovering_);
539
540 EXPECT_FALSE(adapter_->IsDiscovering());
541
542 message_loop.RunUntilIdle();
youngki 2013/04/17 16:23:45 This method has been deprecated: https://code.goog
keybuk 2013/04/17 17:46:31 Not needed anymore with the current test code - dr
543 }
544
545 TEST_F(BluetoothExperimentalChromeOSTest, StopDiscoveryAfterTwoStarts) {
546 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
547
548 GetAdapter();
549
550 adapter_->SetPowered(
551 true,
552 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
553 base::Unretained(this)),
554 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
555 base::Unretained(this)));
556 adapter_->StartDiscovering(
557 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
558 base::Unretained(this)),
559 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
560 base::Unretained(this)));
561 EXPECT_EQ(2, callback_count_);
562 EXPECT_EQ(0, error_callback_count_);
563 callback_count_ = 0;
564
565 ASSERT_TRUE(adapter_->IsPowered());
566 ASSERT_TRUE(adapter_->IsDiscovering());
567
568 // Install an observer and start discovering again; only the callback
569 // should be called since we were already discovering to begin with.
570 TestObserver observer(adapter_);
571 adapter_->AddObserver(&observer);
572
573 adapter_->StartDiscovering(
574 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
575 base::Unretained(this)),
576 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
577 base::Unretained(this)));
578 EXPECT_EQ(1, callback_count_);
579 EXPECT_EQ(0, error_callback_count_);
580 callback_count_ = 0;
581
582 EXPECT_EQ(0, observer.discovering_changed_count_);
583
584 // Stop discovering; only the callback should be called since we're still
585 // discovering. The adapter should be still discovering.
586 adapter_->StopDiscovering(
587 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
588 base::Unretained(this)),
589 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
590 base::Unretained(this)));
591 EXPECT_EQ(1, callback_count_);
592 EXPECT_EQ(0, error_callback_count_);
593 callback_count_ = 0;
594
595 EXPECT_EQ(0, observer.discovering_changed_count_);
596
597 EXPECT_TRUE(adapter_->IsDiscovering());
598
599 // Stop discovering one more time; aside from the callback, expect the
600 // AdapterDiscoveringChanged method to be called and no longer to be
601 // discovering,
602 adapter_->StopDiscovering(
603 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
604 base::Unretained(this)),
605 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
606 base::Unretained(this)));
607 EXPECT_EQ(1, callback_count_);
608 EXPECT_EQ(0, error_callback_count_);
609
610 EXPECT_EQ(1, observer.discovering_changed_count_);
611 EXPECT_FALSE(observer.last_discovering_);
612
613 EXPECT_FALSE(adapter_->IsDiscovering());
614
615 message_loop.RunUntilIdle();
616 }
617
618 TEST_F(BluetoothExperimentalChromeOSTest, Discovery) {
619 // Test a simulated discovery session.
620 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
621
622 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
623 GetAdapter();
624
625 TestObserver observer(adapter_);
626 adapter_->AddObserver(&observer);
627
628 adapter_->SetPowered(
629 true,
630 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
631 base::Unretained(this)),
632 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
633 base::Unretained(this)));
634 adapter_->StartDiscovering(
635 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
636 base::Unretained(this)),
637 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
638 base::Unretained(this)));
639 EXPECT_EQ(2, callback_count_);
640 EXPECT_EQ(0, error_callback_count_);
641 callback_count_ = 0;
642
643 ASSERT_TRUE(adapter_->IsPowered());
644 ASSERT_TRUE(adapter_->IsDiscovering());
645
646 // First device to appear should be an Apple Mouse.
647 message_loop.Run();
648
649 EXPECT_EQ(1, observer.device_added_count_);
650 EXPECT_EQ(FakeBluetoothDeviceClient::kAppleMouseAddress,
651 observer.last_device_address_);
652
653 // Next we should get another two devices...
654 message_loop.Run();
655 EXPECT_EQ(3, observer.device_added_count_);
656
657 // Okay, let's run forward until a device is actually removed...
658 while (!observer.device_removed_count_)
659 message_loop.Run();
660
661 EXPECT_EQ(1, observer.device_removed_count_);
662 EXPECT_EQ(FakeBluetoothDeviceClient::kVanishingDeviceAddress,
663 observer.last_device_address_);
664
665 message_loop.RunUntilIdle();
666 }
667
668 TEST_F(BluetoothExperimentalChromeOSTest, PoweredAndDiscovering) {
669 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
670
671 GetAdapter();
672 adapter_->SetPowered(
673 true,
674 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
675 base::Unretained(this)),
676 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
677 base::Unretained(this)));
678 adapter_->StartDiscovering(
679 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
680 base::Unretained(this)),
681 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
682 base::Unretained(this)));
683 EXPECT_EQ(2, callback_count_);
684 EXPECT_EQ(0, error_callback_count_);
685 callback_count_ = 0;
686
687 // Stop the timers that the simulation uses
688 fake_bluetooth_device_client_->EndDiscoverySimulation(
689 dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath));
690 message_loop.RunUntilIdle();
691
692 ASSERT_TRUE(adapter_->IsPowered());
693 ASSERT_TRUE(adapter_->IsDiscovering());
694
695 fake_bluetooth_adapter_client_->SetVisible(false);
696 ASSERT_FALSE(adapter_->IsPresent());
697
698 // Install an observer; expect the AdapterPresentChanged,
699 // AdapterPoweredChanged and AdapterDiscoveringChanged methods to be called
700 // with true, and IsPresent(), IsPowered() and IsDiscovering() to all
701 // return true.
702 TestObserver observer(adapter_);
703 adapter_->AddObserver(&observer);
704
705 fake_bluetooth_adapter_client_->SetVisible(true);
706
707 EXPECT_EQ(1, observer.present_changed_count_);
708 EXPECT_TRUE(observer.last_present_);
709 EXPECT_TRUE(adapter_->IsPresent());
710
711 EXPECT_EQ(1, observer.powered_changed_count_);
712 EXPECT_TRUE(observer.last_powered_);
713 EXPECT_TRUE(adapter_->IsPowered());
714
715 EXPECT_EQ(1, observer.discovering_changed_count_);
716 EXPECT_TRUE(observer.last_discovering_);
717 EXPECT_TRUE(adapter_->IsDiscovering());
718
719 observer.present_changed_count_ = 0;
720 observer.powered_changed_count_ = 0;
721 observer.discovering_changed_count_ = 0;
722
723 // Now mark the adapter not present again. Expect the methods to be called
724 // again, to reset the properties back to false
725 fake_bluetooth_adapter_client_->SetVisible(false);
726
727 EXPECT_EQ(1, observer.present_changed_count_);
728 EXPECT_FALSE(observer.last_present_);
729 EXPECT_FALSE(adapter_->IsPresent());
730
731 EXPECT_EQ(1, observer.powered_changed_count_);
732 EXPECT_FALSE(observer.last_powered_);
733 EXPECT_FALSE(adapter_->IsPowered());
734
735 EXPECT_EQ(1, observer.discovering_changed_count_);
736 EXPECT_FALSE(observer.last_discovering_);
737 EXPECT_FALSE(adapter_->IsDiscovering());
738 }
739
740 TEST_F(BluetoothExperimentalChromeOSTest, DeviceProperties) {
741 GetAdapter();
742
743 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
744 ASSERT_EQ(1U, devices.size());
745 ASSERT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
746 devices[0]->GetAddress());
747
748 // Verify the other device properties.
749 EXPECT_EQ(UTF8ToUTF16(FakeBluetoothDeviceClient::kPairedDeviceName),
750 devices[0]->GetName());
751 EXPECT_EQ(BluetoothDevice::DEVICE_COMPUTER, devices[0]->GetDeviceType());
752 EXPECT_TRUE(devices[0]->IsPaired());
753 EXPECT_FALSE(devices[0]->IsConnected());
754 EXPECT_FALSE(devices[0]->IsConnectable());
755 EXPECT_FALSE(devices[0]->IsConnecting());
756
757 BluetoothDevice::ServiceList uuids = devices[0]->GetServices();
758 ASSERT_EQ(2U, uuids.size());
759 EXPECT_EQ(uuids[0], "00001800-0000-1000-8000-00805f9b34fb");
760 EXPECT_EQ(uuids[1], "00001801-0000-1000-8000-00805f9b34fb");
761 }
762
763 TEST_F(BluetoothExperimentalChromeOSTest, DeviceClassChanged) {
764 // Simulate a change of class of a device, as sometimes occurs
765 // during discovery.
766 GetAdapter();
767
768 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
769 ASSERT_EQ(1U, devices.size());
770 ASSERT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
771 devices[0]->GetAddress());
772 ASSERT_EQ(BluetoothDevice::DEVICE_COMPUTER, devices[0]->GetDeviceType());
773
774 // Install an observer; expect the DeviceChanged method to be called when
775 // we change the class of the device.
776 TestObserver observer(adapter_);
777 adapter_->AddObserver(&observer);
778
779 FakeBluetoothDeviceClient::Properties* properties =
780 fake_bluetooth_device_client_->GetProperties(
781 dbus::ObjectPath(FakeBluetoothDeviceClient::kPairedDevicePath));
782
783 properties->bluetooth_class.ReplaceValue(0x002580);
784 properties->NotifyPropertyChanged(properties->bluetooth_class.name());
785
786 EXPECT_EQ(1, observer.device_changed_count_);
787 EXPECT_EQ(devices[0], observer.last_device_);
788
789 EXPECT_EQ(BluetoothDevice::DEVICE_MOUSE, devices[0]->GetDeviceType());
790 }
791
792 TEST_F(BluetoothExperimentalChromeOSTest, DeviceNameChanged) {
793 // Simulate a change of name of a device.
794 GetAdapter();
795
796 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
797 ASSERT_EQ(1U, devices.size());
798 ASSERT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
799 devices[0]->GetAddress());
800 ASSERT_EQ(UTF8ToUTF16(FakeBluetoothDeviceClient::kPairedDeviceName),
801 devices[0]->GetName());
802
803 // Install an observer; expect the DeviceChanged method to be called when
804 // we change the alias of the device.
805 TestObserver observer(adapter_);
806 adapter_->AddObserver(&observer);
807
808 FakeBluetoothDeviceClient::Properties* properties =
809 fake_bluetooth_device_client_->GetProperties(
810 dbus::ObjectPath(FakeBluetoothDeviceClient::kPairedDevicePath));
811
812 static const std::string new_name("New Device Name");
813 properties->alias.ReplaceValue(new_name);
814 properties->NotifyPropertyChanged(properties->alias.name());
815
816 EXPECT_EQ(1, observer.device_changed_count_);
817 EXPECT_EQ(devices[0], observer.last_device_);
818
819 EXPECT_EQ(UTF8ToUTF16(new_name), devices[0]->GetName());
820 }
821
822 TEST_F(BluetoothExperimentalChromeOSTest, DeviceUuidsChanged) {
823 // Simulate a change of advertised services of a device.
824 GetAdapter();
825
826 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
827 ASSERT_EQ(1U, devices.size());
828 ASSERT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
829 devices[0]->GetAddress());
830
831 BluetoothDevice::ServiceList uuids = devices[0]->GetServices();
832 ASSERT_EQ(2U, uuids.size());
833 ASSERT_EQ(uuids[0], "00001800-0000-1000-8000-00805f9b34fb");
834 ASSERT_EQ(uuids[1], "00001801-0000-1000-8000-00805f9b34fb");
835
836 // Install an observer; expect the DeviceChanged method to be called when
837 // we change the class of the device.
838 TestObserver observer(adapter_);
839 adapter_->AddObserver(&observer);
840
841 FakeBluetoothDeviceClient::Properties* properties =
842 fake_bluetooth_device_client_->GetProperties(
843 dbus::ObjectPath(FakeBluetoothDeviceClient::kPairedDevicePath));
844
845 uuids.push_back("0000110c-0000-1000-8000-00805f9b34fb");
846 uuids.push_back("0000110e-0000-1000-8000-00805f9b34fb");
847 uuids.push_back("0000110a-0000-1000-8000-00805f9b34fb");
848
849 properties->uuids.ReplaceValue(uuids);
850 properties->NotifyPropertyChanged(properties->uuids.name());
851
852 EXPECT_EQ(1, observer.device_changed_count_);
853 EXPECT_EQ(devices[0], observer.last_device_);
854
855 // Fetching the value should give the new one.
856 uuids = devices[0]->GetServices();
857 ASSERT_EQ(5U, uuids.size());
858 EXPECT_EQ(uuids[0], "00001800-0000-1000-8000-00805f9b34fb");
859 EXPECT_EQ(uuids[1], "00001801-0000-1000-8000-00805f9b34fb");
860 EXPECT_EQ(uuids[2], "0000110c-0000-1000-8000-00805f9b34fb");
861 EXPECT_EQ(uuids[3], "0000110e-0000-1000-8000-00805f9b34fb");
862 EXPECT_EQ(uuids[4], "0000110a-0000-1000-8000-00805f9b34fb");
863 }
864
865 TEST_F(BluetoothExperimentalChromeOSTest, ForgetDevice) {
866 GetAdapter();
867
868 BluetoothAdapter::DeviceList devices = adapter_->GetDevices();
869 ASSERT_EQ(1U, devices.size());
870 ASSERT_EQ(FakeBluetoothDeviceClient::kPairedDeviceAddress,
871 devices[0]->GetAddress());
872
873 std::string address = devices[0]->GetAddress();
874
875 // Install an observer; expect the DeviceRemoved method to be called
876 // with the device we remove.
877 TestObserver observer(adapter_);
878 adapter_->AddObserver(&observer);
879
880 devices[0]->Forget(
881 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
882 base::Unretained(this)));
883 EXPECT_EQ(0, error_callback_count_);
884
885 EXPECT_EQ(1, observer.device_removed_count_);
886 EXPECT_EQ(address, observer.last_device_address_);
887
888 // GetDevices shouldn't return the device either.
889 devices = adapter_->GetDevices();
890 ASSERT_EQ(0U, devices.size());
891 }
892
893 TEST_F(BluetoothExperimentalChromeOSTest, ConnectPairedDevice) {
894 GetAdapter();
895
896 BluetoothDevice* device = adapter_->GetDevice(
897 FakeBluetoothDeviceClient::kPairedDeviceAddress);
898 ASSERT_TRUE(device != NULL);
899 ASSERT_TRUE(device->IsPaired());
900
901 TestObserver observer(adapter_);
902 adapter_->AddObserver(&observer);
903
904 // Connect without a pairing delegate; since the device is already Paired
905 // this should succeed and the device should become connected.
906 device->Connect(
907 NULL,
908 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
909 base::Unretained(this)),
910 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
911 base::Unretained(this)));
912
913 EXPECT_EQ(1, callback_count_);
914 EXPECT_EQ(0, error_callback_count_);
915
916 EXPECT_EQ(1, observer.device_changed_count_);
917 EXPECT_EQ(device, observer.last_device_);
918
919 EXPECT_TRUE(device->IsConnected());
920 EXPECT_FALSE(device->IsConnecting());
921 }
922
923 TEST_F(BluetoothExperimentalChromeOSTest, ConnectUnpairableDevice) {
924 GetAdapter();
925 DiscoverDevices();
926
927 BluetoothDevice* device = adapter_->GetDevice(
928 FakeBluetoothDeviceClient::kMicrosoftMouseAddress);
929 ASSERT_TRUE(device != NULL);
930 ASSERT_FALSE(device->IsPaired());
931
932 TestObserver observer(adapter_);
933 adapter_->AddObserver(&observer);
934
935 // Connect without a pairing delegate; since the device does not require
936 // pairing, this should succeed and the device should become connected.
937 device->Connect(
938 NULL,
939 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
940 base::Unretained(this)),
941 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
942 base::Unretained(this)));
943
944 EXPECT_EQ(1, callback_count_);
945 EXPECT_EQ(0, error_callback_count_);
946
947 EXPECT_EQ(1, observer.device_changed_count_);
948 EXPECT_EQ(device, observer.last_device_);
949
950 EXPECT_TRUE(device->IsConnected());
951 EXPECT_FALSE(device->IsConnecting());
952 }
953
954 TEST_F(BluetoothExperimentalChromeOSTest, ConnectConnectedDevice) {
955 GetAdapter();
956
957 BluetoothDevice* device = adapter_->GetDevice(
958 FakeBluetoothDeviceClient::kPairedDeviceAddress);
959 ASSERT_TRUE(device != NULL);
960 ASSERT_TRUE(device->IsPaired());
961
962 device->Connect(
963 NULL,
964 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
965 base::Unretained(this)),
966 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
967 base::Unretained(this)));
968
969 ASSERT_EQ(1, callback_count_);
970 ASSERT_EQ(0, error_callback_count_);
971 callback_count_ = 0;
972
973 ASSERT_TRUE(device->IsConnected());
974
975 // Connect again; since the device is already Connected, this shouldn't do
976 // anything, not even the observer method should be called.
977 TestObserver observer(adapter_);
978 adapter_->AddObserver(&observer);
979
980 device->Connect(
981 NULL,
982 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
983 base::Unretained(this)),
984 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
985 base::Unretained(this)));
986
987 EXPECT_EQ(1, callback_count_);
988 EXPECT_EQ(0, error_callback_count_);
989
990 EXPECT_EQ(0, observer.device_changed_count_);
991
992 EXPECT_TRUE(device->IsConnected());
993 EXPECT_FALSE(device->IsConnecting());
994 }
995
996 TEST_F(BluetoothExperimentalChromeOSTest, ConnectDeviceFails) {
997 GetAdapter();
998 DiscoverDevices();
999
1000 BluetoothDevice* device = adapter_->GetDevice(
1001 FakeBluetoothDeviceClient::kAppleMouseAddress);
1002 ASSERT_TRUE(device != NULL);
1003 ASSERT_FALSE(device->IsPaired());
1004
1005 TestObserver observer(adapter_);
1006 adapter_->AddObserver(&observer);
1007
1008 // Connect without a pairing delegate; since the device requires pairing,
1009 // this should fail with an error.
1010 device->Connect(
1011 NULL,
1012 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1013 base::Unretained(this)),
1014 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1015 base::Unretained(this)));
1016
1017 EXPECT_EQ(0, callback_count_);
1018 EXPECT_EQ(1, error_callback_count_);
1019 EXPECT_EQ(BluetoothDevice::ERROR_FAILED, last_connect_error_);
1020
1021 EXPECT_EQ(0, observer.device_changed_count_);
1022
1023 EXPECT_FALSE(device->IsConnected());
1024 EXPECT_FALSE(device->IsConnecting());
1025 }
1026
1027 TEST_F(BluetoothExperimentalChromeOSTest, DisconnectDevice) {
1028 GetAdapter();
1029
1030 BluetoothDevice* device = adapter_->GetDevice(
1031 FakeBluetoothDeviceClient::kPairedDeviceAddress);
1032 ASSERT_TRUE(device != NULL);
1033 ASSERT_TRUE(device->IsPaired());
1034
1035 device->Connect(
1036 NULL,
1037 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1038 base::Unretained(this)),
1039 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1040 base::Unretained(this)));
1041
1042 ASSERT_EQ(1, callback_count_);
1043 ASSERT_EQ(0, error_callback_count_);
1044 callback_count_ = 0;
1045
1046 ASSERT_TRUE(device->IsConnected());
1047 ASSERT_FALSE(device->IsConnecting());
1048
1049 // Disconnect the device, we should see the observer method fire and the
1050 // device get dropped.
1051 TestObserver observer(adapter_);
1052 adapter_->AddObserver(&observer);
1053
1054 device->Disconnect(
1055 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1056 base::Unretained(this)),
1057 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
1058 base::Unretained(this)));
1059
1060 EXPECT_EQ(1, callback_count_);
1061 EXPECT_EQ(0, error_callback_count_);
1062
1063 EXPECT_EQ(1, observer.device_changed_count_);
1064 EXPECT_EQ(device, observer.last_device_);
1065
1066 EXPECT_FALSE(device->IsConnected());
1067 }
1068
1069 TEST_F(BluetoothExperimentalChromeOSTest, DisconnectUnconnectedDevice) {
1070 GetAdapter();
1071
1072 BluetoothDevice* device = adapter_->GetDevice(
1073 FakeBluetoothDeviceClient::kPairedDeviceAddress);
1074 ASSERT_TRUE(device != NULL);
1075 ASSERT_TRUE(device->IsPaired());
1076 ASSERT_FALSE(device->IsConnected());
1077
1078 // Disconnect the device, we should see the observer method fire and the
1079 // device get dropped.
1080 TestObserver observer(adapter_);
1081 adapter_->AddObserver(&observer);
1082
1083 device->Disconnect(
1084 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1085 base::Unretained(this)),
1086 base::Bind(&BluetoothExperimentalChromeOSTest::ErrorCallback,
1087 base::Unretained(this)));
1088
1089 EXPECT_EQ(0, callback_count_);
1090 EXPECT_EQ(1, error_callback_count_);
1091
1092 EXPECT_EQ(0, observer.device_changed_count_);
1093
1094 EXPECT_FALSE(device->IsConnected());
1095 }
1096
1097 TEST_F(BluetoothExperimentalChromeOSTest, PairAppleMouse) {
1098 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1099 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1100
1101 GetAdapter();
1102 DiscoverDevices();
1103
1104 // The Apple Mouse requires no PIN or Passkey to pair; this is equivalent
1105 // to Simple Secure Pairing or a device with a fixed 0000 PIN.
1106 BluetoothDevice* device = adapter_->GetDevice(
1107 FakeBluetoothDeviceClient::kAppleMouseAddress);
1108 ASSERT_TRUE(device != NULL);
1109 ASSERT_FALSE(device->IsPaired());
1110
1111 TestObserver observer(adapter_);
1112 adapter_->AddObserver(&observer);
1113
1114 TestPairingDelegate pairing_delegate;
1115 device->Connect(
1116 &pairing_delegate,
1117 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1118 base::Unretained(this)),
1119 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1120 base::Unretained(this)));
1121
1122 EXPECT_EQ(0, pairing_delegate.call_count_);
1123 EXPECT_TRUE(device->IsConnecting());
1124
1125 message_loop.Run();
1126
1127 EXPECT_EQ(1, callback_count_);
1128 EXPECT_EQ(0, error_callback_count_);
1129
1130 // One change for connected, and one for paired.
1131 EXPECT_EQ(2, observer.device_changed_count_);
1132 EXPECT_EQ(device, observer.last_device_);
1133
1134 EXPECT_TRUE(device->IsConnected());
1135 EXPECT_FALSE(device->IsConnecting());
1136
1137 EXPECT_TRUE(device->IsPaired());
1138
1139 // Pairing dialog should be dismissed
1140 EXPECT_EQ(1, pairing_delegate.call_count_);
1141 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1142
1143 // Make sure the trusted property has been set to true.
1144 FakeBluetoothDeviceClient::Properties* properties =
1145 fake_bluetooth_device_client_->GetProperties(
1146 dbus::ObjectPath(FakeBluetoothDeviceClient::kAppleMousePath));
1147 EXPECT_TRUE(properties->trusted.value());
1148
1149 message_loop.RunUntilIdle();
1150 }
1151
1152 TEST_F(BluetoothExperimentalChromeOSTest, PairAppleKeyboard) {
1153 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1154 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1155
1156 GetAdapter();
1157 DiscoverDevices();
1158
1159 // The Apple Keyboard requires that we display a randomly generated
1160 // PIN on the screen.
1161 BluetoothDevice* device = adapter_->GetDevice(
1162 FakeBluetoothDeviceClient::kAppleKeyboardAddress);
1163 ASSERT_TRUE(device != NULL);
1164 ASSERT_FALSE(device->IsPaired());
1165
1166 TestObserver observer(adapter_);
1167 adapter_->AddObserver(&observer);
1168
1169 TestPairingDelegate pairing_delegate;
1170 device->Connect(
1171 &pairing_delegate,
1172 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1173 base::Unretained(this)),
1174 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1175 base::Unretained(this)));
1176
1177 EXPECT_EQ(1, pairing_delegate.call_count_);
1178 EXPECT_EQ(1, pairing_delegate.display_pincode_count_);
1179 EXPECT_EQ("123456", pairing_delegate.last_pincode_);
1180 EXPECT_TRUE(device->IsConnecting());
1181
1182 message_loop.Run();
1183
1184 EXPECT_EQ(1, callback_count_);
1185 EXPECT_EQ(0, error_callback_count_);
1186
1187 // One change for connected, and one for paired.
1188 EXPECT_EQ(2, observer.device_changed_count_);
1189 EXPECT_EQ(device, observer.last_device_);
1190
1191 EXPECT_TRUE(device->IsConnected());
1192 EXPECT_FALSE(device->IsConnecting());
1193
1194 EXPECT_TRUE(device->IsPaired());
1195
1196 // Pairing dialog should be dismissed
1197 EXPECT_EQ(2, pairing_delegate.call_count_);
1198 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1199
1200 // Make sure the trusted property has been set to true.
1201 FakeBluetoothDeviceClient::Properties* properties =
1202 fake_bluetooth_device_client_->GetProperties(
1203 dbus::ObjectPath(FakeBluetoothDeviceClient::kAppleKeyboardPath));
1204 EXPECT_TRUE(properties->trusted.value());
1205
1206 message_loop.RunUntilIdle();
1207 }
1208
1209 TEST_F(BluetoothExperimentalChromeOSTest, PairMotorolaKeyboard) {
1210 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1211 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1212
1213 GetAdapter();
1214 DiscoverDevices();
1215
1216 // The Motorola Keyboard requires that we display a randomly generated
1217 // Passkey on the screen, and notifies us as it's typed in.
1218 BluetoothDevice* device = adapter_->GetDevice(
1219 FakeBluetoothDeviceClient::kMotorolaKeyboardAddress);
1220 ASSERT_TRUE(device != NULL);
1221 ASSERT_FALSE(device->IsPaired());
1222
1223 TestObserver observer(adapter_);
1224 adapter_->AddObserver(&observer);
1225
1226 TestPairingDelegate pairing_delegate;
1227 device->Connect(
1228 &pairing_delegate,
1229 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1230 base::Unretained(this)),
1231 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1232 base::Unretained(this)));
1233
1234 EXPECT_EQ(1, pairing_delegate.call_count_);
1235 EXPECT_EQ(1, pairing_delegate.display_passkey_count_);
1236 EXPECT_EQ(123456U, pairing_delegate.last_passkey_);
1237 EXPECT_TRUE(device->IsConnecting());
1238
1239 // TODO(keybuk): verify we get typing notifications
1240
1241 message_loop.Run();
1242
1243 EXPECT_EQ(1, callback_count_);
1244 EXPECT_EQ(0, error_callback_count_);
1245
1246 // One change for connected, and one for paired.
1247 EXPECT_EQ(2, observer.device_changed_count_);
1248 EXPECT_EQ(device, observer.last_device_);
1249
1250 EXPECT_TRUE(device->IsConnected());
1251 EXPECT_FALSE(device->IsConnecting());
1252
1253 EXPECT_TRUE(device->IsPaired());
1254
1255 // Pairing dialog should be dismissed
1256 EXPECT_EQ(2, pairing_delegate.call_count_);
1257 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1258
1259 // Make sure the trusted property has been set to true.
1260 FakeBluetoothDeviceClient::Properties* properties =
1261 fake_bluetooth_device_client_->GetProperties(
1262 dbus::ObjectPath(FakeBluetoothDeviceClient::kMotorolaKeyboardPath));
1263 EXPECT_TRUE(properties->trusted.value());
1264
1265 message_loop.RunUntilIdle();
1266 }
1267
1268 TEST_F(BluetoothExperimentalChromeOSTest, PairSonyHeadphones) {
1269 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1270 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1271
1272 GetAdapter();
1273 DiscoverDevices();
1274
1275 // The Sony Headphones fake requires that the user enters a PIN for them.
1276 BluetoothDevice* device = adapter_->GetDevice(
1277 FakeBluetoothDeviceClient::kSonyHeadphonesAddress);
1278 ASSERT_TRUE(device != NULL);
1279 ASSERT_FALSE(device->IsPaired());
1280
1281 TestObserver observer(adapter_);
1282 adapter_->AddObserver(&observer);
1283
1284 TestPairingDelegate pairing_delegate;
1285 device->Connect(
1286 &pairing_delegate,
1287 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1288 base::Unretained(this)),
1289 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1290 base::Unretained(this)));
1291
1292 EXPECT_EQ(1, pairing_delegate.call_count_);
1293 EXPECT_EQ(1, pairing_delegate.request_pincode_count_);
1294 EXPECT_TRUE(device->IsConnecting());
1295
1296 // Set the PIN.
1297 device->SetPinCode("1234");
1298 message_loop.Run();
1299
1300 EXPECT_EQ(1, callback_count_);
1301 EXPECT_EQ(0, error_callback_count_);
1302
1303 // One change for connected, and one for paired.
1304 EXPECT_EQ(2, observer.device_changed_count_);
1305 EXPECT_EQ(device, observer.last_device_);
1306
1307 EXPECT_TRUE(device->IsConnected());
1308 EXPECT_FALSE(device->IsConnecting());
1309
1310 EXPECT_TRUE(device->IsPaired());
1311
1312 // Pairing dialog should be dismissed
1313 EXPECT_EQ(2, pairing_delegate.call_count_);
1314 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1315
1316 // Make sure the trusted property has been set to true.
1317 FakeBluetoothDeviceClient::Properties* properties =
1318 fake_bluetooth_device_client_->GetProperties(
1319 dbus::ObjectPath(FakeBluetoothDeviceClient::kSonyHeadphonesPath));
1320 EXPECT_TRUE(properties->trusted.value());
1321
1322 message_loop.RunUntilIdle();
1323 }
1324
1325 TEST_F(BluetoothExperimentalChromeOSTest, PairPhone) {
1326 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1327 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1328
1329 GetAdapter();
1330 DiscoverDevices();
1331
1332 // The fake phone requests that we confirm a displayed passkey.
1333 BluetoothDevice* device = adapter_->GetDevice(
1334 FakeBluetoothDeviceClient::kPhoneAddress);
1335 ASSERT_TRUE(device != NULL);
1336 ASSERT_FALSE(device->IsPaired());
1337
1338 TestObserver observer(adapter_);
1339 adapter_->AddObserver(&observer);
1340
1341 TestPairingDelegate pairing_delegate;
1342 device->Connect(
1343 &pairing_delegate,
1344 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1345 base::Unretained(this)),
1346 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1347 base::Unretained(this)));
1348
1349 EXPECT_EQ(1, pairing_delegate.call_count_);
1350 EXPECT_EQ(1, pairing_delegate.confirm_passkey_count_);
1351 EXPECT_EQ(123456U, pairing_delegate.last_passkey_);
1352 EXPECT_TRUE(device->IsConnecting());
1353
1354 // Confirm the passkey.
1355 device->ConfirmPairing();
1356 message_loop.Run();
1357
1358 EXPECT_EQ(1, callback_count_);
1359 EXPECT_EQ(0, error_callback_count_);
1360
1361 // One change for connected, and one for paired.
1362 EXPECT_EQ(2, observer.device_changed_count_);
1363 EXPECT_EQ(device, observer.last_device_);
1364
1365 EXPECT_TRUE(device->IsConnected());
1366 EXPECT_FALSE(device->IsConnecting());
1367
1368 EXPECT_TRUE(device->IsPaired());
1369
1370 // Pairing dialog should be dismissed
1371 EXPECT_EQ(2, pairing_delegate.call_count_);
1372 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1373
1374 // Make sure the trusted property has been set to true.
1375 FakeBluetoothDeviceClient::Properties* properties =
1376 fake_bluetooth_device_client_->GetProperties(
1377 dbus::ObjectPath(FakeBluetoothDeviceClient::kPhonePath));
1378 EXPECT_TRUE(properties->trusted.value());
1379
1380 message_loop.RunUntilIdle();
1381 }
1382
1383 TEST_F(BluetoothExperimentalChromeOSTest, PairWeirdDevice) {
1384 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1385 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1386
1387 GetAdapter();
1388 DiscoverDevices();
1389
1390 // Use the "weird device" fake that requires that the user enters a Passkey,
1391 // this would be some kind of device that has a display, but doesn't use
1392 // "just works" - maybe a car?
1393 BluetoothDevice* device = adapter_->GetDevice(
1394 FakeBluetoothDeviceClient::kWeirdDeviceAddress);
1395 ASSERT_TRUE(device != NULL);
1396 ASSERT_FALSE(device->IsPaired());
1397
1398 TestObserver observer(adapter_);
1399 adapter_->AddObserver(&observer);
1400
1401 TestPairingDelegate pairing_delegate;
1402 device->Connect(
1403 &pairing_delegate,
1404 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1405 base::Unretained(this)),
1406 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1407 base::Unretained(this)));
1408
1409 EXPECT_EQ(1, pairing_delegate.call_count_);
1410 EXPECT_EQ(1, pairing_delegate.request_passkey_count_);
1411 EXPECT_TRUE(device->IsConnecting());
1412
1413 // Set the Passkey.
1414 device->SetPasskey(1234);
1415 message_loop.Run();
1416
1417 EXPECT_EQ(1, callback_count_);
1418 EXPECT_EQ(0, error_callback_count_);
1419
1420 // One change for connected, and one for paired.
1421 EXPECT_EQ(2, observer.device_changed_count_);
1422 EXPECT_EQ(device, observer.last_device_);
1423
1424 EXPECT_TRUE(device->IsConnected());
1425 EXPECT_FALSE(device->IsConnecting());
1426
1427 EXPECT_TRUE(device->IsPaired());
1428
1429 // Pairing dialog should be dismissed
1430 EXPECT_EQ(2, pairing_delegate.call_count_);
1431 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1432
1433 // Make sure the trusted property has been set to true.
1434 FakeBluetoothDeviceClient::Properties* properties =
1435 fake_bluetooth_device_client_->GetProperties(
1436 dbus::ObjectPath(FakeBluetoothDeviceClient::kWeirdDevicePath));
1437 EXPECT_TRUE(properties->trusted.value());
1438
1439 message_loop.RunUntilIdle();
1440 }
1441
1442 TEST_F(BluetoothExperimentalChromeOSTest, PairingFails) {
1443 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1444 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1445
1446 GetAdapter();
1447 DiscoverDevice(FakeBluetoothDeviceClient::kVanishingDeviceAddress);
1448
1449 // The vanishing device times out during pairing
1450 BluetoothDevice* device = adapter_->GetDevice(
1451 FakeBluetoothDeviceClient::kVanishingDeviceAddress);
1452 ASSERT_TRUE(device != NULL);
1453 ASSERT_FALSE(device->IsPaired());
1454
1455 TestObserver observer(adapter_);
1456 adapter_->AddObserver(&observer);
1457
1458 TestPairingDelegate pairing_delegate;
1459 device->Connect(
1460 &pairing_delegate,
1461 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1462 base::Unretained(this)),
1463 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1464 base::Unretained(this)));
1465
1466 EXPECT_EQ(0, pairing_delegate.call_count_);
1467 EXPECT_TRUE(device->IsConnecting());
1468
1469 // Run the loop to get the error..
1470 message_loop.Run();
1471
1472 EXPECT_EQ(0, callback_count_);
1473 EXPECT_EQ(1, error_callback_count_);
1474
1475 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_TIMEOUT, last_connect_error_);
1476
1477 EXPECT_FALSE(device->IsConnected());
1478 EXPECT_FALSE(device->IsConnecting());
1479 EXPECT_FALSE(device->IsPaired());
1480
1481 // Pairing dialog should be dismissed
1482 EXPECT_EQ(1, pairing_delegate.call_count_);
1483 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1484
1485 message_loop.RunUntilIdle();
1486 }
1487
1488 TEST_F(BluetoothExperimentalChromeOSTest, PairingFailsAtConnection) {
1489 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1490 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1491
1492 GetAdapter();
1493 DiscoverDevices();
1494
1495 // Everything seems to go according to plan with the Microsoft Mouse, it
1496 // pairs with 0000, but then you can't make connections to it after.
1497 BluetoothDevice* device = adapter_->GetDevice(
1498 FakeBluetoothDeviceClient::kMicrosoftMouseAddress);
1499 ASSERT_TRUE(device != NULL);
1500 ASSERT_FALSE(device->IsPaired());
1501
1502 TestObserver observer(adapter_);
1503 adapter_->AddObserver(&observer);
1504
1505 TestPairingDelegate pairing_delegate;
1506 device->Connect(
1507 &pairing_delegate,
1508 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1509 base::Unretained(this)),
1510 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1511 base::Unretained(this)));
1512
1513 EXPECT_EQ(0, pairing_delegate.call_count_);
1514 EXPECT_TRUE(device->IsConnecting());
1515
1516 message_loop.Run();
1517
1518 EXPECT_EQ(0, callback_count_);
1519 EXPECT_EQ(1, error_callback_count_);
1520 EXPECT_EQ(BluetoothDevice::ERROR_FAILED, last_connect_error_);
1521
1522 // Just one change for paired, the device should not be connected.
1523 EXPECT_EQ(1, observer.device_changed_count_);
1524 EXPECT_EQ(device, observer.last_device_);
1525
1526 EXPECT_FALSE(device->IsConnected());
1527 EXPECT_FALSE(device->IsConnecting());
1528
1529 EXPECT_TRUE(device->IsPaired());
1530
1531 // Pairing dialog should be dismissed
1532 EXPECT_EQ(1, pairing_delegate.call_count_);
1533 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1534
1535 // Make sure the trusted property has been set to true still (since pairing
1536 // worked).
1537 FakeBluetoothDeviceClient::Properties* properties =
1538 fake_bluetooth_device_client_->GetProperties(
1539 dbus::ObjectPath(FakeBluetoothDeviceClient::kMicrosoftMousePath));
1540 EXPECT_TRUE(properties->trusted.value());
1541
1542 message_loop.RunUntilIdle();
1543 }
1544
1545 TEST_F(BluetoothExperimentalChromeOSTest, PairingRejectedAtPinCode) {
1546 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1547 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1548
1549 GetAdapter();
1550 DiscoverDevices();
1551
1552 // Reject the pairing after we receive a request for the PIN code.
1553 BluetoothDevice* device = adapter_->GetDevice(
1554 FakeBluetoothDeviceClient::kSonyHeadphonesAddress);
1555 ASSERT_TRUE(device != NULL);
1556 ASSERT_FALSE(device->IsPaired());
1557
1558 TestObserver observer(adapter_);
1559 adapter_->AddObserver(&observer);
1560
1561 TestPairingDelegate pairing_delegate;
1562 device->Connect(
1563 &pairing_delegate,
1564 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1565 base::Unretained(this)),
1566 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1567 base::Unretained(this)));
1568
1569 EXPECT_EQ(1, pairing_delegate.call_count_);
1570 EXPECT_EQ(1, pairing_delegate.request_pincode_count_);
1571 EXPECT_TRUE(device->IsConnecting());
1572
1573 // Reject the pairing.
1574 device->RejectPairing();
1575 message_loop.Run();
1576
1577 EXPECT_EQ(0, callback_count_);
1578 EXPECT_EQ(1, error_callback_count_);
1579 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_REJECTED, last_connect_error_);
1580
1581 // Should be no changes.
1582 EXPECT_EQ(0, observer.device_changed_count_);
1583 EXPECT_FALSE(device->IsConnected());
1584 EXPECT_FALSE(device->IsConnecting());
1585 EXPECT_FALSE(device->IsPaired());
1586
1587 // Pairing dialog should be dismissed
1588 EXPECT_EQ(2, pairing_delegate.call_count_);
1589 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1590
1591 message_loop.RunUntilIdle();
1592 }
1593
1594 TEST_F(BluetoothExperimentalChromeOSTest, PairingCancelledAtPinCode) {
1595 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1596 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1597
1598 GetAdapter();
1599 DiscoverDevices();
1600
1601 // Cancel the pairing after we receive a request for the PIN code.
1602 BluetoothDevice* device = adapter_->GetDevice(
1603 FakeBluetoothDeviceClient::kSonyHeadphonesAddress);
1604 ASSERT_TRUE(device != NULL);
1605 ASSERT_FALSE(device->IsPaired());
1606
1607 TestObserver observer(adapter_);
1608 adapter_->AddObserver(&observer);
1609
1610 TestPairingDelegate pairing_delegate;
1611 device->Connect(
1612 &pairing_delegate,
1613 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1614 base::Unretained(this)),
1615 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1616 base::Unretained(this)));
1617
1618 EXPECT_EQ(1, pairing_delegate.call_count_);
1619 EXPECT_EQ(1, pairing_delegate.request_pincode_count_);
1620 EXPECT_TRUE(device->IsConnecting());
1621
1622 // Cancel the pairing.
1623 device->CancelPairing();
1624 message_loop.Run();
1625
1626 EXPECT_EQ(0, callback_count_);
1627 EXPECT_EQ(1, error_callback_count_);
1628 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_CANCELED, last_connect_error_);
1629
1630 // Should be no changes.
1631 EXPECT_EQ(0, observer.device_changed_count_);
1632 EXPECT_FALSE(device->IsConnected());
1633 EXPECT_FALSE(device->IsConnecting());
1634 EXPECT_FALSE(device->IsPaired());
1635
1636 // Pairing dialog should be dismissed
1637 EXPECT_EQ(2, pairing_delegate.call_count_);
1638 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1639
1640 message_loop.RunUntilIdle();
1641 }
1642
1643 TEST_F(BluetoothExperimentalChromeOSTest, PairingRejectedAtPasskey) {
1644 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1645 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1646
1647 GetAdapter();
1648 DiscoverDevices();
1649
1650 // Reject the pairing after we receive a request for the passkey.
1651 BluetoothDevice* device = adapter_->GetDevice(
1652 FakeBluetoothDeviceClient::kWeirdDeviceAddress);
1653 ASSERT_TRUE(device != NULL);
1654 ASSERT_FALSE(device->IsPaired());
1655
1656 TestObserver observer(adapter_);
1657 adapter_->AddObserver(&observer);
1658
1659 TestPairingDelegate pairing_delegate;
1660 device->Connect(
1661 &pairing_delegate,
1662 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1663 base::Unretained(this)),
1664 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1665 base::Unretained(this)));
1666
1667 EXPECT_EQ(1, pairing_delegate.call_count_);
1668 EXPECT_EQ(1, pairing_delegate.request_passkey_count_);
1669 EXPECT_TRUE(device->IsConnecting());
1670
1671 // Reject the pairing.
1672 device->RejectPairing();
1673 message_loop.Run();
1674
1675 EXPECT_EQ(0, callback_count_);
1676 EXPECT_EQ(1, error_callback_count_);
1677 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_REJECTED, last_connect_error_);
1678
1679 // Should be no changes.
1680 EXPECT_EQ(0, observer.device_changed_count_);
1681 EXPECT_FALSE(device->IsConnected());
1682 EXPECT_FALSE(device->IsConnecting());
1683 EXPECT_FALSE(device->IsPaired());
1684
1685 // Pairing dialog should be dismissed
1686 EXPECT_EQ(2, pairing_delegate.call_count_);
1687 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1688
1689 message_loop.RunUntilIdle();
1690 }
1691
1692 TEST_F(BluetoothExperimentalChromeOSTest, PairingCancelledAtPasskey) {
1693 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1694 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1695
1696 GetAdapter();
1697 DiscoverDevices();
1698
1699 // Cancel the pairing after we receive a request for the passkey.
1700 BluetoothDevice* device = adapter_->GetDevice(
1701 FakeBluetoothDeviceClient::kWeirdDeviceAddress);
1702 ASSERT_TRUE(device != NULL);
1703 ASSERT_FALSE(device->IsPaired());
1704
1705 TestObserver observer(adapter_);
1706 adapter_->AddObserver(&observer);
1707
1708 TestPairingDelegate pairing_delegate;
1709 device->Connect(
1710 &pairing_delegate,
1711 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1712 base::Unretained(this)),
1713 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1714 base::Unretained(this)));
1715
1716 EXPECT_EQ(1, pairing_delegate.call_count_);
1717 EXPECT_EQ(1, pairing_delegate.request_passkey_count_);
1718 EXPECT_TRUE(device->IsConnecting());
1719
1720 // Cancel the pairing.
1721 device->CancelPairing();
1722 message_loop.Run();
1723
1724 EXPECT_EQ(0, callback_count_);
1725 EXPECT_EQ(1, error_callback_count_);
1726 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_CANCELED, last_connect_error_);
1727
1728 // Should be no changes.
1729 EXPECT_EQ(0, observer.device_changed_count_);
1730 EXPECT_FALSE(device->IsConnected());
1731 EXPECT_FALSE(device->IsConnecting());
1732 EXPECT_FALSE(device->IsPaired());
1733
1734 // Pairing dialog should be dismissed
1735 EXPECT_EQ(2, pairing_delegate.call_count_);
1736 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1737
1738 message_loop.RunUntilIdle();
1739 }
1740
1741 TEST_F(BluetoothExperimentalChromeOSTest, PairingRejectedAtConfirmation) {
1742 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1743 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1744
1745 GetAdapter();
1746 DiscoverDevices();
1747
1748 // Reject the pairing after we receive a request for passkey confirmation.
1749 BluetoothDevice* device = adapter_->GetDevice(
1750 FakeBluetoothDeviceClient::kPhoneAddress);
1751 ASSERT_TRUE(device != NULL);
1752 ASSERT_FALSE(device->IsPaired());
1753
1754 TestObserver observer(adapter_);
1755 adapter_->AddObserver(&observer);
1756
1757 TestPairingDelegate pairing_delegate;
1758 device->Connect(
1759 &pairing_delegate,
1760 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1761 base::Unretained(this)),
1762 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1763 base::Unretained(this)));
1764
1765 EXPECT_EQ(1, pairing_delegate.call_count_);
1766 EXPECT_EQ(1, pairing_delegate.confirm_passkey_count_);
1767 EXPECT_TRUE(device->IsConnecting());
1768
1769 // Reject the pairing.
1770 device->RejectPairing();
1771 message_loop.Run();
1772
1773 EXPECT_EQ(0, callback_count_);
1774 EXPECT_EQ(1, error_callback_count_);
1775 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_REJECTED, last_connect_error_);
1776
1777 // Should be no changes.
1778 EXPECT_EQ(0, observer.device_changed_count_);
1779 EXPECT_FALSE(device->IsConnected());
1780 EXPECT_FALSE(device->IsConnecting());
1781 EXPECT_FALSE(device->IsPaired());
1782
1783 // Pairing dialog should be dismissed
1784 EXPECT_EQ(2, pairing_delegate.call_count_);
1785 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1786
1787 message_loop.RunUntilIdle();
1788 }
1789
1790 TEST_F(BluetoothExperimentalChromeOSTest, PairingCancelledAtConfirmation) {
1791 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1792 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1793
1794 GetAdapter();
1795 DiscoverDevices();
1796
1797 // Cancel the pairing after we receive a request for the passkey.
1798 BluetoothDevice* device = adapter_->GetDevice(
1799 FakeBluetoothDeviceClient::kPhoneAddress);
1800 ASSERT_TRUE(device != NULL);
1801 ASSERT_FALSE(device->IsPaired());
1802
1803 TestObserver observer(adapter_);
1804 adapter_->AddObserver(&observer);
1805
1806 TestPairingDelegate pairing_delegate;
1807 device->Connect(
1808 &pairing_delegate,
1809 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1810 base::Unretained(this)),
1811 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1812 base::Unretained(this)));
1813
1814 EXPECT_EQ(1, pairing_delegate.call_count_);
1815 EXPECT_EQ(1, pairing_delegate.confirm_passkey_count_);
1816 EXPECT_TRUE(device->IsConnecting());
1817
1818 // Cancel the pairing.
1819 device->CancelPairing();
1820 message_loop.Run();
1821
1822 EXPECT_EQ(0, callback_count_);
1823 EXPECT_EQ(1, error_callback_count_);
1824 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_CANCELED, last_connect_error_);
1825
1826 // Should be no changes.
1827 EXPECT_EQ(0, observer.device_changed_count_);
1828 EXPECT_FALSE(device->IsConnected());
1829 EXPECT_FALSE(device->IsConnecting());
1830 EXPECT_FALSE(device->IsPaired());
1831
1832 // Pairing dialog should be dismissed
1833 EXPECT_EQ(2, pairing_delegate.call_count_);
1834 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1835
1836 message_loop.RunUntilIdle();
1837 }
1838
1839 TEST_F(BluetoothExperimentalChromeOSTest, PairingCancelledInFlight) {
1840 base::MessageLoop message_loop(MessageLoop::TYPE_DEFAULT);
1841 fake_bluetooth_device_client_->SetSimulationIntervalMs(10);
1842
1843 GetAdapter();
1844 DiscoverDevices();
1845
1846 // Cancel the pairing while we're waiting for the remote host.
1847 BluetoothDevice* device = adapter_->GetDevice(
1848 FakeBluetoothDeviceClient::kAppleMouseAddress);
1849 ASSERT_TRUE(device != NULL);
1850 ASSERT_FALSE(device->IsPaired());
1851
1852 TestObserver observer(adapter_);
1853 adapter_->AddObserver(&observer);
1854
1855 TestPairingDelegate pairing_delegate;
1856 device->Connect(
1857 &pairing_delegate,
1858 base::Bind(&BluetoothExperimentalChromeOSTest::Callback,
1859 base::Unretained(this)),
1860 base::Bind(&BluetoothExperimentalChromeOSTest::ConnectErrorCallback,
1861 base::Unretained(this)));
1862
1863 EXPECT_EQ(0, pairing_delegate.call_count_);
1864 EXPECT_TRUE(device->IsConnecting());
1865
1866 // Cancel the pairing.
1867 device->CancelPairing();
1868 message_loop.Run();
1869
1870 EXPECT_EQ(0, callback_count_);
1871 EXPECT_EQ(1, error_callback_count_);
1872 EXPECT_EQ(BluetoothDevice::ERROR_AUTH_CANCELED, last_connect_error_);
1873
1874 // Should be no changes.
1875 EXPECT_EQ(0, observer.device_changed_count_);
1876 EXPECT_FALSE(device->IsConnected());
1877 EXPECT_FALSE(device->IsConnecting());
1878 EXPECT_FALSE(device->IsPaired());
1879
1880 // Pairing dialog should be dismissed
1881 EXPECT_EQ(1, pairing_delegate.call_count_);
1882 EXPECT_EQ(1, pairing_delegate.dismiss_count_);
1883
1884 message_loop.RunUntilIdle();
1885 }
1886
1887 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698