blob: 7289036695d6904f04d054972381ac046b93a8de [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 }
Thieu Led4974cd2013-05-23 10:39:28 -0700266 void InvokeConnectSuccessNoService(DBusPropertiesMap props, Error *error,
267 const ResultCallback &callback,
268 int timeout) {
269 device_->service_ = NULL;
270 callback.Run(Error());
271 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500272 void InvokeDisconnect(Error *error, const ResultCallback &callback,
273 int timeout) {
274 if (!callback.is_null())
275 callback.Run(Error());
276 }
Arman Uguray539c4232012-09-11 10:00:22 -0700277 void InvokeDisconnectFail(Error *error, const ResultCallback &callback,
278 int timeout) {
279 error->Populate(Error::kOperationFailed);
280 if (!callback.is_null())
281 callback.Run(*error);
282 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500283
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400284 void ExpectCdmaStartModem(string network_technology) {
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400285 if (!device_->IsUnderlyingDeviceEnabled())
286 EXPECT_CALL(*proxy_,
287 Enable(true, _, _, CellularCapability::kTimeoutEnable))
288 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400289 EXPECT_CALL(*simple_proxy_,
290 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
291 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
292 EXPECT_CALL(*proxy_,
293 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
294 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
295 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
296 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400297 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400298 else
299 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400300 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400301 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
302 .Times(2)
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400303 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400304 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700305 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400306 }
307
Eric Shienbrood9a245532012-03-07 14:20:39 -0500308 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500309
Darin Petkov0828f5f2011-08-11 10:18:52 -0700310 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500311 static const char kTestDeviceName[];
312 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500313 static const char kDBusOwner[];
Jason Glasgowa585fc32012-06-06 11:04:09 -0400314 static const char kDBusService[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500315 static const char kDBusPath[];
316 static const char kTestCarrier[];
Darin Petkova4ca3c32012-08-17 16:05:24 +0200317 static const char kTestCarrierSPN[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500318 static const char kMEID[];
319 static const char kIMEI[];
320 static const char kIMSI[];
321 static const char kMSISDN[];
322 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500323 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500324
Darin Petkov0828f5f2011-08-11 10:18:52 -0700325 class TestProxyFactory : public ProxyFactory {
326 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700327 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700328
mukesh agrawal1830fa12011-09-26 14:31:40 -0700329 virtual ModemProxyInterface *CreateModemProxy(
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_->proxy_.release();
333 }
334
335 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
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_->simple_proxy_.release();
339 }
340
341 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
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_->cdma_proxy_.release();
345 }
346
Darin Petkov975b5e72011-08-30 11:48:08 -0700347 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700348 const string &/*path*/,
349 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700350 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
351 // CellularCapabilityGSM::InitProperties (and thus
352 // CellularCapabilityGSM::GetIMSI) from being called during the
353 // construction. Remove this workaround after refactoring the tests.
354 return test_->create_gsm_card_proxy_from_factory_ ?
355 test_->gsm_card_proxy_.release() : NULL;
Darin Petkov975b5e72011-08-30 11:48:08 -0700356 }
357
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700358 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700359 const string &/*path*/,
360 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700361 return test_->gsm_network_proxy_.release();
362 }
363
Darin Petkov0828f5f2011-08-11 10:18:52 -0700364 private:
365 CellularTest *test_;
366 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700367 void StartRTNLHandler();
368 void StopRTNLHandler();
369
Ben Chan3ecdf822012-08-06 12:29:23 -0700370 void AllowCreateGSMCardProxyFromFactory() {
371 create_gsm_card_proxy_from_factory_ = true;
372 }
373
Darin Petkov721ac932011-11-16 15:43:09 +0100374 void SetCellularType(Cellular::Type type) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700375 device_->InitCapability(type);
Darin Petkov721ac932011-11-16 15:43:09 +0100376 }
377
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400378 CellularCapabilityClassic *GetCapabilityClassic() {
379 return dynamic_cast<CellularCapabilityClassic *>(
380 device_->capability_.get());
381 }
382
Darin Petkovae0c64e2011-11-15 15:50:27 +0100383 CellularCapabilityCDMA *GetCapabilityCDMA() {
384 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
385 }
386
387 CellularCapabilityGSM *GetCapabilityGSM() {
388 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
389 }
390
Ben Chan09fa2a02012-11-07 22:09:09 -0800391 CellularCapabilityUniversal *GetCapabilityUniversal() {
392 return dynamic_cast<CellularCapabilityUniversal *>(
393 device_->capability_.get());
394 }
395
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700396 // Different tests simulate a cellular service being set using a real /mock
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700397 // service.
Arman Ugurayf84a4242013-04-09 20:01:07 -0700398 CellularService *SetService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700399 device_->service_ = new CellularService(&modem_info_, device_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700400 return device_->service_;
401 }
Arman Ugurayf84a4242013-04-09 20:01:07 -0700402 MockCellularService *SetMockService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700403 device_->service_ = new MockCellularService(&modem_info_, device_);
404 return static_cast<MockCellularService *>(device_->service_.get());
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700405 }
406
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700407 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700408 MockModemInfo modem_info_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700409 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700410 NiceMock<MockRTNLHandler> rtnl_handler_;
411
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500412 MockDHCPProvider dhcp_provider_;
413 scoped_refptr<MockDHCPConfig> dhcp_config_;
414
Ben Chan3ecdf822012-08-06 12:29:23 -0700415 bool create_gsm_card_proxy_from_factory_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700416 scoped_ptr<MockModemProxy> proxy_;
417 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
418 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700419 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700420 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700421 TestProxyFactory proxy_factory_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700422 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700423};
424
Darin Petkov77cb6812011-08-15 16:19:41 -0700425const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700426const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700427const char CellularTest::kDBusOwner[] = ":1.19";
Jason Glasgowa585fc32012-06-06 11:04:09 -0400428const char CellularTest::kDBusService[] = "org.chromium.ModemManager";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700429const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700430const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Darin Petkova4ca3c32012-08-17 16:05:24 +0200431const char CellularTest::kTestCarrierSPN[] = "Home Provider";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500432const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700433const char CellularTest::kIMEI[] = "987654321098765";
434const char CellularTest::kIMSI[] = "123456789012345";
435const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200436const char CellularTest::kTestMobileProviderDBPath[] =
437 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500438const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700439
Darin Petkove9d12e02011-07-27 15:09:37 -0700440TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700441 EXPECT_EQ("CellularStateDisabled",
442 device_->GetStateString(Cellular::kStateDisabled));
443 EXPECT_EQ("CellularStateEnabled",
444 device_->GetStateString(Cellular::kStateEnabled));
445 EXPECT_EQ("CellularStateRegistered",
446 device_->GetStateString(Cellular::kStateRegistered));
447 EXPECT_EQ("CellularStateConnected",
448 device_->GetStateString(Cellular::kStateConnected));
449 EXPECT_EQ("CellularStateLinked",
450 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700451}
452
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700453TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100454 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400455 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700456 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500457 Error error;
458 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700459 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400460 EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
461 EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700462 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700463 ASSERT_TRUE(device_->service_.get());
464 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100465 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700466 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700467 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700468}
469
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700470TEST_F(CellularTest, StartGSMRegister) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700471 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500472 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500473 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500474 EXPECT_CALL(*gsm_card_proxy_,
475 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500476 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500477 EXPECT_CALL(*gsm_card_proxy_,
478 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500479 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500480 EXPECT_CALL(*gsm_card_proxy_,
481 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500482 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
483 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700486 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
487 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100488 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
489 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500490 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500491 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200492 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500493 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500494 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500495 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500496 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
497 .Times(2)
498 .WillRepeatedly(Invoke(this,
499 &CellularTest::InvokeGetSignalQuality));
500 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700501 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
Ben Chan3ecdf822012-08-06 12:29:23 -0700502 AllowCreateGSMCardProxyFromFactory();
503
Eric Shienbrood9a245532012-03-07 14:20:39 -0500504 Error error;
505 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
506 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700507 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400508 EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
509 EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
Darin Petkova4ca3c32012-08-17 16:05:24 +0200510 EXPECT_EQ(kTestCarrierSPN, GetCapabilityGSM()->spn_);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400511 EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700512 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
513 ASSERT_TRUE(device_->service_.get());
514 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100515 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100516 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700517 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700518 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200519 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200520 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Darin Petkov137884a2011-10-26 18:52:47 +0200521 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700522}
523
Darin Petkovbac96002011-08-09 13:22:00 -0700524TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700525 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
526 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100527 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700528 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400529 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400530 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500531 Error error;
532 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
533 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700534 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700535 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
536}
537
Darin Petkov0828f5f2011-08-11 10:18:52 -0700538TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700539 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
540 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100541 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700542 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400543 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400544 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700545 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700546 .WillOnce(Return(dhcp_config_));
547 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700548 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_)).Times(3);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500549 Error error;
550 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
551 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700552 dispatcher_.DispatchPendingEvents();
553 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700554 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
555 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700556}
557
Darin Petkov3335b372011-08-22 11:05:32 -0700558TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100559 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700560 static const char kPaymentURL[] = "https://payment.url";
561 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700562 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100563 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100564 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700565 device_->CreateService();
566 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100567 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700568 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
569 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800570 ASSERT_FALSE(device_->service_->activate_over_non_cellular_network());
Darin Petkov3335b372011-08-22 11:05:32 -0700571}
572
Darin Petkovc5f56562011-08-06 16:40:05 -0700573namespace {
574
575MATCHER(ContainsPhoneNumber, "") {
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400576 return ContainsKey(arg,
577 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700578}
579
Eric Shienbrood9a245532012-03-07 14:20:39 -0500580} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700581
582TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700583 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700584 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700585 .Times(2)
586 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700587 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700588 device_->Connect(&error);
589 EXPECT_EQ(Error::kAlreadyConnected, error.type());
590 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700591
Darin Petkov0828f5f2011-08-11 10:18:52 -0700592 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700593 device_->Connect(&error);
594 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700595
Thieu Lec7d8cd12013-02-13 11:38:14 -0800596 device_->state_ = Cellular::kStateEnabled;
597 device_->Connect(&error);
598 EXPECT_EQ(Error::kNotRegistered, error.type());
599
600 error.Reset();
601 device_->state_ = Cellular::kStateDisabled;
602 device_->Connect(&error);
603 EXPECT_EQ(Error::kNotRegistered, error.type());
604
Darin Petkovc5f56562011-08-06 16:40:05 -0700605 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700606 SetService();
Darin Petkovd2045802011-08-23 11:09:25 -0700607
Jason Glasgow7b461df2012-05-01 16:38:45 -0400608 device_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100609 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700610 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700611 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500612
Darin Petkov4d6d9412011-08-24 13:19:54 -0700613 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500614 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500615 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500616 CellularCapability::kTimeoutConnect))
617 .Times(2)
618 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400619 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100620 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500621 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700622 device_->Connect(&error);
623 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700624 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500625 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
626
Jason Glasgow7b461df2012-05-01 16:38:45 -0400627 device_->allow_roaming_ = true;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500628 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
629 device_->state_ = Cellular::kStateRegistered;
630 device_->Connect(&error);
631 EXPECT_TRUE(error.IsSuccess());
632 dispatcher_.DispatchPendingEvents();
633 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700634}
635
Eric Shienbrood9a245532012-03-07 14:20:39 -0500636TEST_F(CellularTest, Disconnect) {
637 Error error;
638 device_->state_ = Cellular::kStateRegistered;
639 device_->Disconnect(&error);
640 EXPECT_EQ(Error::kNotConnected, error.type());
641 error.Reset();
642
Darin Petkovfb0625e2012-01-16 13:05:56 +0100643 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500644 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800645 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood9a245532012-03-07 14:20:39 -0500646 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400647 GetCapabilityClassic()->proxy_.reset(proxy_.release());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500648 device_->Disconnect(&error);
649 EXPECT_TRUE(error.IsSuccess());
650 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100651}
652
Arman Uguray539c4232012-09-11 10:00:22 -0700653TEST_F(CellularTest, DisconnectFailure) {
654 // Test the case where the underlying modem state is set
655 // to disconnecting, but shill thinks it's still connected
656 Error error;
657 device_->state_ = Cellular::kStateConnected;
658 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800659 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Arman Uguray539c4232012-09-11 10:00:22 -0700660 .Times(2)
661 .WillRepeatedly(Invoke(this, &CellularTest::InvokeDisconnectFail));
662 GetCapabilityClassic()->proxy_.reset(proxy_.release());
663 device_->modem_state_ = Cellular::kModemStateDisconnecting;
664 device_->Disconnect(&error);
665 EXPECT_TRUE(error.IsFailure());
666 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
667
668 device_->modem_state_ = Cellular::kModemStateConnected;
669 device_->Disconnect(&error);
670 EXPECT_TRUE(error.IsFailure());
671 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
672}
673
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400674TEST_F(CellularTest, ConnectFailure) {
675 SetCellularType(Cellular::kTypeCDMA);
676 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700677 SetService();
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400678 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
679 EXPECT_CALL(*simple_proxy_,
680 Connect(_, _, _, CellularCapability::kTimeoutConnect))
681 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400682 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400683 Error error;
684 device_->Connect(&error);
685 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
686}
687
Thieu Leb5954a22012-05-18 10:37:34 -0700688TEST_F(CellularTest, ConnectFailureNoService) {
689 // Make sure we don't crash if the connect failed and there is no
690 // CellularService object. This can happen if the modem is enabled and
691 // then quick disabled.
692 SetCellularType(Cellular::kTypeCDMA);
693 device_->state_ = Cellular::kStateRegistered;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700694 SetService();
Thieu Leb5954a22012-05-18 10:37:34 -0700695 EXPECT_CALL(
696 *simple_proxy_,
697 Connect(_, _, _, CellularCapability::kTimeoutConnect))
698 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700699 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700700 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
701 Error error;
702 device_->Connect(&error);
703}
704
Thieu Led4974cd2013-05-23 10:39:28 -0700705TEST_F(CellularTest, ConnectSuccessNoService) {
706 // Make sure we don't crash if the connect succeeds but the service was
707 // destroyed before the connect request completes.
708 SetCellularType(Cellular::kTypeCDMA);
709 device_->state_ = Cellular::kStateRegistered;
710 SetService();
711 EXPECT_CALL(
712 *simple_proxy_,
713 Connect(_, _, _, CellularCapability::kTimeoutConnect))
714 .WillOnce(Invoke(this, &CellularTest::InvokeConnectSuccessNoService));
715 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
716 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
717 Error error;
718 device_->Connect(&error);
719}
720
Arman Uguray32c76402012-11-27 14:01:13 -0800721TEST_F(CellularTest, LinkEventWontDestroyService) {
722 // If the network interface goes down, Cellular::LinkEvent should
723 // drop the connection but the service object should persist.
724 device_->state_ = Cellular::kStateLinked;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700725 CellularService *service = SetService();
Arman Uguray32c76402012-11-27 14:01:13 -0800726 device_->LinkEvent(0, 0); // flags doesn't contain IFF_UP
727 EXPECT_EQ(device_->state_, Cellular::kStateConnected);
728 EXPECT_EQ(device_->service_, service);
729}
730
Arman Ugurayed8e6102012-11-29 14:47:20 -0800731TEST_F(CellularTest, UseNoArpGateway) {
732 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, false))
733 .WillOnce(Return(dhcp_config_));
734 device_->AcquireIPConfig();
735}
736
Ben Chan09fa2a02012-11-07 22:09:09 -0800737TEST_F(CellularTest, HandleNewRegistrationStateForServiceRequiringActivation) {
738 SetCellularType(Cellular::kTypeUniversal);
739
740 // Service activation is needed
741 GetCapabilityUniversal()->mdn_ = "0000000000";
Arman Ugurayf4c61812013-01-10 18:58:39 -0800742 CellularService::OLP olp;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700743 EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
Arman Ugurayf4c61812013-01-10 18:58:39 -0800744 .WillRepeatedly(Return(&olp));
Arman Uguray41cc6342013-03-29 16:34:39 -0700745 EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
746 GetActivationState(_,_))
747 .WillRepeatedly(Return(PendingActivationStore::kStateUnknown));
Ben Chan09fa2a02012-11-07 22:09:09 -0800748
749 device_->state_ = Cellular::kStateDisabled;
750 device_->HandleNewRegistrationState();
751 EXPECT_FALSE(device_->service_.get());
752
753 device_->state_ = Cellular::kStateEnabled;
754 device_->HandleNewRegistrationState();
755 EXPECT_TRUE(device_->service_.get());
Ben Chan3d6de0e2012-12-10 12:01:34 -0800756 EXPECT_TRUE(device_->service_->activate_over_non_cellular_network());
Ben Chan09fa2a02012-11-07 22:09:09 -0800757}
758
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400759TEST_F(CellularTest, ModemStateChangeEnable) {
760 EXPECT_CALL(*simple_proxy_,
761 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
762 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
763 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
764 EXPECT_CALL(*proxy_,
765 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
766 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
767 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
768 .WillOnce(Invoke(this,
769 &CellularTest::InvokeGetRegistrationStateUnregistered));
770 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
771 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700772 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400773 device_->state_ = Cellular::kStateDisabled;
774 device_->set_modem_state(Cellular::kModemStateDisabled);
775 SetCellularType(Cellular::kTypeCDMA);
776
777 DBusPropertiesMap props;
778 props[CellularCapabilityClassic::kModemPropertyEnabled].writer().
779 append_bool(true);
780 device_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
781 dispatcher_.DispatchPendingEvents();
782
783 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
784 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
785 EXPECT_TRUE(device_->enabled());
786}
787
788TEST_F(CellularTest, ModemStateChangeDisable) {
789 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800790 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400791 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
792 EXPECT_CALL(*proxy_,
Thieu Lec8d2d962012-05-15 14:31:18 -0700793 Enable(false, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400794 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700795 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400796 device_->enabled_ = true;
797 device_->enabled_pending_ = true;
798 device_->state_ = Cellular::kStateEnabled;
799 device_->set_modem_state(Cellular::kModemStateEnabled);
800 SetCellularType(Cellular::kTypeCDMA);
801 GetCapabilityClassic()->InitProxies();
802
803 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
804 kModemClassicStateDisabled,
805 0);
806 dispatcher_.DispatchPendingEvents();
807
808 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
809 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
810 EXPECT_FALSE(device_->enabled());
811}
812
Thieu Led0012052012-07-25 16:09:09 -0700813TEST_F(CellularTest, ModemStateChangeStaleConnected) {
814 // Test to make sure that we ignore stale modem Connected state transitions.
815 // When a modem is asked to connect and before the connect completes, the
816 // modem is disabled, it may send a stale Connected state transition after
817 // it has been disabled.
818 device_->state_ = Cellular::kStateDisabled;
819 device_->OnModemStateChanged(Cellular::kModemStateEnabling,
820 Cellular::kModemStateConnected,
821 0);
822 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
823}
824
825TEST_F(CellularTest, ModemStateChangeValidConnected) {
826 device_->state_ = Cellular::kStateEnabled;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700827 SetService();
Thieu Led0012052012-07-25 16:09:09 -0700828 device_->OnModemStateChanged(Cellular::kModemStateConnecting,
829 Cellular::kModemStateConnected,
830 0);
831 EXPECT_EQ(Cellular::kStateConnected, device_->state());
832}
833
Thieu Le5218cf22012-11-26 11:52:57 -0800834TEST_F(CellularTest, ModemStateChangeLostRegistration) {
835 SetCellularType(Cellular::kTypeUniversal);
836 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
837 capability->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
838 EXPECT_TRUE(capability->IsRegistered());
839 device_->OnModemStateChanged(Cellular::kModemStateRegistered,
840 Cellular::kModemStateEnabled,
841 0);
842 EXPECT_FALSE(capability->IsRegistered());
843}
844
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700845TEST_F(CellularTest, EnableTrafficMonitor) {
846 SetCellularType(Cellular::kTypeUniversal);
847 CellularCapabilityUniversal *capability = GetCapabilityUniversal();
848 capability->model_id_.clear();
849 EXPECT_CALL(*this, TestCallback(IsSuccess()));
850 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
851 Unretained(this)),
852 Error(Error::kSuccess));
853 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700854 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700855
856 device_->state_ = Cellular::kStateDisabled;
857
858 capability->model_id_ = CellularCapabilityUniversal::kE362ModelId;
859 EXPECT_CALL(*this, TestCallback(IsFailure()));
860 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
861 Unretained(this)),
862 Error(Error::kOperationFailed));
863 EXPECT_FALSE(device_->traffic_monitor_enabled());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700864 Mock::VerifyAndClearExpectations(this);
Arman Ugurayd42d8ec2013-04-08 19:28:21 -0700865
866 EXPECT_CALL(*this, TestCallback(IsSuccess()));
867 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
868 Unretained(this)),
869 Error(Error::kSuccess));
870 EXPECT_TRUE(device_->traffic_monitor_enabled());
871}
872
Thieu Le37b90032012-05-15 15:18:41 -0700873TEST_F(CellularTest, StartModemCallback) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700874 EXPECT_CALL(*this, TestCallback(IsSuccess()));
875 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700876 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
877 Unretained(this)),
878 Error(Error::kSuccess));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700879 EXPECT_EQ(device_->state_, Cellular::kStateEnabled);
880}
881
Thieu Le37b90032012-05-15 15:18:41 -0700882TEST_F(CellularTest, StartModemCallbackFail) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700883 EXPECT_CALL(*this, TestCallback(IsFailure()));
884 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700885 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
886 Unretained(this)),
887 Error(Error::kOperationFailed));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700888 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
889}
890
Thieu Le37b90032012-05-15 15:18:41 -0700891TEST_F(CellularTest, StopModemCallback) {
892 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700893 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700894 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
895 Unretained(this)),
896 Error(Error::kSuccess));
897 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
898 EXPECT_FALSE(device_->service_.get());
899}
900
901TEST_F(CellularTest, StopModemCallbackFail) {
902 EXPECT_CALL(*this, TestCallback(IsFailure()));
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700903 SetMockService();
Thieu Le37b90032012-05-15 15:18:41 -0700904 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
905 Unretained(this)),
906 Error(Error::kOperationFailed));
907 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
908 EXPECT_FALSE(device_->service_.get());
909}
910
Arman Ugurayf84a4242013-04-09 20:01:07 -0700911TEST_F(CellularTest, OnConnectionHealthCheckerResult) {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700912 MockCellularService *service(SetMockService());
Arman Ugurayf84a4242013-04-09 20:01:07 -0700913 EXPECT_FALSE(service->out_of_credits_);
914
915 EXPECT_CALL(*service, Disconnect(_)).Times(0);
916 device_->OnConnectionHealthCheckerResult(
917 ConnectionHealthChecker::kResultUnknown);
918 EXPECT_FALSE(service->out_of_credits_);
919 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700920 ConnectionHealthChecker::kResultConnectionFailure);
921 EXPECT_FALSE(service->out_of_credits_);
922 Mock::VerifyAndClearExpectations(service);
923
924 EXPECT_CALL(*service, Disconnect(_)).Times(1);
925 device_->OnConnectionHealthCheckerResult(
Arman Ugurayf84a4242013-04-09 20:01:07 -0700926 ConnectionHealthChecker::kResultCongestedTxQueue);
927 EXPECT_TRUE(service->out_of_credits_);
928
929 // Don't leak the service object.
930 device_->service_ = NULL;
931}
932
Liam McLoughlin0fec81c2013-02-28 10:31:47 -0500933// The following test crashes under Clang
934// Disabling it for now (crosbug.com/39351)
935#if defined(__clang__)
936 #define MAYBE_ConnectAddsTerminationAction \
937 DISABLED_ConnectAddsTerminationAction
938#else
939 #define MAYBE_ConnectAddsTerminationAction \
940 ConnectAddsTerminationAction
941#endif // defined(__clang__)
942
943TEST_F(CellularTest, MAYBE_ConnectAddsTerminationAction) {
Gary Moraina9fb3252012-05-31 12:05:31 -0700944 Error error;
945 EXPECT_CALL(*simple_proxy_,
946 Connect(ContainsPhoneNumber(), _, _,
947 CellularCapability::kTimeoutConnect))
948 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
949 EXPECT_CALL(*proxy_,
Thieu Le049adb52012-11-12 17:14:51 -0800950 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
Gary Moraina9fb3252012-05-31 12:05:31 -0700951 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
952
953 // TestCallback() will be called when the termination actions complete. This
954 // verifies that the actions were registered, invoked, and report their
955 // status.
956 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
957
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700958 SetService();
Gary Moraina9fb3252012-05-31 12:05:31 -0700959 GetCapabilityClassic()->proxy_.reset(proxy_.release());
960 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
961 device_->state_ = Cellular::kStateRegistered;
962 device_->Connect(&error);
963 EXPECT_TRUE(error.IsSuccess());
964 dispatcher_.DispatchPendingEvents();
965 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
966
967 // If the action of establishing a connection registered a termination action
968 // with the manager, then running the termination action will result in a
969 // disconnect.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700970 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200971 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700972 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
973 dispatcher_.DispatchPendingEvents();
974
975 // Verify that the termination action has been removed from the manager.
976 // Running the registered termination actions again should result in
977 // TestCallback being called with success because there are no registered
978 // termination actions.. If the termination action is not removed, then
979 // TestCallback will be called with kOperationTimeout.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700980 modem_info_.manager()->RunTerminationActions(
Darin Petkov3ec55342012-09-28 14:04:44 +0200981 Bind(&CellularTest::TestCallback, Unretained(this)));
Gary Moraina9fb3252012-05-31 12:05:31 -0700982 dispatcher_.DispatchPendingEvents();
983}
984
Darin Petkove7c6ad32012-06-29 10:22:09 +0200985TEST_F(CellularTest, SetAllowRoaming) {
986 EXPECT_FALSE(device_->allow_roaming_);
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700987 EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
Darin Petkove7c6ad32012-06-29 10:22:09 +0200988 Error error;
989 device_->SetAllowRoaming(true, &error);
990 EXPECT_TRUE(error.IsSuccess());
991 EXPECT_TRUE(device_->allow_roaming_);
992}
993
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700994// Custom property setters should return false, and make no changes, if
995// the new value is the same as the old value.
996TEST_F(CellularTest, CustomSetterNoopChange) {
997 Error error;
998 EXPECT_FALSE(device_->allow_roaming_);
999 EXPECT_FALSE(device_->SetAllowRoaming(false, &error));
1000 EXPECT_TRUE(error.IsSuccess());
1001}
1002
Chris Masoneb925cc82011-06-22 15:39:57 -07001003} // namespace shill