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