| // |
| // Copyright (C) 2016 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #include "shill/dbus/chromeos_manager_dbus_adaptor.h" |
| |
| #include <memory> |
| |
| #include <brillo/errors/error.h> |
| #include <dbus/bus.h> |
| #include <dbus/message.h> |
| #include <dbus/mock_bus.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "shill/dbus/mock_dbus_service_watcher.h" |
| #include "shill/dbus/mock_dbus_service_watcher_factory.h" |
| #include "shill/error.h" |
| #include "shill/mock_control.h" |
| #include "shill/mock_event_dispatcher.h" |
| #include "shill/mock_manager.h" |
| #include "shill/mock_metrics.h" |
| |
| using dbus::MockBus; |
| using dbus::Response; |
| using std::string; |
| using testing::_; |
| using testing::DoAll; |
| using testing::Invoke; |
| using testing::Return; |
| using testing::SetArgPointee; |
| using testing::Test; |
| using testing::WithArg; |
| |
| namespace shill { |
| |
| class ChromeosManagerDBusAdaptorTest : public Test { |
| public: |
| ChromeosManagerDBusAdaptorTest() |
| : adaptor_bus_(new MockBus(dbus::Bus::Options())), |
| proxy_bus_(new MockBus(dbus::Bus::Options())), |
| metrics_(&dispatcher_), |
| manager_(&control_interface_, &dispatcher_, &metrics_), |
| manager_adaptor_(adaptor_bus_, proxy_bus_, &manager_) {} |
| |
| virtual ~ChromeosManagerDBusAdaptorTest() {} |
| |
| virtual void SetUp() { |
| manager_adaptor_.dbus_service_watcher_factory_ = |
| &dbus_service_watcher_factory_; |
| } |
| |
| virtual void TearDown() {} |
| |
| protected: |
| scoped_refptr<MockBus> adaptor_bus_; |
| scoped_refptr<MockBus> proxy_bus_; |
| MockControl control_interface_; |
| MockEventDispatcher dispatcher_; |
| MockMetrics metrics_; |
| MockManager manager_; |
| MockDBusServiceWatcherFactory dbus_service_watcher_factory_; |
| ChromeosManagerDBusAdaptor manager_adaptor_; |
| }; |
| |
| void SetErrorTypeSuccess(Error* error) { error->Populate(Error::kSuccess); } |
| |
| void SetErrorTypeFailure(Error* error) { |
| error->Populate(Error::kOperationFailed); |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, ClaimInterface) { |
| brillo::ErrorPtr error; |
| string kDefaultClaimerName = ""; |
| string kNonDefaultClaimerName = "test_claimer"; |
| string kInterfaceName = "test_interface"; |
| scoped_ptr<Response> message(Response::CreateEmpty()); |
| |
| // Watcher for device claimer is not created when we fail to claim the device. |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _)) |
| .WillOnce(WithArg<2>(Invoke(SetErrorTypeFailure))); |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .Times(0); |
| manager_adaptor_.ClaimInterface(&error, message.get(), kNonDefaultClaimerName, |
| kInterfaceName); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| |
| // Watcher for device claimer is not created when we succeed in claiming the |
| // device from the default claimer. |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _)) |
| .WillOnce(WithArg<2>(Invoke(SetErrorTypeSuccess))); |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .Times(0); |
| manager_adaptor_.ClaimInterface(&error, message.get(), kDefaultClaimerName, |
| kInterfaceName); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| |
| // Watcher for device claimer is created when we succeed in claiming the |
| // device from a non-default claimer. |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _)) |
| .WillOnce(WithArg<2>(Invoke(SetErrorTypeSuccess))); |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .WillOnce(Return(new MockDBusServiceWatcher())); |
| manager_adaptor_.ClaimInterface(&error, message.get(), kNonDefaultClaimerName, |
| kInterfaceName); |
| EXPECT_NE(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, ReleaseInterface) { |
| brillo::ErrorPtr error; |
| string kClaimerName = "test_claimer"; |
| string kInterfaceName = "test_interface"; |
| scoped_ptr<Response> message(Response::CreateEmpty()); |
| |
| // Setup watcher for device claimer. |
| manager_adaptor_.watcher_for_device_claimer_.reset( |
| new MockDBusServiceWatcher()); |
| |
| // If the device claimer is not removed, do not reset the watcher for device |
| // claimer. |
| EXPECT_CALL(manager_, ReleaseDevice(_, kInterfaceName, _, _)) |
| .WillOnce(SetArgPointee<2>(false)); |
| manager_adaptor_.ReleaseInterface(&error, message.get(), kClaimerName, |
| kInterfaceName); |
| EXPECT_NE(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| |
| // If the device claimer is removed, reset the watcher for device claimer. |
| EXPECT_CALL(manager_, ReleaseDevice(_, kInterfaceName, _, _)) |
| .WillOnce(SetArgPointee<2>(true)); |
| manager_adaptor_.ReleaseInterface(&error, message.get(), kClaimerName, |
| kInterfaceName); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, SetupApModeInterface) { |
| brillo::ErrorPtr error; |
| string out_interface_name; |
| scoped_ptr<Response> message(Response::CreateEmpty()); |
| |
| #if !defined(DISABLE_WIFI) && defined(__BRILLO__) |
| // Watcher for AP mode setter is not created when we fail to setup AP mode |
| // interface. |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| EXPECT_CALL(manager_, SetupApModeInterface(&out_interface_name, _)) |
| .WillOnce(DoAll(WithArg<1>(Invoke(SetErrorTypeFailure)), Return(false))); |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .Times(0); |
| EXPECT_FALSE(manager_adaptor_.SetupApModeInterface(&error, message.get(), |
| &out_interface_name)); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| |
| // Watcher for AP mode setter is created when we succeed in AP mode |
| // interface setup. |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| EXPECT_CALL(manager_, SetupApModeInterface(&out_interface_name, _)) |
| .WillOnce(DoAll(WithArg<1>(Invoke(SetErrorTypeSuccess)), Return(true))); |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .WillOnce(Return(new MockDBusServiceWatcher())); |
| EXPECT_TRUE(manager_adaptor_.SetupApModeInterface(&error, message.get(), |
| &out_interface_name)); |
| EXPECT_NE(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| #else |
| EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _)) |
| .Times(0); |
| EXPECT_FALSE(manager_adaptor_.SetupApModeInterface(&error, message.get(), |
| &out_interface_name)); |
| #endif // !DISABLE_WIFI && __BRILLO__ |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, SetupStationModeInterface) { |
| brillo::ErrorPtr error; |
| string out_interface_name; |
| |
| #if !defined(DISABLE_WIFI) && defined(__BRILLO__) |
| // Setup watcher for AP mode setter. |
| manager_adaptor_.watcher_for_ap_mode_setter_.reset( |
| new MockDBusServiceWatcher()); |
| |
| // Reset watcher for AP mode setter after setting up station mode interface. |
| EXPECT_CALL(manager_, SetupStationModeInterface(&out_interface_name, _)) |
| .WillOnce(Return(true)); |
| EXPECT_TRUE( |
| manager_adaptor_.SetupStationModeInterface(&error, &out_interface_name)); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| #else |
| EXPECT_FALSE( |
| manager_adaptor_.SetupStationModeInterface(&error, &out_interface_name)); |
| #endif // !DISABLE_WIFI && __BRILLO__ |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, OnApModeSetterVanished) { |
| // Setup watcher for AP mode setter. |
| manager_adaptor_.watcher_for_ap_mode_setter_.reset( |
| new MockDBusServiceWatcher()); |
| |
| // Reset watcher for AP mode setter after AP mode setter vanishes. |
| #if !defined(DISABLE_WIFI) && defined(__BRILLO__) |
| EXPECT_CALL(manager_, OnApModeSetterVanished()); |
| #endif // !DISABLE_WIFI && __BRILLO__ |
| manager_adaptor_.OnApModeSetterVanished(); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get()); |
| } |
| |
| TEST_F(ChromeosManagerDBusAdaptorTest, OnDeviceClaimerVanished) { |
| // Setup watcher for device claimer. |
| manager_adaptor_.watcher_for_device_claimer_.reset( |
| new MockDBusServiceWatcher()); |
| |
| // Reset watcher for device claimer after the device claimer vanishes. |
| EXPECT_CALL(manager_, OnDeviceClaimerVanished()); |
| manager_adaptor_.OnDeviceClaimerVanished(); |
| EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get()); |
| } |
| |
| } // namespace shill |