diff options
Diffstat (limited to 'device/bluetooth/bluetooth_adapter_chromeos_devices_unittest.cc')
-rw-r--r-- | device/bluetooth/bluetooth_adapter_chromeos_devices_unittest.cc | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/device/bluetooth/bluetooth_adapter_chromeos_devices_unittest.cc b/device/bluetooth/bluetooth_adapter_chromeos_devices_unittest.cc new file mode 100644 index 0000000..0ff8d3d --- /dev/null +++ b/device/bluetooth/bluetooth_adapter_chromeos_devices_unittest.cc @@ -0,0 +1,168 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/dbus/mock_bluetooth_adapter_client.h" +#include "chromeos/dbus/mock_bluetooth_device_client.h" +#include "chromeos/dbus/mock_bluetooth_manager_client.h" +#include "chromeos/dbus/mock_dbus_thread_manager.h" +#include "dbus/object_path.h" +#include "device/bluetooth/bluetooth_adapter.h" +#include "device/bluetooth/bluetooth_adapter_chromeos.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" +#include "testing/gtest/include/gtest/gtest.h" + +using device::BluetoothAdapter; +using device::BluetoothAdapterFactory; +using device::BluetoothDevice; +using device::MockBluetoothAdapter; +using ::testing::_; +using ::testing::Mock; +using ::testing::Return; +using ::testing::SaveArg; + +namespace chromeos { + +class BluetoothAdapterChromeOsDevicesTest : public testing::Test { + public: + virtual void SetUp() { + MockDBusThreadManager* mock_dbus_thread_manager = new MockDBusThreadManager; + + EXPECT_CALL(*mock_dbus_thread_manager, GetSystemBus()) + .WillRepeatedly(Return(reinterpret_cast<dbus::Bus*>(NULL))); + DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); + + mock_manager_client_ = + mock_dbus_thread_manager->mock_bluetooth_manager_client(); + mock_adapter_client_ = + mock_dbus_thread_manager->mock_bluetooth_adapter_client(); + mock_device_client_ = + mock_dbus_thread_manager->mock_bluetooth_device_client(); + + // Create the default adapter instance; + // BluetoothManagerClient::DefaultAdapter will be called once, passing + // a callback to obtain the adapter path. + BluetoothManagerClient::AdapterCallback adapter_callback; + EXPECT_CALL(*mock_manager_client_, DefaultAdapter(_)) + .WillOnce(SaveArg<0>(&adapter_callback)); + + EXPECT_CALL(*mock_manager_client_, AddObserver(_)) + .Times(1); + EXPECT_CALL(*mock_adapter_client_, AddObserver(_)) + .Times(1); + + adapter_ = BluetoothAdapterFactory::DefaultAdapter(); + ASSERT_TRUE(adapter_.get() != NULL); + + // Call the adapter callback; + // BluetoothAdapterClient::GetProperties will be called once to obtain + // the property set. + MockBluetoothAdapterClient::Properties adapter_properties; + adapter_properties.address.ReplaceValue(adapter_address_); + adapter_properties.powered.ReplaceValue(true); + + EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path_)) + .WillRepeatedly(Return(&adapter_properties)); + + // Add an observer to the adapter; expect the usual set of changes to + // an adapter becoming present and then clear to clean up for the test. + adapter_->AddObserver(&adapter_observer_); + + EXPECT_CALL(adapter_observer_, AdapterPresentChanged(adapter_.get(), true)) + .Times(1); + EXPECT_CALL(adapter_observer_, AdapterPoweredChanged(adapter_.get(), true)) + .Times(1); + + adapter_callback.Run(adapter_path_, true); + + Mock::VerifyAndClearExpectations(mock_manager_client_); + Mock::VerifyAndClearExpectations(mock_adapter_client_); + Mock::VerifyAndClearExpectations(mock_device_client_); + Mock::VerifyAndClearExpectations(&adapter_observer_); + } + + virtual void TearDown() { + BluetoothAdapterChromeOs* adapter_chromeos = + static_cast<BluetoothAdapterChromeOs*>(adapter_.get()); + EXPECT_CALL(*mock_device_client_, RemoveObserver(adapter_chromeos)) + .Times(1); + EXPECT_CALL(*mock_adapter_client_, RemoveObserver(adapter_chromeos)) + .Times(1); + EXPECT_CALL(*mock_manager_client_, RemoveObserver(adapter_chromeos)) + .Times(1); + + adapter_ = NULL; + DBusThreadManager::Shutdown(); + } + + protected: + MockBluetoothManagerClient* mock_manager_client_; + MockBluetoothAdapterClient* mock_adapter_client_; + MockBluetoothDeviceClient* mock_device_client_; + + static const dbus::ObjectPath adapter_path_; + static const std::string adapter_address_; + scoped_refptr<BluetoothAdapter> adapter_; + + MockBluetoothAdapter::Observer adapter_observer_; +}; + +const dbus::ObjectPath BluetoothAdapterChromeOsDevicesTest::adapter_path_( + "/fake/hci0"); +const std::string BluetoothAdapterChromeOsDevicesTest::adapter_address_ = + "CA:FE:4A:C0:FE:FE"; + +TEST_F(BluetoothAdapterChromeOsDevicesTest, DeviceRemovedAfterFound) { + const dbus::ObjectPath device_path("/fake/hci0/dev_ba_c0_11_00_00_01"); + const std::string device_address = "BA:C0:11:00:00:01"; + + MockBluetoothDeviceClient::Properties device_properties; + device_properties.address.ReplaceValue(device_address); + device_properties.name.ReplaceValue("Fake Keyboard"); + device_properties.bluetooth_class.ReplaceValue(0x2540); + + // Inform the adapter that the device has been found; + // BluetoothAdapterClient::Observer::DeviceAdded will be called, passing + // the device object. + BluetoothDevice* device; + EXPECT_CALL(adapter_observer_, DeviceAdded(adapter_.get(), _)) + .Times(1) + .WillOnce(SaveArg<1>(&device)); + + BluetoothAdapterChromeOs* adapter_chromeos = + static_cast<BluetoothAdapterChromeOs*>(adapter_.get()); + static_cast<BluetoothAdapterClient::Observer*>(adapter_chromeos) + ->DeviceFound(adapter_path_, device_address, device_properties); + + // Now inform the adapter that the device has been added and assigned an + // object path; BluetoothDeviceClient::GetProperties will be called to + // obtain the property set; and + // BluetoothAdapterClient::Observer::DeviceChanged will be called passing + // the same device object as before. + EXPECT_CALL(*mock_device_client_, GetProperties(device_path)) + .WillRepeatedly(Return(&device_properties)); + + EXPECT_CALL(adapter_observer_, DeviceChanged(adapter_chromeos, device)) + .Times(1); + + static_cast<BluetoothAdapterClient::Observer*>(adapter_chromeos) + ->DeviceCreated(adapter_path_, device_path); + + // Finally remove the adapter again; + // BluetoothAdapterClient::Observer::DeviceRemoved should be not called, + // instead BluetoothAdapterClient::Observer::DeviceChanged will be called. + EXPECT_CALL(adapter_observer_, DeviceRemoved(adapter_.get(), device)) + .Times(0); + EXPECT_CALL(adapter_observer_, DeviceChanged(adapter_.get(), device)) + .Times(1); + + static_cast<BluetoothAdapterClient::Observer*>(adapter_chromeos) + ->DeviceRemoved(adapter_path_, device_path); + + // Verify that the device is still visible, just no longer paired. + EXPECT_TRUE(device->IsVisible()); + EXPECT_FALSE(device->IsPaired()); +} + +} // namespace chromeos |