blob: c2362cfb4c6e0f2712a03f5b81654d1b52b9a020 [file] [log] [blame]
// Copyright (c) 2012 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 <base/stl_util-inl.h>
#include <gtest/gtest.h>
#include <mm/mm-modem.h>
#include "shill/manager.h"
#include "shill/mock_control.h"
#include "shill/mock_glib.h"
#include "shill/mock_manager.h"
#include "shill/mock_metrics.h"
#include "shill/mock_modem_manager_proxy.h"
#include "shill/modem.h"
#include "shill/modem_manager.h"
#include "shill/proxy_factory.h"
using std::string;
using std::vector;
using testing::_;
using testing::Return;
using testing::StrEq;
using testing::Test;
namespace shill {
class ModemManagerTest : public Test {
public:
ModemManagerTest()
: manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
modem_manager_(kService,
kPath,
&control_interface_,
&dispatcher_,
&metrics_,
&manager_,
&glib_,
NULL),
proxy_(new MockModemManagerProxy()),
proxy_factory_(this) {
}
virtual void SetUp();
virtual void TearDown();
protected:
class TestProxyFactory : public ProxyFactory {
public:
explicit TestProxyFactory(ModemManagerTest *test) : test_(test) {}
virtual ModemManagerProxyInterface *CreateModemManagerProxy(
ModemManager */*manager*/,
const string &/*path*/,
const string &/*service*/) {
return test_->proxy_.release();
}
private:
ModemManagerTest *test_;
};
static const char kService[];
static const char kPath[];
static const char kOwner[];
static const char kModemPath[];
MockGLib glib_;
MockControl control_interface_;
EventDispatcher dispatcher_;
MockMetrics metrics_;
MockManager manager_;
ModemManager modem_manager_;
scoped_ptr<MockModemManagerProxy> proxy_;
TestProxyFactory proxy_factory_;
};
const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
const char ModemManagerTest::kPath[] = "/org/chromium/ModemManager";
const char ModemManagerTest::kOwner[] = ":1.17";
const char ModemManagerTest::kModemPath[] = "/org/chromium/ModemManager/Gobi/0";
void ModemManagerTest::SetUp() {
modem_manager_.proxy_factory_ = &proxy_factory_;
}
void ModemManagerTest::TearDown() {
modem_manager_.watcher_id_ = 0;
modem_manager_.proxy_factory_ = NULL;
}
TEST_F(ModemManagerTest, Start) {
const int kWatcher = 123;
EXPECT_CALL(glib_, BusWatchName(G_BUS_TYPE_SYSTEM,
StrEq(kService),
G_BUS_NAME_WATCHER_FLAGS_NONE,
ModemManager::OnAppear,
ModemManager::OnVanish,
&modem_manager_,
NULL))
.WillOnce(Return(kWatcher));
EXPECT_EQ(0, modem_manager_.watcher_id_);
modem_manager_.Start();
EXPECT_EQ(kWatcher, modem_manager_.watcher_id_);
}
TEST_F(ModemManagerTest, Stop) {
const int kWatcher = 345;
modem_manager_.watcher_id_ = kWatcher;
modem_manager_.owner_ = kOwner;
EXPECT_CALL(glib_, BusUnwatchName(kWatcher)).Times(1);
modem_manager_.Stop();
EXPECT_EQ(0, modem_manager_.watcher_id_);
EXPECT_EQ("", modem_manager_.owner_);
}
TEST_F(ModemManagerTest, Connect) {
EXPECT_EQ("", modem_manager_.owner_);
EXPECT_CALL(*proxy_, EnumerateDevices())
.WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
modem_manager_.Connect(kOwner);
EXPECT_EQ(kOwner, modem_manager_.owner_);
EXPECT_EQ(1, modem_manager_.modems_.size());
ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
EXPECT_FALSE(modem_manager_.modems_[kModemPath]->task_factory_.empty());
}
TEST_F(ModemManagerTest, Disconnect) {
modem_manager_.owner_ = kOwner;
modem_manager_.Disconnect();
EXPECT_EQ("", modem_manager_.owner_);
}
TEST_F(ModemManagerTest, OnAppear) {
EXPECT_EQ("", modem_manager_.owner_);
EXPECT_CALL(*proxy_, EnumerateDevices())
.WillOnce(Return(vector<DBus::Path>()));
ModemManager::OnAppear(NULL, kService, kOwner, &modem_manager_);
EXPECT_EQ(kOwner, modem_manager_.owner_);
}
TEST_F(ModemManagerTest, OnVanish) {
modem_manager_.owner_ = kOwner;
ModemManager::OnVanish(NULL, kService, &modem_manager_);
EXPECT_EQ("", modem_manager_.owner_);
}
TEST_F(ModemManagerTest, AddRemoveModem) {
modem_manager_.owner_ = kOwner;
modem_manager_.AddModem(kModemPath);
EXPECT_EQ(1, modem_manager_.modems_.size());
ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
EXPECT_FALSE(modem_manager_.modems_[kModemPath]->task_factory_.empty());
modem_manager_.RemoveModem(kModemPath);
EXPECT_EQ(0, modem_manager_.modems_.size());
}
} // namespace shill