• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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:
TestObserver(scoped_refptr<BluetoothAdapter> adapter)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   }
~TestObserver()41   virtual ~TestObserver() {}
42 
AdapterPresentChanged(BluetoothAdapter * adapter,bool present)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 
AdapterPoweredChanged(BluetoothAdapter * adapter,bool powered)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 
AdapterDiscoveringChanged(BluetoothAdapter * adapter,bool discovering)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 
DeviceAdded(BluetoothAdapter * adapter,BluetoothDevice * device)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 
DeviceChanged(BluetoothAdapter * adapter,BluetoothDevice * device)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 
DeviceRemoved(BluetoothAdapter * adapter,BluetoothDevice * device)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.
QuitMessageLoop()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 
124 class TestPairingDelegate : public BluetoothDevice::PairingDelegate {
125  public:
TestPairingDelegate()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) {}
~TestPairingDelegate()137   virtual ~TestPairingDelegate() {}
138 
RequestPinCode(BluetoothDevice * device)139   virtual void RequestPinCode(BluetoothDevice* device) OVERRIDE {
140     ++call_count_;
141     ++request_pincode_count_;
142     QuitMessageLoop();
143   }
144 
RequestPasskey(BluetoothDevice * device)145   virtual void RequestPasskey(BluetoothDevice* device) OVERRIDE {
146     ++call_count_;
147     ++request_passkey_count_;
148     QuitMessageLoop();
149   }
150 
DisplayPinCode(BluetoothDevice * device,const std::string & pincode)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 
DisplayPasskey(BluetoothDevice * device,uint32 passkey)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 
KeysEntered(BluetoothDevice * device,uint32 entered)167   virtual void KeysEntered(BluetoothDevice* device, uint32 entered) OVERRIDE {
168     ++call_count_;
169     ++keys_entered_count_;
170     last_entered_ = entered;
171     QuitMessageLoop();
172   }
173 
ConfirmPasskey(BluetoothDevice * device,uint32 passkey)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 
DismissDisplayOrConfirm()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.
QuitMessageLoop()203    void QuitMessageLoop() {
204      if (base::MessageLoop::current() &&
205          base::MessageLoop::current()->is_running())
206        base::MessageLoop::current()->Quit();
207    }
208 };
209 
210 class BluetoothChromeOSTest : public testing::Test {
211  public:
SetUp()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 
TearDown()232   virtual void TearDown() {
233     adapter_ = NULL;
234     DBusThreadManager::Shutdown();
235   }
236 
237   // Generic callbacks
Callback()238   void Callback() {
239     ++callback_count_;
240   }
241 
ErrorCallback()242   void ErrorCallback() {
243     ++error_callback_count_;
244   }
245 
ConnectErrorCallback(enum BluetoothDevice::ConnectErrorCode error)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.
GetAdapter()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.
DiscoverDevice(const std::string & address)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.
DiscoverDevices()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 
TEST_F(BluetoothChromeOSTest,AlreadyPresent)330 TEST_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 
TEST_F(BluetoothChromeOSTest,BecomePresent)348 TEST_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 
TEST_F(BluetoothChromeOSTest,BecomeNotPresent)377 TEST_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 
TEST_F(BluetoothChromeOSTest,SecondAdapter)405 TEST_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 
TEST_F(BluetoothChromeOSTest,BecomePowered)452 TEST_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 
TEST_F(BluetoothChromeOSTest,BecomeNotPowered)476 TEST_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 
TEST_F(BluetoothChromeOSTest,StopDiscovery)510 TEST_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 
TEST_F(BluetoothChromeOSTest,StopDiscoveryAfterTwoStarts)553 TEST_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 
TEST_F(BluetoothChromeOSTest,Discovery)624 TEST_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 
TEST_F(BluetoothChromeOSTest,PoweredAndDiscovering)672 TEST_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 
TEST_F(BluetoothChromeOSTest,DeviceProperties)743 TEST_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 
TEST_F(BluetoothChromeOSTest,DeviceClassChanged)772 TEST_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 
TEST_F(BluetoothChromeOSTest,DeviceNameChanged)800 TEST_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 
TEST_F(BluetoothChromeOSTest,DeviceUuidsChanged)829 TEST_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 
TEST_F(BluetoothChromeOSTest,ForgetDevice)871 TEST_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 
TEST_F(BluetoothChromeOSTest,ForgetUnpairedDevice)899 TEST_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 
TEST_F(BluetoothChromeOSTest,ConnectPairedDevice)949 TEST_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 
TEST_F(BluetoothChromeOSTest,ConnectUnpairableDevice)981 TEST_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 
TEST_F(BluetoothChromeOSTest,ConnectConnectedDevice)1026 TEST_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 
TEST_F(BluetoothChromeOSTest,ConnectDeviceFails)1070 TEST_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 
TEST_F(BluetoothChromeOSTest,DisconnectDevice)1101 TEST_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 
TEST_F(BluetoothChromeOSTest,DisconnectUnconnectedDevice)1143 TEST_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 
TEST_F(BluetoothChromeOSTest,PairAppleMouse)1171 TEST_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 
TEST_F(BluetoothChromeOSTest,PairAppleKeyboard)1232 TEST_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 
TEST_F(BluetoothChromeOSTest,PairMotorolaKeyboard)1294 TEST_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 
TEST_F(BluetoothChromeOSTest,PairSonyHeadphones)1377 TEST_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 
TEST_F(BluetoothChromeOSTest,PairPhone)1440 TEST_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 
TEST_F(BluetoothChromeOSTest,PairWeirdDevice)1500 TEST_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 
TEST_F(BluetoothChromeOSTest,PairUnpairableDeviceFails)1561 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingFails)1604 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingFailsAtConnection)1648 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingRejectedAtPinCode)1705 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingCancelledAtPinCode)1752 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingRejectedAtPasskey)1799 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingCancelledAtPasskey)1846 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingRejectedAtConfirmation)1893 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingCancelledAtConfirmation)1940 TEST_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 
TEST_F(BluetoothChromeOSTest,PairingCancelledInFlight)1987 TEST_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