blob: 0d85ae32f58f819ba91a7eecb21748387e9388e6 [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"
Darin Petkov184c54e2011-11-15 12:44:39 +010017#include "shill/cellular_capability_gsm.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"
Chris Masone2ae797d2011-08-23 20:41:00 -070021#include "shill/mock_device_info.h"
Darin Petkov77cb6812011-08-15 16:19:41 -070022#include "shill/mock_dhcp_config.h"
23#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070024#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080025#include "shill/mock_metrics.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070026#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070027#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070028#include "shill/mock_modem_gsm_network_proxy.h"
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"
Darin Petkov3335b372011-08-22 11:05:32 -070032#include "shill/nice_mock_control.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070033#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070034#include "shill/proxy_factory.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070035
Eric Shienbrood9a245532012-03-07 14:20:39 -050036using base::Bind;
37using base::Unretained;
Darin Petkovc0865312011-09-16 15:31:20 -070038using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070039using std::string;
Darin Petkovbec79a22011-08-01 14:47:17 -070040using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070041using testing::AnyNumber;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050042using testing::Invoke;
Darin Petkov0828f5f2011-08-11 10:18:52 -070043using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070044using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070045using testing::SetArgumentPointee;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050046using testing::Unused;
Chris Masoneb925cc82011-06-22 15:39:57 -070047
48namespace shill {
49
Eric Shienbrood9a245532012-03-07 14:20:39 -050050MATCHER(IsSuccess, "") {
51 return arg.IsSuccess();
52}
53
Darin Petkov0828f5f2011-08-11 10:18:52 -070054class CellularPropertyTest : public PropertyStoreTest {
55 public:
56 CellularPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070057 : device_(new Cellular(control_interface(),
Darin Petkov0828f5f2011-08-11 10:18:52 -070058 NULL,
59 NULL,
Thieu Le3426c8f2012-01-11 17:35:11 -080060 NULL,
Darin Petkove9d12e02011-07-27 15:09:37 -070061 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070062 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070063 3,
64 Cellular::kTypeGSM,
Darin Petkov0828f5f2011-08-11 10:18:52 -070065 "",
Darin Petkov137884a2011-10-26 18:52:47 +020066 "",
67 NULL)) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070068 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070069
Chris Masoneb925cc82011-06-22 15:39:57 -070070 protected:
Darin Petkov0828f5f2011-08-11 10:18:52 -070071 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070072};
73
Darin Petkov0828f5f2011-08-11 10:18:52 -070074TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070075 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
76 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070077}
78
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080079TEST_F(CellularPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070080 {
81 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080082 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070083 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070084 flimflam::kCellularAllowRoamingProperty,
85 PropertyStoreTest::kBoolV,
86 &error));
87 }
Chris Masonea8a2c252011-06-27 22:16:30 -070088 // Ensure that attempting to write a R/O property returns InvalidArgs error.
89 {
90 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080091 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
92 flimflam::kAddressProperty,
93 PropertyStoreTest::kStringV,
94 &error));
Chris Masone9d779932011-08-25 16:33:41 -070095 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -070096 }
97 {
98 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080099 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
100 flimflam::kCarrierProperty,
101 PropertyStoreTest::kStringV,
102 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700103 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700105}
106
Darin Petkov0828f5f2011-08-11 10:18:52 -0700107class CellularTest : public testing::Test {
108 public:
109 CellularTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800110 : manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
111 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Darin Petkov77cb6812011-08-15 16:19:41 -0700112 dhcp_config_(new MockDHCPConfig(&control_interface_,
113 &dispatcher_,
114 &dhcp_provider_,
115 kTestDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -0800116 "",
Darin Petkov77cb6812011-08-15 16:19:41 -0700117 &glib_)),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700118 device_(new Cellular(&control_interface_,
119 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800120 &metrics_,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700121 &manager_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700122 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700123 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700124 3,
125 Cellular::kTypeGSM,
126 kDBusOwner,
Darin Petkov137884a2011-10-26 18:52:47 +0200127 kDBusPath,
128 NULL)),
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500129 proxy_(new MockModemProxy()),
130 simple_proxy_(new MockModemSimpleProxy()),
131 cdma_proxy_(new MockModemCDMAProxy()),
132 gsm_card_proxy_(new MockModemGSMCardProxy()),
133 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
134 proxy_factory_(this),
135 provider_db_(NULL) {
136 device_->capability_->proxy_factory_ = &proxy_factory_;
137 }
Darin Petkov137884a2011-10-26 18:52:47 +0200138
139 virtual ~CellularTest() {
140 mobile_provider_close_db(provider_db_);
141 provider_db_ = NULL;
142 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700143
144 virtual void SetUp() {
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700145 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700146 device_->set_dhcp_provider(&dhcp_provider_);
Chris Masone2ae797d2011-08-23 20:41:00 -0700147 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700148 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700149 }
150
151 virtual void TearDown() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500152 device_->DestroyIPConfig();
Darin Petkovfb0625e2012-01-16 13:05:56 +0100153 device_->state_ = Cellular::kStateDisabled;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500154 device_->capability_->ReleaseProxies();
Darin Petkov77cb6812011-08-15 16:19:41 -0700155 device_->set_dhcp_provider(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700156 }
157
Eric Shienbrood9a245532012-03-07 14:20:39 -0500158 void InvokeEnable(bool enable, Error *error,
159 const ResultCallback &callback, int timeout) {
160 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500161 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500162 void InvokeGetSignalQuality(Error *error,
163 const SignalQualityCallback &callback,
164 int timeout) {
165 callback.Run(kStrength, Error());
166 }
167 void InvokeGetModemStatus(Error *error,
168 const DBusPropertyMapCallback &callback,
169 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500170 DBusPropertiesMap props;
171 props["carrier"].writer().append_string(kTestCarrier);
172 props["unknown-property"].writer().append_string("irrelevant-value");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500173 callback.Run(props, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500174 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500175 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
176 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500177 static const char kManufacturer[] = "Company";
178 static const char kModelID[] = "Gobi 2000";
179 static const char kHWRev[] = "A00B1234";
180 ModemHardwareInfo info;
181 info._1 = kManufacturer;
182 info._2 = kModelID;
183 info._3 = kHWRev;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500184 callback.Run(info, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500185 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500186 void InvokeGetRegistrationState1X(Error *error,
187 const RegistrationStateCallback &callback,
188 int timeout) {
189 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
190 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
191 Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500192 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500193 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
194 int timeout) {
195 callback.Run(kIMEI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500196 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500197 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
198 int timeout) {
199 callback.Run(kIMSI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500200 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500201 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
202 int timeout) {
203 callback.Run(kMSISDN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500204 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500205 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
206 int timeout) {
207 callback.Run(kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500208 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500209 void InvokeGetRegistrationInfo(Error *error,
210 const RegistrationInfoCallback &callback,
211 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500212 static const char kNetworkID[] = "22803";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500213 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
214 kNetworkID, kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500215 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500216 void InvokeRegister(const string &network_id,
217 Error *error,
218 const ResultCallback &callback,
219 int timeout) {
220 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500221 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500222 void InvokeGetRegistrationState(Error *error,
223 const RegistrationStateCallback &callback,
224 int timeout) {
225 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
226 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
227 Error());
228 }
229 void InvokeConnect(DBusPropertiesMap props, Error *error,
230 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400231 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500232 callback.Run(Error());
233 }
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400234 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
235 const ResultCallback &callback, int timeout) {
236 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
237 callback.Run(Error(Error::kNotOnHomeNetwork));
238 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500239 void InvokeDisconnect(Error *error, const ResultCallback &callback,
240 int timeout) {
241 if (!callback.is_null())
242 callback.Run(Error());
243 }
244
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400245 void ExpectCdmaStartModem(string network_technology) {
246 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
247 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
248 EXPECT_CALL(*simple_proxy_,
249 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
250 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
251 EXPECT_CALL(*proxy_,
252 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
253 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
254 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
255 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
256 .WillOnce(Invoke(this,
257 &CellularTest::InvokeGetRegistrationState1X));
258 else
259 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
260 .WillOnce(Invoke(this,
261 &CellularTest::InvokeGetRegistrationState));
262 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
263 .Times(2)
264 .WillRepeatedly(Invoke(this,
265 &CellularTest::InvokeGetSignalQuality));
266 EXPECT_CALL(*this, TestCallback(IsSuccess()));
267 }
268
Eric Shienbrood9a245532012-03-07 14:20:39 -0500269 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500270
Darin Petkov0828f5f2011-08-11 10:18:52 -0700271 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500272 static const char kTestDeviceName[];
273 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500274 static const char kDBusOwner[];
275 static const char kDBusPath[];
276 static const char kTestCarrier[];
277 static const char kMEID[];
278 static const char kIMEI[];
279 static const char kIMSI[];
280 static const char kMSISDN[];
281 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500282 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500283
Darin Petkov0828f5f2011-08-11 10:18:52 -0700284 class TestProxyFactory : public ProxyFactory {
285 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700286 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700287
mukesh agrawal1830fa12011-09-26 14:31:40 -0700288 virtual ModemProxyInterface *CreateModemProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700289 const string &/*path*/,
290 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700291 return test_->proxy_.release();
292 }
293
294 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700295 const string &/*path*/,
296 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700297 return test_->simple_proxy_.release();
298 }
299
300 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700301 const string &/*path*/,
302 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700303 return test_->cdma_proxy_.release();
304 }
305
Darin Petkov975b5e72011-08-30 11:48:08 -0700306 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700307 const string &/*path*/,
308 const string &/*service*/) {
Darin Petkov975b5e72011-08-30 11:48:08 -0700309 return test_->gsm_card_proxy_.release();
310 }
311
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700312 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700313 const string &/*path*/,
314 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700315 return test_->gsm_network_proxy_.release();
316 }
317
Darin Petkov0828f5f2011-08-11 10:18:52 -0700318 private:
319 CellularTest *test_;
320 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700321 void StartRTNLHandler();
322 void StopRTNLHandler();
323
Darin Petkov721ac932011-11-16 15:43:09 +0100324 void SetCellularType(Cellular::Type type) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500325 device_->InitCapability(type, &proxy_factory_);
Darin Petkov721ac932011-11-16 15:43:09 +0100326 }
327
Darin Petkovae0c64e2011-11-15 15:50:27 +0100328 CellularCapabilityCDMA *GetCapabilityCDMA() {
329 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
330 }
331
332 CellularCapabilityGSM *GetCapabilityGSM() {
333 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
334 }
335
Darin Petkov3335b372011-08-22 11:05:32 -0700336 NiceMockControl control_interface_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700337 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800338 MockMetrics metrics_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700339 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700340 MockManager manager_;
341 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700342 NiceMock<MockRTNLHandler> rtnl_handler_;
343
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500344 MockDHCPProvider dhcp_provider_;
345 scoped_refptr<MockDHCPConfig> dhcp_config_;
346
347 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700348 scoped_ptr<MockModemProxy> proxy_;
349 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
350 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700351 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700352 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700353 TestProxyFactory proxy_factory_;
Darin Petkov137884a2011-10-26 18:52:47 +0200354 mobile_provider_db *provider_db_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700355};
356
Darin Petkov77cb6812011-08-15 16:19:41 -0700357const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700358const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700359const char CellularTest::kDBusOwner[] = ":1.19";
360const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700361const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500362const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700363const char CellularTest::kIMEI[] = "987654321098765";
364const char CellularTest::kIMSI[] = "123456789012345";
365const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200366const char CellularTest::kTestMobileProviderDBPath[] =
367 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500368const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700369
Darin Petkove9d12e02011-07-27 15:09:37 -0700370TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700371 EXPECT_EQ("CellularStateDisabled",
372 device_->GetStateString(Cellular::kStateDisabled));
373 EXPECT_EQ("CellularStateEnabled",
374 device_->GetStateString(Cellular::kStateEnabled));
375 EXPECT_EQ("CellularStateRegistered",
376 device_->GetStateString(Cellular::kStateRegistered));
377 EXPECT_EQ("CellularStateConnected",
378 device_->GetStateString(Cellular::kStateConnected));
379 EXPECT_EQ("CellularStateLinked",
380 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700381}
382
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700383TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100384 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400385 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700386 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500387 Error error;
388 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700389 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500390 EXPECT_EQ(kMEID, device_->capability_->meid_);
391 EXPECT_EQ(kTestCarrier, device_->capability_->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700392 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700393 ASSERT_TRUE(device_->service_.get());
394 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100395 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700396 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700397 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700398}
399
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700400TEST_F(CellularTest, StartGSMRegister) {
Darin Petkov137884a2011-10-26 18:52:47 +0200401 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
402 ASSERT_TRUE(provider_db_);
403 device_->provider_db_ = provider_db_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500404 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500405 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
406 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500407 Register("", _, _, CellularCapability::kTimeoutRegister))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500408 .WillOnce(Invoke(this, &CellularTest::InvokeRegister));
409 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500410 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500411 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500412 EXPECT_CALL(*gsm_card_proxy_,
413 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500414 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500415 EXPECT_CALL(*gsm_card_proxy_,
416 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500417 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500418 EXPECT_CALL(*gsm_card_proxy_,
419 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500420 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
421 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500422 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500423 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700424 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
425 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100426 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
427 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500428 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500429 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200430 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500431 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500432 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500433 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500434 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
435 .Times(2)
436 .WillRepeatedly(Invoke(this,
437 &CellularTest::InvokeGetSignalQuality));
438 EXPECT_CALL(*this, TestCallback(IsSuccess()));
439 Error error;
440 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
441 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700442 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500443 EXPECT_EQ(kIMEI, device_->capability_->imei_);
444 EXPECT_EQ(kIMSI, device_->capability_->imsi_);
Darin Petkov63138a92012-02-06 14:09:15 +0100445 EXPECT_EQ(kTestCarrier, GetCapabilityGSM()->spn_);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500446 EXPECT_EQ(kMSISDN, device_->capability_->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700447 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
448 ASSERT_TRUE(device_->service_.get());
449 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100450 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100451 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700452 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700453 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200454 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
455 EXPECT_EQ("Orange", device_->service_->serving_operator().GetName());
456 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700457}
458
Darin Petkovbac96002011-08-09 13:22:00 -0700459TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700460 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
461 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100462 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700463 device_->set_modem_state(Cellular::kModemStateConnected);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500464 device_->capability_->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400465 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500466 Error error;
467 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
468 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700469 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700470 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
471}
472
Darin Petkov0828f5f2011-08-11 10:18:52 -0700473TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700474 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
475 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100476 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700477 device_->set_modem_state(Cellular::kModemStateConnected);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500478 device_->capability_->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400479 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd32f4842012-01-11 16:08:13 -0800480 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700481 .WillOnce(Return(dhcp_config_));
482 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700483 EXPECT_CALL(manager_, UpdateService(_)).Times(2);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484 Error error;
485 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
486 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700487 dispatcher_.DispatchPendingEvents();
488 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700489 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
490 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700491}
492
Darin Petkov3335b372011-08-22 11:05:32 -0700493TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100494 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700495 static const char kPaymentURL[] = "https://payment.url";
496 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700497 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100498 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100499 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700500 device_->CreateService();
501 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100502 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700503 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
504 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Paul Stewart22aa71b2011-09-16 12:15:11 -0700505 EXPECT_TRUE(device_->service_->TechnologyIs(Technology::kCellular));
Darin Petkov3335b372011-08-22 11:05:32 -0700506}
507
Darin Petkovc5f56562011-08-06 16:40:05 -0700508namespace {
509
510MATCHER(ContainsPhoneNumber, "") {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500511 return ContainsKey(arg, CellularCapability::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700512}
513
Eric Shienbrood9a245532012-03-07 14:20:39 -0500514} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700515
516TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700517 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700518 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700519 .Times(2)
520 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700521 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700522 device_->Connect(&error);
523 EXPECT_EQ(Error::kAlreadyConnected, error.type());
524 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700525
Darin Petkov0828f5f2011-08-11 10:18:52 -0700526 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700527 device_->Connect(&error);
528 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700529
Darin Petkovc5f56562011-08-06 16:40:05 -0700530 device_->state_ = Cellular::kStateRegistered;
Darin Petkovd2045802011-08-23 11:09:25 -0700531 device_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800532 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
Darin Petkovd2045802011-08-23 11:09:25 -0700533
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500534 device_->capability_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100535 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700536 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700537 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500538
Darin Petkov4d6d9412011-08-24 13:19:54 -0700539 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500540 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500541 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500542 CellularCapability::kTimeoutConnect))
543 .Times(2)
544 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
545 device_->capability_->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100546 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500547 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700548 device_->Connect(&error);
549 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700550 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500551 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
552
553 device_->capability_->allow_roaming_ = true;
554 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
555 device_->state_ = Cellular::kStateRegistered;
556 device_->Connect(&error);
557 EXPECT_TRUE(error.IsSuccess());
558 dispatcher_.DispatchPendingEvents();
559 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700560}
561
Eric Shienbrood9a245532012-03-07 14:20:39 -0500562TEST_F(CellularTest, Disconnect) {
563 Error error;
564 device_->state_ = Cellular::kStateRegistered;
565 device_->Disconnect(&error);
566 EXPECT_EQ(Error::kNotConnected, error.type());
567 error.Reset();
568
Darin Petkovfb0625e2012-01-16 13:05:56 +0100569 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500570 EXPECT_CALL(*proxy_,
571 Disconnect(_, _, CellularCapability::kTimeoutDefault))
572 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
573 device_->capability_->proxy_.reset(proxy_.release());
574 device_->Disconnect(&error);
575 EXPECT_TRUE(error.IsSuccess());
576 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100577}
578
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400579TEST_F(CellularTest, ConnectFailure) {
580 SetCellularType(Cellular::kTypeCDMA);
581 device_->state_ = Cellular::kStateRegistered;
582 device_->service_ = new CellularService(
583 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
584 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
585 EXPECT_CALL(*simple_proxy_,
586 Connect(_, _, _, CellularCapability::kTimeoutConnect))
587 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
588 device_->capability_->simple_proxy_.reset(simple_proxy_.release());
589 Error error;
590 device_->Connect(&error);
591 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
592}
593
Chris Masoneb925cc82011-06-22 15:39:57 -0700594} // namespace shill