| // Copyright 2018 The Chromium OS 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 "bluetooth/newblued/stack_sync_monitor.h" |
| |
| #include <memory> |
| |
| #include <base/bind.h> |
| #include <base/memory/ref_counted.h> |
| #include <base/message_loop/message_loop.h> |
| #include <base/run_loop.h> |
| #include <chromeos/dbus/service_constants.h> |
| #include <dbus/mock_bus.h> |
| #include <dbus/mock_object_manager.h> |
| #include <dbus/mock_object_proxy.h> |
| #include <dbus/object_path.h> |
| #include <dbus/property.h> |
| #include <gtest/gtest.h> |
| |
| namespace bluetooth { |
| |
| using ::testing::Return; |
| |
| class StackSyncMonitorTest : public ::testing::Test { |
| public: |
| StackSyncMonitorTest() |
| : stack_sync_quitting_(false), |
| bus_(new dbus::MockBus(dbus::Bus::Options())) { |
| dbus::ObjectPath object_path( |
| bluez_object_manager::kBluezObjectManagerServicePath); |
| EXPECT_CALL(*bus_, GetDBusTaskRunner()) |
| .WillRepeatedly(Return(message_loop_.task_runner().get())); |
| object_proxy_ = new dbus::MockObjectProxy( |
| bus_.get(), bluez_object_manager::kBluezObjectManagerServiceName, |
| object_path); |
| EXPECT_CALL(*bus_, GetObjectProxy( |
| bluez_object_manager::kBluezObjectManagerServiceName, |
| object_path)) |
| .WillRepeatedly(Return(object_proxy_.get())); |
| object_manager_ = new dbus::MockObjectManager( |
| bus_.get(), bluez_object_manager::kBluezObjectManagerServiceName, |
| object_path); |
| EXPECT_CALL(*bus_, GetObjectManager( |
| bluez_object_manager::kBluezObjectManagerServiceName, |
| object_path)) |
| .WillRepeatedly(Return(object_manager_.get())); |
| properties_.reset(monitor_.CreateProperties( |
| object_proxy_.get(), object_path, |
| bluetooth_adapter::kBluetoothAdapterInterface)); |
| } |
| |
| void OnBluezDown() { stack_sync_quitting_ = true; } |
| |
| protected: |
| bool stack_sync_quitting_; |
| scoped_refptr<dbus::MockBus> bus_; |
| scoped_refptr<dbus::MockObjectProxy> object_proxy_; |
| scoped_refptr<dbus::MockObjectManager> object_manager_; |
| std::unique_ptr<dbus::PropertySet> properties_; |
| StackSyncMonitor monitor_; |
| base::MessageLoop message_loop_; |
| }; |
| |
| TEST_F(StackSyncMonitorTest, PowerDown) { |
| monitor_.RegisterBluezDownCallback( |
| bus_.get(), |
| base::Bind(&StackSyncMonitorTest::OnBluezDown, base::Unretained(this))); |
| |
| // BlueZ adapter power on. |
| monitor_.bluez_powered_.ReplaceValue(true); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_FALSE(stack_sync_quitting_); |
| |
| // BlueZ adapter power down, call BluezDownCallback. |
| monitor_.bluez_powered_.ReplaceValue(false); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_TRUE(stack_sync_quitting_); |
| } |
| |
| TEST_F(StackSyncMonitorTest, BluezStackSyncQuitting) { |
| monitor_.RegisterBluezDownCallback( |
| bus_.get(), |
| base::Bind(&StackSyncMonitorTest::OnBluezDown, base::Unretained(this))); |
| |
| // BlueZ adapter power on. |
| monitor_.bluez_powered_.ReplaceValue(true); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| |
| // BlueZ stack sync quitting, refrain from calling BluezDownCallback. |
| monitor_.bluez_stack_sync_quitting_.ReplaceValue(true); |
| properties_->NotifyPropertyChanged( |
| bluetooth_adapter::kStackSyncQuittingProperty); |
| monitor_.bluez_powered_.ReplaceValue(false); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_FALSE(stack_sync_quitting_); |
| } |
| |
| TEST_F(StackSyncMonitorTest, NoCallback) { |
| monitor_.RegisterBluezDownCallback(bus_.get(), base::Closure()); |
| |
| // BlueZ adapter power on. |
| monitor_.bluez_powered_.ReplaceValue(true); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| |
| // BlueZ adapter power down, but no callback is provided. |
| monitor_.bluez_powered_.ReplaceValue(false); |
| properties_->NotifyPropertyChanged(bluetooth_adapter::kPoweredProperty); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_FALSE(stack_sync_quitting_); |
| } |
| |
| } // namespace bluetooth |