Home | History | Annotate | Download | only in dbus
      1 //
      2 // Copyright (C) 2016 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/dbus/chromeos_manager_dbus_adaptor.h"
     18 
     19 #include <memory>
     20 
     21 #include <brillo/errors/error.h>
     22 #include <dbus/bus.h>
     23 #include <dbus/message.h>
     24 #include <dbus/mock_bus.h>
     25 #include <gmock/gmock.h>
     26 #include <gtest/gtest.h>
     27 
     28 #include "shill/dbus/mock_dbus_service_watcher.h"
     29 #include "shill/dbus/mock_dbus_service_watcher_factory.h"
     30 #include "shill/error.h"
     31 #include "shill/mock_control.h"
     32 #include "shill/mock_event_dispatcher.h"
     33 #include "shill/mock_manager.h"
     34 #include "shill/mock_metrics.h"
     35 
     36 using dbus::MockBus;
     37 using dbus::Response;
     38 using std::string;
     39 using testing::_;
     40 using testing::DoAll;
     41 using testing::Invoke;
     42 using testing::Return;
     43 using testing::SetArgPointee;
     44 using testing::Test;
     45 using testing::WithArg;
     46 
     47 namespace shill {
     48 
     49 class ChromeosManagerDBusAdaptorTest : public Test {
     50  public:
     51   ChromeosManagerDBusAdaptorTest()
     52       : adaptor_bus_(new MockBus(dbus::Bus::Options())),
     53         proxy_bus_(new MockBus(dbus::Bus::Options())),
     54         metrics_(&dispatcher_),
     55         manager_(&control_interface_, &dispatcher_, &metrics_),
     56         manager_adaptor_(adaptor_bus_, proxy_bus_, &manager_) {}
     57 
     58   virtual ~ChromeosManagerDBusAdaptorTest() {}
     59 
     60   virtual void SetUp() {
     61     manager_adaptor_.dbus_service_watcher_factory_ =
     62         &dbus_service_watcher_factory_;
     63   }
     64 
     65   virtual void TearDown() {}
     66 
     67  protected:
     68   scoped_refptr<MockBus> adaptor_bus_;
     69   scoped_refptr<MockBus> proxy_bus_;
     70   MockControl control_interface_;
     71   MockEventDispatcher dispatcher_;
     72   MockMetrics metrics_;
     73   MockManager manager_;
     74   MockDBusServiceWatcherFactory dbus_service_watcher_factory_;
     75   ChromeosManagerDBusAdaptor manager_adaptor_;
     76 };
     77 
     78 void SetErrorTypeSuccess(Error* error) { error->Populate(Error::kSuccess); }
     79 
     80 void SetErrorTypeFailure(Error* error) {
     81   error->Populate(Error::kOperationFailed);
     82 }
     83 
     84 TEST_F(ChromeosManagerDBusAdaptorTest, ClaimInterface) {
     85   brillo::ErrorPtr error;
     86   string kDefaultClaimerName = "";
     87   string kNonDefaultClaimerName = "test_claimer";
     88   string kInterfaceName = "test_interface";
     89   scoped_ptr<Response> message(Response::CreateEmpty());
     90 
     91   // Watcher for device claimer is not created when we fail to claim the device.
     92   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
     93   EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _))
     94       .WillOnce(WithArg<2>(Invoke(SetErrorTypeFailure)));
     95   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
     96       .Times(0);
     97   manager_adaptor_.ClaimInterface(&error, message.get(), kNonDefaultClaimerName,
     98                                   kInterfaceName);
     99   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    100 
    101   // Watcher for device claimer is not created when we succeed in claiming the
    102   // device from the default claimer.
    103   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    104   EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _))
    105       .WillOnce(WithArg<2>(Invoke(SetErrorTypeSuccess)));
    106   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
    107       .Times(0);
    108   manager_adaptor_.ClaimInterface(&error, message.get(), kDefaultClaimerName,
    109                                   kInterfaceName);
    110   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    111 
    112   // Watcher for device claimer is created when we succeed in claiming the
    113   // device from a non-default claimer.
    114   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    115   EXPECT_CALL(manager_, ClaimDevice(_, kInterfaceName, _))
    116       .WillOnce(WithArg<2>(Invoke(SetErrorTypeSuccess)));
    117   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
    118       .WillOnce(Return(new MockDBusServiceWatcher()));
    119   manager_adaptor_.ClaimInterface(&error, message.get(), kNonDefaultClaimerName,
    120                                   kInterfaceName);
    121   EXPECT_NE(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    122 }
    123 
    124 TEST_F(ChromeosManagerDBusAdaptorTest, ReleaseInterface) {
    125   brillo::ErrorPtr error;
    126   string kClaimerName = "test_claimer";
    127   string kInterfaceName = "test_interface";
    128   scoped_ptr<Response> message(Response::CreateEmpty());
    129 
    130   // Setup watcher for device claimer.
    131   manager_adaptor_.watcher_for_device_claimer_.reset(
    132       new MockDBusServiceWatcher());
    133 
    134   // If the device claimer is not removed, do not reset the watcher for device
    135   // claimer.
    136   EXPECT_CALL(manager_, ReleaseDevice(_, kInterfaceName, _, _))
    137       .WillOnce(SetArgPointee<2>(false));
    138   manager_adaptor_.ReleaseInterface(&error, message.get(), kClaimerName,
    139                                   kInterfaceName);
    140   EXPECT_NE(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    141 
    142   // If the device claimer is removed, reset the watcher for device claimer.
    143   EXPECT_CALL(manager_, ReleaseDevice(_, kInterfaceName, _, _))
    144       .WillOnce(SetArgPointee<2>(true));
    145   manager_adaptor_.ReleaseInterface(&error, message.get(), kClaimerName,
    146                                     kInterfaceName);
    147   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    148 }
    149 
    150 TEST_F(ChromeosManagerDBusAdaptorTest, SetupApModeInterface) {
    151   brillo::ErrorPtr error;
    152   string out_interface_name;
    153   scoped_ptr<Response> message(Response::CreateEmpty());
    154 
    155 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
    156   // Watcher for AP mode setter is not created when we fail to setup AP mode
    157   // interface.
    158   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    159   EXPECT_CALL(manager_, SetupApModeInterface(&out_interface_name, _))
    160       .WillOnce(DoAll(WithArg<1>(Invoke(SetErrorTypeFailure)), Return(false)));
    161   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
    162       .Times(0);
    163   EXPECT_FALSE(manager_adaptor_.SetupApModeInterface(&error, message.get(),
    164                                                      &out_interface_name));
    165   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    166 
    167   // Watcher for AP mode setter is created when we succeed in AP mode
    168   // interface setup.
    169   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    170   EXPECT_CALL(manager_, SetupApModeInterface(&out_interface_name, _))
    171       .WillOnce(DoAll(WithArg<1>(Invoke(SetErrorTypeSuccess)), Return(true)));
    172   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
    173       .WillOnce(Return(new MockDBusServiceWatcher()));
    174   EXPECT_TRUE(manager_adaptor_.SetupApModeInterface(&error, message.get(),
    175                                                     &out_interface_name));
    176   EXPECT_NE(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    177 #else
    178   EXPECT_CALL(dbus_service_watcher_factory_, CreateDBusServiceWatcher(_, _, _))
    179       .Times(0);
    180   EXPECT_FALSE(manager_adaptor_.SetupApModeInterface(&error, message.get(),
    181                                                      &out_interface_name));
    182 #endif  // !DISABLE_WIFI && __BRILLO__
    183 }
    184 
    185 TEST_F(ChromeosManagerDBusAdaptorTest, SetupStationModeInterface) {
    186   brillo::ErrorPtr error;
    187   string out_interface_name;
    188 
    189 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
    190   // Setup watcher for AP mode setter.
    191   manager_adaptor_.watcher_for_ap_mode_setter_.reset(
    192       new MockDBusServiceWatcher());
    193 
    194   // Reset watcher for AP mode setter after setting up station mode interface.
    195   EXPECT_CALL(manager_, SetupStationModeInterface(&out_interface_name, _))
    196       .WillOnce(Return(true));
    197   EXPECT_TRUE(
    198       manager_adaptor_.SetupStationModeInterface(&error, &out_interface_name));
    199   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    200 #else
    201   EXPECT_FALSE(
    202       manager_adaptor_.SetupStationModeInterface(&error, &out_interface_name));
    203 #endif  // !DISABLE_WIFI && __BRILLO__
    204 }
    205 
    206 TEST_F(ChromeosManagerDBusAdaptorTest, OnApModeSetterVanished) {
    207   // Setup watcher for AP mode setter.
    208   manager_adaptor_.watcher_for_ap_mode_setter_.reset(
    209       new MockDBusServiceWatcher());
    210 
    211   // Reset watcher for AP mode setter after AP mode setter vanishes.
    212 #if !defined(DISABLE_WIFI) && defined(__BRILLO__)
    213   EXPECT_CALL(manager_, OnApModeSetterVanished());
    214 #endif  // !DISABLE_WIFI && __BRILLO__
    215   manager_adaptor_.OnApModeSetterVanished();
    216   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_ap_mode_setter_.get());
    217 }
    218 
    219 TEST_F(ChromeosManagerDBusAdaptorTest, OnDeviceClaimerVanished) {
    220   // Setup watcher for device claimer.
    221   manager_adaptor_.watcher_for_device_claimer_.reset(
    222       new MockDBusServiceWatcher());
    223 
    224   // Reset watcher for device claimer after the device claimer vanishes.
    225   EXPECT_CALL(manager_, OnDeviceClaimerVanished());
    226   manager_adaptor_.OnDeviceClaimerVanished();
    227   EXPECT_EQ(nullptr, manager_adaptor_.watcher_for_device_claimer_.get());
    228 }
    229 
    230 }  // namespace shill
    231