blob: d48f4f30d3105ea37c663cc482444241268eeaa5 [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>
Darin Petkove0a312e2011-07-20 13:45:28 -07007#include <mm/mm-modem.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"
Darin Petkovc90fe522011-07-15 13:59:47 -070015#include "shill/mock_modem_manager_proxy.h"
Darin Petkove0a312e2011-07-20 13:45:28 -070016#include "shill/modem.h"
Darin Petkov887f2982011-07-14 16:10:17 -070017#include "shill/modem_manager.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070018#include "shill/proxy_factory.h"
Darin Petkov887f2982011-07-14 16:10:17 -070019
Darin Petkovc90fe522011-07-15 13:59:47 -070020using std::string;
David Rochberg7cb06f62012-03-05 11:23:44 -050021using std::tr1::shared_ptr;
Darin Petkov5c97ac52011-07-19 16:30:49 -070022using std::vector;
Darin Petkov887f2982011-07-14 16:10:17 -070023using testing::_;
David Rochberg7cb06f62012-03-05 11:23:44 -050024using testing::Invoke;
Darin Petkov887f2982011-07-14 16:10:17 -070025using testing::Return;
26using testing::StrEq;
27using testing::Test;
28
29namespace shill {
30
David Rochberg7cb06f62012-03-05 11:23:44 -050031// A testing subclass of ModemManager.
32class ModemManagerCore : public ModemManager {
33 public:
34 ModemManagerCore(const string &service,
35 const string &path,
36 ControlInterface *control_interface,
37 EventDispatcher *dispatcher,
38 Metrics *metrics,
39 Manager *manager,
40 GLib *glib,
41 mobile_provider_db *provider_db)
42 : ModemManager(service,
43 path,
44 control_interface,
45 dispatcher,
46 metrics,
47 manager,
48 glib,
49 provider_db) {}
50
51 virtual ~ModemManagerCore() {}
52
53 MOCK_METHOD1(Connect, void(const string &owner));
54 MOCK_METHOD0(Disconnect, void());
55 MOCK_METHOD1(InitModem, void(shared_ptr<Modem> modem));
56};
57
Darin Petkov887f2982011-07-14 16:10:17 -070058class ModemManagerTest : public Test {
59 public:
60 ModemManagerTest()
David Rochberg7cb06f62012-03-05 11:23:44 -050061 : manager_(&control_interface_, &dispatcher_, &metrics_, &glib_) {
Darin Petkovc90fe522011-07-15 13:59:47 -070062 }
Darin Petkov887f2982011-07-14 16:10:17 -070063 protected:
64 static const char kService[];
65 static const char kPath[];
Darin Petkov5c97ac52011-07-19 16:30:49 -070066 static const char kOwner[];
67 static const char kModemPath[];
Darin Petkov887f2982011-07-14 16:10:17 -070068
69 MockGLib glib_;
70 MockControl control_interface_;
71 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -080072 MockMetrics metrics_;
Chris Masone2ae797d2011-08-23 20:41:00 -070073 MockManager manager_;
Darin Petkov887f2982011-07-14 16:10:17 -070074};
75
Darin Petkov5c97ac52011-07-19 16:30:49 -070076const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
77const char ModemManagerTest::kPath[] = "/org/chromium/ModemManager";
78const char ModemManagerTest::kOwner[] = ":1.17";
David Rochberg7cb06f62012-03-05 11:23:44 -050079const char ModemManagerTest::kModemPath[] = "/org/blah/Modem/blah/0";
Darin Petkov887f2982011-07-14 16:10:17 -070080
David Rochberg7cb06f62012-03-05 11:23:44 -050081class ModemManagerCoreTest : public ModemManagerTest {
82 public:
83 ModemManagerCoreTest()
84 : ModemManagerTest(),
85 modem_manager_(kService,
86 kPath,
87 &control_interface_,
88 &dispatcher_,
89 &metrics_,
90 &manager_,
91 &glib_,
92 NULL) {}
93 virtual void SetUp() {
94 }
Darin Petkovab565bb2011-10-06 02:55:51 -070095
David Rochberg7cb06f62012-03-05 11:23:44 -050096 virtual void TearDown() {
97 modem_manager_.watcher_id_ = 0;
98 }
Darin Petkove0a312e2011-07-20 13:45:28 -070099
David Rochberg7cb06f62012-03-05 11:23:44 -0500100 protected:
101 ModemManagerCore modem_manager_;
102};
103
104
105TEST_F(ModemManagerCoreTest, Start) {
Darin Petkov887f2982011-07-14 16:10:17 -0700106 const int kWatcher = 123;
107 EXPECT_CALL(glib_, BusWatchName(G_BUS_TYPE_SYSTEM,
108 StrEq(kService),
109 G_BUS_NAME_WATCHER_FLAGS_NONE,
110 ModemManager::OnAppear,
111 ModemManager::OnVanish,
112 &modem_manager_,
113 NULL))
114 .WillOnce(Return(kWatcher));
115 EXPECT_EQ(0, modem_manager_.watcher_id_);
116 modem_manager_.Start();
117 EXPECT_EQ(kWatcher, modem_manager_.watcher_id_);
118}
119
David Rochberg7cb06f62012-03-05 11:23:44 -0500120TEST_F(ModemManagerCoreTest, Stop) {
Darin Petkov887f2982011-07-14 16:10:17 -0700121 const int kWatcher = 345;
Darin Petkov887f2982011-07-14 16:10:17 -0700122 modem_manager_.watcher_id_ = kWatcher;
123 modem_manager_.owner_ = kOwner;
124 EXPECT_CALL(glib_, BusUnwatchName(kWatcher)).Times(1);
David Rochberg7cb06f62012-03-05 11:23:44 -0500125 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov887f2982011-07-14 16:10:17 -0700126 modem_manager_.Stop();
Darin Petkov887f2982011-07-14 16:10:17 -0700127}
128
David Rochberg7cb06f62012-03-05 11:23:44 -0500129TEST_F(ModemManagerCoreTest, OnAppearVanish) {
Darin Petkov887f2982011-07-14 16:10:17 -0700130 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500131 EXPECT_CALL(modem_manager_, Connect(kOwner));
132 EXPECT_CALL(modem_manager_, Disconnect());
Darin Petkov5c97ac52011-07-19 16:30:49 -0700133 ModemManager::OnAppear(NULL, kService, kOwner, &modem_manager_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500134 ModemManager::OnVanish(NULL, kService, &modem_manager_);
135}
136
137TEST_F(ModemManagerCoreTest, Connect) {
138 EXPECT_EQ("", modem_manager_.owner_);
139 modem_manager_.ModemManager::Connect(kOwner);
Darin Petkov887f2982011-07-14 16:10:17 -0700140 EXPECT_EQ(kOwner, modem_manager_.owner_);
141}
142
David Rochberg7cb06f62012-03-05 11:23:44 -0500143TEST_F(ModemManagerCoreTest, Disconnect) {
144 EXPECT_CALL(modem_manager_, InitModem(_));
145
Darin Petkov887f2982011-07-14 16:10:17 -0700146 modem_manager_.owner_ = kOwner;
David Rochberg7cb06f62012-03-05 11:23:44 -0500147 modem_manager_.AddModem(kModemPath);
148 EXPECT_EQ(1, modem_manager_.modems_.size());
149
150 modem_manager_.ModemManager::Disconnect();
Darin Petkov887f2982011-07-14 16:10:17 -0700151 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500152 EXPECT_EQ(0, modem_manager_.modems_.size());
Darin Petkov887f2982011-07-14 16:10:17 -0700153}
154
David Rochberg7cb06f62012-03-05 11:23:44 -0500155TEST_F(ModemManagerCoreTest, AddRemoveModem) {
Darin Petkov5c97ac52011-07-19 16:30:49 -0700156 modem_manager_.owner_ = kOwner;
David Rochberg7cb06f62012-03-05 11:23:44 -0500157 EXPECT_CALL(modem_manager_, InitModem(_));
158
Darin Petkov5c97ac52011-07-19 16:30:49 -0700159 modem_manager_.AddModem(kModemPath);
160 EXPECT_EQ(1, modem_manager_.modems_.size());
Darin Petkova7b89492011-07-27 12:48:17 -0700161 ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
Darin Petkove0a312e2011-07-20 13:45:28 -0700162
Darin Petkov5c97ac52011-07-19 16:30:49 -0700163 modem_manager_.RemoveModem(kModemPath);
164 EXPECT_EQ(0, modem_manager_.modems_.size());
165}
166
David Rochberg7cb06f62012-03-05 11:23:44 -0500167
168class ModemManagerClassicTest : public ModemManagerTest {
169 public:
170 ModemManagerClassicTest()
171 : ModemManagerTest(),
172 modem_manager_(kService,
173 kPath,
174 &control_interface_,
175 &dispatcher_,
176 &metrics_,
177 &manager_,
178 &glib_,
179 NULL),
180 proxy_(new MockModemManagerProxy()),
181 proxy_factory_(this) {
182 }
183
184 protected:
185 class TestProxyFactory : public ProxyFactory {
186 public:
187 explicit TestProxyFactory(ModemManagerClassicTest *test) : test_(test) {}
188
189 virtual ModemManagerProxyInterface *CreateModemManagerProxy(
190 ModemManagerClassic */*manager*/,
191 const string &/*path*/,
192 const string &/*service*/) {
193 return test_->proxy_.release();
194 }
195
196 private:
197 ModemManagerClassicTest *test_;
198 };
199
200 virtual void SetUp() {
201 modem_manager_.proxy_factory_ = &proxy_factory_;
202 }
203
204 virtual void TearDown() {
205 modem_manager_.proxy_factory_ = NULL;
206 }
207
208 ModemManagerClassic modem_manager_;
209 scoped_ptr<MockModemManagerProxy> proxy_;
210 TestProxyFactory proxy_factory_;
211};
212
213TEST_F(ModemManagerClassicTest, Connect) {
214 EXPECT_EQ("", modem_manager_.owner_);
215
216 EXPECT_CALL(*proxy_, EnumerateDevices())
217 .WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
218
219 modem_manager_.Connect(kOwner);
220 EXPECT_EQ(kOwner, modem_manager_.owner_);
221 EXPECT_EQ(1, modem_manager_.modems_.size());
222 ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
223}
224
225
226class ModemManager1Test : public ModemManagerTest {
227 public:
228 ModemManager1Test()
229 : ModemManagerTest(),
230 modem_manager_(kService,
231 kPath,
232 &control_interface_,
233 &dispatcher_,
234 &metrics_,
235 &manager_,
236 &glib_,
237 NULL),
238 proxy_(new MockDBusObjectManagerProxy()),
239 proxy_factory_(this) {
240 }
241
242 protected:
243 class TestProxyFactory : public ProxyFactory {
244 public:
245 explicit TestProxyFactory(ModemManager1Test *test) : test_(test) {}
246
247 virtual DBusObjectManagerProxyInterface *CreateDBusObjectManagerProxy(
248 DBusObjectManagerProxyDelegate */*manager*/,
249 const string &/*path*/,
250 const string &/*service*/) {
251 return test_->proxy_.release();
252 }
253
254 private:
255 ModemManager1Test *test_;
256 };
257
258 virtual void SetUp() {
259 modem_manager_.proxy_factory_ = &proxy_factory_;
260 }
261
262 virtual void TearDown() {
263 modem_manager_.proxy_factory_ = NULL;
264 }
265
266 static DBusObjectsWithProperties GetModemWithProperties() {
267 DBusPropertiesMap o_fd_mm1_modem;
268
269 DBusInterfaceToProperties i_to_p;
270 i_to_p[ModemManager1::kDBusInterfaceModem] = o_fd_mm1_modem;
271
272 DBusObjectsWithProperties objects_with_properties;
273 objects_with_properties[kModemPath] = i_to_p;
274
275 return objects_with_properties;
276 }
277
278 ModemManager1 modem_manager_;
279 scoped_ptr<MockDBusObjectManagerProxy> proxy_;
280 TestProxyFactory proxy_factory_;
281};
282
283TEST_F(ModemManager1Test, Connect) {
284 Error e;
285
286 EXPECT_CALL(*proxy_, GetManagedObjects(_, _));
287
288 modem_manager_.Connect(kOwner);
289 modem_manager_.OnGetManagedObjectsCallback(GetModemWithProperties(), e, NULL);
290 EXPECT_EQ(1, modem_manager_.modems_.size());
291 EXPECT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
292 // TODO(rochberg): As mm1::connect gets more interesting, this will
293 // need to expand
294}
295
296TEST_F(ModemManager1Test, AddRemoveInterfaces) {
297 EXPECT_CALL(*proxy_, GetManagedObjects(_, _));
298 modem_manager_.Connect(kOwner);
299
300 // Have nothing come back from GetManagedObjects
301 modem_manager_.OnGetManagedObjectsCallback(DBusObjectsWithProperties(),
302 Error(),
303 NULL);
304 EXPECT_EQ(0, modem_manager_.modems_.size());
305
306 // Add an object that doesn't have a modem interface. Nothing should be added
307 modem_manager_.OnInterfacesAdded(kModemPath,
308 DBusInterfaceToProperties());
309 EXPECT_EQ(0, modem_manager_.modems_.size());
310
311 // Actually add a modem
312 modem_manager_.OnInterfacesAdded(kModemPath,
313 GetModemWithProperties()[kModemPath]);
314 EXPECT_EQ(1, modem_manager_.modems_.size());
315
316 // Remove an irrelevant interface
317 vector<string> not_including_modem_interface;
318 not_including_modem_interface.push_back("not.a.modem.interface");
319 modem_manager_.OnInterfacesRemoved(kModemPath,
320 not_including_modem_interface);
321 EXPECT_EQ(1, modem_manager_.modems_.size());
322
323 // Remove the modem
324 vector<string> with_modem_interface;
325 with_modem_interface.push_back(ModemManager1::kDBusInterfaceModem);
326 modem_manager_.OnInterfacesRemoved(kModemPath,
327 with_modem_interface);
328 EXPECT_EQ(0, modem_manager_.modems_.size());
329}
Darin Petkov887f2982011-07-14 16:10:17 -0700330} // namespace shill