普通文本  |  231行  |  9.09 KB

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