blob: f5db7d753a1c3f0b2bcfa235ce4139040c63f6a2 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 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>
Darin Petkovbec79a22011-08-01 14:47:17 -070013#include <mm/mm-modem.h>
Darin Petkov137884a2011-10-26 18:52:47 +020014#include <mobile_provider.h>
Chris Masoneb925cc82011-06-22 15:39:57 -070015
Darin Petkovae0c64e2011-11-15 15:50:27 +010016#include "shill/cellular_capability_cdma.h"
Jason Glasgow82f9ab32012-04-04 14:27:19 -040017#include "shill/cellular_capability_classic.h"
Darin Petkov184c54e2011-11-15 12:44:39 +010018#include "shill/cellular_capability_gsm.h"
Darin Petkovd9661952011-08-03 16:25:42 -070019#include "shill/cellular_service.h"
Darin Petkov4d6d9412011-08-24 13:19:54 -070020#include "shill/error.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070021#include "shill/event_dispatcher.h"
Thieu Le37b90032012-05-15 15:18:41 -070022#include "shill/mock_cellular_service.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070023#include "shill/mock_device_info.h"
Darin Petkov77cb6812011-08-15 16:19:41 -070024#include "shill/mock_dhcp_config.h"
25#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070026#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080027#include "shill/mock_metrics.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070028#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070029#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070030#include "shill/mock_modem_gsm_network_proxy.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070031#include "shill/mock_modem_proxy.h"
Darin Petkove604f702011-07-28 15:51:17 -070032#include "shill/mock_modem_simple_proxy.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070033#include "shill/mock_rtnl_handler.h"
Darin Petkov3335b372011-08-22 11:05:32 -070034#include "shill/nice_mock_control.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070035#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070036#include "shill/proxy_factory.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070037
Eric Shienbrood9a245532012-03-07 14:20:39 -050038using base::Bind;
39using base::Unretained;
Darin Petkovc0865312011-09-16 15:31:20 -070040using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070041using std::string;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040042using std::vector;
Darin Petkovbec79a22011-08-01 14:47:17 -070043using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070044using testing::AnyNumber;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050045using testing::Invoke;
Darin Petkov0828f5f2011-08-11 10:18:52 -070046using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070047using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070048using testing::SetArgumentPointee;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050049using testing::Unused;
Chris Masoneb925cc82011-06-22 15:39:57 -070050
51namespace shill {
52
Eric Shienbrood9a245532012-03-07 14:20:39 -050053MATCHER(IsSuccess, "") {
54 return arg.IsSuccess();
55}
56
Gary Morainbaeefdf2012-04-30 14:53:35 -070057MATCHER(IsFailure, "") {
58 return arg.IsFailure();
59}
60
Darin Petkov0828f5f2011-08-11 10:18:52 -070061class CellularPropertyTest : public PropertyStoreTest {
62 public:
63 CellularPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070064 : device_(new Cellular(control_interface(),
Darin Petkov0828f5f2011-08-11 10:18:52 -070065 NULL,
66 NULL,
Thieu Le3426c8f2012-01-11 17:35:11 -080067 NULL,
Darin Petkove9d12e02011-07-27 15:09:37 -070068 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070069 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070070 3,
71 Cellular::kTypeGSM,
Darin Petkov0828f5f2011-08-11 10:18:52 -070072 "",
Darin Petkov137884a2011-10-26 18:52:47 +020073 "",
74 NULL)) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070075 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070076
Chris Masoneb925cc82011-06-22 15:39:57 -070077 protected:
Darin Petkov0828f5f2011-08-11 10:18:52 -070078 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070079};
80
Darin Petkov0828f5f2011-08-11 10:18:52 -070081TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070082 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
83 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070084}
85
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080086TEST_F(CellularPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070087 {
88 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080089 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070090 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070091 flimflam::kCellularAllowRoamingProperty,
92 PropertyStoreTest::kBoolV,
93 &error));
94 }
Chris Masonea8a2c252011-06-27 22:16:30 -070095 // Ensure that attempting to write a R/O property returns InvalidArgs error.
96 {
97 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080098 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
99 flimflam::kAddressProperty,
100 PropertyStoreTest::kStringV,
101 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700102 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 }
104 {
105 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800106 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
107 flimflam::kCarrierProperty,
108 PropertyStoreTest::kStringV,
109 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700110 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700111 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700112}
113
Darin Petkov0828f5f2011-08-11 10:18:52 -0700114class CellularTest : public testing::Test {
115 public:
116 CellularTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800117 : manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
118 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Darin Petkov77cb6812011-08-15 16:19:41 -0700119 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700120 kTestDeviceName)),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700121 device_(new Cellular(&control_interface_,
122 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800123 &metrics_,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700124 &manager_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700125 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700126 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700127 3,
128 Cellular::kTypeGSM,
129 kDBusOwner,
Darin Petkov137884a2011-10-26 18:52:47 +0200130 kDBusPath,
131 NULL)),
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500132 proxy_(new MockModemProxy()),
133 simple_proxy_(new MockModemSimpleProxy()),
134 cdma_proxy_(new MockModemCDMAProxy()),
135 gsm_card_proxy_(new MockModemGSMCardProxy()),
136 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
137 proxy_factory_(this),
138 provider_db_(NULL) {
139 device_->capability_->proxy_factory_ = &proxy_factory_;
140 }
Darin Petkov137884a2011-10-26 18:52:47 +0200141
142 virtual ~CellularTest() {
143 mobile_provider_close_db(provider_db_);
144 provider_db_ = NULL;
145 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700146
147 virtual void SetUp() {
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700148 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700149 device_->set_dhcp_provider(&dhcp_provider_);
Chris Masone2ae797d2011-08-23 20:41:00 -0700150 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700151 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700152 }
153
154 virtual void TearDown() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500155 device_->DestroyIPConfig();
Darin Petkovfb0625e2012-01-16 13:05:56 +0100156 device_->state_ = Cellular::kStateDisabled;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500157 device_->capability_->ReleaseProxies();
Darin Petkov77cb6812011-08-15 16:19:41 -0700158 device_->set_dhcp_provider(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700159 }
160
Eric Shienbrood9a245532012-03-07 14:20:39 -0500161 void InvokeEnable(bool enable, Error *error,
162 const ResultCallback &callback, int timeout) {
163 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500164 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500165 void InvokeGetSignalQuality(Error *error,
166 const SignalQualityCallback &callback,
167 int timeout) {
168 callback.Run(kStrength, Error());
169 }
170 void InvokeGetModemStatus(Error *error,
171 const DBusPropertyMapCallback &callback,
172 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500173 DBusPropertiesMap props;
174 props["carrier"].writer().append_string(kTestCarrier);
175 props["unknown-property"].writer().append_string("irrelevant-value");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500176 callback.Run(props, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500177 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500178 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
179 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500180 static const char kManufacturer[] = "Company";
181 static const char kModelID[] = "Gobi 2000";
182 static const char kHWRev[] = "A00B1234";
183 ModemHardwareInfo info;
184 info._1 = kManufacturer;
185 info._2 = kModelID;
186 info._3 = kHWRev;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500187 callback.Run(info, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500188 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500189 void InvokeGetRegistrationState1X(Error *error,
190 const RegistrationStateCallback &callback,
191 int timeout) {
192 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
193 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
194 Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500195 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500196 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
197 int timeout) {
198 callback.Run(kIMEI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500199 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500200 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
201 int timeout) {
202 callback.Run(kIMSI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500203 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500204 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
205 int timeout) {
206 callback.Run(kMSISDN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500207 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500208 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
209 int timeout) {
210 callback.Run(kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500211 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500212 void InvokeGetRegistrationInfo(Error *error,
213 const RegistrationInfoCallback &callback,
214 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500215 static const char kNetworkID[] = "22803";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500216 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
217 kNetworkID, kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500218 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500219 void InvokeRegister(const string &network_id,
220 Error *error,
221 const ResultCallback &callback,
222 int timeout) {
223 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500224 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500225 void InvokeGetRegistrationState(Error *error,
226 const RegistrationStateCallback &callback,
227 int timeout) {
228 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
229 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
230 Error());
231 }
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400232 void InvokeGetRegistrationStateUnregistered(
233 Error *error,
234 const RegistrationStateCallback &callback,
235 int timeout) {
236 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
237 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
238 Error());
239 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500240 void InvokeConnect(DBusPropertiesMap props, Error *error,
241 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400242 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500243 callback.Run(Error());
244 }
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400245 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
Thieu Leb5954a22012-05-18 10:37:34 -0700246 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400247 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
248 callback.Run(Error(Error::kNotOnHomeNetwork));
249 }
Thieu Leb5954a22012-05-18 10:37:34 -0700250 void InvokeConnectFailNoService(DBusPropertiesMap props, Error *error,
251 const ResultCallback &callback, int timeout) {
252 device_->service_ = NULL;
253 callback.Run(Error(Error::kNotOnHomeNetwork));
254 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500255 void InvokeDisconnect(Error *error, const ResultCallback &callback,
256 int timeout) {
257 if (!callback.is_null())
258 callback.Run(Error());
259 }
260
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400261 void ExpectCdmaStartModem(string network_technology) {
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400262 if (!device_->IsUnderlyingDeviceEnabled())
263 EXPECT_CALL(*proxy_,
264 Enable(true, _, _, CellularCapability::kTimeoutEnable))
265 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400266 EXPECT_CALL(*simple_proxy_,
267 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
268 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
269 EXPECT_CALL(*proxy_,
270 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
271 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
272 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
273 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400274 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400275 else
276 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400277 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400278 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
279 .Times(2)
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400280 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400281 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400282 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400283 }
284
Eric Shienbrood9a245532012-03-07 14:20:39 -0500285 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500286
Darin Petkov0828f5f2011-08-11 10:18:52 -0700287 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500288 static const char kTestDeviceName[];
289 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500290 static const char kDBusOwner[];
291 static const char kDBusPath[];
292 static const char kTestCarrier[];
293 static const char kMEID[];
294 static const char kIMEI[];
295 static const char kIMSI[];
296 static const char kMSISDN[];
297 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500298 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500299
Darin Petkov0828f5f2011-08-11 10:18:52 -0700300 class TestProxyFactory : public ProxyFactory {
301 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700302 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700303
mukesh agrawal1830fa12011-09-26 14:31:40 -0700304 virtual ModemProxyInterface *CreateModemProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700305 const string &/*path*/,
306 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700307 return test_->proxy_.release();
308 }
309
310 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700311 const string &/*path*/,
312 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700313 return test_->simple_proxy_.release();
314 }
315
316 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700317 const string &/*path*/,
318 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700319 return test_->cdma_proxy_.release();
320 }
321
Darin Petkov975b5e72011-08-30 11:48:08 -0700322 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700323 const string &/*path*/,
324 const string &/*service*/) {
Darin Petkov975b5e72011-08-30 11:48:08 -0700325 return test_->gsm_card_proxy_.release();
326 }
327
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700328 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700329 const string &/*path*/,
330 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700331 return test_->gsm_network_proxy_.release();
332 }
333
Darin Petkov0828f5f2011-08-11 10:18:52 -0700334 private:
335 CellularTest *test_;
336 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700337 void StartRTNLHandler();
338 void StopRTNLHandler();
339
Darin Petkov721ac932011-11-16 15:43:09 +0100340 void SetCellularType(Cellular::Type type) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500341 device_->InitCapability(type, &proxy_factory_);
Darin Petkov721ac932011-11-16 15:43:09 +0100342 }
343
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400344 CellularCapabilityClassic *GetCapabilityClassic() {
345 return dynamic_cast<CellularCapabilityClassic *>(
346 device_->capability_.get());
347 }
348
Darin Petkovae0c64e2011-11-15 15:50:27 +0100349 CellularCapabilityCDMA *GetCapabilityCDMA() {
350 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
351 }
352
353 CellularCapabilityGSM *GetCapabilityGSM() {
354 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
355 }
356
Darin Petkov3335b372011-08-22 11:05:32 -0700357 NiceMockControl control_interface_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700358 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800359 MockMetrics metrics_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700360 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700361 MockManager manager_;
362 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700363 NiceMock<MockRTNLHandler> rtnl_handler_;
364
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500365 MockDHCPProvider dhcp_provider_;
366 scoped_refptr<MockDHCPConfig> dhcp_config_;
367
368 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700369 scoped_ptr<MockModemProxy> proxy_;
370 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
371 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700372 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700373 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700374 TestProxyFactory proxy_factory_;
Darin Petkov137884a2011-10-26 18:52:47 +0200375 mobile_provider_db *provider_db_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700376};
377
Darin Petkov77cb6812011-08-15 16:19:41 -0700378const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700379const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700380const char CellularTest::kDBusOwner[] = ":1.19";
381const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700382const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500383const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700384const char CellularTest::kIMEI[] = "987654321098765";
385const char CellularTest::kIMSI[] = "123456789012345";
386const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200387const char CellularTest::kTestMobileProviderDBPath[] =
388 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500389const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700390
Darin Petkove9d12e02011-07-27 15:09:37 -0700391TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700392 EXPECT_EQ("CellularStateDisabled",
393 device_->GetStateString(Cellular::kStateDisabled));
394 EXPECT_EQ("CellularStateEnabled",
395 device_->GetStateString(Cellular::kStateEnabled));
396 EXPECT_EQ("CellularStateRegistered",
397 device_->GetStateString(Cellular::kStateRegistered));
398 EXPECT_EQ("CellularStateConnected",
399 device_->GetStateString(Cellular::kStateConnected));
400 EXPECT_EQ("CellularStateLinked",
401 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700402}
403
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700404TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100405 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400406 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700407 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500408 Error error;
409 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700410 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400411 EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
412 EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700413 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700414 ASSERT_TRUE(device_->service_.get());
415 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100416 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700417 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700418 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700419}
420
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700421TEST_F(CellularTest, StartGSMRegister) {
Darin Petkov137884a2011-10-26 18:52:47 +0200422 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
423 ASSERT_TRUE(provider_db_);
424 device_->provider_db_ = provider_db_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500425 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500426 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500427 EXPECT_CALL(*gsm_card_proxy_,
428 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500429 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500430 EXPECT_CALL(*gsm_card_proxy_,
431 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500432 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500433 EXPECT_CALL(*gsm_card_proxy_,
434 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500435 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
436 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500437 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500438 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700439 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
440 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100441 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
442 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500443 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500444 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200445 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500446 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500447 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500448 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500449 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
450 .Times(2)
451 .WillRepeatedly(Invoke(this,
452 &CellularTest::InvokeGetSignalQuality));
453 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400454 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455 Error error;
456 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
457 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700458 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400459 EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
460 EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
Darin Petkov63138a92012-02-06 14:09:15 +0100461 EXPECT_EQ(kTestCarrier, GetCapabilityGSM()->spn_);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400462 EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700463 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
464 ASSERT_TRUE(device_->service_.get());
465 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100466 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100467 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700468 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700469 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200470 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
471 EXPECT_EQ("Orange", device_->service_->serving_operator().GetName());
472 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700473}
474
Darin Petkovbac96002011-08-09 13:22:00 -0700475TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700476 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
477 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100478 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700479 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400480 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400481 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500482 Error error;
483 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
484 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700485 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700486 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
487}
488
Darin Petkov0828f5f2011-08-11 10:18:52 -0700489TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700490 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
491 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100492 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700493 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400494 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400495 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd408fdf2012-05-07 17:15:57 -0700496 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700497 .WillOnce(Return(dhcp_config_));
498 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700499 EXPECT_CALL(manager_, UpdateService(_)).Times(2);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500500 Error error;
501 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
502 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700503 dispatcher_.DispatchPendingEvents();
504 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700505 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
506 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700507}
508
Darin Petkov3335b372011-08-22 11:05:32 -0700509TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100510 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700511 static const char kPaymentURL[] = "https://payment.url";
512 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700513 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100514 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100515 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700516 device_->CreateService();
517 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100518 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700519 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
520 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Paul Stewart22aa71b2011-09-16 12:15:11 -0700521 EXPECT_TRUE(device_->service_->TechnologyIs(Technology::kCellular));
Darin Petkov3335b372011-08-22 11:05:32 -0700522}
523
Darin Petkovc5f56562011-08-06 16:40:05 -0700524namespace {
525
526MATCHER(ContainsPhoneNumber, "") {
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400527 return ContainsKey(arg,
528 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700529}
530
Eric Shienbrood9a245532012-03-07 14:20:39 -0500531} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700532
533TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700534 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700535 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700536 .Times(2)
537 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700538 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700539 device_->Connect(&error);
540 EXPECT_EQ(Error::kAlreadyConnected, error.type());
541 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700542
Darin Petkov0828f5f2011-08-11 10:18:52 -0700543 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700544 device_->Connect(&error);
545 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700546
Darin Petkovc5f56562011-08-06 16:40:05 -0700547 device_->state_ = Cellular::kStateRegistered;
Darin Petkovd2045802011-08-23 11:09:25 -0700548 device_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800549 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
Darin Petkovd2045802011-08-23 11:09:25 -0700550
Jason Glasgow7b461df2012-05-01 16:38:45 -0400551 device_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100552 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700553 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700554 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500555
Darin Petkov4d6d9412011-08-24 13:19:54 -0700556 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500557 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500558 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500559 CellularCapability::kTimeoutConnect))
560 .Times(2)
561 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400562 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100563 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500564 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700565 device_->Connect(&error);
566 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700567 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500568 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
569
Jason Glasgow7b461df2012-05-01 16:38:45 -0400570 device_->allow_roaming_ = true;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500571 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
572 device_->state_ = Cellular::kStateRegistered;
573 device_->Connect(&error);
574 EXPECT_TRUE(error.IsSuccess());
575 dispatcher_.DispatchPendingEvents();
576 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700577}
578
Eric Shienbrood9a245532012-03-07 14:20:39 -0500579TEST_F(CellularTest, Disconnect) {
580 Error error;
581 device_->state_ = Cellular::kStateRegistered;
582 device_->Disconnect(&error);
583 EXPECT_EQ(Error::kNotConnected, error.type());
584 error.Reset();
585
Darin Petkovfb0625e2012-01-16 13:05:56 +0100586 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500587 EXPECT_CALL(*proxy_,
588 Disconnect(_, _, CellularCapability::kTimeoutDefault))
589 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400590 GetCapabilityClassic()->proxy_.reset(proxy_.release());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500591 device_->Disconnect(&error);
592 EXPECT_TRUE(error.IsSuccess());
593 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100594}
595
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400596TEST_F(CellularTest, ConnectFailure) {
597 SetCellularType(Cellular::kTypeCDMA);
598 device_->state_ = Cellular::kStateRegistered;
599 device_->service_ = new CellularService(
600 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
601 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
602 EXPECT_CALL(*simple_proxy_,
603 Connect(_, _, _, CellularCapability::kTimeoutConnect))
604 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400605 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400606 Error error;
607 device_->Connect(&error);
608 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
609}
610
Thieu Leb5954a22012-05-18 10:37:34 -0700611TEST_F(CellularTest, ConnectFailureNoService) {
612 // Make sure we don't crash if the connect failed and there is no
613 // CellularService object. This can happen if the modem is enabled and
614 // then quick disabled.
615 SetCellularType(Cellular::kTypeCDMA);
616 device_->state_ = Cellular::kStateRegistered;
617 device_->service_ = new CellularService(
618 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
619 EXPECT_CALL(
620 *simple_proxy_,
621 Connect(_, _, _, CellularCapability::kTimeoutConnect))
622 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
623 EXPECT_CALL(manager_, UpdateService(_));
624 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
625 Error error;
626 device_->Connect(&error);
627}
628
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400629TEST_F(CellularTest, ModemStateChangeEnable) {
630 EXPECT_CALL(*simple_proxy_,
631 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
632 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
633 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
634 EXPECT_CALL(*proxy_,
635 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
636 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
637 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
638 .WillOnce(Invoke(this,
639 &CellularTest::InvokeGetRegistrationStateUnregistered));
640 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
641 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
642 EXPECT_CALL(manager_, UpdateEnabledTechnologies());
643 device_->state_ = Cellular::kStateDisabled;
644 device_->set_modem_state(Cellular::kModemStateDisabled);
645 SetCellularType(Cellular::kTypeCDMA);
646
647 DBusPropertiesMap props;
648 props[CellularCapabilityClassic::kModemPropertyEnabled].writer().
649 append_bool(true);
650 device_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
651 dispatcher_.DispatchPendingEvents();
652
653 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
654 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
655 EXPECT_TRUE(device_->enabled());
656}
657
658TEST_F(CellularTest, ModemStateChangeDisable) {
659 EXPECT_CALL(*proxy_,
660 Disconnect(_, _, CellularCapability::kTimeoutDefault))
661 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
662 EXPECT_CALL(*proxy_,
Thieu Lec8d2d962012-05-15 14:31:18 -0700663 Enable(false, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400664 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
665 EXPECT_CALL(manager_, UpdateEnabledTechnologies());
666 device_->enabled_ = true;
667 device_->enabled_pending_ = true;
668 device_->state_ = Cellular::kStateEnabled;
669 device_->set_modem_state(Cellular::kModemStateEnabled);
670 SetCellularType(Cellular::kTypeCDMA);
671 GetCapabilityClassic()->InitProxies();
672
673 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
674 kModemClassicStateDisabled,
675 0);
676 dispatcher_.DispatchPendingEvents();
677
678 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
679 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
680 EXPECT_FALSE(device_->enabled());
681}
682
Thieu Le37b90032012-05-15 15:18:41 -0700683TEST_F(CellularTest, StartModemCallback) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700684 EXPECT_CALL(*this, TestCallback(IsSuccess()));
685 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700686 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
687 Unretained(this)),
688 Error(Error::kSuccess));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700689 EXPECT_EQ(device_->state_, Cellular::kStateEnabled);
690}
691
Thieu Le37b90032012-05-15 15:18:41 -0700692TEST_F(CellularTest, StartModemCallbackFail) {
Gary Morainbaeefdf2012-04-30 14:53:35 -0700693 EXPECT_CALL(*this, TestCallback(IsFailure()));
694 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
Thieu Le37b90032012-05-15 15:18:41 -0700695 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
696 Unretained(this)),
697 Error(Error::kOperationFailed));
Gary Morainbaeefdf2012-04-30 14:53:35 -0700698 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
699}
700
Thieu Le37b90032012-05-15 15:18:41 -0700701TEST_F(CellularTest, StopModemCallback) {
702 EXPECT_CALL(*this, TestCallback(IsSuccess()));
703 device_->service_ = new MockCellularService(&control_interface_,
704 &dispatcher_,
705 &metrics_,
706 &manager_,
707 device_);
708 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
709 Unretained(this)),
710 Error(Error::kSuccess));
711 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
712 EXPECT_FALSE(device_->service_.get());
713}
714
715TEST_F(CellularTest, StopModemCallbackFail) {
716 EXPECT_CALL(*this, TestCallback(IsFailure()));
717 device_->service_ = new MockCellularService(&control_interface_,
718 &dispatcher_,
719 &metrics_,
720 &manager_,
721 device_);
722 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
723 Unretained(this)),
724 Error(Error::kOperationFailed));
725 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
726 EXPECT_FALSE(device_->service_.get());
727}
728
Chris Masoneb925cc82011-06-22 15:39:57 -0700729} // namespace shill