|  | // 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 "chrome/browser/chromeos/bluetooth/bluetooth_adapter.h" | 
|  | #include "chrome/browser/chromeos/bluetooth/test/mock_bluetooth_adapter.h" | 
|  | #include "chromeos/dbus/mock_bluetooth_adapter_client.h" | 
|  | #include "chromeos/dbus/mock_bluetooth_manager_client.h" | 
|  | #include "chromeos/dbus/mock_dbus_thread_manager.h" | 
|  | #include "dbus/object_path.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | using ::testing::_; | 
|  | using ::testing::InSequence; | 
|  | using ::testing::Return; | 
|  | using ::testing::SaveArg; | 
|  |  | 
|  | namespace chromeos { | 
|  |  | 
|  | class BluetoothAdapterTest : 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(); | 
|  |  | 
|  | set_callback_called_ = false; | 
|  | error_callback_called_ = false; | 
|  | } | 
|  |  | 
|  | virtual void TearDown() { | 
|  | DBusThreadManager::Shutdown(); | 
|  | } | 
|  |  | 
|  | void SetCallback() { | 
|  | set_callback_called_ = true; | 
|  | } | 
|  |  | 
|  | void ErrorCallback() { | 
|  | error_callback_called_ = true; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | MockBluetoothManagerClient* mock_manager_client_; | 
|  | MockBluetoothAdapterClient* mock_adapter_client_; | 
|  |  | 
|  | bool set_callback_called_; | 
|  | bool error_callback_called_; | 
|  | }; | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterNotPresent) { | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; make out it failed. | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must not be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(dbus::ObjectPath(""), false); | 
|  |  | 
|  | // Adapter should not be present. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterWithAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged will be called to | 
|  | // indicate the adapter is now present. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should be present with the given address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must not be called | 
|  | // yet. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should not be present yet. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  |  | 
|  | // Tell the adapter the address now; | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should be present with the given address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterBecomesPresentWithAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; make out it failed. | 
|  | adapter_callback.Run(dbus::ObjectPath(""), false); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(adapter_path); | 
|  |  | 
|  | // Adapter should be present with the new address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterReplacedWithAddress) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "BA:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must be called once | 
|  | // with false to indicate the old adapter being removed and once with true | 
|  | // to announce the new adapter. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should be present with the new address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(new_adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterBecomesPresentWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; make out it failed. | 
|  | adapter_callback.Run(dbus::ObjectPath(""), false); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must not be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(adapter_path); | 
|  |  | 
|  | // Adapter should not be present yet. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  |  | 
|  | // Tell the adapter the address now; | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should be present with the new address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterReplacedWithoutAddress) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "BA:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must be called to | 
|  | // indicate the adapter has gone away. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should be now marked not present. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  |  | 
|  | // Tell the adapter the address now; | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged now must be called. | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(new_adapter_path, | 
|  | new_adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should be present with the new address. | 
|  | EXPECT_TRUE(adapter->IsPresent()); | 
|  | EXPECT_EQ(new_adapter_address, adapter->address()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterRemoved) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Report that the adapter has been removed; | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged will be called to | 
|  | // indicate the adapter is no longer present. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->AdapterRemoved(adapter_path); | 
|  |  | 
|  | // Adapter should be no longer present. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterWithoutAddressRemoved) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Report that the adapter has been removed; | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged must not be called | 
|  | // since we never should have announced it in the first place. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->AdapterRemoved(adapter_path); | 
|  |  | 
|  | // Adapter should be still no longer present. | 
|  | EXPECT_FALSE(adapter->IsPresent()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyInitiallyFalse) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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(false); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyInitiallyTrue) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | 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); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterPoweredPropertyInitiallyTrueWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set but BluetoothAdapter::Observer::AdapterPoweredChanged | 
|  | // should not yet be called. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  | adapter_properties.powered.ReplaceValue(true); | 
|  |  | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should not yet have the property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  |  | 
|  | // Tell the adapter the address now, | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged and | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyChanged) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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(false); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  |  | 
|  | // Report that the property has been changed; | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | adapter_properties.powered.ReplaceValue(true); | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.powered.name()); | 
|  |  | 
|  | // Adapter should have the new property values. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyUnchanged) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  |  | 
|  | // Report that the property has been changed, but don't change the value; | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged should not be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.powered.name()); | 
|  |  | 
|  | // Adapter should still have the same property values. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterPoweredPropertyChangedWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set but BluetoothAdapter::Observer::AdapterPoweredChanged | 
|  | // should not yet be called. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Tell the adapter that its powered property changed, the observer | 
|  | // method should still not be called because there is no address for | 
|  | // the adapter so it is not present. | 
|  | adapter_properties.powered.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.powered.name()); | 
|  |  | 
|  | // Adapter should not yet have the property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  |  | 
|  | // Tell the adapter the address now, | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged and | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should now have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyResetOnReplace) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "00:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  | initial_adapter_properties.powered.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterPoweredPropertyResetOnReplaceWhenTrue) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "BA:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  | initial_adapter_properties.powered.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  | new_adapter_properties.powered.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged will be called once | 
|  | // to set the value to false for the previous adapter and once to set the | 
|  | // value to true for the new adapter. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_TRUE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterPoweredPropertyResetOnRemove) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Report that the adapter has been removed; | 
|  | // BluetoothAdapter::Observer::AdapterPoweredChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPoweredChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->AdapterRemoved(adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_FALSE(adapter->IsPowered()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterSetPowered) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Request that the powered property be changed; | 
|  | // MockBluetoothAdapterClient::Set should be called, passing the address | 
|  | // of the powered property and a callback to receive the response. | 
|  | dbus::PropertySet::SetCallback set_callback; | 
|  | EXPECT_CALL(adapter_properties, Set(&adapter_properties.powered, _)) | 
|  | .WillOnce(SaveArg<1>(&set_callback)); | 
|  |  | 
|  | adapter->SetPowered(true, | 
|  | base::Bind(&BluetoothAdapterTest::SetCallback, | 
|  | base::Unretained(this)), | 
|  | base::Bind(&BluetoothAdapterTest::ErrorCallback, | 
|  | base::Unretained(this))); | 
|  |  | 
|  | // Reply to the callback to indicate success, the set callback we provided | 
|  | // should be called but the properties should not be refetched. | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .Times(0); | 
|  |  | 
|  | set_callback.Run(true); | 
|  |  | 
|  | EXPECT_TRUE(set_callback_called_); | 
|  | EXPECT_FALSE(error_callback_called_); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterSetPoweredError) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Request that the powered property be changed; | 
|  | // MockBluetoothAdapterClient::Set should be called, passing the address | 
|  | // of the powered property and a callback to receive the response. | 
|  | dbus::PropertySet::SetCallback set_callback; | 
|  | EXPECT_CALL(adapter_properties, Set(&adapter_properties.powered, _)) | 
|  | .WillOnce(SaveArg<1>(&set_callback)); | 
|  |  | 
|  | adapter->SetPowered(true, | 
|  | base::Bind(&BluetoothAdapterTest::SetCallback, | 
|  | base::Unretained(this)), | 
|  | base::Bind(&BluetoothAdapterTest::ErrorCallback, | 
|  | base::Unretained(this))); | 
|  |  | 
|  | // Reply to the callback to indicate failure, the error callback we provided | 
|  | // should be called but the properties should not be refetched. | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .Times(0); | 
|  |  | 
|  | set_callback.Run(false); | 
|  |  | 
|  | EXPECT_FALSE(set_callback_called_); | 
|  | EXPECT_TRUE(error_callback_called_); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyInitiallyFalse) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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.discovering.ReplaceValue(false); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyInitiallyTrue) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterDiscoveringPropertyInitiallyTrueWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set but BluetoothAdapter::Observer::AdapterDiscoveringChanged | 
|  | // should not yet be called. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  | adapter_properties.discovering.ReplaceValue(true); | 
|  |  | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should not yet have the property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  |  | 
|  | // Tell the adapter the address now, | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged and | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyChanged) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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.discovering.ReplaceValue(false); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  |  | 
|  | // Report that the property has been changed; | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | adapter_properties.discovering.ReplaceValue(true); | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.discovering.name()); | 
|  |  | 
|  | // Adapter should have the new property values. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyUnchanged) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Adapter should have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  |  | 
|  | // Report that the property has been changed, but don't change the value; | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged should not be | 
|  | // called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.discovering.name()); | 
|  |  | 
|  | // Adapter should still have the same property values. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterDiscoveringPropertyChangedWithoutAddress) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set but BluetoothAdapter::Observer::AdapterDiscoveringChanged | 
|  | // should not yet be called. | 
|  | MockBluetoothAdapterClient::Properties adapter_properties; | 
|  |  | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Tell the adapter that its discovering property changed, the observer | 
|  | // method should still not be called because there is no address for | 
|  | // the adapter so it is not present. | 
|  | adapter_properties.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), _)) | 
|  | .Times(0); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.discovering.name()); | 
|  |  | 
|  | // Adapter should not yet have the property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  |  | 
|  | // Tell the adapter the address now, | 
|  | // BluetoothAdapter::Observer::AdapterPresentChanged and | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged now must be called. | 
|  | adapter_properties.address.ReplaceValue(adapter_address); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothAdapterClient::Observer*>(adapter.get()) | 
|  | ->AdapterPropertyChanged(adapter_path, | 
|  | adapter_properties.address.name()); | 
|  |  | 
|  | // Adapter should now have the correct property value. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyResetOnReplace) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "BA:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  | initial_adapter_properties.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, | 
|  | DefaultAdapterDiscoveringPropertyResetOnReplaceWhenTrue) { | 
|  | const dbus::ObjectPath initial_adapter_path("/fake/hci0"); | 
|  | const dbus::ObjectPath new_adapter_path("/fake/hci1"); | 
|  | const std::string initial_adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  | const std::string new_adapter_address = "BA:C0:11:CO:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // Call the adapter callback; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties initial_adapter_properties; | 
|  | initial_adapter_properties.address.ReplaceValue(initial_adapter_address); | 
|  | initial_adapter_properties.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(initial_adapter_path)) | 
|  | .WillRepeatedly(Return(&initial_adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(initial_adapter_path, true); | 
|  |  | 
|  | // Tell the adapter the default adapter changed; | 
|  | // BluetoothAdapterClient::GetProperties will be called once to obtain | 
|  | // the property set. | 
|  | MockBluetoothAdapterClient::Properties new_adapter_properties; | 
|  | new_adapter_properties.address.ReplaceValue(new_adapter_address); | 
|  | new_adapter_properties.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(new_adapter_path)) | 
|  | .WillRepeatedly(Return(&new_adapter_properties)); | 
|  |  | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged will be called once | 
|  | // to set the value to false for the previous adapter and once to set the | 
|  | // value to true for the new adapter. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | { | 
|  | InSequence s; | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), | 
|  | false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), | 
|  | true)) | 
|  | .Times(1); | 
|  | } | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->DefaultAdapterChanged(new_adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_TRUE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | TEST_F(BluetoothAdapterTest, DefaultAdapterDiscoveringPropertyResetOnRemove) { | 
|  | const dbus::ObjectPath adapter_path("/fake/hci0"); | 
|  | const std::string adapter_address = "CA:FE:4A:C0:FE:FE"; | 
|  |  | 
|  | // 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)); | 
|  |  | 
|  | scoped_refptr<BluetoothAdapter> adapter = BluetoothAdapter::DefaultAdapter(); | 
|  |  | 
|  | // 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.discovering.ReplaceValue(true); | 
|  |  | 
|  | EXPECT_CALL(*mock_adapter_client_, GetProperties(adapter_path)) | 
|  | .WillRepeatedly(Return(&adapter_properties)); | 
|  |  | 
|  | adapter_callback.Run(adapter_path, true); | 
|  |  | 
|  | // Report that the adapter has been removed; | 
|  | // BluetoothAdapter::Observer::AdapterDiscoveringChanged will be called. | 
|  | MockBluetoothAdapter::Observer adapter_observer; | 
|  | adapter->AddObserver(&adapter_observer); | 
|  |  | 
|  | EXPECT_CALL(adapter_observer, AdapterPresentChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  | EXPECT_CALL(adapter_observer, AdapterDiscoveringChanged(adapter.get(), false)) | 
|  | .Times(1); | 
|  |  | 
|  | static_cast<BluetoothManagerClient::Observer*>(adapter.get()) | 
|  | ->AdapterRemoved(adapter_path); | 
|  |  | 
|  | // Adapter should have the new property value. | 
|  | EXPECT_FALSE(adapter->IsDiscovering()); | 
|  | } | 
|  |  | 
|  | }  // namespace chromeos |