//
// 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