blob: 2014b13cdd82a12dcb3be11777c9b769aadb8b93 [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"
10#include "shill/mock_control.h"
David Rochberg7cb06f62012-03-05 11:23:44 -050011#include "shill/mock_dbus_objectmanager_proxy.h"
Darin Petkov887f2982011-07-14 16:10:17 -070012#include "shill/mock_glib.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070013#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080014#include "shill/mock_metrics.h"
David Rochbergfa1d31d2012-03-20 10:38:07 -040015#include "shill/mock_modem.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070016#include "shill/mock_modem_manager_proxy.h"
Darin Petkove0a312e2011-07-20 13:45:28 -070017#include "shill/modem.h"
Darin Petkov887f2982011-07-14 16:10:17 -070018#include "shill/modem_manager.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070019#include "shill/proxy_factory.h"
Darin Petkov887f2982011-07-14 16:10:17 -070020
Darin Petkovc90fe522011-07-15 13:59:47 -070021using std::string;
David Rochberg7cb06f62012-03-05 11:23:44 -050022using std::tr1::shared_ptr;
Darin Petkov5c97ac52011-07-19 16:30:49 -070023using std::vector;
Darin Petkov887f2982011-07-14 16:10:17 -070024using testing::_;
David Rochberg7cb06f62012-03-05 11:23:44 -050025using testing::Invoke;
David Rochbergb6b6ccb2012-03-16 13:40:36 -040026using testing::Pointee;
Darin Petkov887f2982011-07-14 16:10:17 -070027using testing::Return;
28using testing::StrEq;
29using testing::Test;
30
31namespace shill {
32
David Rochberg7cb06f62012-03-05 11:23:44 -050033// A testing subclass of ModemManager.
34class ModemManagerCore : public ModemManager {
35 public:
36 ModemManagerCore(const string &service,
37 const string &path,
38 ControlInterface *control_interface,
39 EventDispatcher *dispatcher,
40 Metrics *metrics,
41 Manager *manager,
42 GLib *glib,
Ben Chan62028b22012-11-05 11:20:02 -080043 CellularOperatorInfo *cellular_operator_info,
David Rochberg7cb06f62012-03-05 11:23:44 -050044 mobile_provider_db *provider_db)
45 : ModemManager(service,
46 path,
47 control_interface,
48 dispatcher,
49 metrics,
50 manager,
51 glib,
Ben Chan62028b22012-11-05 11:20:02 -080052 cellular_operator_info,
David Rochberg7cb06f62012-03-05 11:23:44 -050053 provider_db) {}
54
55 virtual ~ModemManagerCore() {}
56
57 MOCK_METHOD1(Connect, void(const string &owner));
58 MOCK_METHOD0(Disconnect, void());
David Rochberg7cb06f62012-03-05 11:23:44 -050059};
60
Darin Petkov887f2982011-07-14 16:10:17 -070061class ModemManagerTest : public Test {
62 public:
63 ModemManagerTest()
Thieu Le6c1e3bb2013-02-06 15:20:35 -080064 : metrics_(&dispatcher_),
65 manager_(&control_interface_, &dispatcher_, &metrics_, &glib_) {
Darin Petkovc90fe522011-07-15 13:59:47 -070066 }
David Rochbergfa1d31d2012-03-20 10:38:07 -040067
68 virtual void SetUp() {
69 modem_.reset(new StrictModem(
Jason Glasgowa585fc32012-06-06 11:04:09 -040070 kOwner, kService, kModemPath, &control_interface_, &dispatcher_,
Ben Chan62028b22012-11-05 11:20:02 -080071 &metrics_, &manager_, static_cast<CellularOperatorInfo *>(NULL),
72 static_cast<mobile_provider_db *>(NULL)));
David Rochbergfa1d31d2012-03-20 10:38:07 -040073 }
Ben Chan62028b22012-11-05 11:20:02 -080074
Darin Petkov887f2982011-07-14 16:10:17 -070075 protected:
76 static const char kService[];
77 static const char kPath[];
Darin Petkov5c97ac52011-07-19 16:30:49 -070078 static const char kOwner[];
79 static const char kModemPath[];
Darin Petkov887f2982011-07-14 16:10:17 -070080
David Rochbergfa1d31d2012-03-20 10:38:07 -040081 shared_ptr<StrictModem> modem_;
82
Darin Petkov887f2982011-07-14 16:10:17 -070083 MockGLib glib_;
84 MockControl control_interface_;
85 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -080086 MockMetrics metrics_;
Chris Masone2ae797d2011-08-23 20:41:00 -070087 MockManager manager_;
Darin Petkov887f2982011-07-14 16:10:17 -070088};
89
Darin Petkov5c97ac52011-07-19 16:30:49 -070090const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
91const char ModemManagerTest::kPath[] = "/org/chromium/ModemManager";
92const char ModemManagerTest::kOwner[] = ":1.17";
David Rochberg7cb06f62012-03-05 11:23:44 -050093const char ModemManagerTest::kModemPath[] = "/org/blah/Modem/blah/0";
Darin Petkov887f2982011-07-14 16:10:17 -070094
David Rochberg7cb06f62012-03-05 11:23:44 -050095class ModemManagerCoreTest : public ModemManagerTest {
96 public:
97 ModemManagerCoreTest()
98 : ModemManagerTest(),
99 modem_manager_(kService,
100 kPath,
101 &control_interface_,
102 &dispatcher_,
103 &metrics_,
104 &manager_,
105 &glib_,
Ben Chan62028b22012-11-05 11:20:02 -0800106 NULL,
David Rochberg7cb06f62012-03-05 11:23:44 -0500107 NULL) {}
Darin Petkovab565bb2011-10-06 02:55:51 -0700108
David Rochberg7cb06f62012-03-05 11:23:44 -0500109 virtual void TearDown() {
110 modem_manager_.watcher_id_ = 0;
111 }
Darin Petkove0a312e2011-07-20 13:45:28 -0700112
David Rochberg7cb06f62012-03-05 11:23:44 -0500113 protected:
114 ModemManagerCore modem_manager_;
115};
116
David Rochberg7cb06f62012-03-05 11:23:44 -0500117TEST_F(ModemManagerCoreTest, Start) {
Darin Petkov887f2982011-07-14 16:10:17 -0700118 const int kWatcher = 123;
119 EXPECT_CALL(glib_, BusWatchName(G_BUS_TYPE_SYSTEM,
120 StrEq(kService),
121 G_BUS_NAME_WATCHER_FLAGS_NONE,
122 ModemManager::OnAppear,
123 ModemManager::OnVanish,
124 &modem_manager_,
125 NULL))
126 .WillOnce(Return(kWatcher));
127 EXPECT_EQ(0, modem_manager_.watcher_id_);
128 modem_manager_.Start();
129 EXPECT_EQ(kWatcher, modem_manager_.watcher_id_);
130}
131
David Rochberg7cb06f62012-03-05 11:23:44 -0500132TEST_F(ModemManagerCoreTest, Stop) {
Darin Petkov887f2982011-07-14 16:10:17 -0700133 const int kWatcher = 345;
Darin Petkov887f2982011-07-14 16:10:17 -0700134 modem_manager_.watcher_id_ = kWatcher;
135 modem_manager_.owner_ = kOwner;
136 EXPECT_CALL(glib_, BusUnwatchName(kWatcher)).Times(1);
David Rochberg7cb06f62012-03-05 11:23:44 -0500137 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov887f2982011-07-14 16:10:17 -0700138 modem_manager_.Stop();
Darin Petkov887f2982011-07-14 16:10:17 -0700139}
140
David Rochberg7cb06f62012-03-05 11:23:44 -0500141TEST_F(ModemManagerCoreTest, OnAppearVanish) {
Darin Petkov887f2982011-07-14 16:10:17 -0700142 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500143 EXPECT_CALL(modem_manager_, Connect(kOwner));
144 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov5c97ac52011-07-19 16:30:49 -0700145 ModemManager::OnAppear(NULL, kService, kOwner, &modem_manager_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500146 ModemManager::OnVanish(NULL, kService, &modem_manager_);
147}
148
149TEST_F(ModemManagerCoreTest, Connect) {
150 EXPECT_EQ("", modem_manager_.owner_);
151 modem_manager_.ModemManager::Connect(kOwner);
Darin Petkov887f2982011-07-14 16:10:17 -0700152 EXPECT_EQ(kOwner, modem_manager_.owner_);
153}
154
David Rochberg7cb06f62012-03-05 11:23:44 -0500155TEST_F(ModemManagerCoreTest, Disconnect) {
Darin Petkov887f2982011-07-14 16:10:17 -0700156 modem_manager_.owner_ = kOwner;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400157 modem_manager_.RecordAddedModem(modem_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500158 EXPECT_EQ(1, modem_manager_.modems_.size());
159
160 modem_manager_.ModemManager::Disconnect();
Darin Petkov887f2982011-07-14 16:10:17 -0700161 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500162 EXPECT_EQ(0, modem_manager_.modems_.size());
Darin Petkov887f2982011-07-14 16:10:17 -0700163}
164
David Rochbergfa1d31d2012-03-20 10:38:07 -0400165TEST_F(ModemManagerCoreTest, ModemExists) {
Darin Petkov5c97ac52011-07-19 16:30:49 -0700166 modem_manager_.owner_ = kOwner;
David Rochberg7cb06f62012-03-05 11:23:44 -0500167
David Rochbergfa1d31d2012-03-20 10:38:07 -0400168 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
169 modem_manager_.RecordAddedModem(modem_);
170 EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
Darin Petkov5c97ac52011-07-19 16:30:49 -0700171}
172
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400173class ModemManagerClassicMockInit : public ModemManagerClassic {
174 public:
175 ModemManagerClassicMockInit(const string &service,
176 const string &path,
177 ControlInterface *control_interface,
178 EventDispatcher *dispatcher,
179 Metrics *metrics,
180 Manager *manager,
181 GLib *glib,
Ben Chan62028b22012-11-05 11:20:02 -0800182 CellularOperatorInfo *cellular_operator_info,
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400183 mobile_provider_db *provider_db) :
184 ModemManagerClassic(service,
185 path,
186 control_interface,
187 dispatcher,
188 metrics,
189 manager,
190 glib,
Ben Chan62028b22012-11-05 11:20:02 -0800191 cellular_operator_info,
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400192 provider_db) {}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400193 MOCK_METHOD1(InitModemClassic, void(shared_ptr<ModemClassic>));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400194};
David Rochberg7cb06f62012-03-05 11:23:44 -0500195
196class ModemManagerClassicTest : public ModemManagerTest {
197 public:
198 ModemManagerClassicTest()
199 : ModemManagerTest(),
200 modem_manager_(kService,
201 kPath,
202 &control_interface_,
203 &dispatcher_,
204 &metrics_,
205 &manager_,
206 &glib_,
Ben Chan62028b22012-11-05 11:20:02 -0800207 NULL,
David Rochberg7cb06f62012-03-05 11:23:44 -0500208 NULL),
209 proxy_(new MockModemManagerProxy()),
210 proxy_factory_(this) {
211 }
212
213 protected:
214 class TestProxyFactory : public ProxyFactory {
215 public:
216 explicit TestProxyFactory(ModemManagerClassicTest *test) : test_(test) {}
217
218 virtual ModemManagerProxyInterface *CreateModemManagerProxy(
219 ModemManagerClassic */*manager*/,
220 const string &/*path*/,
221 const string &/*service*/) {
222 return test_->proxy_.release();
223 }
224
225 private:
226 ModemManagerClassicTest *test_;
227 };
228
229 virtual void SetUp() {
230 modem_manager_.proxy_factory_ = &proxy_factory_;
231 }
232
233 virtual void TearDown() {
234 modem_manager_.proxy_factory_ = NULL;
235 }
236
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400237 ModemManagerClassicMockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500238 scoped_ptr<MockModemManagerProxy> proxy_;
239 TestProxyFactory proxy_factory_;
240};
241
242TEST_F(ModemManagerClassicTest, Connect) {
243 EXPECT_EQ("", modem_manager_.owner_);
244
245 EXPECT_CALL(*proxy_, EnumerateDevices())
246 .WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
247
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400248 EXPECT_CALL(modem_manager_,
David Rochbergfa1d31d2012-03-20 10:38:07 -0400249 InitModemClassic(
250 Pointee(Field(&Modem::path_, StrEq(kModemPath)))));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400251
David Rochberg7cb06f62012-03-05 11:23:44 -0500252 modem_manager_.Connect(kOwner);
253 EXPECT_EQ(kOwner, modem_manager_.owner_);
254 EXPECT_EQ(1, modem_manager_.modems_.size());
255 ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
256}
257
258
David Rochbergfa1d31d2012-03-20 10:38:07 -0400259class ModemManager1MockInit : public ModemManager1 {
260 public:
261 ModemManager1MockInit(const string &service,
262 const string &path,
263 ControlInterface *control_interface,
264 EventDispatcher *dispatcher,
265 Metrics *metrics,
266 Manager *manager,
267 GLib *glib,
Ben Chan62028b22012-11-05 11:20:02 -0800268 CellularOperatorInfo *cellular_operator_info,
David Rochbergfa1d31d2012-03-20 10:38:07 -0400269 mobile_provider_db *provider_db) :
270 ModemManager1(service,
271 path,
272 control_interface,
273 dispatcher,
274 metrics,
275 manager,
276 glib,
Ben Chan62028b22012-11-05 11:20:02 -0800277 cellular_operator_info,
David Rochbergfa1d31d2012-03-20 10:38:07 -0400278 provider_db) {}
279 MOCK_METHOD2(InitModem1, void(shared_ptr<Modem1>,
280 const DBusInterfaceToProperties &));
281};
282
283
David Rochberg7cb06f62012-03-05 11:23:44 -0500284class ModemManager1Test : public ModemManagerTest {
285 public:
286 ModemManager1Test()
287 : ModemManagerTest(),
288 modem_manager_(kService,
289 kPath,
290 &control_interface_,
291 &dispatcher_,
292 &metrics_,
293 &manager_,
294 &glib_,
Ben Chan62028b22012-11-05 11:20:02 -0800295 NULL,
David Rochberg7cb06f62012-03-05 11:23:44 -0500296 NULL),
297 proxy_(new MockDBusObjectManagerProxy()),
298 proxy_factory_(this) {
299 }
300
301 protected:
302 class TestProxyFactory : public ProxyFactory {
303 public:
304 explicit TestProxyFactory(ModemManager1Test *test) : test_(test) {}
305
306 virtual DBusObjectManagerProxyInterface *CreateDBusObjectManagerProxy(
David Rochberg7cb06f62012-03-05 11:23:44 -0500307 const string &/*path*/,
308 const string &/*service*/) {
309 return test_->proxy_.release();
310 }
311
312 private:
313 ModemManager1Test *test_;
314 };
315
316 virtual void SetUp() {
317 modem_manager_.proxy_factory_ = &proxy_factory_;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400318 proxy_->IgnoreSetCallbacks();
David Rochberg7cb06f62012-03-05 11:23:44 -0500319 }
320
321 virtual void TearDown() {
322 modem_manager_.proxy_factory_ = NULL;
323 }
324
325 static DBusObjectsWithProperties GetModemWithProperties() {
326 DBusPropertiesMap o_fd_mm1_modem;
327
Ben Chan876efd32012-09-28 15:25:13 -0700328 DBusInterfaceToProperties properties;
329 properties[MM_DBUS_INTERFACE_MODEM] = o_fd_mm1_modem;
David Rochberg7cb06f62012-03-05 11:23:44 -0500330
331 DBusObjectsWithProperties objects_with_properties;
Ben Chan876efd32012-09-28 15:25:13 -0700332 objects_with_properties[kModemPath] = properties;
David Rochberg7cb06f62012-03-05 11:23:44 -0500333
334 return objects_with_properties;
335 }
336
David Rochbergfa1d31d2012-03-20 10:38:07 -0400337 ModemManager1MockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500338 scoped_ptr<MockDBusObjectManagerProxy> proxy_;
339 TestProxyFactory proxy_factory_;
340};
341
342TEST_F(ModemManager1Test, Connect) {
343 Error e;
344
Eric Shienbrood9a245532012-03-07 14:20:39 -0500345 EXPECT_CALL(*proxy_, GetManagedObjects(_, _, _));
David Rochbergfa1d31d2012-03-20 10:38:07 -0400346 EXPECT_CALL(modem_manager_,
347 InitModem1(
348 Pointee(Field(&Modem::path_, StrEq(kModemPath))),
349 _));
David Rochberg7cb06f62012-03-05 11:23:44 -0500350
351 modem_manager_.Connect(kOwner);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500352 modem_manager_.OnGetManagedObjectsReply(GetModemWithProperties(), e);
David Rochberg7cb06f62012-03-05 11:23:44 -0500353 EXPECT_EQ(1, modem_manager_.modems_.size());
354 EXPECT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
David Rochberg7cb06f62012-03-05 11:23:44 -0500355}
356
David Rochbergfa1d31d2012-03-20 10:38:07 -0400357
David Rochberg7cb06f62012-03-05 11:23:44 -0500358TEST_F(ModemManager1Test, AddRemoveInterfaces) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500359 EXPECT_CALL(*proxy_, GetManagedObjects(_, _, _));
David Rochberg7cb06f62012-03-05 11:23:44 -0500360 modem_manager_.Connect(kOwner);
361
362 // Have nothing come back from GetManagedObjects
Eric Shienbrood9a245532012-03-07 14:20:39 -0500363 modem_manager_.OnGetManagedObjectsReply(DBusObjectsWithProperties(), Error());
David Rochberg7cb06f62012-03-05 11:23:44 -0500364 EXPECT_EQ(0, modem_manager_.modems_.size());
365
366 // Add an object that doesn't have a modem interface. Nothing should be added
David Rochbergfa1d31d2012-03-20 10:38:07 -0400367 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(0);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500368 modem_manager_.OnInterfacesAddedSignal(kModemPath,
369 DBusInterfaceToProperties());
David Rochberg7cb06f62012-03-05 11:23:44 -0500370 EXPECT_EQ(0, modem_manager_.modems_.size());
371
372 // Actually add a modem
David Rochbergfa1d31d2012-03-20 10:38:07 -0400373 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(1);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500374 modem_manager_.OnInterfacesAddedSignal(kModemPath,
375 GetModemWithProperties()[kModemPath]);
David Rochberg7cb06f62012-03-05 11:23:44 -0500376 EXPECT_EQ(1, modem_manager_.modems_.size());
377
378 // Remove an irrelevant interface
379 vector<string> not_including_modem_interface;
380 not_including_modem_interface.push_back("not.a.modem.interface");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500381 modem_manager_.OnInterfacesRemovedSignal(kModemPath,
382 not_including_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500383 EXPECT_EQ(1, modem_manager_.modems_.size());
384
385 // Remove the modem
386 vector<string> with_modem_interface;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400387 with_modem_interface.push_back(MM_DBUS_INTERFACE_MODEM);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500388 modem_manager_.OnInterfacesRemovedSignal(kModemPath,
389 with_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500390 EXPECT_EQ(0, modem_manager_.modems_.size());
391}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400392
Darin Petkov887f2982011-07-14 16:10:17 -0700393} // namespace shill