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