blob: 435a8feb91cf128b92660e61be11dd4b5b93d99f [file] [log] [blame]
Arman Ugurayf4c61812013-01-10 18:58:39 -08001// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
Chris Masoneb925cc82011-06-22 15:39:57 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular.h"
6
Darin Petkov0828f5f2011-08-11 10:18:52 -07007#include <sys/socket.h>
8#include <linux/if.h>
9#include <linux/netlink.h> // Needs typedefs from sys/socket.h.
10
Eric Shienbrood9a245532012-03-07 14:20:39 -050011#include <base/bind.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070012#include <chromeos/dbus/service_constants.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070013
Darin Petkovae0c64e2011-11-15 15:50:27 +010014#include "shill/cellular_capability_cdma.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040015#include "shill/cellular_capability_classic.h"
Darin Petkov184c54e2011-11-15 12:44:39 +010016#include "shill/cellular_capability_gsm.h"
Ben Chan09fa2a02012-11-07 22:09:09 -080017#include "shill/cellular_capability_universal.h"
Darin Petkovd9661952011-08-03 16:25:42 -070018#include "shill/cellular_service.h"
Darin Petkov4d6d9412011-08-24 13:19:54 -070019#include "shill/error.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070020#include "shill/event_dispatcher.h"
Thieu Le37b90032012-05-15 15:18:41 -070021#include "shill/mock_cellular_service.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070022#include "shill/mock_device_info.h"
Darin Petkov77cb6812011-08-15 16:19:41 -070023#include "shill/mock_dhcp_config.h"
24#include "shill/mock_dhcp_provider.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070025#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070026#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070027#include "shill/mock_modem_gsm_network_proxy.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070028#include "shill/mock_modem_info.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070029#include "shill/mock_modem_proxy.h"
Darin Petkove604f702011-07-28 15:51:17 -070030#include "shill/mock_modem_simple_proxy.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070031#include "shill/mock_rtnl_handler.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070032#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070033#include "shill/proxy_factory.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070034
Ben Chan09fa2a02012-11-07 22:09:09 -080035// mm/mm-modem.h must be included after cellular_capability_universal.h
36// in order to allow MM_MODEM_CDMA_* to be defined properly.
37#include <mm/mm-modem.h>
38
Eric Shienbrood9a245532012-03-07 14:20:39 -050039using base::Bind;
40using base::Unretained;
Darin Petkovc0865312011-09-16 15:31:20 -070041using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070042using std::string;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040043using std::vector;
Darin Petkovbec79a22011-08-01 14:47:17 -070044using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070045using testing::AnyNumber;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050046using testing::Invoke;
Arman Ugurayf84a4242013-04-09 20:01:07 -070047using testing::Mock;
Darin Petkov0828f5f2011-08-11 10:18:52 -070048using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070049using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070050using testing::SetArgumentPointee;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050051using testing::Unused;
Chris Masoneb925cc82011-06-22 15:39:57 -070052
53namespace shill {
54
Eric Shienbrood9a245532012-03-07 14:20:39 -050055MATCHER(IsSuccess, "") {
56 return arg.IsSuccess();
57}
58
Gary Morainbaeefdf2012-04-30 14:53:35 -070059MATCHER(IsFailure, "") {
60 return arg.IsFailure();
61}
62
Darin Petkov0828f5f2011-08-11 10:18:52 -070063class CellularPropertyTest : public PropertyStoreTest {
64 public:
65 CellularPropertyTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070066 : modem_info_(control_interface(),
67 dispatcher(),
68 metrics(),
69 manager(),
70 glib()),
71 device_(new Cellular(&modem_info_,
Darin Petkove9d12e02011-07-27 15:09:37 -070072 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070073 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070074 3,
Ben Chan3ecdf822012-08-06 12:29:23 -070075 Cellular::kTypeCDMA,
Darin Petkov0828f5f2011-08-11 10:18:52 -070076 "",
Darin Petkov137884a2011-10-26 18:52:47 +020077 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040078 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070079 ProxyFactory::GetInstance())) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070080 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070081
Chris Masoneb925cc82011-06-22 15:39:57 -070082 protected:
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070083 MockModemInfo modem_info_;
Darin Petkov0828f5f2011-08-11 10:18:52 -070084 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070085};
86
Darin Petkov0828f5f2011-08-11 10:18:52 -070087TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070088 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
89 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070090}
91
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080092TEST_F(CellularPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070093 {
94 ::DBus::Error error;
mukesh agrawalbebf1b82013-04-23 15:06:33 -070095 ::DBus::Variant allow_roaming;
96 allow_roaming.writer().append_bool(true);
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080097 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070098 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070099 flimflam::kCellularAllowRoamingProperty,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700100 allow_roaming,
Chris Masonea8a2c252011-06-27 22:16:30 -0700101 &error));
102 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 // Ensure that attempting to write a R/O property returns InvalidArgs error.
104 {
105 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800106 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
107 flimflam::kAddressProperty,
108 PropertyStoreTest::kStringV,
109 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700110 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700111 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 }
113 {
114 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800115 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
116 flimflam::kCarrierProperty,
117 PropertyStoreTest::kStringV,
118 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700119 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700120 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700121 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700122}
123
Darin Petkov0828f5f2011-08-11 10:18:52 -0700124class CellularTest : public testing::Test {
125 public:
126 CellularTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700127 : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
128 device_info_(modem_info_.control_interface(), &dispatcher_,
129 modem_info_.metrics(), modem_info_.manager()),
130 dhcp_config_(new MockDHCPConfig(modem_info_.control_interface(),
Paul Stewartd408fdf2012-05-07 17:15:57 -0700131 kTestDeviceName)),
Ben Chan3ecdf822012-08-06 12:29:23 -0700132 create_gsm_card_proxy_from_factory_(false),
133 proxy_(new MockModemProxy()),
134 simple_proxy_(new MockModemSimpleProxy()),
135 cdma_proxy_(new MockModemCDMAProxy()),
136 gsm_card_proxy_(new MockModemGSMCardProxy()),
137 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
138 proxy_factory_(this),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700139 device_(new Cellular(&modem_info_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700140 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700141 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700142 3,
143 Cellular::kTypeGSM,
144 kDBusOwner,
Jason Glasgowa585fc32012-06-06 11:04:09 -0400145 kDBusService,
Darin Petkov137884a2011-10-26 18:52:47 +0200146 kDBusPath,
Thieu Lece4483e2013-01-23 15:12:03 -0800147 &proxy_factory_)) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700148 modem_info_.metrics()->RegisterDevice(device_->interface_index(),
149 Technology::kCellular);
Darin Petkov137884a2011-10-26 18:52:47 +0200150 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700151
152 virtual void SetUp() {
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700153 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700154 device_->set_dhcp_provider(&dhcp_provider_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700155 EXPECT_CALL(*modem_info_.mock_manager(), device_info())
156 .WillRepeatedly(Return(&device_info_));
157 EXPECT_CALL(*modem_info_.mock_manager(), DeregisterService(_))
158 .Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700159 }
160
161 virtual void TearDown() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500162 device_->DestroyIPConfig();
Darin Petkovfb0625e2012-01-16 13:05:56 +0100163 device_->state_ = Cellular::kStateDisabled;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500164 device_->capability_->ReleaseProxies();
Darin Petkov77cb6812011-08-15 16:19:41 -0700165 device_->set_dhcp_provider(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700166 }
167
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700168 void InitProviderDB() {
169 modem_info_.SetProviderDB(kTestMobileProviderDBPath);
170 }
171
Eric Shienbrood9a245532012-03-07 14:20:39 -0500172 void InvokeEnable(bool enable, Error *error,
173 const ResultCallback &callback, int timeout) {
174 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500175 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500176 void InvokeGetSignalQuality(Error *error,
177 const SignalQualityCallback &callback,
178 int timeout) {
179 callback.Run(kStrength, Error());
180 }
181 void InvokeGetModemStatus(Error *error,
182 const DBusPropertyMapCallback &callback,
183 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500184 DBusPropertiesMap props;
185 props["carrier"].writer().append_string(kTestCarrier);
186 props["unknown-property"].writer().append_string("irrelevant-value");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500187 callback.Run(props, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500188 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500189 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
190 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500191 static const char kManufacturer[] = "Company";
192 static const char kModelID[] = "Gobi 2000";
193 static const char kHWRev[] = "A00B1234";
194 ModemHardwareInfo info;
195 info._1 = kManufacturer;
196 info._2 = kModelID;
197 info._3 = kHWRev;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500198 callback.Run(info, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500199 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500200 void InvokeGetRegistrationState1X(Error *error,
201 const RegistrationStateCallback &callback,
202 int timeout) {
203 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
204 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
205 Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500206 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500207 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
208 int timeout) {
209 callback.Run(kIMEI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500210 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500211 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
212 int timeout) {
213 callback.Run(kIMSI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500214 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500215 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
216 int timeout) {
217 callback.Run(kMSISDN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500218 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500219 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
220 int timeout) {
Darin Petkova4ca3c32012-08-17 16:05:24 +0200221 callback.Run(kTestCarrierSPN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500222 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500223 void InvokeGetRegistrationInfo(Error *error,
224 const RegistrationInfoCallback &callback,
225 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500226 static const char kNetworkID[] = "22803";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500227 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
228 kNetworkID, kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500229 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500230 void InvokeRegister(const string &network_id,
231 Error *error,
232 const ResultCallback &callback,
233 int timeout) {
234 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500235 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500236 void InvokeGetRegistrationState(Error *error,
237 const RegistrationStateCallback &callback,
238 int timeout) {
239 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
240 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
241 Error());
242 }
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400243 void InvokeGetRegistrationStateUnregistered(
244 Error *error,
245 const RegistrationStateCallback &callback,
246 int timeout) {
247 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
248 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
249 Error());
Arman Uguray539c4232012-09-11 10:00:22 -0700250 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500251 void InvokeConnect(DBusPropertiesMap props, Error *error,
252 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400253 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500254 callback.Run(Error());
255 }
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400256 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
Thieu Leb5954a22012-05-18 10:37:34 -0700257 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400258 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
259 callback.Run(Error(Error::kNotOnHomeNetwork));
260 }
Thieu Leb5954a22012-05-18 10:37:34 -0700261 void InvokeConnectFailNoService(DBusPropertiesMap props, Error *error,
262 const ResultCallback &callback, int timeout) {
263 device_->service_ = NULL;
264 callback.Run(Error(Error::kNotOnHomeNetwork));
265 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500266 void InvokeDisconnect(Error *error, const ResultCallback &callback,
267 int timeout) {
268 if (!callback.is_null())
269 callback.Run(Error());
270 }
Arman Uguray539c4232012-09-11 10:00:22 -0700271 void InvokeDisconnectFail(Error *error, const ResultCallback &callback,
272 int timeout) {
273 error->Populate(Error::kOperationFailed);
274 if (!callback.is_null())
275 callback.Run(*error);
276 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500277
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400278 void ExpectCdmaStartModem(string network_technology) {
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400279 if (!device_->IsUnderlyingDeviceEnabled())
280 EXPECT_CALL(*proxy_,
281 Enable(true, _, _, CellularCapability::kTimeoutEnable))
282 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400283 EXPECT_CALL(*simple_proxy_,
284 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
285 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
286 EXPECT_CALL(*proxy_,
287 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
288 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
289 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
290 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400291 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400292 else
293 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400294 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400295 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
296 .Times(2)
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400297 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400298 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700299 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400300 }
301
Eric Shienbrood9a245532012-03-07 14:20:39 -0500302 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500303
Darin Petkov0828f5f2011-08-11 10:18:52 -0700304 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500305 static const char kTestDeviceName[];
306 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500307 static const char kDBusOwner[];
Jason Glasgowa585fc32012-06-06 11:04:09 -0400308 static const char kDBusService[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500309 static const char kDBusPath[];
310 static const char kTestCarrier[];
Darin Petkova4ca3c32012-08-17 16:05:24 +0200311 static const char kTestCarrierSPN[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500312 static const char kMEID[];
313 static const char kIMEI[];
314 static const char kIMSI[];
315 static const char kMSISDN[];
316 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500317 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500318
Darin Petkov0828f5f2011-08-11 10:18:52 -0700319 class TestProxyFactory : public ProxyFactory {
320 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700321 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700322
mukesh agrawal1830fa12011-09-26 14:31:40 -0700323 virtual ModemProxyInterface *CreateModemProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700324 const string &/*path*/,
325 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700326 return test_->proxy_.release();
327 }
328
329 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700330 const string &/*path*/,
331 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700332 return test_->simple_proxy_.release();
333 }
334
335 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700336 const string &/*path*/,
337 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700338 return test_->cdma_proxy_.release();
339 }
340
Darin Petkov975b5e72011-08-30 11:48:08 -0700341 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700342 const string &/*path*/,
343 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700344 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
345 // CellularCapabilityGSM::InitProperties (and thus
346 // CellularCapabilityGSM::GetIMSI) from being called during the
347 // construction. Remove this workaround after refactoring the tests.
348 return test_->create_gsm_card_proxy_from_factory_ ?
349 test_->gsm_card_proxy_.release() : NULL;
Darin Petkov975b5e72011-08-30 11:48:08 -0700350 }
351
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700352 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700353 const string &/*path*/,
354 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700355 return test_->gsm_network_proxy_.release();
356 }
357
Darin Petkov0828f5f2011-08-11 10:18:52 -0700358 private:
359 CellularTest *test_;
360 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700361 void StartRTNLHandler();
362 void StopRTNLHandler();
363
Ben Chan3ecdf822012-08-06 12:29:23 -0700364 void AllowCreateGSMCardProxyFromFactory() {
365 create_gsm_card_proxy_from_factory_ = true;
366 }
367
Darin Petkov721ac932011-11-16 15:43:09 +0100368 void SetCellularType(Cellular::Type type) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700369 device_->InitCapability(type);
Darin Petkov721ac932011-11-16 15:43:09 +0100370 }
371
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400372 CellularCapabilityClassic *GetCapabilityClassic() {
373 return dynamic_cast<CellularCapabilityClassic *>(
374 device_->capability_.get());
375 }
376
Darin Petkovae0c64e2011-11-15 15:50:27 +0100377 CellularCapabilityCDMA *GetCapabilityCDMA() {
378 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
379 }
380
381 CellularCapabilityGSM *GetCapabilityGSM() {
382 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
383 }
384
Ben Chan09fa2a02012-11-07 22:09:09 -0800385 CellularCapabilityUniversal *GetCapabilityUniversal() {
386 return dynamic_cast<CellularCapabilityUniversal *>(
387 device_->capability_.get());
388 }
389
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700390 // Different tests simulate a cellular service being set using a real /mock
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700391 // service.
Arman Ugurayf84a4242013-04-09 20:01:07 -0700392 CellularService *SetService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700393 device_->service_ = new CellularService(&modem_info_, device_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700394 return device_->service_;
395 }
Arman Ugurayf84a4242013-04-09 20:01:07 -0700396 MockCellularService *SetMockService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700397 device_->service_ = new MockCellularService(&modem_info_, device_);
398 return static_cast<MockCellularService *>(device_->service_.get());
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700399 }
400
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700401 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700402 MockModemInfo modem_info_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700403 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700404 NiceMock<MockRTNLHandler> rtnl_handler_;
405
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500406 MockDHCPProvider dhcp_provider_;
407 scoped_refptr<MockDHCPConfig> dhcp_config_;
408
Ben Chan3ecdf822012-08-06 12:29:23 -0700409 bool create_gsm_card_proxy_from_factory_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700410 scoped_ptr<MockModemProxy> proxy_;
411 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
412 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700413 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700414 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700415 TestProxyFactory proxy_factory_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700416 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700417};
418
Darin Petkov77cb6812011-08-15 16:19:41 -0700419const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700420const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700421const char CellularTest::kDBusOwner[] = ":1.19";
Jason Glasgowa585fc32012-06-06 11:04:09 -0400422const char CellularTest::kDBusService[] = "org.chromium.ModemManager";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700423const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700424const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Darin Petkova4ca3c32012-08-17 16:05:24 +0200425const char CellularTest::kTestCarrierSPN[] = "Home Provider";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500426const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700427const char CellularTest::kIMEI[] = "987654321098765";
428const char CellularTest::kIMSI[] = "123456789012345";
429const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200430const char CellularTest::kTestMobileProviderDBPath[] =
431 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500432const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700433
Darin Petkove9d12e02011-07-27 15:09:37 -0700434TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700435 EXPECT_EQ("CellularStateDisabled",
436 device_->GetStateString(Cellular::kStateDisabled));
437 EXPECT_EQ("CellularStateEnabled",
438 device_->GetStateString(Cellular::kStateEnabled));
439 EXPECT_EQ("CellularStateRegistered",
440 device_->GetStateString(Cellular::kStateRegistered));
441 EXPECT_EQ("CellularStateConnected",
442 device_->GetStateString(Cellular::kStateConnected));
443 EXPECT_EQ("CellularStateLinked",
444 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700445}
446
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700447TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100448 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400449 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700450 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500451 Error error;
452 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700453 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400454 EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
455 EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700456 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700457 ASSERT_TRUE(device_->service_.get());
458 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100459 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700460 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700461 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700462}
463
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700464TEST_F(CellularTest, StartGSMRegister) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700465 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500466 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500467 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500468 EXPECT_CALL(*gsm_card_proxy_,
469 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500470 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500471 EXPECT_CALL(*gsm_card_proxy_,
472 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500473 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500474 EXPECT_CALL(*gsm_card_proxy_,
475 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500476 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
477 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500478 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500479 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700480 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
481 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100482 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
483 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200486 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500487 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500488 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500489 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500490 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
491 .Times(2)
492 .WillRepeatedly(Invoke(this,
493 &CellularTest::InvokeGetSignalQuality));
494 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700495 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Ben Chan3ecdf822012-08-06 12:29:23 -0700496 AllowCreateGSMCardProxyFromFactory();
497
Eric Shienbrood9a245532012-03-07 14:20:39 -0500498 Error error;
499 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
500 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700501 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400502 EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
503 EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200504 EXPECT_EQ(kTestCarrierSPN, GetCapabilityGSM()->spn_);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400505 EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700506 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
507 ASSERT_TRUE(device_->service_.get());
508 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100509 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100510 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700511 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700512 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200513 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200514 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Darin Petkov137884a2011-10-26 18:52:47 +0200515 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700516}
517
Darin Petkovbac96002011-08-09 13:22:00 -0700518TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700519 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
520 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100521 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700522 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400523 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400524 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500525 Error error;
526 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
527 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700528 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700529 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
530}
531
Darin Petkov0828f5f2011-08-11 10:18:52 -0700532TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700533 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
534 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100535 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700536 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400537 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400538 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700539 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700540 .WillOnce(Return(dhcp_config_));
541 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700542 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_)).Times(3);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500543 Error error;
544 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
545 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700546 dispatcher_.DispatchPendingEvents();
547 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700548 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
549 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700550}
551
Darin Petkov3335b372011-08-22 11:05:32 -0700552TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100553 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700554 static const char kPaymentURL[] = "https://payment.url";
555 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700556 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100557 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100558 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700559 device_->CreateService();
560 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100561 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700562 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
563 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800564 ASSERT_FALSE(device_->service_->activate_over_non_cellular_network());
Darin Petkov3335b372011-08-22 11:05:32 -0700565}
566
Darin Petkovc5f56562011-08-06 16:40:05 -0700567namespace {
568
569MATCHER(ContainsPhoneNumber, "") {
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400570 return ContainsKey(arg,
571 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700572}
573
Eric Shienbrood9a245532012-03-07 14:20:39 -0500574} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700575
576TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700577 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700578 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700579 .Times(2)
580 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700581 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700582 device_->Connect(&error);
583 EXPECT_EQ(Error::kAlreadyConnected, error.type());
584 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700585
Darin Petkov0828f5f2011-08-11 10:18:52 -0700586 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700587 device_->Connect(&error);
588 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700589
Thieu Lec7d8cd12013-02-13 11:38:14 -0800590 device_->state_ = Cellular::kStateEnabled;
591 device_->Connect(&error);
592 EXPECT_EQ(Error::kNotRegistered, error.type());
593
594 error.Reset();
595 device_->state_ = Cellular::kStateDisabled;
596 device_->Connect(&error);
597 EXPECT_EQ(Error::kNotRegistered, error.type());
598
Darin Petkovc5f56562011-08-06 16:40:05 -0700599 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700600 SetService();
Darin Petkovd2045802011-08-23 11:09:25 -0700601
Jason Glasgow7b461df2012-05-01 16:38:45 -0400602 device_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100603 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700604 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700605 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500606
Darin Petkov4d6d9412011-08-24 13:19:54 -0700607 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500608 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500609 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500610 CellularCapability::kTimeoutConnect))
611 .Times(2)
612 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400613 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100614 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500615 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700616 device_->Connect(&error);
617 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700618 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500619 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
620
Jason Glasgow7b461df2012-05-01 16:38:45 -0400621 device_->allow_roaming_ = true;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500622 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
623 device_->state_ = Cellular::kStateRegistered;
624 device_->Connect(&error);
625 EXPECT_TRUE(error.IsSuccess());
626 dispatcher_.DispatchPendingEvents();
627 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700628}
629
Eric Shienbrood9a245532012-03-07 14:20:39 -0500630TEST_F(CellularTest, Disconnect) {
631 Error error;
632 device_->state_ = Cellular::kStateRegistered;
633 device_->Disconnect(&error);
634 EXPECT_EQ(Error::kNotConnected, error.type());
635 error.Reset();
636
Darin Petkovfb0625e2012-01-16 13:05:56 +0100637 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500638 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800639 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood9a245532012-03-07 14:20:39 -0500640 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400641 GetCapabilityClassic()->proxy_.reset(proxy_.release());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500642 device_->Disconnect(&error);
643 EXPECT_TRUE(error.IsSuccess());
644 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100645}
646
Arman Uguray539c4232012-09-11 10:00:22 -0700647TEST_F(CellularTest, DisconnectFailure) {
648 // Test the case where the underlying modem state is set
649 // to disconnecting, but shill thinks it's still connected
650 Error error;
651 device_->state_ = Cellular::kStateConnected;
652 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800653 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Arman Uguray539c4232012-09-11 10:00:22 -0700654 .Times(2)
655 .WillRepeatedly(Invoke(this, &CellularTest::InvokeDisconnectFail));
656 GetCapabilityClassic()->proxy_.reset(proxy_.release());
657 device_->modem_state_ = Cellular::kModemStateDisconnecting;
658 device_->Disconnect(&error);
659 EXPECT_TRUE(error.IsFailure());
660 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
661
662 device_->modem_state_ = Cellular::kModemStateConnected;
663 device_->Disconnect(&error);
664 EXPECT_TRUE(error.IsFailure());
665 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
666}
667
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400668TEST_F(CellularTest, ConnectFailure) {
669 SetCellularType(Cellular::kTypeCDMA);
670 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700671 SetService();
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400672 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
673 EXPECT_CALL(*simple_proxy_,
674 Connect(_, _, _, CellularCapability::kTimeoutConnect))
675 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400676 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400677 Error error;
678 device_->Connect(&error);
679 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
680}
681
Thieu Leb5954a22012-05-18 10:37:34 -0700682TEST_F(CellularTest, ConnectFailureNoService) {
683 // Make sure we don't crash if the connect failed and there is no
684 // CellularService object. This can happen if the modem is enabled and
685 // then quick disabled.
686 SetCellularType(Cellular::kTypeCDMA);
687 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700688 SetService();
Thieu Leb5954a22012-05-18 10:37:34 -0700689 EXPECT_CALL(
690 *simple_proxy_,
691 Connect(_, _, _, CellularCapability::kTimeoutConnect))
692 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700693 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700694 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
695 Error error;
696 device_->Connect(&error);
697}
698
Arman Uguray32c76402012-11-27 14:01:13 -0800699TEST_F(CellularTest, LinkEventWontDestroyService) {
700 // If the network interface goes down, Cellular::LinkEvent should
701 // drop the connection but the service object should persist.
702 device_->state_ = Cellular::kStateLinked;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700703 CellularService *service = SetService();
Arman Uguray32c76402012-11-27 14:01:13 -0800704 device_->LinkEvent(0, 0); // flags doesn't contain IFF_UP
705 EXPECT_EQ(device_->state_, Cellular::kStateConnected);
706 EXPECT_EQ(device_->service_, service);
707}
708
Arman Ugurayed8e6102012-11-29 14:47:20 -0800709TEST_F(CellularTest, UseNoArpGateway) {
710 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, false))
711 .WillOnce(Return(dhcp_config_));
712 device_->AcquireIPConfig();
713}
714
Ben Chan09fa2a02012-11-07 22:09:09 -0800715TEST_F(CellularTest, HandleNewRegistrationStateForServiceRequiringActivation) {
716 SetCellularType(Cellular::kTypeUniversal);
717
718 // Service activation is needed
719 GetCapabilityUniversal()->mdn_ = "0000000000";
Arman Ugurayf4c61812013-01-10 18:58:39 -0800720 CellularService::OLP olp;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700721 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
Arman Ugurayf4c61812013-01-10 18:58:39 -0800722 .WillRepeatedly(Return(&olp));
Arman Uguray41cc6342013-03-29 16:34:39 -0700723 EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
724 GetActivationState(_,_))
725 .WillRepeatedly(Return(PendingActivationStore::kStateUnknown));
Ben Chan09fa2a02012-11-07 22:09:09 -0800726
727 device_->state_ = Cellular::kStateDisabled;
728 device_->HandleNewRegistrationState();
729 EXPECT_FALSE(device_->service_.get());
730
731 device_->state_ = Cellular::kStateEnabled;
732 device_->HandleNewRegistrationState();
733 EXPECT_TRUE(device_->service_.get());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800734 EXPECT_TRUE(device_->service_->activate_over_non_cellular_network());
Ben Chan09fa2a02012-11-07 22:09:09 -0800735}
736
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400737TEST_F(CellularTest, ModemStateChangeEnable) {
738 EXPECT_CALL(*simple_proxy_,
739 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
740 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
741 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
742 EXPECT_CALL(*proxy_,
743 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
744 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
745 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
746 .WillOnce(Invoke(this,
747 &CellularTest::InvokeGetRegistrationStateUnregistered));
748 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
749 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700750 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400751 device_->state_ = Cellular::kStateDisabled;
752 device_->set_modem_state(Cellular::kModemStateDisabled);
753 SetCellularType(Cellular::kTypeCDMA);
754
755 DBusPropertiesMap props;
756 props[CellularCapabilityClassic::kModemPropertyEnabled].writer().
757 append_bool(true);
758 device_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
759 dispatcher_.DispatchPendingEvents();
760
761 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
762 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
763 EXPECT_TRUE(device_->enabled());
764}
765
766TEST_F(CellularTest, ModemStateChangeDisable) {
767 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800768 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400769 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
770 EXPECT_CALL(*proxy_,
Thieu Lec8d2d962012-05-15 14:31:18 -0700771 Enable(false, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400772 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700773 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400774 device_->enabled_ = true;
775 device_->enabled_pending_ = true;
776 device_->state_ = Cellular::kStateEnabled;
777 device_->set_modem_state(Cellular::kModemStateEnabled);
778 SetCellularType(Cellular::kTypeCDMA);
779 GetCapabilityClassic()->InitProxies();
780
781 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
782 kModemClassicStateDisabled,
783 0);
784 dispatcher_.DispatchPendingEvents();
785
786 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
787 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
788 EXPECT_FALSE(device_->enabled());
789}
790
Thieu Led0012052012-07-25 16:09:09 -0700791TEST_F(CellularTest, ModemStateChangeStaleConnected) {
792 // Test to make sure that we ignore stale modem Connected state transitions.
793 // When a modem is asked to connect and before the connect completes, the
794 // modem is disabled, it may send a stale Connected state transition after
795 // it has been disabled.
796 device_->state_ = Cellular::kStateDisabled;
797 device_->OnModemStateChanged(Cellular::kModemStateEnabling,
798 Cellular::kModemStateConnected,
799 0);
800 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
801}
802
803TEST_F(CellularTest, ModemStateChangeValidConnected) {
804 device_->state_ = Cellular::kStateEnabled;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700805 SetService();
Thieu Led0012052012-07-25 16:09:09 -0700806 device_->OnModemStateChanged(Cellular::kModemStateConnecting,
807 Cellular::kModemStateConnected,
808 0);
809 EXPECT_EQ(Cellular::kStateConnected, device_->state());
810}
811
Thieu Le5218cf22012-11-26 11:52:57 -0800812TEST_F(CellularTest, ModemStateChangeLostRegistration) {
813 SetCellularType(Cellular::kTypeUniversal);
814 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
815 capability->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
816 EXPECT_TRUE(capability->IsRegistered());
817 device_->OnModemStateChanged(Cellular::kModemStateRegistered,
818 Cellular::kModemStateEnabled,
819 0);
820 EXPECT_FALSE(capability->IsRegistered());
821}
822
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700823TEST_F(CellularTest, EnableTrafficMonitor) {
824 SetCellularType(Cellular::kTypeUniversal);
825 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
826 capability->model_id_.clear();
827 EXPECT_CALL(*this, TestCallback(IsSuccess()));
828 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
829 Unretained(this)),
830 Error(Error::kSuccess));
831 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700832 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700833
834 device_->state_ = Cellular::kStateDisabled;
835
836 capability->model_id_ = CellularCapabilityUniversal::kE362ModelId;
837 EXPECT_CALL(*this, TestCallback(IsFailure()));
838 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
839 Unretained(this)),
840 Error(Error::kOperationFailed));
841 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700842 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700843
844 EXPECT_CALL(*this, TestCallback(IsSuccess()));
845 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
846 Unretained(this)),
847 Error(Error::kSuccess));
848 EXPECT_TRUE(device_->traffic_monitor_enabled());
849}
850
Thieu Le37b90032012-05-15 15:18:41 -0700851TEST_F(CellularTest, StartModemCallback) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700852 EXPECT_CALL(*this, TestCallback(IsSuccess()));
853 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700854 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
855 Unretained(this)),
856 Error(Error::kSuccess));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700857 EXPECT_EQ(device_->state_, Cellular::kStateEnabled);
858}
859
Thieu Le37b90032012-05-15 15:18:41 -0700860TEST_F(CellularTest, StartModemCallbackFail) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700861 EXPECT_CALL(*this, TestCallback(IsFailure()));
862 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700863 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
864 Unretained(this)),
865 Error(Error::kOperationFailed));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700866 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
867}
868
Thieu Le37b90032012-05-15 15:18:41 -0700869TEST_F(CellularTest, StopModemCallback) {
870 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700871 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700872 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
873 Unretained(this)),
874 Error(Error::kSuccess));
875 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
876 EXPECT_FALSE(device_->service_.get());
877}
878
879TEST_F(CellularTest, StopModemCallbackFail) {
880 EXPECT_CALL(*this, TestCallback(IsFailure()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700881 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700882 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
883 Unretained(this)),
884 Error(Error::kOperationFailed));
885 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
886 EXPECT_FALSE(device_->service_.get());
887}
888
Arman Ugurayf84a4242013-04-09 20:01:07 -0700889TEST_F(CellularTest, OnConnectionHealthCheckerResult) {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700890 MockCellularService *service(SetMockService());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700891 EXPECT_FALSE(service->out_of_credits_);
892
893 EXPECT_CALL(*service, Disconnect(_)).Times(0);
894 device_->OnConnectionHealthCheckerResult(
895 ConnectionHealthChecker::kResultUnknown);
896 EXPECT_FALSE(service->out_of_credits_);
897 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700898 ConnectionHealthChecker::kResultConnectionFailure);
899 EXPECT_FALSE(service->out_of_credits_);
900 Mock::VerifyAndClearExpectations(service);
901
902 EXPECT_CALL(*service, Disconnect(_)).Times(1);
903 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700904 ConnectionHealthChecker::kResultCongestedTxQueue);
905 EXPECT_TRUE(service->out_of_credits_);
906
907 // Don't leak the service object.
908 device_->service_ = NULL;
909}
910
Liam McLoughlin0fec81c2013-02-28 10:31:47 -0500911// The following test crashes under Clang
912// Disabling it for now (crosbug.com/39351)
913#if defined(__clang__)
914 #define MAYBE_ConnectAddsTerminationAction \
915 DISABLED_ConnectAddsTerminationAction
916#else
917 #define MAYBE_ConnectAddsTerminationAction \
918 ConnectAddsTerminationAction
919#endif // defined(__clang__)
920
921TEST_F(CellularTest, MAYBE_ConnectAddsTerminationAction) {
Gary Moraina9fb3252012-05-31 12:05:31 -0700922 Error error;
923 EXPECT_CALL(*simple_proxy_,
924 Connect(ContainsPhoneNumber(), _, _,
925 CellularCapability::kTimeoutConnect))
926 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
927 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800928 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Gary Moraina9fb3252012-05-31 12:05:31 -0700929 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
930
931 // TestCallback() will be called when the termination actions complete. This
932 // verifies that the actions were registered, invoked, and report their
933 // status.
934 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
935
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700936 SetService();
Gary Moraina9fb3252012-05-31 12:05:31 -0700937 GetCapabilityClassic()->proxy_.reset(proxy_.release());
938 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
939 device_->state_ = Cellular::kStateRegistered;
940 device_->Connect(&error);
941 EXPECT_TRUE(error.IsSuccess());
942 dispatcher_.DispatchPendingEvents();
943 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
944
945 // If the action of establishing a connection registered a termination action
946 // with the manager, then running the termination action will result in a
947 // disconnect.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700948 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200949 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700950 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
951 dispatcher_.DispatchPendingEvents();
952
953 // Verify that the termination action has been removed from the manager.
954 // Running the registered termination actions again should result in
955 // TestCallback being called with success because there are no registered
956 // termination actions.. If the termination action is not removed, then
957 // TestCallback will be called with kOperationTimeout.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700958 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200959 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700960 dispatcher_.DispatchPendingEvents();
961}
962
Darin Petkove7c6ad32012-06-29 10:22:09 +0200963TEST_F(CellularTest, SetAllowRoaming) {
964 EXPECT_FALSE(device_->allow_roaming_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700965 EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
Darin Petkove7c6ad32012-06-29 10:22:09 +0200966 Error error;
967 device_->SetAllowRoaming(true, &error);
968 EXPECT_TRUE(error.IsSuccess());
969 EXPECT_TRUE(device_->allow_roaming_);
970}
971
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700972// Custom property setters should return false, and make no changes, if
973// the new value is the same as the old value.
974TEST_F(CellularTest, CustomSetterNoopChange) {
975 Error error;
976 EXPECT_FALSE(device_->allow_roaming_);
977 EXPECT_FALSE(device_->SetAllowRoaming(false, &error));
978 EXPECT_TRUE(error.IsSuccess());
979}
980
Chris Masoneb925cc82011-06-22 15:39:57 -0700981} // namespace shill