blob: 28f3455b8b5da318690c66176b96638e81ec15c8 [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>
Ben Chan5c853ef2012-10-05 00:05:37 -07006#include <ModemManager/ModemManager.h>
Darin Petkov887f2982011-07-14 16:10:17 -07007
8#include "shill/manager.h"
Ben Chan66174a12014-01-08 21:27:00 -08009#include "shill/mock_control.h"
David Rochberg7cb06f62012-03-05 11:23:44 -050010#include "shill/mock_dbus_objectmanager_proxy.h"
Ben Chan66174a12014-01-08 21:27:00 -080011#include "shill/mock_dbus_service_proxy.h"
12#include "shill/mock_manager.h"
David Rochbergfa1d31d2012-03-20 10:38:07 -040013#include "shill/mock_modem.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070014#include "shill/mock_modem_info.h"
Darin Petkovc90fe522011-07-15 13:59:47 -070015#include "shill/mock_modem_manager_proxy.h"
Ben Chan1e2ba232014-01-27 16:35:45 -080016#include "shill/mock_proxy_factory.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"
Ben Chan1e2ba232014-01-27 16:35:45 -080019#include "shill/testing.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;
Ben Chan66174a12014-01-08 21:27:00 -080028using testing::SaveArg;
Darin Petkov887f2982011-07-14 16:10:17 -070029using testing::StrEq;
30using testing::Test;
31
32namespace shill {
33
34class ModemManagerTest : public Test {
35 public:
36 ModemManagerTest()
Ben Chan66174a12014-01-08 21:27:00 -080037 : manager_(&control_, &dispatcher_, NULL, NULL),
38 modem_info_(&control_, &dispatcher_, NULL, &manager_, NULL),
39 dbus_service_proxy_(NULL) {}
David Rochbergfa1d31d2012-03-20 10:38:07 -040040
41 virtual void SetUp() {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070042 modem_.reset(new StrictModem(kOwner, kService, kModemPath, &modem_info_));
Ben Chan66174a12014-01-08 21:27:00 -080043 manager_.dbus_manager_.reset(new DBusManager());
44 dbus_service_proxy_ = new MockDBusServiceProxy();
45 // Ownership of |dbus_service_proxy_| is transferred to
46 // |manager_.dbus_manager_|.
47 manager_.dbus_manager_->proxy_.reset(dbus_service_proxy_);
David Rochbergfa1d31d2012-03-20 10:38:07 -040048 }
Ben Chan62028b22012-11-05 11:20:02 -080049
Darin Petkov887f2982011-07-14 16:10:17 -070050 protected:
51 static const char kService[];
52 static const char kPath[];
Darin Petkov5c97ac52011-07-19 16:30:49 -070053 static const char kOwner[];
54 static const char kModemPath[];
Darin Petkov887f2982011-07-14 16:10:17 -070055
David Rochbergfa1d31d2012-03-20 10:38:07 -040056 shared_ptr<StrictModem> modem_;
57
Darin Petkov887f2982011-07-14 16:10:17 -070058 EventDispatcher dispatcher_;
Ben Chan66174a12014-01-08 21:27:00 -080059 MockControl control_;
60 MockManager manager_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070061 MockModemInfo modem_info_;
Ben Chan1e2ba232014-01-27 16:35:45 -080062 MockProxyFactory proxy_factory_;
Ben Chan66174a12014-01-08 21:27:00 -080063 MockDBusServiceProxy *dbus_service_proxy_;
Darin Petkov887f2982011-07-14 16:10:17 -070064};
65
Darin Petkov5c97ac52011-07-19 16:30:49 -070066const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
67const char ModemManagerTest::kPath[] = "/org/chromium/ModemManager";
68const char ModemManagerTest::kOwner[] = ":1.17";
David Rochberg7cb06f62012-03-05 11:23:44 -050069const char ModemManagerTest::kModemPath[] = "/org/blah/Modem/blah/0";
Darin Petkov887f2982011-07-14 16:10:17 -070070
David Rochberg7cb06f62012-03-05 11:23:44 -050071class ModemManagerCoreTest : public ModemManagerTest {
72 public:
73 ModemManagerCoreTest()
74 : ModemManagerTest(),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070075 modem_manager_(kService, kPath, &modem_info_) {}
Darin Petkovab565bb2011-10-06 02:55:51 -070076
David Rochberg7cb06f62012-03-05 11:23:44 -050077 protected:
Ben Chan66174a12014-01-08 21:27:00 -080078 ModemManager modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -050079};
80
Ben Chan66174a12014-01-08 21:27:00 -080081TEST_F(ModemManagerCoreTest, StartStopWithModemManagerServiceAbsent) {
82 StringCallback get_name_owner_callback;
83 EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _))
84 .WillOnce(SaveArg<2>(&get_name_owner_callback));
Darin Petkov887f2982011-07-14 16:10:17 -070085 modem_manager_.Start();
Ben Chan66174a12014-01-08 21:27:00 -080086 get_name_owner_callback.Run("", Error());
87 EXPECT_EQ("", modem_manager_.owner_);
88
89 modem_manager_.Stop();
90 EXPECT_EQ("", modem_manager_.owner_);
Darin Petkov887f2982011-07-14 16:10:17 -070091}
92
Ben Chan66174a12014-01-08 21:27:00 -080093TEST_F(ModemManagerCoreTest, StartStopWithModemManagerServicePresent) {
94 StringCallback get_name_owner_callback;
95 EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _))
96 .WillOnce(SaveArg<2>(&get_name_owner_callback));
97 modem_manager_.Start();
98 get_name_owner_callback.Run(kOwner, Error());
99 EXPECT_EQ(kOwner, modem_manager_.owner_);
100
Darin Petkov887f2982011-07-14 16:10:17 -0700101 modem_manager_.Stop();
Ben Chan66174a12014-01-08 21:27:00 -0800102 EXPECT_EQ("", modem_manager_.owner_);
Darin Petkov887f2982011-07-14 16:10:17 -0700103}
104
David Rochberg7cb06f62012-03-05 11:23:44 -0500105TEST_F(ModemManagerCoreTest, OnAppearVanish) {
Ben Chan66174a12014-01-08 21:27:00 -0800106 EXPECT_CALL(*dbus_service_proxy_, GetNameOwner(kService, _, _, _));
107 modem_manager_.Start();
Darin Petkov887f2982011-07-14 16:10:17 -0700108 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500109
Ben Chan66174a12014-01-08 21:27:00 -0800110 manager_.dbus_manager()->OnNameOwnerChanged(kService, "", kOwner);
Darin Petkov887f2982011-07-14 16:10:17 -0700111 EXPECT_EQ(kOwner, modem_manager_.owner_);
Ben Chan66174a12014-01-08 21:27:00 -0800112
113 manager_.dbus_manager()->OnNameOwnerChanged(kService, kOwner, "");
114 EXPECT_EQ("", modem_manager_.owner_);
Darin Petkov887f2982011-07-14 16:10:17 -0700115}
116
Ben Chan66174a12014-01-08 21:27:00 -0800117TEST_F(ModemManagerCoreTest, ConnectDisconnect) {
118 EXPECT_EQ("", modem_manager_.owner_);
119 modem_manager_.Connect(kOwner);
120 EXPECT_EQ(kOwner, modem_manager_.owner_);
121 EXPECT_EQ(0, modem_manager_.modems_.size());
122
David Rochbergfa1d31d2012-03-20 10:38:07 -0400123 modem_manager_.RecordAddedModem(modem_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500124 EXPECT_EQ(1, modem_manager_.modems_.size());
125
126 modem_manager_.ModemManager::Disconnect();
Darin Petkov887f2982011-07-14 16:10:17 -0700127 EXPECT_EQ("", modem_manager_.owner_);
David Rochberg7cb06f62012-03-05 11:23:44 -0500128 EXPECT_EQ(0, modem_manager_.modems_.size());
Darin Petkov887f2982011-07-14 16:10:17 -0700129}
130
Ben Chan66174a12014-01-08 21:27:00 -0800131TEST_F(ModemManagerCoreTest, AddRemoveModem) {
132 modem_manager_.Connect(kOwner);
David Rochbergfa1d31d2012-03-20 10:38:07 -0400133 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
Ben Chan66174a12014-01-08 21:27:00 -0800134
135 // Remove non-existent modem path.
136 modem_manager_.RemoveModem(kModemPath);
137 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
138
David Rochbergfa1d31d2012-03-20 10:38:07 -0400139 modem_manager_.RecordAddedModem(modem_);
140 EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
Ben Chan66174a12014-01-08 21:27:00 -0800141
142 // Add an already added modem.
143 modem_manager_.RecordAddedModem(modem_);
144 EXPECT_TRUE(modem_manager_.ModemExists(kModemPath));
145
146 modem_manager_.RemoveModem(kModemPath);
147 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
148
149 // Remove an already removed modem path.
150 modem_manager_.RemoveModem(kModemPath);
151 EXPECT_FALSE(modem_manager_.ModemExists(kModemPath));
Darin Petkov5c97ac52011-07-19 16:30:49 -0700152}
153
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400154class ModemManagerClassicMockInit : public ModemManagerClassic {
155 public:
156 ModemManagerClassicMockInit(const string &service,
157 const string &path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700158 ModemInfo *modem_info_) :
159 ModemManagerClassic(service, path, modem_info_) {}
160
David Rochbergfa1d31d2012-03-20 10:38:07 -0400161 MOCK_METHOD1(InitModemClassic, void(shared_ptr<ModemClassic>));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400162};
David Rochberg7cb06f62012-03-05 11:23:44 -0500163
164class ModemManagerClassicTest : public ModemManagerTest {
165 public:
166 ModemManagerClassicTest()
167 : ModemManagerTest(),
Ben Chan1e2ba232014-01-27 16:35:45 -0800168 modem_manager_(kService, kPath, &modem_info_),
169 proxy_(new MockModemManagerProxy()) {}
David Rochberg7cb06f62012-03-05 11:23:44 -0500170
171 protected:
David Rochberg7cb06f62012-03-05 11:23:44 -0500172 virtual void SetUp() {
173 modem_manager_.proxy_factory_ = &proxy_factory_;
174 }
175
176 virtual void TearDown() {
177 modem_manager_.proxy_factory_ = NULL;
178 }
179
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400180 ModemManagerClassicMockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500181 scoped_ptr<MockModemManagerProxy> proxy_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500182};
183
184TEST_F(ModemManagerClassicTest, Connect) {
185 EXPECT_EQ("", modem_manager_.owner_);
186
Ben Chan1e2ba232014-01-27 16:35:45 -0800187 EXPECT_CALL(proxy_factory_, CreateModemManagerProxy(_, kPath, kOwner))
188 .WillOnce(ReturnAndReleasePointee(&proxy_));
David Rochberg7cb06f62012-03-05 11:23:44 -0500189 EXPECT_CALL(*proxy_, EnumerateDevices())
190 .WillOnce(Return(vector<DBus::Path>(1, kModemPath)));
191
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400192 EXPECT_CALL(modem_manager_,
David Rochbergfa1d31d2012-03-20 10:38:07 -0400193 InitModemClassic(
194 Pointee(Field(&Modem::path_, StrEq(kModemPath)))));
David Rochbergb6b6ccb2012-03-16 13:40:36 -0400195
David Rochberg7cb06f62012-03-05 11:23:44 -0500196 modem_manager_.Connect(kOwner);
197 EXPECT_EQ(kOwner, modem_manager_.owner_);
198 EXPECT_EQ(1, modem_manager_.modems_.size());
199 ASSERT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
200}
201
202
David Rochbergfa1d31d2012-03-20 10:38:07 -0400203class ModemManager1MockInit : public ModemManager1 {
204 public:
205 ModemManager1MockInit(const string &service,
206 const string &path,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700207 ModemInfo *modem_info_) :
208 ModemManager1(service, path, modem_info_) {}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400209 MOCK_METHOD2(InitModem1, void(shared_ptr<Modem1>,
210 const DBusInterfaceToProperties &));
211};
212
213
David Rochberg7cb06f62012-03-05 11:23:44 -0500214class ModemManager1Test : public ModemManagerTest {
215 public:
216 ModemManager1Test()
217 : ModemManagerTest(),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700218 modem_manager_(kService, kPath, &modem_info_),
Ben Chan1e2ba232014-01-27 16:35:45 -0800219 proxy_(new MockDBusObjectManagerProxy()) {}
David Rochberg7cb06f62012-03-05 11:23:44 -0500220
221 protected:
David Rochberg7cb06f62012-03-05 11:23:44 -0500222 virtual void SetUp() {
223 modem_manager_.proxy_factory_ = &proxy_factory_;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400224 proxy_->IgnoreSetCallbacks();
David Rochberg7cb06f62012-03-05 11:23:44 -0500225 }
226
227 virtual void TearDown() {
228 modem_manager_.proxy_factory_ = NULL;
229 }
230
Ben Chan1e2ba232014-01-27 16:35:45 -0800231 void Connect(const DBusObjectsWithProperties &expected_objects) {
232 EXPECT_CALL(proxy_factory_, CreateDBusObjectManagerProxy(kPath, kOwner))
233 .WillOnce(ReturnAndReleasePointee(&proxy_));
234 EXPECT_CALL(*proxy_, set_interfaces_added_callback(_));
235 EXPECT_CALL(*proxy_, set_interfaces_removed_callback(_));
236 ManagedObjectsCallback get_managed_objects_callback;
237 EXPECT_CALL(*proxy_, GetManagedObjects(_, _, _))
238 .WillOnce(SaveArg<1>(&get_managed_objects_callback));
239 modem_manager_.Connect(kOwner);
240 get_managed_objects_callback.Run(expected_objects, Error());
241 }
242
David Rochberg7cb06f62012-03-05 11:23:44 -0500243 static DBusObjectsWithProperties GetModemWithProperties() {
244 DBusPropertiesMap o_fd_mm1_modem;
245
Ben Chan876efd32012-09-28 15:25:13 -0700246 DBusInterfaceToProperties properties;
247 properties[MM_DBUS_INTERFACE_MODEM] = o_fd_mm1_modem;
David Rochberg7cb06f62012-03-05 11:23:44 -0500248
249 DBusObjectsWithProperties objects_with_properties;
Ben Chan876efd32012-09-28 15:25:13 -0700250 objects_with_properties[kModemPath] = properties;
David Rochberg7cb06f62012-03-05 11:23:44 -0500251
252 return objects_with_properties;
253 }
254
David Rochbergfa1d31d2012-03-20 10:38:07 -0400255 ModemManager1MockInit modem_manager_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500256 scoped_ptr<MockDBusObjectManagerProxy> proxy_;
Ben Chan1e2ba232014-01-27 16:35:45 -0800257 MockProxyFactory proxy_factory_;
David Rochberg7cb06f62012-03-05 11:23:44 -0500258};
259
260TEST_F(ModemManager1Test, Connect) {
Ben Chan1e2ba232014-01-27 16:35:45 -0800261 Connect(GetModemWithProperties());
David Rochberg7cb06f62012-03-05 11:23:44 -0500262 EXPECT_EQ(1, modem_manager_.modems_.size());
263 EXPECT_TRUE(ContainsKey(modem_manager_.modems_, kModemPath));
David Rochberg7cb06f62012-03-05 11:23:44 -0500264}
265
266TEST_F(ModemManager1Test, AddRemoveInterfaces) {
David Rochberg7cb06f62012-03-05 11:23:44 -0500267 // Have nothing come back from GetManagedObjects
Ben Chan1e2ba232014-01-27 16:35:45 -0800268 Connect(DBusObjectsWithProperties());
David Rochberg7cb06f62012-03-05 11:23:44 -0500269 EXPECT_EQ(0, modem_manager_.modems_.size());
270
271 // Add an object that doesn't have a modem interface. Nothing should be added
David Rochbergfa1d31d2012-03-20 10:38:07 -0400272 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(0);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500273 modem_manager_.OnInterfacesAddedSignal(kModemPath,
274 DBusInterfaceToProperties());
David Rochberg7cb06f62012-03-05 11:23:44 -0500275 EXPECT_EQ(0, modem_manager_.modems_.size());
276
277 // Actually add a modem
David Rochbergfa1d31d2012-03-20 10:38:07 -0400278 EXPECT_CALL(modem_manager_, InitModem1(_, _)).Times(1);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500279 modem_manager_.OnInterfacesAddedSignal(kModemPath,
280 GetModemWithProperties()[kModemPath]);
David Rochberg7cb06f62012-03-05 11:23:44 -0500281 EXPECT_EQ(1, modem_manager_.modems_.size());
282
283 // Remove an irrelevant interface
284 vector<string> not_including_modem_interface;
285 not_including_modem_interface.push_back("not.a.modem.interface");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500286 modem_manager_.OnInterfacesRemovedSignal(kModemPath,
287 not_including_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500288 EXPECT_EQ(1, modem_manager_.modems_.size());
289
290 // Remove the modem
291 vector<string> with_modem_interface;
David Rochbergfa1d31d2012-03-20 10:38:07 -0400292 with_modem_interface.push_back(MM_DBUS_INTERFACE_MODEM);
Ben Chan1e2ba232014-01-27 16:35:45 -0800293 modem_manager_.OnInterfacesRemovedSignal(kModemPath, with_modem_interface);
David Rochberg7cb06f62012-03-05 11:23:44 -0500294 EXPECT_EQ(0, modem_manager_.modems_.size());
295}
David Rochbergfa1d31d2012-03-20 10:38:07 -0400296
Darin Petkov887f2982011-07-14 16:10:17 -0700297} // namespace shill