blob: 336f175cbf0c0f8323503f66f2d4b19b4f5461e7 [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"
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"
Chris Masone2ae797d2011-08-23 20:41:00 -070025#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080026#include "shill/mock_metrics.h"
Darin Petkovbec79a22011-08-01 14:47:17 -070027#include "shill/mock_modem_cdma_proxy.h"
Darin Petkov975b5e72011-08-30 11:48:08 -070028#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkova1e0a1c2011-08-25 15:08:33 -070029#include "shill/mock_modem_gsm_network_proxy.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070030#include "shill/mock_modem_proxy.h"
Darin Petkove604f702011-07-28 15:51:17 -070031#include "shill/mock_modem_simple_proxy.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070032#include "shill/mock_rtnl_handler.h"
Darin Petkov3335b372011-08-22 11:05:32 -070033#include "shill/nice_mock_control.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070034#include "shill/property_store_unittest.h"
Darin Petkove9d12e02011-07-27 15:09:37 -070035#include "shill/proxy_factory.h"
Chris Masoneb925cc82011-06-22 15:39:57 -070036
Eric Shienbrood9a245532012-03-07 14:20:39 -050037using base::Bind;
38using base::Unretained;
Darin Petkovc0865312011-09-16 15:31:20 -070039using std::map;
Chris Masoneb925cc82011-06-22 15:39:57 -070040using std::string;
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040041using std::vector;
Darin Petkovbec79a22011-08-01 14:47:17 -070042using testing::_;
Chris Masoneb9c00592011-10-06 13:10:39 -070043using testing::AnyNumber;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050044using testing::Invoke;
Darin Petkov0828f5f2011-08-11 10:18:52 -070045using testing::NiceMock;
Darin Petkove604f702011-07-28 15:51:17 -070046using testing::Return;
Darin Petkovbec79a22011-08-01 14:47:17 -070047using testing::SetArgumentPointee;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050048using testing::Unused;
Chris Masoneb925cc82011-06-22 15:39:57 -070049
50namespace shill {
51
Eric Shienbrood9a245532012-03-07 14:20:39 -050052MATCHER(IsSuccess, "") {
53 return arg.IsSuccess();
54}
55
Darin Petkov0828f5f2011-08-11 10:18:52 -070056class CellularPropertyTest : public PropertyStoreTest {
57 public:
58 CellularPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070059 : device_(new Cellular(control_interface(),
Darin Petkov0828f5f2011-08-11 10:18:52 -070060 NULL,
61 NULL,
Thieu Le3426c8f2012-01-11 17:35:11 -080062 NULL,
Darin Petkove9d12e02011-07-27 15:09:37 -070063 "usb0",
Chris Masone626719f2011-08-18 16:58:48 -070064 "00:01:02:03:04:05",
Darin Petkove9d12e02011-07-27 15:09:37 -070065 3,
66 Cellular::kTypeGSM,
Darin Petkov0828f5f2011-08-11 10:18:52 -070067 "",
Darin Petkov137884a2011-10-26 18:52:47 +020068 "",
69 NULL)) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -070070 virtual ~CellularPropertyTest() {}
Darin Petkove9d12e02011-07-27 15:09:37 -070071
Chris Masoneb925cc82011-06-22 15:39:57 -070072 protected:
Darin Petkov0828f5f2011-08-11 10:18:52 -070073 DeviceRefPtr device_;
Chris Masoneb925cc82011-06-22 15:39:57 -070074};
75
Darin Petkov0828f5f2011-08-11 10:18:52 -070076TEST_F(CellularPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070077 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
78 EXPECT_FALSE(device_->store().Contains(""));
Chris Masoneb925cc82011-06-22 15:39:57 -070079}
80
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080081TEST_F(CellularPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070082 {
83 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080084 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070085 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070086 flimflam::kCellularAllowRoamingProperty,
87 PropertyStoreTest::kBoolV,
88 &error));
89 }
Chris Masonea8a2c252011-06-27 22:16:30 -070090 // Ensure that attempting to write a R/O property returns InvalidArgs error.
91 {
92 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080093 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
94 flimflam::kAddressProperty,
95 PropertyStoreTest::kStringV,
96 &error));
Chris Masone9d779932011-08-25 16:33:41 -070097 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -070098 }
99 {
100 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800101 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
102 flimflam::kCarrierProperty,
103 PropertyStoreTest::kStringV,
104 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700105 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 }
Chris Masoneb925cc82011-06-22 15:39:57 -0700107}
108
Darin Petkov0828f5f2011-08-11 10:18:52 -0700109class CellularTest : public testing::Test {
110 public:
111 CellularTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800112 : manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
113 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Darin Petkov77cb6812011-08-15 16:19:41 -0700114 dhcp_config_(new MockDHCPConfig(&control_interface_,
115 &dispatcher_,
116 &dhcp_provider_,
117 kTestDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -0800118 "",
Darin Petkov77cb6812011-08-15 16:19:41 -0700119 &glib_)),
Darin Petkov0828f5f2011-08-11 10:18:52 -0700120 device_(new Cellular(&control_interface_,
121 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800122 &metrics_,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700123 &manager_,
Darin Petkov77cb6812011-08-15 16:19:41 -0700124 kTestDeviceName,
Chris Masone626719f2011-08-18 16:58:48 -0700125 kTestDeviceAddress,
Darin Petkov0828f5f2011-08-11 10:18:52 -0700126 3,
127 Cellular::kTypeGSM,
128 kDBusOwner,
Darin Petkov137884a2011-10-26 18:52:47 +0200129 kDBusPath,
130 NULL)),
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500131 proxy_(new MockModemProxy()),
132 simple_proxy_(new MockModemSimpleProxy()),
133 cdma_proxy_(new MockModemCDMAProxy()),
134 gsm_card_proxy_(new MockModemGSMCardProxy()),
135 gsm_network_proxy_(new MockModemGSMNetworkProxy()),
136 proxy_factory_(this),
137 provider_db_(NULL) {
138 device_->capability_->proxy_factory_ = &proxy_factory_;
139 }
Darin Petkov137884a2011-10-26 18:52:47 +0200140
141 virtual ~CellularTest() {
142 mobile_provider_close_db(provider_db_);
143 provider_db_ = NULL;
144 }
Darin Petkov0828f5f2011-08-11 10:18:52 -0700145
146 virtual void SetUp() {
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700147 static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
Darin Petkov77cb6812011-08-15 16:19:41 -0700148 device_->set_dhcp_provider(&dhcp_provider_);
Chris Masone2ae797d2011-08-23 20:41:00 -0700149 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700150 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700151 }
152
153 virtual void TearDown() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500154 device_->DestroyIPConfig();
Darin Petkovfb0625e2012-01-16 13:05:56 +0100155 device_->state_ = Cellular::kStateDisabled;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500156 device_->capability_->ReleaseProxies();
Darin Petkov77cb6812011-08-15 16:19:41 -0700157 device_->set_dhcp_provider(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700158 }
159
Eric Shienbrood9a245532012-03-07 14:20:39 -0500160 void InvokeEnable(bool enable, Error *error,
161 const ResultCallback &callback, int timeout) {
162 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500163 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500164 void InvokeGetSignalQuality(Error *error,
165 const SignalQualityCallback &callback,
166 int timeout) {
167 callback.Run(kStrength, Error());
168 }
169 void InvokeGetModemStatus(Error *error,
170 const DBusPropertyMapCallback &callback,
171 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500172 DBusPropertiesMap props;
173 props["carrier"].writer().append_string(kTestCarrier);
174 props["unknown-property"].writer().append_string("irrelevant-value");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500175 callback.Run(props, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500176 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500177 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
178 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500179 static const char kManufacturer[] = "Company";
180 static const char kModelID[] = "Gobi 2000";
181 static const char kHWRev[] = "A00B1234";
182 ModemHardwareInfo info;
183 info._1 = kManufacturer;
184 info._2 = kModelID;
185 info._3 = kHWRev;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500186 callback.Run(info, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500187 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500188 void InvokeGetRegistrationState1X(Error *error,
189 const RegistrationStateCallback &callback,
190 int timeout) {
191 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
192 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
193 Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500194 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500195 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
196 int timeout) {
197 callback.Run(kIMEI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500198 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500199 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
200 int timeout) {
201 callback.Run(kIMSI, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500202 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500203 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
204 int timeout) {
205 callback.Run(kMSISDN, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500206 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500207 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
208 int timeout) {
209 callback.Run(kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500210 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500211 void InvokeGetRegistrationInfo(Error *error,
212 const RegistrationInfoCallback &callback,
213 int timeout) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500214 static const char kNetworkID[] = "22803";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500215 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
216 kNetworkID, kTestCarrier, Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500217 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500218 void InvokeRegister(const string &network_id,
219 Error *error,
220 const ResultCallback &callback,
221 int timeout) {
222 callback.Run(Error());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500223 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500224 void InvokeGetRegistrationState(Error *error,
225 const RegistrationStateCallback &callback,
226 int timeout) {
227 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
228 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
229 Error());
230 }
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400231 void InvokeGetRegistrationStateUnregistered(
232 Error *error,
233 const RegistrationStateCallback &callback,
234 int timeout) {
235 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
236 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
237 Error());
238 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500239 void InvokeConnect(DBusPropertiesMap props, Error *error,
240 const ResultCallback &callback, int timeout) {
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400241 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500242 callback.Run(Error());
243 }
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400244 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
245 const ResultCallback &callback, int timeout) {
246 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
247 callback.Run(Error(Error::kNotOnHomeNetwork));
248 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500249 void InvokeDisconnect(Error *error, const ResultCallback &callback,
250 int timeout) {
251 if (!callback.is_null())
252 callback.Run(Error());
253 }
254
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400255 void ExpectCdmaStartModem(string network_technology) {
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400256 if (!device_->IsUnderlyingDeviceEnabled())
257 EXPECT_CALL(*proxy_,
258 Enable(true, _, _, CellularCapability::kTimeoutEnable))
259 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400260 EXPECT_CALL(*simple_proxy_,
261 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
262 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
263 EXPECT_CALL(*proxy_,
264 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
265 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
266 if (network_technology == flimflam::kNetworkTechnology1Xrtt)
267 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400268 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400269 else
270 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400271 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400272 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
273 .Times(2)
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400274 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400275 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400276 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400277 }
278
Eric Shienbrood9a245532012-03-07 14:20:39 -0500279 MOCK_METHOD1(TestCallback, void(const Error &error));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500280
Darin Petkov0828f5f2011-08-11 10:18:52 -0700281 protected:
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500282 static const char kTestDeviceName[];
283 static const char kTestDeviceAddress[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500284 static const char kDBusOwner[];
285 static const char kDBusPath[];
286 static const char kTestCarrier[];
287 static const char kMEID[];
288 static const char kIMEI[];
289 static const char kIMSI[];
290 static const char kMSISDN[];
291 static const char kTestMobileProviderDBPath[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500292 static const int kStrength;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500293
Darin Petkov0828f5f2011-08-11 10:18:52 -0700294 class TestProxyFactory : public ProxyFactory {
295 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700296 explicit TestProxyFactory(CellularTest *test) : test_(test) {}
Darin Petkov0828f5f2011-08-11 10:18:52 -0700297
mukesh agrawal1830fa12011-09-26 14:31:40 -0700298 virtual ModemProxyInterface *CreateModemProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700299 const string &/*path*/,
300 const string &/*service*/) {
Darin Petkov0828f5f2011-08-11 10:18:52 -0700301 return test_->proxy_.release();
302 }
303
304 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
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_->simple_proxy_.release();
308 }
309
310 virtual ModemCDMAProxyInterface *CreateModemCDMAProxy(
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_->cdma_proxy_.release();
314 }
315
Darin Petkov975b5e72011-08-30 11:48:08 -0700316 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700317 const string &/*path*/,
318 const string &/*service*/) {
Darin Petkov975b5e72011-08-30 11:48:08 -0700319 return test_->gsm_card_proxy_.release();
320 }
321
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700322 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700323 const string &/*path*/,
324 const string &/*service*/) {
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700325 return test_->gsm_network_proxy_.release();
326 }
327
Darin Petkov0828f5f2011-08-11 10:18:52 -0700328 private:
329 CellularTest *test_;
330 };
Darin Petkov0828f5f2011-08-11 10:18:52 -0700331 void StartRTNLHandler();
332 void StopRTNLHandler();
333
Darin Petkov721ac932011-11-16 15:43:09 +0100334 void SetCellularType(Cellular::Type type) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500335 device_->InitCapability(type, &proxy_factory_);
Darin Petkov721ac932011-11-16 15:43:09 +0100336 }
337
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400338 CellularCapabilityClassic *GetCapabilityClassic() {
339 return dynamic_cast<CellularCapabilityClassic *>(
340 device_->capability_.get());
341 }
342
Darin Petkovae0c64e2011-11-15 15:50:27 +0100343 CellularCapabilityCDMA *GetCapabilityCDMA() {
344 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
345 }
346
347 CellularCapabilityGSM *GetCapabilityGSM() {
348 return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
349 }
350
Darin Petkov3335b372011-08-22 11:05:32 -0700351 NiceMockControl control_interface_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700352 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800353 MockMetrics metrics_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700354 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700355 MockManager manager_;
356 MockDeviceInfo device_info_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700357 NiceMock<MockRTNLHandler> rtnl_handler_;
358
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500359 MockDHCPProvider dhcp_provider_;
360 scoped_refptr<MockDHCPConfig> dhcp_config_;
361
362 CellularRefPtr device_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700363 scoped_ptr<MockModemProxy> proxy_;
364 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
365 scoped_ptr<MockModemCDMAProxy> cdma_proxy_;
Darin Petkov975b5e72011-08-30 11:48:08 -0700366 scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700367 scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700368 TestProxyFactory proxy_factory_;
Darin Petkov137884a2011-10-26 18:52:47 +0200369 mobile_provider_db *provider_db_;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700370};
371
Darin Petkov77cb6812011-08-15 16:19:41 -0700372const char CellularTest::kTestDeviceName[] = "usb0";
Chris Masone626719f2011-08-18 16:58:48 -0700373const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
Darin Petkov0828f5f2011-08-11 10:18:52 -0700374const char CellularTest::kDBusOwner[] = ":1.19";
375const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
Darin Petkov51489002011-08-18 13:13:20 -0700376const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500377const char CellularTest::kMEID[] = "01234567EF8901";
Darin Petkov975b5e72011-08-30 11:48:08 -0700378const char CellularTest::kIMEI[] = "987654321098765";
379const char CellularTest::kIMSI[] = "123456789012345";
380const char CellularTest::kMSISDN[] = "12345678901";
Darin Petkov137884a2011-10-26 18:52:47 +0200381const char CellularTest::kTestMobileProviderDBPath[] =
382 "provider_db_unittest.bfd";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500383const int CellularTest::kStrength = 90;
Darin Petkov0828f5f2011-08-11 10:18:52 -0700384
Darin Petkove9d12e02011-07-27 15:09:37 -0700385TEST_F(CellularTest, GetStateString) {
Darin Petkovcc044422011-08-17 13:30:06 -0700386 EXPECT_EQ("CellularStateDisabled",
387 device_->GetStateString(Cellular::kStateDisabled));
388 EXPECT_EQ("CellularStateEnabled",
389 device_->GetStateString(Cellular::kStateEnabled));
390 EXPECT_EQ("CellularStateRegistered",
391 device_->GetStateString(Cellular::kStateRegistered));
392 EXPECT_EQ("CellularStateConnected",
393 device_->GetStateString(Cellular::kStateConnected));
394 EXPECT_EQ("CellularStateLinked",
395 device_->GetStateString(Cellular::kStateLinked));
Darin Petkove9d12e02011-07-27 15:09:37 -0700396}
397
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700398TEST_F(CellularTest, StartCDMARegister) {
Darin Petkov721ac932011-11-16 15:43:09 +0100399 SetCellularType(Cellular::kTypeCDMA);
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400400 ExpectCdmaStartModem(flimflam::kNetworkTechnology1Xrtt);
Darin Petkov975b5e72011-08-30 11:48:08 -0700401 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500402 Error error;
403 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
Darin Petkov0828f5f2011-08-11 10:18:52 -0700404 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400405 EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
406 EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
Darin Petkovbac96002011-08-09 13:22:00 -0700407 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovd2045802011-08-23 11:09:25 -0700408 ASSERT_TRUE(device_->service_.get());
409 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkovb72cf402011-11-22 14:51:39 +0100410 device_->service_->network_technology());
Darin Petkov22b72bf2011-08-29 14:01:20 -0700411 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkovd2045802011-08-23 11:09:25 -0700412 EXPECT_EQ(flimflam::kRoamingStateHome, device_->service_->roaming_state());
Darin Petkovbac96002011-08-09 13:22:00 -0700413}
414
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700415TEST_F(CellularTest, StartGSMRegister) {
Darin Petkov137884a2011-10-26 18:52:47 +0200416 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
417 ASSERT_TRUE(provider_db_);
418 device_->provider_db_ = provider_db_;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500419 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500420 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500421 EXPECT_CALL(*gsm_card_proxy_,
422 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500423 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500424 EXPECT_CALL(*gsm_card_proxy_,
425 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500426 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500427 EXPECT_CALL(*gsm_card_proxy_,
428 GetSPN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500429 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
430 EXPECT_CALL(*gsm_card_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500431 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500432 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700433 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
434 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
Darin Petkov63138a92012-02-06 14:09:15 +0100435 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
436 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500437 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500438 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
Darin Petkov137884a2011-10-26 18:52:47 +0200439 static const char kNetworkID[] = "22803";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500440 EXPECT_CALL(*gsm_network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500441 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500442 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500443 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(NULL, _, _))
444 .Times(2)
445 .WillRepeatedly(Invoke(this,
446 &CellularTest::InvokeGetSignalQuality));
447 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400448 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500449 Error error;
450 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
451 EXPECT_TRUE(error.IsSuccess());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700452 dispatcher_.DispatchPendingEvents();
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400453 EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
454 EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
Darin Petkov63138a92012-02-06 14:09:15 +0100455 EXPECT_EQ(kTestCarrier, GetCapabilityGSM()->spn_);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400456 EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700457 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
458 ASSERT_TRUE(device_->service_.get());
459 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkovb72cf402011-11-22 14:51:39 +0100460 device_->service_->network_technology());
Darin Petkov63138a92012-02-06 14:09:15 +0100461 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
Darin Petkov22b72bf2011-08-29 14:01:20 -0700462 EXPECT_EQ(kStrength, device_->service_->strength());
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700463 EXPECT_EQ(flimflam::kRoamingStateRoaming, device_->service_->roaming_state());
Darin Petkov137884a2011-10-26 18:52:47 +0200464 EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
465 EXPECT_EQ("Orange", device_->service_->serving_operator().GetName());
466 EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
Darin Petkova1e0a1c2011-08-25 15:08:33 -0700467}
468
Darin Petkovbac96002011-08-09 13:22:00 -0700469TEST_F(CellularTest, StartConnected) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700470 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
471 .WillOnce(Return(true));
Darin Petkov721ac932011-11-16 15:43:09 +0100472 SetCellularType(Cellular::kTypeCDMA);
Darin Petkovbac96002011-08-09 13:22:00 -0700473 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400474 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400475 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500476 Error error;
477 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
478 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700479 dispatcher_.DispatchPendingEvents();
Darin Petkovbac96002011-08-09 13:22:00 -0700480 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
481}
482
Darin Petkov0828f5f2011-08-11 10:18:52 -0700483TEST_F(CellularTest, StartLinked) {
Chris Masone2ae797d2011-08-23 20:41:00 -0700484 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
485 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
Darin Petkov721ac932011-11-16 15:43:09 +0100486 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700487 device_->set_modem_state(Cellular::kModemStateConnected);
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400488 GetCapabilityClassic()->meid_ = kMEID;
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400489 ExpectCdmaStartModem(flimflam::kNetworkTechnologyEvdo);
Paul Stewartd32f4842012-01-11 16:08:13 -0800490 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _))
Darin Petkov77cb6812011-08-15 16:19:41 -0700491 .WillOnce(Return(dhcp_config_));
492 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700493 EXPECT_CALL(manager_, UpdateService(_)).Times(2);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500494 Error error;
495 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
496 EXPECT_TRUE(error.IsSuccess());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700497 dispatcher_.DispatchPendingEvents();
498 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
Darin Petkov60b8c3b2011-08-25 11:03:20 -0700499 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
500 device_->SelectService(NULL);
Darin Petkov0828f5f2011-08-11 10:18:52 -0700501}
502
Darin Petkov3335b372011-08-22 11:05:32 -0700503TEST_F(CellularTest, CreateService) {
Darin Petkov721ac932011-11-16 15:43:09 +0100504 SetCellularType(Cellular::kTypeCDMA);
Darin Petkov3335b372011-08-22 11:05:32 -0700505 static const char kPaymentURL[] = "https://payment.url";
506 static const char kUsageURL[] = "https://usage.url";
Darin Petkov3335b372011-08-22 11:05:32 -0700507 device_->home_provider_.SetName(kTestCarrier);
Darin Petkov381928f2012-02-02 23:00:12 +0100508 GetCapabilityCDMA()->olp_.SetURL(kPaymentURL);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100509 GetCapabilityCDMA()->usage_url_ = kUsageURL;
Darin Petkov3335b372011-08-22 11:05:32 -0700510 device_->CreateService();
511 ASSERT_TRUE(device_->service_.get());
Darin Petkov381928f2012-02-02 23:00:12 +0100512 EXPECT_EQ(kPaymentURL, device_->service_->olp().GetURL());
Darin Petkov3335b372011-08-22 11:05:32 -0700513 EXPECT_EQ(kUsageURL, device_->service_->usage_url());
514 EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
Paul Stewart22aa71b2011-09-16 12:15:11 -0700515 EXPECT_TRUE(device_->service_->TechnologyIs(Technology::kCellular));
Darin Petkov3335b372011-08-22 11:05:32 -0700516}
517
Darin Petkovc5f56562011-08-06 16:40:05 -0700518namespace {
519
520MATCHER(ContainsPhoneNumber, "") {
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400521 return ContainsKey(arg,
522 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
Darin Petkovc5f56562011-08-06 16:40:05 -0700523}
524
Eric Shienbrood9a245532012-03-07 14:20:39 -0500525} // namespace
Darin Petkovc5f56562011-08-06 16:40:05 -0700526
527TEST_F(CellularTest, Connect) {
Darin Petkov4d6d9412011-08-24 13:19:54 -0700528 Error error;
Chris Masone2ae797d2011-08-23 20:41:00 -0700529 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
Darin Petkov9bac6fe2011-08-26 12:49:05 -0700530 .Times(2)
531 .WillRepeatedly(Return(true));
Darin Petkovc5f56562011-08-06 16:40:05 -0700532 device_->state_ = Cellular::kStateConnected;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700533 device_->Connect(&error);
534 EXPECT_EQ(Error::kAlreadyConnected, error.type());
535 error.Populate(Error::kSuccess);
Darin Petkovc5f56562011-08-06 16:40:05 -0700536
Darin Petkov0828f5f2011-08-11 10:18:52 -0700537 device_->state_ = Cellular::kStateLinked;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700538 device_->Connect(&error);
539 EXPECT_EQ(Error::kAlreadyConnected, error.type());
Darin Petkov0828f5f2011-08-11 10:18:52 -0700540
Darin Petkovc5f56562011-08-06 16:40:05 -0700541 device_->state_ = Cellular::kStateRegistered;
Darin Petkovd2045802011-08-23 11:09:25 -0700542 device_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800543 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
Darin Petkovd2045802011-08-23 11:09:25 -0700544
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500545 device_->capability_->allow_roaming_ = false;
Darin Petkovb72cf402011-11-22 14:51:39 +0100546 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700547 device_->Connect(&error);
Darin Petkov4d6d9412011-08-24 13:19:54 -0700548 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500549
Darin Petkov4d6d9412011-08-24 13:19:54 -0700550 error.Populate(Error::kSuccess);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500551 EXPECT_CALL(*simple_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500552 Connect(ContainsPhoneNumber(), _, _,
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500553 CellularCapability::kTimeoutConnect))
554 .Times(2)
555 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400556 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Darin Petkovb72cf402011-11-22 14:51:39 +0100557 device_->service_->roaming_state_ = flimflam::kRoamingStateHome;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500558 device_->state_ = Cellular::kStateRegistered;
Darin Petkov4d6d9412011-08-24 13:19:54 -0700559 device_->Connect(&error);
560 EXPECT_TRUE(error.IsSuccess());
Darin Petkovc5f56562011-08-06 16:40:05 -0700561 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500562 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
563
564 device_->capability_->allow_roaming_ = true;
565 device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
566 device_->state_ = Cellular::kStateRegistered;
567 device_->Connect(&error);
568 EXPECT_TRUE(error.IsSuccess());
569 dispatcher_.DispatchPendingEvents();
570 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
Darin Petkovc5f56562011-08-06 16:40:05 -0700571}
572
Eric Shienbrood9a245532012-03-07 14:20:39 -0500573TEST_F(CellularTest, Disconnect) {
574 Error error;
575 device_->state_ = Cellular::kStateRegistered;
576 device_->Disconnect(&error);
577 EXPECT_EQ(Error::kNotConnected, error.type());
578 error.Reset();
579
Darin Petkovfb0625e2012-01-16 13:05:56 +0100580 device_->state_ = Cellular::kStateConnected;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500581 EXPECT_CALL(*proxy_,
582 Disconnect(_, _, CellularCapability::kTimeoutDefault))
583 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400584 GetCapabilityClassic()->proxy_.reset(proxy_.release());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500585 device_->Disconnect(&error);
586 EXPECT_TRUE(error.IsSuccess());
587 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
Darin Petkovfb0625e2012-01-16 13:05:56 +0100588}
589
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400590TEST_F(CellularTest, ConnectFailure) {
591 SetCellularType(Cellular::kTypeCDMA);
592 device_->state_ = Cellular::kStateRegistered;
593 device_->service_ = new CellularService(
594 &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
595 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
596 EXPECT_CALL(*simple_proxy_,
597 Connect(_, _, _, CellularCapability::kTimeoutConnect))
598 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400599 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
Eric Shienbroodcc95c5d2012-03-30 15:25:49 -0400600 Error error;
601 device_->Connect(&error);
602 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
603}
604
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400605TEST_F(CellularTest, ModemStateChangeEnable) {
606 EXPECT_CALL(*simple_proxy_,
607 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
608 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
609 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
610 EXPECT_CALL(*proxy_,
611 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
612 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
613 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(NULL, _, _))
614 .WillOnce(Invoke(this,
615 &CellularTest::InvokeGetRegistrationStateUnregistered));
616 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
617 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
618 EXPECT_CALL(manager_, UpdateEnabledTechnologies());
619 device_->state_ = Cellular::kStateDisabled;
620 device_->set_modem_state(Cellular::kModemStateDisabled);
621 SetCellularType(Cellular::kTypeCDMA);
622
623 DBusPropertiesMap props;
624 props[CellularCapabilityClassic::kModemPropertyEnabled].writer().
625 append_bool(true);
626 device_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
627 dispatcher_.DispatchPendingEvents();
628
629 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
630 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
631 EXPECT_TRUE(device_->enabled());
632}
633
634TEST_F(CellularTest, ModemStateChangeDisable) {
635 EXPECT_CALL(*proxy_,
636 Disconnect(_, _, CellularCapability::kTimeoutDefault))
637 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
638 EXPECT_CALL(*proxy_,
639 Enable(false, _, _, CellularCapability::kTimeoutDefault))
640 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
641 EXPECT_CALL(manager_, UpdateEnabledTechnologies());
642 device_->enabled_ = true;
643 device_->enabled_pending_ = true;
644 device_->state_ = Cellular::kStateEnabled;
645 device_->set_modem_state(Cellular::kModemStateEnabled);
646 SetCellularType(Cellular::kTypeCDMA);
647 GetCapabilityClassic()->InitProxies();
648
649 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
650 kModemClassicStateDisabled,
651 0);
652 dispatcher_.DispatchPendingEvents();
653
654 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
655 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
656 EXPECT_FALSE(device_->enabled());
657}
658
Chris Masoneb925cc82011-06-22 15:39:57 -0700659} // namespace shill