blob: 197e0ead80fb8bb12220e041c3f18bfd0a0218c8 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov887f2982011-07-14 16:10:17 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Eric Shienbrood3e20a232012-02-16 11:35:56 -05005#include <base/stl_util.h>
Darin Petkov887f2982011-07-14 16:10:17 -07006#include <gtest/gtest.h>
Ben Chan5c853ef2012-10-05 00:05:37 -07007#include <ModemManager/ModemManager.h>
Darin Petkov887f2982011-07-14 16:10:17 -07008
9#include "shill/manager.h"
David Rochberg7cb06f62012-03-05 11:23:44 -050010#include "shill/mock_dbus_objectmanager_proxy.h"
David Rochbergfa1d31d2012-03-20 10:38:07 -040011#include "shill/mock_modem.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070012#include "shill/mock_modem_info.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070013#include "shill/mock_modem_manager_proxy.h"
Darin Petkove0a312e2011-07-20 13:45:28 -070014#include "shill/modem.h"
Darin Petkov887f2982011-07-14 16:10:17 -070015#include "shill/modem_manager.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070016#include "shill/proxy_factory.h"
Darin Petkov887f2982011-07-14 16:10:17 -070017
Darin Petkovc90fe522011-07-15 13:59:47 -070018using std::string;
David Rochberg7cb06f62012-03-05 11:23:44 -050019using std::tr1::shared_ptr;
Darin Petkov5c97ac52011-07-19 16:30:49 -070020using std::vector;
Darin Petkov887f2982011-07-14 16:10:17 -070021using testing::_;
David Rochberg7cb06f62012-03-05 11:23:44 -050022using testing::Invoke;
David Rochbergb6b6ccb2012-03-16 13:40:36 -040023using testing::Pointee;
Darin Petkov887f2982011-07-14 16:10:17 -070024using testing::Return;
25using testing::StrEq;
26using testing::Test;
27
28namespace shill {
29
David Rochberg7cb06f62012-03-05 11:23:44 -050030// A testing subclass of ModemManager.
31class ModemManagerCore : public ModemManager {
32 public:
33 ModemManagerCore(const string &service,
34 const string &path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070035 ModemInfo * modem_info)
David Rochberg7cb06f62012-03-05 11:23:44 -050036 : ModemManager(service,
37 path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070038 modem_info) {}
David Rochberg7cb06f62012-03-05 11:23:44 -050039
40 virtual ~ModemManagerCore() {}
41
42 MOCK_METHOD1(Connect, void(const string &owner));
43 MOCK_METHOD0(Disconnect, void());
David Rochberg7cb06f62012-03-05 11:23:44 -050044};
45
Darin Petkov887f2982011-07-14 16:10:17 -070046class ModemManagerTest : public Test {
47 public:
48 ModemManagerTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070049 : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL) {}
David Rochbergfa1d31d2012-03-20 10:38:07 -040050
51 virtual void SetUp() {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070052 modem_.reset(new StrictModem(kOwner, kService, kModemPath, &modem_info_));
David Rochbergfa1d31d2012-03-20 10:38:07 -040053 }
Ben Chan62028b22012-11-05 11:20:02 -080054
Darin Petkov887f2982011-07-14 16:10:17 -070055 protected:
56 static const char kService[];
57 static const char kPath[];
Darin Petkov5c97ac52011-07-19 16:30:49 -070058 static const char kOwner[];
59 static const char kModemPath[];
Darin Petkov887f2982011-07-14 16:10:17 -070060
David Rochbergfa1d31d2012-03-20 10:38:07 -040061 shared_ptr<StrictModem> modem_;
62
Darin Petkov887f2982011-07-14 16:10:17 -070063 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070064 MockModemInfo modem_info_;
Darin Petkov887f2982011-07-14 16:10:17 -070065};
66
Darin Petkov5c97ac52011-07-19 16:30:49 -070067const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
68const char ModemManagerTest::kPath[] = "/org/chromium/ModemManager";
69const char ModemManagerTest::kOwner[] = ":1.17";
David Rochberg7cb06f62012-03-05 11:23:44 -050070const char ModemManagerTest::kModemPath[] = "/org/blah/Modem/blah/0";
Darin Petkov887f2982011-07-14 16:10:17 -070071
David Rochberg7cb06f62012-03-05 11:23:44 -050072class ModemManagerCoreTest : public ModemManagerTest {
73 public:
74 ModemManagerCoreTest()
75 : ModemManagerTest(),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070076 modem_manager_(kService, kPath, &modem_info_) {}
Darin Petkovab565bb2011-10-06 02:55:51 -070077
David Rochberg7cb06f62012-03-05 11:23:44 -050078 virtual void TearDown() {
79 modem_manager_.watcher_id_ = 0;
80 }
Darin Petkove0a312e2011-07-20 13:45:28 -070081
David Rochberg7cb06f62012-03-05 11:23:44 -050082 protected:
83 ModemManagerCore modem_manager_;
84};
85
David Rochberg7cb06f62012-03-05 11:23:44 -050086TEST_F(ModemManagerCoreTest, Start) {
Darin Petkov887f2982011-07-14 16:10:17 -070087 const int kWatcher = 123;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070088 EXPECT_CALL(*modem_info_.mock_glib(),
89 BusWatchName(G_BUS_TYPE_SYSTEM,
90 StrEq(kService),
91 G_BUS_NAME_WATCHER_FLAGS_NONE,
92 ModemManager::OnAppear,
93 ModemManager::OnVanish,
94 &modem_manager_,
95 NULL))
Darin Petkov887f2982011-07-14 16:10:17 -070096 .WillOnce(Return(kWatcher));
97 EXPECT_EQ(0, modem_manager_.watcher_id_);
98 modem_manager_.Start();
99 EXPECT_EQ(kWatcher, modem_manager_.watcher_id_);
100}
101
David Rochberg7cb06f62012-03-05 11:23:44 -0500102TEST_F(ModemManagerCoreTest, Stop) {
Darin Petkov887f2982011-07-14 16:10:17 -0700103 const int kWatcher = 345;
Darin Petkov887f2982011-07-14 16:10:17 -0700104 modem_manager_.watcher_id_ = kWatcher;
105 modem_manager_.owner_ = kOwner;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700106 EXPECT_CALL(*modem_info_.mock_glib(), BusUnwatchName(kWatcher)).Times(1);
David Rochberg7cb06f62012-03-05 11:23:44 -0500107 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov887f2982011-07-14 16:10:17 -0700108 modem_manager_.Stop();
Darin Petkov887f2982011-07-14 16:10:17 -0700109}
110
David Rochberg7cb06f62012-03-05 11:23:44 -0500111TEST_F(ModemManagerCoreTest, OnAppearVanish) {
Darin Petkov887f2982011-07-14 16:10:17 -0700112 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500113 EXPECT_CALL(modem_manager_, Connect(kOwner));
114 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov5c97ac52011-07-19 16:30:49 -0700115 ModemManager::OnAppear(NULL, kService, kOwner, &modem_manager_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500116 ModemManager::OnVanish(NULL, kService, &modem_manager_);
117}
118
119TEST_F(ModemManagerCoreTest, Connect) {
120 EXPECT_EQ("", modem_manager_.owner_);
121 modem_manager_.ModemManager::Connect(kOwner);
Darin Petkov887f2982011-07-14 16:10:17 -0700122 EXPECT_EQ(kOwner, modem_manager_.owner_);
123}
124
David Rochberg7cb06f62012-03-05 11:23:44 -0500125TEST_F(ModemManagerCoreTest, Disconnect) {
Darin Petkov887f2982011-07-14 16:10:17 -0700126 modem_manager_.owner_ = kOwner;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400127 modem_manager_.RecordAddedModem(modem_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500128 EXPECT_EQ(1, modem_manager_.modems_.size());
129
130 modem_manager_.ModemManager::Disconnect();
Darin Petkov887f2982011-07-14 16:10:17 -0700131 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500132 EXPECT_EQ(0, modem_manager_.modems_.size());
Darin Petkov887f2982011-07-14 16:10:17 -0700133}
134
David Rochbergfa1d31d2012-03-20 10:38:07 -0400135TEST_F(ModemManagerCoreTest, ModemExists) {
Darin Petkov5c97ac52011-07-19 16:30:49 -0700136 modem_manager_.owner_ = kOwner;
David Rochberg7cb06f62012-03-05 11:23:44 -0500137
David Rochbergfa1d31d2012-03-20 10:38:07 -0400138 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
139 modem_manager_.RecordAddedModem(modem_);
140 EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
Darin Petkov5c97ac52011-07-19 16:30:49 -0700141}
142
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400143class ModemManagerClassicMockInit : public ModemManagerClassic {
144 public:
145 ModemManagerClassicMockInit(const string &service,
146 const string &path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700147 ModemInfo *modem_info_) :
148 ModemManagerClassic(service, path, modem_info_) {}
149
David Rochbergfa1d31d2012-03-20 10:38:07 -0400150 MOCK_METHOD1(InitModemClassic, void(shared_ptr<ModemClassic>));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400151};
David Rochberg7cb06f62012-03-05 11:23:44 -0500152
153class ModemManagerClassicTest : public ModemManagerTest {
154 public:
155 ModemManagerClassicTest()
156 : ModemManagerTest(),
157 modem_manager_(kService,
158 kPath,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700159 &modem_info_),
David Rochberg7cb06f62012-03-05 11:23:44 -0500160 proxy_(new MockModemManagerProxy()),
161 proxy_factory_(this) {
162 }
163
164 protected:
165 class TestProxyFactory : public ProxyFactory {
166 public:
167 explicit TestProxyFactory(ModemManagerClassicTest *test) : test_(test) {}
168
169 virtual ModemManagerProxyInterface *CreateModemManagerProxy(
170 ModemManagerClassic */*manager*/,
171 const string &/*path*/,
172 const string &/*service*/) {
173 return test_->proxy_.release();
174 }
175
176 private:
177 ModemManagerClassicTest *test_;
178 };
179
180 virtual void SetUp() {
181 modem_manager_.proxy_factory_ = &proxy_factory_;
182 }
183
184 virtual void TearDown() {
185 modem_manager_.proxy_factory_ = NULL;
186 }
187
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400188 ModemManagerClassicMockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500189 scoped_ptr<MockModemManagerProxy> proxy_;
190 TestProxyFactory proxy_factory_;
191};
192
193TEST_F(ModemManagerClassicTest, Connect) {
194 EXPECT_EQ("", modem_manager_.owner_);
195
196 EXPECT_CALL(*proxy_, EnumerateDevices())
197 .WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
198
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400199 EXPECT_CALL(modem_manager_,
David Rochbergfa1d31d2012-03-20 10:38:07 -0400200 InitModemClassic(
201 Pointee(Field(&Modem::path_, StrEq(kModemPath)))));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400202
David Rochberg7cb06f62012-03-05 11:23:44 -0500203 modem_manager_.Connect(kOwner);
204 EXPECT_EQ(kOwner, modem_manager_.owner_);
205 EXPECT_EQ(1, modem_manager_.modems_.size());
206 ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
207}
208
209
David Rochbergfa1d31d2012-03-20 10:38:07 -0400210class ModemManager1MockInit : public ModemManager1 {
211 public:
212 ModemManager1MockInit(const string &service,
213 const string &path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700214 ModemInfo *modem_info_) :
215 ModemManager1(service, path, modem_info_) {}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400216 MOCK_METHOD2(InitModem1, void(shared_ptr<Modem1>,
217 const DBusInterfaceToProperties &));
218};
219
220
David Rochberg7cb06f62012-03-05 11:23:44 -0500221class ModemManager1Test : public ModemManagerTest {
222 public:
223 ModemManager1Test()
224 : ModemManagerTest(),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700225 modem_manager_(kService, kPath, &modem_info_),
David Rochberg7cb06f62012-03-05 11:23:44 -0500226 proxy_(new MockDBusObjectManagerProxy()),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700227 proxy_factory_(this) {}
David Rochberg7cb06f62012-03-05 11:23:44 -0500228
229 protected:
230 class TestProxyFactory : public ProxyFactory {
231 public:
232 explicit TestProxyFactory(ModemManager1Test *test) : test_(test) {}
233
234 virtual DBusObjectManagerProxyInterface *CreateDBusObjectManagerProxy(
David Rochberg7cb06f62012-03-05 11:23:44 -0500235 const string &/*path*/,
236 const string &/*service*/) {
237 return test_->proxy_.release();
238 }
239
240 private:
241 ModemManager1Test *test_;
242 };
243
244 virtual void SetUp() {
245 modem_manager_.proxy_factory_ = &proxy_factory_;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400246 proxy_->IgnoreSetCallbacks();
David Rochberg7cb06f62012-03-05 11:23:44 -0500247 }
248
249 virtual void TearDown() {
250 modem_manager_.proxy_factory_ = NULL;
251 }
252
253 static DBusObjectsWithProperties GetModemWithProperties() {
254 DBusPropertiesMap o_fd_mm1_modem;
255
Ben Chan876efd32012-09-28 15:25:13 -0700256 DBusInterfaceToProperties properties;
257 properties[MM_DBUS_INTERFACE_MODEM] = o_fd_mm1_modem;
David Rochberg7cb06f62012-03-05 11:23:44 -0500258
259 DBusObjectsWithProperties objects_with_properties;
Ben Chan876efd32012-09-28 15:25:13 -0700260 objects_with_properties[kModemPath] = properties;
David Rochberg7cb06f62012-03-05 11:23:44 -0500261
262 return objects_with_properties;
263 }
264
David Rochbergfa1d31d2012-03-20 10:38:07 -0400265 ModemManager1MockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500266 scoped_ptr<MockDBusObjectManagerProxy> proxy_;
267 TestProxyFactory proxy_factory_;
268};
269
270TEST_F(ModemManager1Test, Connect) {
271 Error e;
272
Eric Shienbrood9a245532012-03-07 14:20:39 -0500273 EXPECT_CALL(*proxy_, GetManagedObjects(_, _, _));
David Rochbergfa1d31d2012-03-20 10:38:07 -0400274 EXPECT_CALL(modem_manager_,
275 InitModem1(
276 Pointee(Field(&Modem::path_, StrEq(kModemPath))),
277 _));
David Rochberg7cb06f62012-03-05 11:23:44 -0500278
279 modem_manager_.Connect(kOwner);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500280 modem_manager_.OnGetManagedObjectsReply(GetModemWithProperties(), e);
David Rochberg7cb06f62012-03-05 11:23:44 -0500281 EXPECT_EQ(1, modem_manager_.modems_.size());
282 EXPECT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
David Rochberg7cb06f62012-03-05 11:23:44 -0500283}
284
David Rochbergfa1d31d2012-03-20 10:38:07 -0400285
David Rochberg7cb06f62012-03-05 11:23:44 -0500286TEST_F(ModemManager1Test, AddRemoveInterfaces) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500287 EXPECT_CALL(*proxy_, GetManagedObjects(_, _, _));
David Rochberg7cb06f62012-03-05 11:23:44 -0500288 modem_manager_.Connect(kOwner);
289
290 // Have nothing come back from GetManagedObjects
Eric Shienbrood9a245532012-03-07 14:20:39 -0500291 modem_manager_.OnGetManagedObjectsReply(DBusObjectsWithProperties(), Error());
David Rochberg7cb06f62012-03-05 11:23:44 -0500292 EXPECT_EQ(0, modem_manager_.modems_.size());
293
294 // Add an object that doesn't have a modem interface. Nothing should be added
David Rochbergfa1d31d2012-03-20 10:38:07 -0400295 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(0);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500296 modem_manager_.OnInterfacesAddedSignal(kModemPath,
297 DBusInterfaceToProperties());
David Rochberg7cb06f62012-03-05 11:23:44 -0500298 EXPECT_EQ(0, modem_manager_.modems_.size());
299
300 // Actually add a modem
David Rochbergfa1d31d2012-03-20 10:38:07 -0400301 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(1);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500302 modem_manager_.OnInterfacesAddedSignal(kModemPath,
303 GetModemWithProperties()[kModemPath]);
David Rochberg7cb06f62012-03-05 11:23:44 -0500304 EXPECT_EQ(1, modem_manager_.modems_.size());
305
306 // Remove an irrelevant interface
307 vector<string> not_including_modem_interface;
308 not_including_modem_interface.push_back("not.a.modem.interface");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500309 modem_manager_.OnInterfacesRemovedSignal(kModemPath,
310 not_including_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500311 EXPECT_EQ(1, modem_manager_.modems_.size());
312
313 // Remove the modem
314 vector<string> with_modem_interface;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400315 with_modem_interface.push_back(MM_DBUS_INTERFACE_MODEM);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500316 modem_manager_.OnInterfacesRemovedSignal(kModemPath,
317 with_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500318 EXPECT_EQ(0, modem_manager_.modems_.size());
319}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400320
Darin Petkov887f2982011-07-14 16:10:17 -0700321} // namespace shill