blob: 892da299b6d7fdee8c2aea50a205a06fa7f98430 [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"
mukesh agrawalfbc40d22013-06-28 00:25:13 -070025#include "shill/mock_external_task.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070026#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070027#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070028#include "shill/mock_modem_gsm_network_proxy.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070029#include "shill/mock_modem_info.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070030#include "shill/mock_modem_proxy.h"
Darin Petkove604f702011-07-28 15:51:17 -070031#include "shill/mock_modem_simple_proxy.h"
mukesh agrawal5d851b12013-07-11 14:09:41 -070032#include "shill/mock_ppp_device.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070033#include "shill/mock_rtnl_handler.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070034#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070035#include "shill/proxy_factory.h"
mukesh agrawalfbc40d22013-06-28 00:25:13 -070036#include "shill/rpc_task.h" // for RpcTaskDelegate
Chris Masoneb925cc82011-06-22 15:39:57 -070037
Ben Chan09fa2a02012-11-07 22:09:09 -080038// mm/mm-modem.h must be included after cellular_capability_universal.h
39// in order to allow MM_MODEM_CDMA_* to be defined properly.
40#include <mm/mm-modem.h>
41
Eric Shienbrood9a245532012-03-07 14:20:39 -050042using base::Bind;
43using base::Unretained;
Darin Petkovc0865312011-09-16 15:31:20 -070044using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070045using std::string;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040046using std::vector;
Darin Petkovbec79a22011-08-01 14:47:17 -070047using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070048using testing::AnyNumber;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050049using testing::Invoke;
Arman Ugurayf84a4242013-04-09 20:01:07 -070050using testing::Mock;
Darin Petkov0828f5f2011-08-11 10:18:52 -070051using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070052using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070053using testing::SetArgumentPointee;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050054using testing::Unused;
Chris Masoneb925cc82011-06-22 15:39:57 -070055
56namespace shill {
57
Eric Shienbrood9a245532012-03-07 14:20:39 -050058MATCHER(IsSuccess, "") {
59 return arg.IsSuccess();
60}
61
Gary Morainbaeefdf2012-04-30 14:53:35 -070062MATCHER(IsFailure, "") {
63 return arg.IsFailure();
64}
65
Darin Petkov0828f5f2011-08-11 10:18:52 -070066class CellularPropertyTest : public PropertyStoreTest {
67 public:
68 CellularPropertyTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070069 : modem_info_(control_interface(),
70 dispatcher(),
71 metrics(),
72 manager(),
73 glib()),
74 device_(new Cellular(&modem_info_,
Darin Petkove9d12e02011-07-27 15:09:37 -070075 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070076 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070077 3,
Ben Chan3ecdf822012-08-06 12:29:23 -070078 Cellular::kTypeCDMA,
Darin Petkov0828f5f2011-08-11 10:18:52 -070079 "",
Darin Petkov137884a2011-10-26 18:52:47 +020080 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040081 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070082 ProxyFactory::GetInstance())) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070083 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070084
Chris Masoneb925cc82011-06-22 15:39:57 -070085 protected:
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070086 MockModemInfo modem_info_;
Darin Petkov0828f5f2011-08-11 10:18:52 -070087 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070088};
89
Darin Petkov0828f5f2011-08-11 10:18:52 -070090TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070091 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
92 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070093}
94
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080095TEST_F(CellularPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070096 {
97 ::DBus::Error error;
mukesh agrawalbebf1b82013-04-23 15:06:33 -070098 ::DBus::Variant allow_roaming;
99 allow_roaming.writer().append_bool(true);
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800100 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700101 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700102 flimflam::kCellularAllowRoamingProperty,
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700103 allow_roaming,
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 &error));
105 }
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 // Ensure that attempting to write a R/O property returns InvalidArgs error.
107 {
108 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800109 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
110 flimflam::kAddressProperty,
111 PropertyStoreTest::kStringV,
112 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700113 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700114 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 }
116 {
117 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800118 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
119 flimflam::kCarrierProperty,
120 PropertyStoreTest::kStringV,
121 &error));
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700122 ASSERT_TRUE(error.is_set()); // name() may be invalid otherwise
Chris Masone9d779932011-08-25 16:33:41 -0700123 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700124 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700125}
126
Darin Petkov0828f5f2011-08-11 10:18:52 -0700127class CellularTest : public testing::Test {
128 public:
129 CellularTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700130 : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
131 device_info_(modem_info_.control_interface(), &dispatcher_,
132 modem_info_.metrics(), modem_info_.manager()),
133 dhcp_config_(new MockDHCPConfig(modem_info_.control_interface(),
Paul Stewartd408fdf2012-05-07 17:15:57 -0700134 kTestDeviceName)),
Ben Chan3ecdf822012-08-06 12:29:23 -0700135 create_gsm_card_proxy_from_factory_(false),
136 proxy_(new MockModemProxy()),
137 simple_proxy_(new MockModemSimpleProxy()),
138 cdma_proxy_(new MockModemCDMAProxy()),
139 gsm_card_proxy_(new MockModemGSMCardProxy()),
140 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
141 proxy_factory_(this),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700142 device_(new Cellular(&modem_info_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700143 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700144 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700145 3,
146 Cellular::kTypeGSM,
147 kDBusOwner,
Jason Glasgowa585fc32012-06-06 11:04:09 -0400148 kDBusService,
Darin Petkov137884a2011-10-26 18:52:47 +0200149 kDBusPath,
Thieu Lece4483e2013-01-23 15:12:03 -0800150 &proxy_factory_)) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700151 modem_info_.metrics()->RegisterDevice(device_->interface_index(),
152 Technology::kCellular);
Darin Petkov137884a2011-10-26 18:52:47 +0200153 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700154
155 virtual void SetUp() {
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700156 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700157 device_->set_dhcp_provider(&dhcp_provider_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700158 EXPECT_CALL(*modem_info_.mock_manager(), device_info())
159 .WillRepeatedly(Return(&device_info_));
160 EXPECT_CALL(*modem_info_.mock_manager(), DeregisterService(_))
161 .Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700162 }
163
164 virtual void TearDown() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500165 device_->DestroyIPConfig();
Darin Petkovfb0625e2012-01-16 13:05:56 +0100166 device_->state_ = Cellular::kStateDisabled;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500167 device_->capability_->ReleaseProxies();
Darin Petkov77cb6812011-08-15 16:19:41 -0700168 device_->set_dhcp_provider(NULL);
mukesh agrawal0381f9a2013-07-11 16:41:52 -0700169 // Break cycle between Cellular and CellularService.
170 device_->service_ = NULL;
171 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700172 }
173
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700174 void InitProviderDB() {
175 modem_info_.SetProviderDB(kTestMobileProviderDBPath);
176 }
177
Eric Shienbrood9a245532012-03-07 14:20:39 -0500178 void InvokeEnable(bool enable, Error *error,
179 const ResultCallback &callback, int timeout) {
180 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500181 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500182 void InvokeGetSignalQuality(Error *error,
183 const SignalQualityCallback &callback,
184 int timeout) {
185 callback.Run(kStrength, Error());
186 }
187 void InvokeGetModemStatus(Error *error,
188 const DBusPropertyMapCallback &callback,
189 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500190 DBusPropertiesMap props;
191 props["carrier"].writer().append_string(kTestCarrier);
192 props["unknown-property"].writer().append_string("irrelevant-value");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500193 callback.Run(props, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500194 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500195 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
196 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500197 static const char kManufacturer[] = "Company";
198 static const char kModelID[] = "Gobi 2000";
199 static const char kHWRev[] = "A00B1234";
200 ModemHardwareInfo info;
201 info._1 = kManufacturer;
202 info._2 = kModelID;
203 info._3 = kHWRev;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500204 callback.Run(info, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500205 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500206 void InvokeGetRegistrationState1X(Error *error,
207 const RegistrationStateCallback &callback,
208 int timeout) {
209 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
210 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
211 Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500212 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500213 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
214 int timeout) {
215 callback.Run(kIMEI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500216 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500217 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
218 int timeout) {
219 callback.Run(kIMSI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500220 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500221 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
222 int timeout) {
223 callback.Run(kMSISDN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500224 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500225 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
226 int timeout) {
Darin Petkova4ca3c32012-08-17 16:05:24 +0200227 callback.Run(kTestCarrierSPN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500228 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500229 void InvokeGetRegistrationInfo(Error *error,
230 const RegistrationInfoCallback &callback,
231 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500232 static const char kNetworkID[] = "22803";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500233 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
234 kNetworkID, kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500235 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500236 void InvokeRegister(const string &network_id,
237 Error *error,
238 const ResultCallback &callback,
239 int timeout) {
240 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500241 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500242 void InvokeGetRegistrationState(Error *error,
243 const RegistrationStateCallback &callback,
244 int timeout) {
245 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
246 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
247 Error());
248 }
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400249 void InvokeGetRegistrationStateUnregistered(
250 Error *error,
251 const RegistrationStateCallback &callback,
252 int timeout) {
253 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
254 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
255 Error());
Arman Uguray539c4232012-09-11 10:00:22 -0700256 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500257 void InvokeConnect(DBusPropertiesMap props, Error *error,
258 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400259 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500260 callback.Run(Error());
261 }
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400262 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
Thieu Leb5954a22012-05-18 10:37:34 -0700263 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400264 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
265 callback.Run(Error(Error::kNotOnHomeNetwork));
266 }
Thieu Leb5954a22012-05-18 10:37:34 -0700267 void InvokeConnectFailNoService(DBusPropertiesMap props, Error *error,
268 const ResultCallback &callback, int timeout) {
269 device_->service_ = NULL;
270 callback.Run(Error(Error::kNotOnHomeNetwork));
271 }
Thieu Led4974cd2013-05-23 10:39:28 -0700272 void InvokeConnectSuccessNoService(DBusPropertiesMap props, Error *error,
273 const ResultCallback &callback,
274 int timeout) {
275 device_->service_ = NULL;
276 callback.Run(Error());
277 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500278 void InvokeDisconnect(Error *error, const ResultCallback &callback,
279 int timeout) {
280 if (!callback.is_null())
281 callback.Run(Error());
282 }
Arman Uguray539c4232012-09-11 10:00:22 -0700283 void InvokeDisconnectFail(Error *error, const ResultCallback &callback,
284 int timeout) {
285 error->Populate(Error::kOperationFailed);
286 if (!callback.is_null())
287 callback.Run(*error);
288 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500289
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400290 void ExpectCdmaStartModem(string network_technology) {
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400291 if (!device_->IsUnderlyingDeviceEnabled())
292 EXPECT_CALL(*proxy_,
293 Enable(true, _, _, CellularCapability::kTimeoutEnable))
294 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400295 EXPECT_CALL(*simple_proxy_,
296 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
297 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
298 EXPECT_CALL(*proxy_,
299 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
300 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
301 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
302 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400303 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400304 else
305 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400306 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400307 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
308 .Times(2)
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400309 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400310 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700311 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400312 }
313
Eric Shienbrood9a245532012-03-07 14:20:39 -0500314 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500315
Darin Petkov0828f5f2011-08-11 10:18:52 -0700316 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500317 static const char kTestDeviceName[];
318 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500319 static const char kDBusOwner[];
Jason Glasgowa585fc32012-06-06 11:04:09 -0400320 static const char kDBusService[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500321 static const char kDBusPath[];
322 static const char kTestCarrier[];
Darin Petkova4ca3c32012-08-17 16:05:24 +0200323 static const char kTestCarrierSPN[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500324 static const char kMEID[];
325 static const char kIMEI[];
326 static const char kIMSI[];
327 static const char kMSISDN[];
328 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500329 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500330
Darin Petkov0828f5f2011-08-11 10:18:52 -0700331 class TestProxyFactory : public ProxyFactory {
332 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700333 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700334
mukesh agrawal1830fa12011-09-26 14:31:40 -0700335 virtual ModemProxyInterface *CreateModemProxy(
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_->proxy_.release();
339 }
340
341 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700342 const string &/*path*/,
343 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700344 return test_->simple_proxy_.release();
345 }
346
347 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700348 const string &/*path*/,
349 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700350 return test_->cdma_proxy_.release();
351 }
352
Darin Petkov975b5e72011-08-30 11:48:08 -0700353 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700354 const string &/*path*/,
355 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700356 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
357 // CellularCapabilityGSM::InitProperties (and thus
358 // CellularCapabilityGSM::GetIMSI) from being called during the
359 // construction. Remove this workaround after refactoring the tests.
360 return test_->create_gsm_card_proxy_from_factory_ ?
361 test_->gsm_card_proxy_.release() : NULL;
Darin Petkov975b5e72011-08-30 11:48:08 -0700362 }
363
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700364 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700365 const string &/*path*/,
366 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700367 return test_->gsm_network_proxy_.release();
368 }
369
Darin Petkov0828f5f2011-08-11 10:18:52 -0700370 private:
371 CellularTest *test_;
372 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700373 void StartRTNLHandler();
374 void StopRTNLHandler();
375
Ben Chan3ecdf822012-08-06 12:29:23 -0700376 void AllowCreateGSMCardProxyFromFactory() {
377 create_gsm_card_proxy_from_factory_ = true;
378 }
379
Darin Petkov721ac932011-11-16 15:43:09 +0100380 void SetCellularType(Cellular::Type type) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700381 device_->InitCapability(type);
Darin Petkov721ac932011-11-16 15:43:09 +0100382 }
383
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400384 CellularCapabilityClassic *GetCapabilityClassic() {
385 return dynamic_cast<CellularCapabilityClassic *>(
386 device_->capability_.get());
387 }
388
Darin Petkovae0c64e2011-11-15 15:50:27 +0100389 CellularCapabilityCDMA *GetCapabilityCDMA() {
390 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
391 }
392
393 CellularCapabilityGSM *GetCapabilityGSM() {
394 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
395 }
396
Ben Chan09fa2a02012-11-07 22:09:09 -0800397 CellularCapabilityUniversal *GetCapabilityUniversal() {
398 return dynamic_cast<CellularCapabilityUniversal *>(
399 device_->capability_.get());
400 }
401
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700402 // Different tests simulate a cellular service being set using a real /mock
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700403 // service.
Arman Ugurayf84a4242013-04-09 20:01:07 -0700404 CellularService *SetService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700405 device_->service_ = new CellularService(&modem_info_, device_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700406 return device_->service_;
407 }
Arman Ugurayf84a4242013-04-09 20:01:07 -0700408 MockCellularService *SetMockService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700409 device_->service_ = new MockCellularService(&modem_info_, device_);
410 return static_cast<MockCellularService *>(device_->service_.get());
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700411 }
412
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700413 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700414 MockModemInfo modem_info_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700415 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700416 NiceMock<MockRTNLHandler> rtnl_handler_;
417
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500418 MockDHCPProvider dhcp_provider_;
419 scoped_refptr<MockDHCPConfig> dhcp_config_;
420
Ben Chan3ecdf822012-08-06 12:29:23 -0700421 bool create_gsm_card_proxy_from_factory_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700422 scoped_ptr<MockModemProxy> proxy_;
423 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
424 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700425 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700426 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700427 TestProxyFactory proxy_factory_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700428 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700429};
430
Darin Petkov77cb6812011-08-15 16:19:41 -0700431const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700432const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700433const char CellularTest::kDBusOwner[] = ":1.19";
Jason Glasgowa585fc32012-06-06 11:04:09 -0400434const char CellularTest::kDBusService[] = "org.chromium.ModemManager";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700435const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700436const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Darin Petkova4ca3c32012-08-17 16:05:24 +0200437const char CellularTest::kTestCarrierSPN[] = "Home Provider";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500438const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700439const char CellularTest::kIMEI[] = "987654321098765";
440const char CellularTest::kIMSI[] = "123456789012345";
441const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200442const char CellularTest::kTestMobileProviderDBPath[] =
443 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500444const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700445
Darin Petkove9d12e02011-07-27 15:09:37 -0700446TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700447 EXPECT_EQ("CellularStateDisabled",
448 device_->GetStateString(Cellular::kStateDisabled));
449 EXPECT_EQ("CellularStateEnabled",
450 device_->GetStateString(Cellular::kStateEnabled));
451 EXPECT_EQ("CellularStateRegistered",
452 device_->GetStateString(Cellular::kStateRegistered));
453 EXPECT_EQ("CellularStateConnected",
454 device_->GetStateString(Cellular::kStateConnected));
455 EXPECT_EQ("CellularStateLinked",
456 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700457}
458
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700459TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100460 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400461 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700462 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500463 Error error;
464 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700465 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400466 EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
467 EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700468 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700469 ASSERT_TRUE(device_->service_.get());
470 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100471 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700472 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700473 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700474}
475
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700476TEST_F(CellularTest, StartGSMRegister) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700477 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500478 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500479 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500480 EXPECT_CALL(*gsm_card_proxy_,
481 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500482 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500483 EXPECT_CALL(*gsm_card_proxy_,
484 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500486 EXPECT_CALL(*gsm_card_proxy_,
487 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500488 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
489 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500490 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500491 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700492 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
493 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100494 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
495 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500496 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500497 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200498 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500499 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500500 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500501 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500502 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
503 .Times(2)
504 .WillRepeatedly(Invoke(this,
505 &CellularTest::InvokeGetSignalQuality));
506 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700507 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Ben Chan3ecdf822012-08-06 12:29:23 -0700508 AllowCreateGSMCardProxyFromFactory();
509
Eric Shienbrood9a245532012-03-07 14:20:39 -0500510 Error error;
511 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
512 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700513 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400514 EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
515 EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200516 EXPECT_EQ(kTestCarrierSPN, GetCapabilityGSM()->spn_);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400517 EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700518 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
519 ASSERT_TRUE(device_->service_.get());
520 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100521 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100522 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700523 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700524 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200525 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200526 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Darin Petkov137884a2011-10-26 18:52:47 +0200527 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700528}
529
Darin Petkovbac96002011-08-09 13:22:00 -0700530TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700531 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
532 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100533 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700534 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400535 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400536 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500537 Error error;
538 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
539 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700540 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700541 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
542}
543
Darin Petkov0828f5f2011-08-11 10:18:52 -0700544TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700545 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
546 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100547 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700548 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400549 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400550 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700551 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700552 .WillOnce(Return(dhcp_config_));
553 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700554 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_)).Times(3);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500555 Error error;
556 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
557 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700558 dispatcher_.DispatchPendingEvents();
559 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700560 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
561 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700562}
563
Darin Petkov3335b372011-08-22 11:05:32 -0700564TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100565 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700566 static const char kPaymentURL[] = "https://payment.url";
567 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700568 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100569 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100570 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700571 device_->CreateService();
572 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100573 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700574 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
575 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800576 ASSERT_FALSE(device_->service_->activate_over_non_cellular_network());
Darin Petkov3335b372011-08-22 11:05:32 -0700577}
578
Darin Petkovc5f56562011-08-06 16:40:05 -0700579namespace {
580
581MATCHER(ContainsPhoneNumber, "") {
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400582 return ContainsKey(arg,
583 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700584}
585
Eric Shienbrood9a245532012-03-07 14:20:39 -0500586} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700587
588TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700589 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700590 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700591 .Times(2)
592 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700593 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700594 device_->Connect(&error);
595 EXPECT_EQ(Error::kAlreadyConnected, error.type());
596 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700597
Darin Petkov0828f5f2011-08-11 10:18:52 -0700598 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700599 device_->Connect(&error);
600 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700601
Thieu Lec7d8cd12013-02-13 11:38:14 -0800602 device_->state_ = Cellular::kStateEnabled;
603 device_->Connect(&error);
604 EXPECT_EQ(Error::kNotRegistered, error.type());
605
606 error.Reset();
607 device_->state_ = Cellular::kStateDisabled;
608 device_->Connect(&error);
609 EXPECT_EQ(Error::kNotRegistered, error.type());
610
Darin Petkovc5f56562011-08-06 16:40:05 -0700611 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700612 SetService();
Darin Petkovd2045802011-08-23 11:09:25 -0700613
Jason Glasgow7b461df2012-05-01 16:38:45 -0400614 device_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100615 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700616 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700617 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500618
Darin Petkov4d6d9412011-08-24 13:19:54 -0700619 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500620 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500621 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500622 CellularCapability::kTimeoutConnect))
623 .Times(2)
624 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400625 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100626 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500627 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700628 device_->Connect(&error);
629 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700630 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500631 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
632
Jason Glasgow7b461df2012-05-01 16:38:45 -0400633 device_->allow_roaming_ = true;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500634 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
635 device_->state_ = Cellular::kStateRegistered;
636 device_->Connect(&error);
637 EXPECT_TRUE(error.IsSuccess());
638 dispatcher_.DispatchPendingEvents();
639 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700640}
641
Eric Shienbrood9a245532012-03-07 14:20:39 -0500642TEST_F(CellularTest, Disconnect) {
643 Error error;
644 device_->state_ = Cellular::kStateRegistered;
645 device_->Disconnect(&error);
646 EXPECT_EQ(Error::kNotConnected, error.type());
647 error.Reset();
648
Darin Petkovfb0625e2012-01-16 13:05:56 +0100649 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500650 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800651 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood9a245532012-03-07 14:20:39 -0500652 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400653 GetCapabilityClassic()->proxy_.reset(proxy_.release());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500654 device_->Disconnect(&error);
655 EXPECT_TRUE(error.IsSuccess());
656 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100657}
658
Arman Uguray539c4232012-09-11 10:00:22 -0700659TEST_F(CellularTest, DisconnectFailure) {
660 // Test the case where the underlying modem state is set
661 // to disconnecting, but shill thinks it's still connected
662 Error error;
663 device_->state_ = Cellular::kStateConnected;
664 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800665 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Arman Uguray539c4232012-09-11 10:00:22 -0700666 .Times(2)
667 .WillRepeatedly(Invoke(this, &CellularTest::InvokeDisconnectFail));
668 GetCapabilityClassic()->proxy_.reset(proxy_.release());
669 device_->modem_state_ = Cellular::kModemStateDisconnecting;
670 device_->Disconnect(&error);
671 EXPECT_TRUE(error.IsFailure());
672 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
673
674 device_->modem_state_ = Cellular::kModemStateConnected;
675 device_->Disconnect(&error);
676 EXPECT_TRUE(error.IsFailure());
677 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
678}
679
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400680TEST_F(CellularTest, ConnectFailure) {
681 SetCellularType(Cellular::kTypeCDMA);
682 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700683 SetService();
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400684 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
685 EXPECT_CALL(*simple_proxy_,
686 Connect(_, _, _, CellularCapability::kTimeoutConnect))
687 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400688 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400689 Error error;
690 device_->Connect(&error);
691 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
692}
693
Thieu Leb5954a22012-05-18 10:37:34 -0700694TEST_F(CellularTest, ConnectFailureNoService) {
695 // Make sure we don't crash if the connect failed and there is no
696 // CellularService object. This can happen if the modem is enabled and
697 // then quick disabled.
698 SetCellularType(Cellular::kTypeCDMA);
699 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700700 SetService();
Thieu Leb5954a22012-05-18 10:37:34 -0700701 EXPECT_CALL(
702 *simple_proxy_,
703 Connect(_, _, _, CellularCapability::kTimeoutConnect))
704 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700705 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700706 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
707 Error error;
708 device_->Connect(&error);
709}
710
Thieu Led4974cd2013-05-23 10:39:28 -0700711TEST_F(CellularTest, ConnectSuccessNoService) {
712 // Make sure we don't crash if the connect succeeds but the service was
713 // destroyed before the connect request completes.
714 SetCellularType(Cellular::kTypeCDMA);
715 device_->state_ = Cellular::kStateRegistered;
716 SetService();
717 EXPECT_CALL(
718 *simple_proxy_,
719 Connect(_, _, _, CellularCapability::kTimeoutConnect))
720 .WillOnce(Invoke(this, &CellularTest::InvokeConnectSuccessNoService));
721 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
722 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
723 Error error;
724 device_->Connect(&error);
725}
726
Arman Uguray32c76402012-11-27 14:01:13 -0800727TEST_F(CellularTest, LinkEventWontDestroyService) {
728 // If the network interface goes down, Cellular::LinkEvent should
729 // drop the connection but the service object should persist.
730 device_->state_ = Cellular::kStateLinked;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700731 CellularService *service = SetService();
Arman Uguray32c76402012-11-27 14:01:13 -0800732 device_->LinkEvent(0, 0); // flags doesn't contain IFF_UP
733 EXPECT_EQ(device_->state_, Cellular::kStateConnected);
734 EXPECT_EQ(device_->service_, service);
735}
736
Arman Ugurayed8e6102012-11-29 14:47:20 -0800737TEST_F(CellularTest, UseNoArpGateway) {
738 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, false))
739 .WillOnce(Return(dhcp_config_));
740 device_->AcquireIPConfig();
741}
742
Ben Chan09fa2a02012-11-07 22:09:09 -0800743TEST_F(CellularTest, HandleNewRegistrationStateForServiceRequiringActivation) {
744 SetCellularType(Cellular::kTypeUniversal);
745
746 // Service activation is needed
747 GetCapabilityUniversal()->mdn_ = "0000000000";
Arman Ugurayf4c61812013-01-10 18:58:39 -0800748 CellularService::OLP olp;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700749 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
Arman Ugurayf4c61812013-01-10 18:58:39 -0800750 .WillRepeatedly(Return(&olp));
Arman Uguray41cc6342013-03-29 16:34:39 -0700751 EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
752 GetActivationState(_,_))
753 .WillRepeatedly(Return(PendingActivationStore::kStateUnknown));
Ben Chan09fa2a02012-11-07 22:09:09 -0800754
755 device_->state_ = Cellular::kStateDisabled;
756 device_->HandleNewRegistrationState();
757 EXPECT_FALSE(device_->service_.get());
758
759 device_->state_ = Cellular::kStateEnabled;
760 device_->HandleNewRegistrationState();
761 EXPECT_TRUE(device_->service_.get());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800762 EXPECT_TRUE(device_->service_->activate_over_non_cellular_network());
Ben Chan09fa2a02012-11-07 22:09:09 -0800763}
764
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400765TEST_F(CellularTest, ModemStateChangeEnable) {
766 EXPECT_CALL(*simple_proxy_,
767 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
768 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
769 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
770 EXPECT_CALL(*proxy_,
771 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
772 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
773 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
774 .WillOnce(Invoke(this,
775 &CellularTest::InvokeGetRegistrationStateUnregistered));
776 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
777 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700778 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400779 device_->state_ = Cellular::kStateDisabled;
780 device_->set_modem_state(Cellular::kModemStateDisabled);
781 SetCellularType(Cellular::kTypeCDMA);
782
783 DBusPropertiesMap props;
784 props[CellularCapabilityClassic::kModemPropertyEnabled].writer().
785 append_bool(true);
786 device_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
787 dispatcher_.DispatchPendingEvents();
788
789 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
790 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
791 EXPECT_TRUE(device_->enabled());
792}
793
794TEST_F(CellularTest, ModemStateChangeDisable) {
795 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800796 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400797 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
798 EXPECT_CALL(*proxy_,
Thieu Lec8d2d962012-05-15 14:31:18 -0700799 Enable(false, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400800 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700801 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400802 device_->enabled_ = true;
803 device_->enabled_pending_ = true;
804 device_->state_ = Cellular::kStateEnabled;
805 device_->set_modem_state(Cellular::kModemStateEnabled);
806 SetCellularType(Cellular::kTypeCDMA);
807 GetCapabilityClassic()->InitProxies();
808
809 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
810 kModemClassicStateDisabled,
811 0);
812 dispatcher_.DispatchPendingEvents();
813
814 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
815 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
816 EXPECT_FALSE(device_->enabled());
817}
818
Thieu Led0012052012-07-25 16:09:09 -0700819TEST_F(CellularTest, ModemStateChangeStaleConnected) {
820 // Test to make sure that we ignore stale modem Connected state transitions.
821 // When a modem is asked to connect and before the connect completes, the
822 // modem is disabled, it may send a stale Connected state transition after
823 // it has been disabled.
824 device_->state_ = Cellular::kStateDisabled;
825 device_->OnModemStateChanged(Cellular::kModemStateEnabling,
826 Cellular::kModemStateConnected,
827 0);
828 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
829}
830
831TEST_F(CellularTest, ModemStateChangeValidConnected) {
832 device_->state_ = Cellular::kStateEnabled;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700833 SetService();
Thieu Led0012052012-07-25 16:09:09 -0700834 device_->OnModemStateChanged(Cellular::kModemStateConnecting,
835 Cellular::kModemStateConnected,
836 0);
837 EXPECT_EQ(Cellular::kStateConnected, device_->state());
838}
839
Thieu Le5218cf22012-11-26 11:52:57 -0800840TEST_F(CellularTest, ModemStateChangeLostRegistration) {
841 SetCellularType(Cellular::kTypeUniversal);
842 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
843 capability->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
844 EXPECT_TRUE(capability->IsRegistered());
845 device_->OnModemStateChanged(Cellular::kModemStateRegistered,
846 Cellular::kModemStateEnabled,
847 0);
848 EXPECT_FALSE(capability->IsRegistered());
849}
850
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700851TEST_F(CellularTest, EnableTrafficMonitor) {
852 SetCellularType(Cellular::kTypeUniversal);
853 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
854 capability->model_id_.clear();
855 EXPECT_CALL(*this, TestCallback(IsSuccess()));
856 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
857 Unretained(this)),
858 Error(Error::kSuccess));
859 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700860 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700861
862 device_->state_ = Cellular::kStateDisabled;
863
864 capability->model_id_ = CellularCapabilityUniversal::kE362ModelId;
865 EXPECT_CALL(*this, TestCallback(IsFailure()));
866 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
867 Unretained(this)),
868 Error(Error::kOperationFailed));
869 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700870 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700871
872 EXPECT_CALL(*this, TestCallback(IsSuccess()));
873 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
874 Unretained(this)),
875 Error(Error::kSuccess));
876 EXPECT_TRUE(device_->traffic_monitor_enabled());
877}
878
Thieu Le37b90032012-05-15 15:18:41 -0700879TEST_F(CellularTest, StartModemCallback) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700880 EXPECT_CALL(*this, TestCallback(IsSuccess()));
881 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700882 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
883 Unretained(this)),
884 Error(Error::kSuccess));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700885 EXPECT_EQ(device_->state_, Cellular::kStateEnabled);
886}
887
Thieu Le37b90032012-05-15 15:18:41 -0700888TEST_F(CellularTest, StartModemCallbackFail) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700889 EXPECT_CALL(*this, TestCallback(IsFailure()));
890 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700891 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
892 Unretained(this)),
893 Error(Error::kOperationFailed));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700894 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
895}
896
Thieu Le37b90032012-05-15 15:18:41 -0700897TEST_F(CellularTest, StopModemCallback) {
898 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700899 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700900 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
901 Unretained(this)),
902 Error(Error::kSuccess));
903 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
904 EXPECT_FALSE(device_->service_.get());
905}
906
907TEST_F(CellularTest, StopModemCallbackFail) {
908 EXPECT_CALL(*this, TestCallback(IsFailure()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700909 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700910 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
911 Unretained(this)),
912 Error(Error::kOperationFailed));
913 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
914 EXPECT_FALSE(device_->service_.get());
915}
916
Arman Ugurayf84a4242013-04-09 20:01:07 -0700917TEST_F(CellularTest, OnConnectionHealthCheckerResult) {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700918 MockCellularService *service(SetMockService());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700919 EXPECT_FALSE(service->out_of_credits_);
920
921 EXPECT_CALL(*service, Disconnect(_)).Times(0);
922 device_->OnConnectionHealthCheckerResult(
923 ConnectionHealthChecker::kResultUnknown);
924 EXPECT_FALSE(service->out_of_credits_);
925 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700926 ConnectionHealthChecker::kResultConnectionFailure);
927 EXPECT_FALSE(service->out_of_credits_);
928 Mock::VerifyAndClearExpectations(service);
929
930 EXPECT_CALL(*service, Disconnect(_)).Times(1);
931 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700932 ConnectionHealthChecker::kResultCongestedTxQueue);
933 EXPECT_TRUE(service->out_of_credits_);
Arman Ugurayf84a4242013-04-09 20:01:07 -0700934}
935
Liam McLoughlin0fec81c2013-02-28 10:31:47 -0500936// The following test crashes under Clang
Paul Stewartee6b3d72013-07-12 16:07:51 -0700937// Disabling it for now (crbug.com/221452)
Liam McLoughlin0fec81c2013-02-28 10:31:47 -0500938#if defined(__clang__)
939 #define MAYBE_ConnectAddsTerminationAction \
940 DISABLED_ConnectAddsTerminationAction
941#else
942 #define MAYBE_ConnectAddsTerminationAction \
943 ConnectAddsTerminationAction
944#endif // defined(__clang__)
945
946TEST_F(CellularTest, MAYBE_ConnectAddsTerminationAction) {
Gary Moraina9fb3252012-05-31 12:05:31 -0700947 Error error;
948 EXPECT_CALL(*simple_proxy_,
949 Connect(ContainsPhoneNumber(), _, _,
950 CellularCapability::kTimeoutConnect))
951 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
952 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800953 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Gary Moraina9fb3252012-05-31 12:05:31 -0700954 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
955
956 // TestCallback() will be called when the termination actions complete. This
957 // verifies that the actions were registered, invoked, and report their
958 // status.
959 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
960
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700961 SetService();
Gary Moraina9fb3252012-05-31 12:05:31 -0700962 GetCapabilityClassic()->proxy_.reset(proxy_.release());
963 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
964 device_->state_ = Cellular::kStateRegistered;
965 device_->Connect(&error);
966 EXPECT_TRUE(error.IsSuccess());
967 dispatcher_.DispatchPendingEvents();
968 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
969
970 // If the action of establishing a connection registered a termination action
971 // with the manager, then running the termination action will result in a
972 // disconnect.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700973 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200974 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700975 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
976 dispatcher_.DispatchPendingEvents();
977
978 // Verify that the termination action has been removed from the manager.
979 // Running the registered termination actions again should result in
980 // TestCallback being called with success because there are no registered
981 // termination actions.. If the termination action is not removed, then
982 // TestCallback will be called with kOperationTimeout.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700983 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200984 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700985 dispatcher_.DispatchPendingEvents();
986}
987
Darin Petkove7c6ad32012-06-29 10:22:09 +0200988TEST_F(CellularTest, SetAllowRoaming) {
989 EXPECT_FALSE(device_->allow_roaming_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700990 EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
Darin Petkove7c6ad32012-06-29 10:22:09 +0200991 Error error;
992 device_->SetAllowRoaming(true, &error);
993 EXPECT_TRUE(error.IsSuccess());
994 EXPECT_TRUE(device_->allow_roaming_);
995}
996
mukesh agrawalfbc40d22013-06-28 00:25:13 -0700997class TestRPCTaskDelegate :
998 public RPCTaskDelegate,
999 public base::SupportsWeakPtr<TestRPCTaskDelegate> {
1000 public:
1001 virtual void GetLogin(std::string *user, std::string *password) {}
1002 virtual void Notify(const std::string &reason,
1003 const std::map<std::string, std::string> &dict) {}
1004};
1005
1006TEST_F(CellularTest, LinkEventUpWithPPP) {
1007 // If PPP is running, don't run DHCP as well.
1008 TestRPCTaskDelegate task_delegate;
1009 base::Callback<void(pid_t, int)> death_callback;
1010 scoped_ptr<NiceMock<MockExternalTask>> mock_task(
1011 new NiceMock<MockExternalTask>(modem_info_.control_interface(),
1012 modem_info_.glib(),
1013 task_delegate.AsWeakPtr(),
1014 death_callback));
1015 EXPECT_CALL(*mock_task, OnDelete()).Times(AnyNumber());
1016 device_->ppp_task_ = mock_task.Pass();
1017 device_->state_ = Cellular::kStateConnected;
1018 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
1019 .Times(0);
1020 EXPECT_CALL(*dhcp_config_, RequestIP()).Times(0);
1021 device_->LinkEvent(IFF_UP, 0);
1022}
1023
1024TEST_F(CellularTest, LinkEventUpWithoutPPP) {
1025 // If PPP is not running, fire up DHCP.
1026 device_->state_ = Cellular::kStateConnected;
1027 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
1028 .WillOnce(Return(dhcp_config_));
1029 EXPECT_CALL(*dhcp_config_, RequestIP());
1030 EXPECT_CALL(*dhcp_config_, ReleaseIP(_)).Times(AnyNumber());
1031 device_->LinkEvent(IFF_UP, 0);
1032}
1033
mukesh agrawal35ec8402013-07-19 14:49:08 -07001034TEST_F(CellularTest, StartPPPAfterEthernetUp) {
1035 CellularService *service(SetService());
mukesh agrawalfbc40d22013-06-28 00:25:13 -07001036 device_->state_ = Cellular::kStateLinked;
mukesh agrawal35ec8402013-07-19 14:49:08 -07001037 device_->set_ipconfig(dhcp_config_);
1038 device_->SelectService(service);
mukesh agrawalfbc40d22013-06-28 00:25:13 -07001039 EXPECT_CALL(*dhcp_config_, ReleaseIP(_))
1040 .Times(AnyNumber())
1041 .WillRepeatedly(Return(true));
1042 EXPECT_CALL(*dynamic_cast<MockGLib *>(modem_info_.glib()),
1043 SpawnAsync(_, _, _, _, _, _, _, _));
1044 device_->StartPPP("fake_serial_device");
mukesh agrawal35ec8402013-07-19 14:49:08 -07001045 EXPECT_FALSE(device_->ipconfig()); // The DHCP client was stopped.
1046 EXPECT_FALSE(device_->selected_service());
mukesh agrawalfbc40d22013-06-28 00:25:13 -07001047 EXPECT_EQ(Cellular::kStateLinked, device_->state());
mukesh agrawalfbc40d22013-06-28 00:25:13 -07001048}
1049
mukesh agrawal35ec8402013-07-19 14:49:08 -07001050TEST_F(CellularTest, StartPPPWithoutEthernet) {
1051 EXPECT_CALL(*dynamic_cast<MockGLib *>(modem_info_.glib()),
1052 SpawnAsync(_, _, _, _, _, _, _, _));
1053 device_->StartPPP("fake_serial_device");
1054 EXPECT_FALSE(device_->ipconfig()); // No DHCP client.
1055 EXPECT_FALSE(device_->selected_service());
1056}
1057
1058// TODO(quiche): test the common bits of StartPPP. crbug.com/246826.
1059
mukesh agrawal3ffe52c2013-06-20 15:21:29 -07001060TEST_F(CellularTest, GetLogin) {
1061 // Doesn't crash when there is no service.
1062 string username_to_pppd;
1063 string password_to_pppd;
1064 EXPECT_FALSE(device_->service());
1065 device_->GetLogin(&username_to_pppd, &password_to_pppd);
1066
1067 // Provides expected username and password in normal case.
1068 const char kFakeUsername[] = "fake-user";
1069 const char kFakePassword[] = "fake-password";
1070 CellularService &service(*SetService());
1071 service.ppp_username_ = kFakeUsername;
1072 service.ppp_password_ = kFakePassword;
1073 device_->GetLogin(&username_to_pppd, &password_to_pppd);
1074}
1075
mukesh agrawal5d851b12013-07-11 14:09:41 -07001076TEST_F(CellularTest, DropConnection) {
1077 device_->set_ipconfig(dhcp_config_);
1078 EXPECT_CALL(*dhcp_config_, ReleaseIP(_));
1079 device_->DropConnection();
1080 Mock::VerifyAndClearExpectations(dhcp_config_); // verify before dtor
1081 EXPECT_FALSE(device_->ipconfig());
1082}
1083
1084TEST_F(CellularTest, DropConnectionPPP) {
1085 scoped_refptr<MockPPPDevice> ppp_device(
1086 new MockPPPDevice(modem_info_.control_interface(),
1087 NULL, NULL, NULL, "fake_ppp0", -1));
1088 EXPECT_CALL(*ppp_device, DropConnection());
1089 device_->ppp_device_ = ppp_device;
1090 device_->DropConnection();
1091}
1092
mukesh agrawal0381f9a2013-07-11 16:41:52 -07001093TEST_F(CellularTest, ChangeServiceState) {
1094 MockCellularService *service(SetMockService());
1095 EXPECT_CALL(*service, SetState(_));
1096 EXPECT_CALL(*service, SetFailure(_));
1097 EXPECT_CALL(*service, SetFailureSilent(_));
1098
1099 // Without PPP, these should be handled by our selected_service().
1100 device_->SelectService(service);
1101 device_->SetServiceState(Service::kStateConfiguring);
1102 device_->SetServiceFailure(Service::kFailurePPPAuth);
1103 device_->SetServiceFailureSilent(Service::kFailureUnknown);
1104 Mock::VerifyAndClearExpectations(service); // before Cellular dtor
1105}
1106
1107TEST_F(CellularTest, ChangeServiceStatePPP) {
1108 MockCellularService *service(SetMockService());
1109 scoped_refptr<MockPPPDevice> ppp_device(
1110 new MockPPPDevice(modem_info_.control_interface(),
1111 NULL, NULL, NULL, "fake_ppp0", -1));
1112 EXPECT_CALL(*ppp_device, SetServiceState(_));
1113 EXPECT_CALL(*ppp_device, SetServiceFailure(_));
1114 EXPECT_CALL(*ppp_device, SetServiceFailureSilent(_));
1115 EXPECT_CALL(*service, SetState(_)).Times(0);
1116 EXPECT_CALL(*service, SetFailure(_)).Times(0);
1117 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
1118 device_->ppp_device_ = ppp_device;
1119
1120 // With PPP, these should all be punted over to the |ppp_device|.
1121 // Note in particular that Cellular does not manipulate |service| in
1122 // this case.
1123 device_->SetServiceState(Service::kStateConfiguring);
1124 device_->SetServiceFailure(Service::kFailurePPPAuth);
1125 device_->SetServiceFailureSilent(Service::kFailureUnknown);
1126}
1127
mukesh agrawalbebf1b82013-04-23 15:06:33 -07001128// Custom property setters should return false, and make no changes, if
1129// the new value is the same as the old value.
1130TEST_F(CellularTest, CustomSetterNoopChange) {
1131 Error error;
1132 EXPECT_FALSE(device_->allow_roaming_);
1133 EXPECT_FALSE(device_->SetAllowRoaming(false, &error));
1134 EXPECT_TRUE(error.IsSuccess());
1135}
1136
Chris Masoneb925cc82011-06-22 15:39:57 -07001137} // namespace shill