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