1 //
2 // Copyright (C) 2013 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/cellular/cellular.h"
18
19 #include <sys/socket.h>
20 #include <linux/if.h> // NOLINT - Needs typedefs from sys/socket.h.
21 #include <linux/netlink.h>
22
23 #include <base/bind.h>
24 #if defined(__ANDROID__)
25 #include <dbus/service_constants.h>
26 #else
27 #include <chromeos/dbus/service_constants.h>
28 #endif // __ANDROID__
29
30 #include "shill/cellular/cellular_bearer.h"
31 #include "shill/cellular/cellular_capability_cdma.h"
32 #include "shill/cellular/cellular_capability_classic.h"
33 #include "shill/cellular/cellular_capability_gsm.h"
34 #include "shill/cellular/cellular_capability_universal.h"
35 #include "shill/cellular/cellular_service.h"
36 #include "shill/cellular/mock_cellular_service.h"
37 #include "shill/cellular/mock_mm1_modem_modem3gpp_proxy.h"
38 #include "shill/cellular/mock_mm1_modem_proxy.h"
39 #include "shill/cellular/mock_mm1_modem_simple_proxy.h"
40 #include "shill/cellular/mock_mobile_operator_info.h"
41 #include "shill/cellular/mock_modem_cdma_proxy.h"
42 #include "shill/cellular/mock_modem_gsm_card_proxy.h"
43 #include "shill/cellular/mock_modem_gsm_network_proxy.h"
44 #include "shill/cellular/mock_modem_info.h"
45 #include "shill/cellular/mock_modem_proxy.h"
46 #include "shill/cellular/mock_modem_simple_proxy.h"
47 #include "shill/dhcp/mock_dhcp_config.h"
48 #include "shill/dhcp/mock_dhcp_provider.h"
49 #include "shill/error.h"
50 #include "shill/mock_adaptors.h"
51 #include "shill/mock_control.h"
52 #include "shill/mock_dbus_properties_proxy.h"
53 #include "shill/mock_device_info.h"
54 #include "shill/mock_external_task.h"
55 #include "shill/mock_ppp_device.h"
56 #include "shill/mock_ppp_device_factory.h"
57 #include "shill/mock_process_manager.h"
58 #include "shill/net/mock_rtnl_handler.h"
59 #include "shill/property_store_unittest.h"
60 #include "shill/rpc_task.h" // for RpcTaskDelegate
61 #include "shill/test_event_dispatcher.h"
62 #include "shill/testing.h"
63
64 // mm/mm-modem.h must be included after cellular_capability_universal.h
65 // in order to allow MM_MODEM_CDMA_* to be defined properly.
66 #include <mm/mm-modem.h>
67
68 using base::Bind;
69 using base::Unretained;
70 using std::map;
71 using std::string;
72 using std::unique_ptr;
73 using std::vector;
74 using testing::_;
75 using testing::AnyNumber;
76 using testing::DoAll;
77 using testing::Invoke;
78 using testing::Mock;
79 using testing::NiceMock;
80 using testing::Return;
81 using testing::ReturnRef;
82 using testing::SaveArg;
83 using testing::SetArgumentPointee;
84 using testing::Unused;
85
86 namespace shill {
87
88 class CellularPropertyTest : public PropertyStoreTest {
89 public:
CellularPropertyTest()90 CellularPropertyTest()
91 : modem_info_(control_interface(),
92 dispatcher(),
93 metrics(),
94 manager()),
95 device_(new Cellular(&modem_info_,
96 "usb0",
97 "00:01:02:03:04:05",
98 3,
99 Cellular::kTypeCDMA,
100 "",
101 "")) {}
~CellularPropertyTest()102 virtual ~CellularPropertyTest() {}
103
104 protected:
105 MockModemInfo modem_info_;
106 DeviceRefPtr device_;
107 };
108
TEST_F(CellularPropertyTest,Contains)109 TEST_F(CellularPropertyTest, Contains) {
110 EXPECT_TRUE(device_->store().Contains(kNameProperty));
111 EXPECT_FALSE(device_->store().Contains(""));
112 }
113
TEST_F(CellularPropertyTest,SetProperty)114 TEST_F(CellularPropertyTest, SetProperty) {
115 {
116 Error error;
117 const bool allow_roaming = true;
118 EXPECT_TRUE(device_->mutable_store()->SetAnyProperty(
119 kCellularAllowRoamingProperty, allow_roaming, &error));
120 }
121 // Ensure that attempting to write a R/O property returns InvalidArgs error.
122 {
123 Error error;
124 EXPECT_FALSE(device_->mutable_store()->SetAnyProperty(
125 kAddressProperty, PropertyStoreTest::kStringV, &error));
126 ASSERT_TRUE(error.IsFailure()); // name() may be invalid otherwise
127 EXPECT_EQ(Error::kInvalidArguments, error.type());
128 }
129 {
130 Error error;
131 EXPECT_FALSE(device_->mutable_store()->SetAnyProperty(
132 kCarrierProperty, PropertyStoreTest::kStringV, &error));
133 ASSERT_TRUE(error.IsFailure()); // name() may be invalid otherwise
134 EXPECT_EQ(Error::kInvalidArguments, error.type());
135 }
136 }
137
138 class CellularTest : public testing::Test {
139 public:
CellularTest()140 CellularTest()
141 : kHomeProviderCode("10001"),
142 kHomeProviderCountry("us"),
143 kHomeProviderName("HomeProviderName"),
144 kServingOperatorCode("10002"),
145 kServingOperatorCountry("ca"),
146 kServingOperatorName("ServingOperatorName"),
147 control_interface_(this),
148 modem_info_(&control_interface_, &dispatcher_, nullptr, nullptr),
149 device_info_(modem_info_.control_interface(), &dispatcher_,
150 modem_info_.metrics(), modem_info_.manager()),
151 dhcp_config_(new MockDHCPConfig(modem_info_.control_interface(),
152 kTestDeviceName)),
153 create_gsm_card_proxy_from_factory_(false),
154 mock_home_provider_info_(nullptr),
155 mock_serving_operator_info_(nullptr),
156 device_(new Cellular(&modem_info_,
157 kTestDeviceName,
158 kTestDeviceAddress,
159 3,
160 Cellular::kTypeGSM,
161 kDBusService,
162 kDBusPath)) {
163 PopulateProxies();
164 modem_info_.metrics()->RegisterDevice(device_->interface_index(),
165 Technology::kCellular);
166 }
167
SetUp()168 virtual void SetUp() {
169 static_cast<Device*>(device_.get())->rtnl_handler_ = &rtnl_handler_;
170 device_->set_dhcp_provider(&dhcp_provider_);
171 device_->process_manager_ = &process_manager_;
172 EXPECT_CALL(*modem_info_.mock_manager(), device_info())
173 .WillRepeatedly(Return(&device_info_));
174 EXPECT_CALL(*modem_info_.mock_manager(), DeregisterService(_))
175 .Times(AnyNumber());
176 }
177
TearDown()178 virtual void TearDown() {
179 device_->DestroyIPConfig();
180 device_->state_ = Cellular::kStateDisabled;
181 device_->capability_->ReleaseProxies();
182 device_->set_dhcp_provider(nullptr);
183 // Break cycle between Cellular and CellularService.
184 device_->service_ = nullptr;
185 device_->SelectService(nullptr);
186 }
187
PopulateProxies()188 void PopulateProxies() {
189 dbus_properties_proxy_.reset(new MockDBusPropertiesProxy());
190 proxy_.reset(new MockModemProxy());
191 simple_proxy_.reset(new MockModemSimpleProxy());
192 cdma_proxy_.reset(new MockModemCDMAProxy());
193 gsm_card_proxy_.reset(new MockModemGSMCardProxy());
194 gsm_network_proxy_.reset(new MockModemGSMNetworkProxy());
195 mm1_modem_3gpp_proxy_.reset(new mm1::MockModemModem3gppProxy());
196 mm1_proxy_.reset(new mm1::MockModemProxy());
197 mm1_simple_proxy_.reset(new mm1::MockModemSimpleProxy());
198 }
199
SetMockMobileOperatorInfoObjects()200 void SetMockMobileOperatorInfoObjects() {
201 mock_home_provider_info_ =
202 new MockMobileOperatorInfo(&dispatcher_, "HomeProvider");
203 // Takes ownership.
204 device_->set_home_provider_info(mock_home_provider_info_);
205
206 mock_serving_operator_info_ =
207 new MockMobileOperatorInfo(&dispatcher_, "ServingOperator");
208 // Takes ownership.
209 device_->set_serving_operator_info(mock_serving_operator_info_);
210 }
211
InvokeEnable(bool enable,Error * error,const ResultCallback & callback,int timeout)212 void InvokeEnable(bool enable, Error* error,
213 const ResultCallback& callback, int timeout) {
214 callback.Run(Error());
215 }
InvokeEnableReturningWrongState(bool enable,Error * error,const ResultCallback & callback,int timeout)216 void InvokeEnableReturningWrongState(
217 bool enable, Error* error, const ResultCallback& callback, int timeout) {
218 callback.Run(Error(Error::kWrongState));
219 }
InvokeGetSignalQuality(Error * error,const SignalQualityCallback & callback,int timeout)220 void InvokeGetSignalQuality(Error* error,
221 const SignalQualityCallback& callback,
222 int timeout) {
223 callback.Run(kStrength, Error());
224 }
InvokeGetModemStatus(Error * error,const KeyValueStoreCallback & callback,int timeout)225 void InvokeGetModemStatus(Error* error,
226 const KeyValueStoreCallback& callback,
227 int timeout) {
228 KeyValueStore props;
229 props.SetString("carrier", kTestCarrier);
230 props.SetString("unknown-property", "irrelevant-value");
231 callback.Run(props, Error());
232 }
InvokeGetModemInfo(Error * error,const ModemInfoCallback & callback,int timeout)233 void InvokeGetModemInfo(Error* error, const ModemInfoCallback& callback,
234 int timeout) {
235 static const char kManufacturer[] = "Company";
236 static const char kModelID[] = "Gobi 2000";
237 static const char kHWRev[] = "A00B1234";
238 callback.Run(kManufacturer, kModelID, kHWRev, Error());
239 }
InvokeGetRegistrationState1X(Error * error,const RegistrationStateCallback & callback,int timeout)240 void InvokeGetRegistrationState1X(Error* error,
241 const RegistrationStateCallback& callback,
242 int timeout) {
243 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
244 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
245 Error());
246 }
InvokeGetIMEI(Error * error,const GSMIdentifierCallback & callback,int timeout)247 void InvokeGetIMEI(Error* error, const GSMIdentifierCallback& callback,
248 int timeout) {
249 callback.Run(kIMEI, Error());
250 }
InvokeGetIMSI(Error * error,const GSMIdentifierCallback & callback,int timeout)251 void InvokeGetIMSI(Error* error, const GSMIdentifierCallback& callback,
252 int timeout) {
253 callback.Run(kIMSI, Error());
254 }
InvokeGetMSISDN(Error * error,const GSMIdentifierCallback & callback,int timeout)255 void InvokeGetMSISDN(Error* error, const GSMIdentifierCallback& callback,
256 int timeout) {
257 callback.Run(kMSISDN, Error());
258 }
InvokeGetSPN(Error * error,const GSMIdentifierCallback & callback,int timeout)259 void InvokeGetSPN(Error* error, const GSMIdentifierCallback& callback,
260 int timeout) {
261 callback.Run(kTestCarrierSPN, Error());
262 }
InvokeGetRegistrationInfo(Error * error,const RegistrationInfoCallback & callback,int timeout)263 void InvokeGetRegistrationInfo(Error* error,
264 const RegistrationInfoCallback& callback,
265 int timeout) {
266 static const char kNetworkID[] = "22803";
267 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING,
268 kNetworkID, kTestCarrier, Error());
269 }
InvokeRegister(const string & network_id,Error * error,const ResultCallback & callback,int timeout)270 void InvokeRegister(const string& network_id,
271 Error* error,
272 const ResultCallback& callback,
273 int timeout) {
274 callback.Run(Error());
275 }
InvokeGetRegistrationState(Error * error,const RegistrationStateCallback & callback,int timeout)276 void InvokeGetRegistrationState(Error* error,
277 const RegistrationStateCallback& callback,
278 int timeout) {
279 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
280 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
281 Error());
282 }
InvokeGetRegistrationStateUnregistered(Error * error,const RegistrationStateCallback & callback,int timeout)283 void InvokeGetRegistrationStateUnregistered(
284 Error* error,
285 const RegistrationStateCallback& callback,
286 int timeout) {
287 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
288 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
289 Error());
290 }
InvokeConnect(KeyValueStore props,Error * error,const ResultCallback & callback,int timeout)291 void InvokeConnect(KeyValueStore props, Error* error,
292 const ResultCallback& callback, int timeout) {
293 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
294 callback.Run(Error());
295 }
InvokeConnectFail(KeyValueStore props,Error * error,const ResultCallback & callback,int timeout)296 void InvokeConnectFail(KeyValueStore props, Error* error,
297 const ResultCallback& callback, int timeout) {
298 EXPECT_EQ(Service::kStateAssociating, device_->service_->state());
299 callback.Run(Error(Error::kNotOnHomeNetwork));
300 }
InvokeConnectFailNoService(KeyValueStore props,Error * error,const ResultCallback & callback,int timeout)301 void InvokeConnectFailNoService(KeyValueStore props, Error* error,
302 const ResultCallback& callback, int timeout) {
303 device_->service_ = nullptr;
304 callback.Run(Error(Error::kNotOnHomeNetwork));
305 }
InvokeConnectSuccessNoService(KeyValueStore props,Error * error,const ResultCallback & callback,int timeout)306 void InvokeConnectSuccessNoService(KeyValueStore props, Error* error,
307 const ResultCallback& callback,
308 int timeout) {
309 device_->service_ = nullptr;
310 callback.Run(Error());
311 }
InvokeDisconnect(Error * error,const ResultCallback & callback,int timeout)312 void InvokeDisconnect(Error* error, const ResultCallback& callback,
313 int timeout) {
314 if (!callback.is_null())
315 callback.Run(Error());
316 }
InvokeDisconnectFail(Error * error,const ResultCallback & callback,int timeout)317 void InvokeDisconnectFail(Error* error, const ResultCallback& callback,
318 int timeout) {
319 error->Populate(Error::kOperationFailed);
320 if (!callback.is_null())
321 callback.Run(*error);
322 }
InvokeDisconnectMM1(const string & bearer,Error * error,const ResultCallback & callback,int timeout)323 void InvokeDisconnectMM1(const string& bearer, Error* error,
324 const ResultCallback& callback, int timeout) {
325 if (!callback.is_null())
326 callback.Run(Error());
327 }
InvokeSetPowerState(const uint32_t & power_state,Error * error,const ResultCallback & callback,int timeout)328 void InvokeSetPowerState(const uint32_t& power_state,
329 Error* error,
330 const ResultCallback& callback,
331 int timeout) {
332 callback.Run(Error());
333 }
ExpectCdmaStartModem(string network_technology)334 void ExpectCdmaStartModem(string network_technology) {
335 if (!device_->IsUnderlyingDeviceEnabled())
336 EXPECT_CALL(*proxy_,
337 Enable(true, _, _, CellularCapability::kTimeoutEnable))
338 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
339 EXPECT_CALL(*simple_proxy_,
340 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
341 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
342 EXPECT_CALL(*proxy_,
343 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
344 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
345 if (network_technology == kNetworkTechnology1Xrtt)
346 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(nullptr, _, _))
347 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState1X));
348 else
349 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(nullptr, _, _))
350 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationState));
351 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(nullptr, _, _))
352 .Times(2)
353 .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
354 EXPECT_CALL(*this, TestCallback(IsSuccess()));
355 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
356 }
357
ExpectDisconnectCapabilityUniversal()358 void ExpectDisconnectCapabilityUniversal() {
359 SetCellularType(Cellular::kTypeUniversal);
360 device_->state_ = Cellular::kStateConnected;
361 EXPECT_CALL(*mm1_simple_proxy_, Disconnect(_, _, _, _))
362 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnectMM1));
363 GetCapabilityUniversal()->modem_simple_proxy_.reset(
364 mm1_simple_proxy_.release());
365 }
366
VerifyDisconnect()367 void VerifyDisconnect() {
368 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
369 }
370
StartPPP(int pid)371 void StartPPP(int pid) {
372 EXPECT_CALL(process_manager_, StartProcess(_, _, _, _, _, _))
373 .WillOnce(Return(pid));
374 device_->StartPPP("fake_serial_device");
375 EXPECT_FALSE(device_->ipconfig()); // No DHCP client.
376 EXPECT_FALSE(device_->selected_service());
377 EXPECT_FALSE(device_->is_ppp_authenticating_);
378 EXPECT_NE(nullptr, device_->ppp_task_);
379 Mock::VerifyAndClearExpectations(&process_manager_);
380 }
381
FakeUpConnectedPPP()382 void FakeUpConnectedPPP() {
383 const char kInterfaceName[] = "fake-ppp-device";
384 const int kInterfaceIndex = -1;
385 auto mock_ppp_device = make_scoped_refptr(
386 new MockPPPDevice(modem_info_.control_interface(), nullptr, nullptr,
387 nullptr, kInterfaceName, kInterfaceIndex));
388 device_->ppp_device_ = mock_ppp_device;
389 device_->state_ = Cellular::kStateConnected;
390 }
391
ExpectPPPStopped()392 void ExpectPPPStopped() {
393 auto mock_ppp_device =
394 static_cast<MockPPPDevice*>(device_->ppp_device_.get());
395 EXPECT_CALL(*mock_ppp_device, DropConnection());
396 }
397
VerifyPPPStopped()398 void VerifyPPPStopped() {
399 EXPECT_EQ(nullptr, device_->ppp_task_);
400 EXPECT_FALSE(device_->ppp_device_);
401 }
402
SetCommonOnAfterResumeExpectations()403 void SetCommonOnAfterResumeExpectations() {
404 EXPECT_CALL(*dbus_properties_proxy_, GetAll(_))
405 .WillRepeatedly(Return(KeyValueStore()));
406 EXPECT_CALL(*mm1_proxy_, set_state_changed_callback(_)).Times(AnyNumber());
407 EXPECT_CALL(*modem_info_.mock_metrics(), NotifyDeviceScanStarted(_))
408 .Times(AnyNumber());
409 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies())
410 .Times(AnyNumber());
411 EXPECT_CALL(*static_cast<DeviceMockAdaptor*>(device_->adaptor()),
412 EmitBoolChanged(_, _)).Times(AnyNumber());
413 }
414
SetupOnAfterResume()415 mm1::MockModemProxy* SetupOnAfterResume() {
416 SetCellularType(Cellular::kTypeUniversal);
417 SetCommonOnAfterResumeExpectations();
418 return mm1_proxy_.get(); // Before the capability snags it.
419 }
420
VerifyOperatorMap(const Stringmap & operator_map,const string & code,const string & name,const string & country)421 void VerifyOperatorMap(const Stringmap& operator_map,
422 const string& code,
423 const string& name,
424 const string& country) {
425 Stringmap::const_iterator it;
426 Stringmap::const_iterator endit = operator_map.end();
427
428 it = operator_map.find(kOperatorCodeKey);
429 if (code == "") {
430 EXPECT_EQ(endit, it);
431 } else {
432 ASSERT_NE(endit, it);
433 EXPECT_EQ(code, it->second);
434 }
435 it = operator_map.find(kOperatorNameKey);
436 if (name == "") {
437 EXPECT_EQ(endit, it);
438 } else {
439 ASSERT_NE(endit, it);
440 EXPECT_EQ(name, it->second);
441 }
442 it = operator_map.find(kOperatorCountryKey);
443 if (country == "") {
444 EXPECT_EQ(endit, it);
445 } else {
446 ASSERT_NE(endit, it);
447 EXPECT_EQ(country, it->second);
448 }
449 }
450
451 MOCK_METHOD1(TestCallback, void(const Error& error));
452
453 protected:
454 static const char kTestDeviceName[];
455 static const char kTestDeviceAddress[];
456 static const char kDBusService[];
457 static const char kDBusPath[];
458 static const char kTestCarrier[];
459 static const char kTestCarrierSPN[];
460 static const char kMEID[];
461 static const char kIMEI[];
462 static const char kIMSI[];
463 static const char kMSISDN[];
464 static const char kTestMobileProviderDBPath[];
465 static const Stringmaps kTestNetworksGSM;
466 static const Stringmaps kTestNetworksCellular;
467 static const int kStrength;
468
469 // Must be std::string so that we can safely ReturnRef.
470 const string kHomeProviderCode;
471 const string kHomeProviderCountry;
472 const string kHomeProviderName;
473 const string kServingOperatorCode;
474 const string kServingOperatorCountry;
475 const string kServingOperatorName;
476
477 class TestControl : public MockControl {
478 public:
TestControl(CellularTest * test)479 explicit TestControl(CellularTest* test) : test_(test) {}
480
CreateDBusPropertiesProxy(const std::string & path,const std::string & service)481 virtual DBusPropertiesProxyInterface* CreateDBusPropertiesProxy(
482 const std::string& path,
483 const std::string& service) {
484 CHECK(test_->dbus_properties_proxy_);
485 return test_->dbus_properties_proxy_.release();
486 }
487
CreateModemProxy(const string &,const string &)488 virtual ModemProxyInterface* CreateModemProxy(
489 const string& /*path*/,
490 const string& /*service*/) {
491 CHECK(test_->proxy_);
492 return test_->proxy_.release();
493 }
494
CreateModemSimpleProxy(const string &,const string &)495 virtual ModemSimpleProxyInterface* CreateModemSimpleProxy(
496 const string& /*path*/,
497 const string& /*service*/) {
498 CHECK(test_->simple_proxy_);
499 return test_->simple_proxy_.release();
500 }
501
CreateModemCDMAProxy(const string &,const string &)502 virtual ModemCDMAProxyInterface* CreateModemCDMAProxy(
503 const string& /*path*/,
504 const string& /*service*/) {
505 CHECK(test_->cdma_proxy_);
506 return test_->cdma_proxy_.release();
507 }
508
CreateModemGSMCardProxy(const string &,const string &)509 virtual ModemGSMCardProxyInterface* CreateModemGSMCardProxy(
510 const string& /*path*/,
511 const string& /*service*/) {
512 // TODO(benchan): This code conditionally returns a nullptr to avoid
513 // CellularCapabilityGSM::InitProperties (and thus
514 // CellularCapabilityGSM::GetIMSI) from being called during the
515 // construction. Remove this workaround after refactoring the tests.
516 CHECK(!test_->create_gsm_card_proxy_from_factory_ ||
517 test_->gsm_card_proxy_);
518 return test_->create_gsm_card_proxy_from_factory_ ?
519 test_->gsm_card_proxy_.release() : nullptr;
520 }
521
CreateModemGSMNetworkProxy(const string &,const string &)522 virtual ModemGSMNetworkProxyInterface* CreateModemGSMNetworkProxy(
523 const string& /*path*/,
524 const string& /*service*/) {
525 CHECK(test_->gsm_network_proxy_);
526 return test_->gsm_network_proxy_.release();
527 }
528
CreateMM1ModemModem3gppProxy(const std::string & path,const std::string & service)529 virtual mm1::ModemModem3gppProxyInterface* CreateMM1ModemModem3gppProxy(
530 const std::string& path,
531 const std::string& service) {
532 CHECK(test_->mm1_modem_3gpp_proxy_);
533 return test_->mm1_modem_3gpp_proxy_.release();
534 }
535
CreateMM1ModemProxy(const std::string & path,const std::string & service)536 virtual mm1::ModemProxyInterface* CreateMM1ModemProxy(
537 const std::string& path,
538 const std::string& service) {
539 CHECK(test_->mm1_proxy_);
540 return test_->mm1_proxy_.release();
541 }
542
CreateMM1ModemSimpleProxy(const string &,const string &)543 virtual mm1::ModemSimpleProxyInterface* CreateMM1ModemSimpleProxy(
544 const string& /*path*/,
545 const string& /*service*/) {
546 CHECK(test_->mm1_simple_proxy_);
547 return test_->mm1_simple_proxy_.release();
548 }
549
550 private:
551 CellularTest* test_;
552 };
553 void StartRTNLHandler();
554 void StopRTNLHandler();
555
AllowCreateGSMCardProxyFromFactory()556 void AllowCreateGSMCardProxyFromFactory() {
557 create_gsm_card_proxy_from_factory_ = true;
558 }
559
SetCellularType(Cellular::Type type)560 void SetCellularType(Cellular::Type type) {
561 device_->InitCapability(type);
562 }
563
GetCapabilityClassic()564 CellularCapabilityClassic* GetCapabilityClassic() {
565 return static_cast<CellularCapabilityClassic*>(
566 device_->capability_.get());
567 }
568
GetCapabilityCDMA()569 CellularCapabilityCDMA* GetCapabilityCDMA() {
570 return static_cast<CellularCapabilityCDMA*>(device_->capability_.get());
571 }
572
GetCapabilityGSM()573 CellularCapabilityGSM* GetCapabilityGSM() {
574 return static_cast<CellularCapabilityGSM*>(device_->capability_.get());
575 }
576
GetCapabilityUniversal()577 CellularCapabilityUniversal* GetCapabilityUniversal() {
578 return static_cast<CellularCapabilityUniversal*>(
579 device_->capability_.get());
580 }
581
582 // Different tests simulate a cellular service being set using a real /mock
583 // service.
SetService()584 CellularService* SetService() {
585 device_->service_ = new CellularService(&modem_info_, device_);
586 return device_->service_.get();
587 }
SetMockService()588 MockCellularService* SetMockService() {
589 device_->service_ = new MockCellularService(&modem_info_, device_);
590 return static_cast<MockCellularService*>(device_->service_.get());
591 }
592
set_enabled_persistent(bool new_value)593 void set_enabled_persistent(bool new_value) {
594 device_->enabled_persistent_ = new_value;
595 }
596
SetCapabilityUniversalActiveBearer(unique_ptr<CellularBearer> bearer)597 void SetCapabilityUniversalActiveBearer(unique_ptr<CellularBearer> bearer) {
598 SetCellularType(Cellular::kTypeUniversal);
599 CellularCapabilityUniversal* capability = GetCapabilityUniversal();
600 capability->active_bearer_ = std::move(bearer);
601 }
602
603 EventDispatcherForTest dispatcher_;
604 TestControl control_interface_;
605 MockModemInfo modem_info_;
606 MockDeviceInfo device_info_;
607 MockProcessManager process_manager_;
608 NiceMock<MockRTNLHandler> rtnl_handler_;
609
610 MockDHCPProvider dhcp_provider_;
611 scoped_refptr<MockDHCPConfig> dhcp_config_;
612
613 bool create_gsm_card_proxy_from_factory_;
614 unique_ptr<MockDBusPropertiesProxy> dbus_properties_proxy_;
615 unique_ptr<MockModemProxy> proxy_;
616 unique_ptr<MockModemSimpleProxy> simple_proxy_;
617 unique_ptr<MockModemCDMAProxy> cdma_proxy_;
618 unique_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
619 unique_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
620 unique_ptr<mm1::MockModemModem3gppProxy> mm1_modem_3gpp_proxy_;
621 unique_ptr<mm1::MockModemProxy> mm1_proxy_;
622 unique_ptr<mm1::MockModemSimpleProxy> mm1_simple_proxy_;
623 MockMobileOperatorInfo* mock_home_provider_info_;
624 MockMobileOperatorInfo* mock_serving_operator_info_;
625 CellularRefPtr device_;
626 };
627
628 const char CellularTest::kTestDeviceName[] = "usb0";
629 const char CellularTest::kTestDeviceAddress[] = "00:01:02:03:04:05";
630 const char CellularTest::kDBusService[] = "org.chromium.ModemManager";
631 const char CellularTest::kDBusPath[] = "/org/chromium/ModemManager/Gobi/0";
632 const char CellularTest::kTestCarrier[] = "The Cellular Carrier";
633 const char CellularTest::kTestCarrierSPN[] = "Home Provider";
634 const char CellularTest::kMEID[] = "01234567EF8901";
635 const char CellularTest::kIMEI[] = "987654321098765";
636 const char CellularTest::kIMSI[] = "123456789012345";
637 const char CellularTest::kMSISDN[] = "12345678901";
638 const char CellularTest::kTestMobileProviderDBPath[] =
639 "provider_db_unittest.bfd";
640 const Stringmaps CellularTest::kTestNetworksGSM =
641 {{{CellularCapabilityGSM::kNetworkPropertyStatus, "1"},
642 {CellularCapabilityGSM::kNetworkPropertyID, "0000"},
643 {CellularCapabilityGSM::kNetworkPropertyLongName, "some_long_name"},
644 {CellularCapabilityGSM::kNetworkPropertyShortName, "short"}}};
645 const Stringmaps CellularTest::kTestNetworksCellular =
646 {{{kStatusProperty, "available"},
647 {kNetworkIdProperty, "0000"},
648 {kLongNameProperty, "some_long_name"},
649 {kShortNameProperty, "short"}}};
650 const int CellularTest::kStrength = 90;
651
TEST_F(CellularTest,GetStateString)652 TEST_F(CellularTest, GetStateString) {
653 EXPECT_EQ("CellularStateDisabled",
654 Cellular::GetStateString(Cellular::kStateDisabled));
655 EXPECT_EQ("CellularStateEnabled",
656 Cellular::GetStateString(Cellular::kStateEnabled));
657 EXPECT_EQ("CellularStateRegistered",
658 Cellular::GetStateString(Cellular::kStateRegistered));
659 EXPECT_EQ("CellularStateConnected",
660 Cellular::GetStateString(Cellular::kStateConnected));
661 EXPECT_EQ("CellularStateLinked",
662 Cellular::GetStateString(Cellular::kStateLinked));
663 }
664
TEST_F(CellularTest,GetModemStateString)665 TEST_F(CellularTest, GetModemStateString) {
666 EXPECT_EQ("CellularModemStateFailed",
667 Cellular::GetModemStateString(Cellular::kModemStateFailed));
668 EXPECT_EQ("CellularModemStateUnknown",
669 Cellular::GetModemStateString(Cellular::kModemStateUnknown));
670 EXPECT_EQ("CellularModemStateInitializing",
671 Cellular::GetModemStateString(Cellular::kModemStateInitializing));
672 EXPECT_EQ("CellularModemStateLocked",
673 Cellular::GetModemStateString(Cellular::kModemStateLocked));
674 EXPECT_EQ("CellularModemStateDisabled",
675 Cellular::GetModemStateString(Cellular::kModemStateDisabled));
676 EXPECT_EQ("CellularModemStateDisabling",
677 Cellular::GetModemStateString(Cellular::kModemStateDisabling));
678 EXPECT_EQ("CellularModemStateEnabling",
679 Cellular::GetModemStateString(Cellular::kModemStateEnabling));
680 EXPECT_EQ("CellularModemStateEnabled",
681 Cellular::GetModemStateString(Cellular::kModemStateEnabled));
682 EXPECT_EQ("CellularModemStateSearching",
683 Cellular::GetModemStateString(Cellular::kModemStateSearching));
684 EXPECT_EQ("CellularModemStateRegistered",
685 Cellular::GetModemStateString(Cellular::kModemStateRegistered));
686 EXPECT_EQ("CellularModemStateDisconnecting",
687 Cellular::GetModemStateString(Cellular::kModemStateDisconnecting));
688 EXPECT_EQ("CellularModemStateConnecting",
689 Cellular::GetModemStateString(Cellular::kModemStateConnecting));
690 EXPECT_EQ("CellularModemStateConnected",
691 Cellular::GetModemStateString(Cellular::kModemStateConnected));
692 }
693
TEST_F(CellularTest,StartCDMARegister)694 TEST_F(CellularTest, StartCDMARegister) {
695 SetCellularType(Cellular::kTypeCDMA);
696 ExpectCdmaStartModem(kNetworkTechnology1Xrtt);
697 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
698 Error error;
699 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
700 dispatcher_.DispatchPendingEvents();
701 EXPECT_EQ(kMEID, device_->meid());
702 EXPECT_EQ(kTestCarrier, device_->carrier());
703 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
704 ASSERT_TRUE(device_->service_.get());
705 EXPECT_EQ(kNetworkTechnology1Xrtt, device_->service_->network_technology());
706 EXPECT_EQ(kStrength, device_->service_->strength());
707 EXPECT_EQ(kRoamingStateHome, device_->service_->roaming_state());
708 }
709
TEST_F(CellularTest,StartGSMRegister)710 TEST_F(CellularTest, StartGSMRegister) {
711 SetMockMobileOperatorInfoObjects();
712 EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
713 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
714 EXPECT_CALL(*gsm_card_proxy_,
715 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
716 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMEI));
717 EXPECT_CALL(*gsm_card_proxy_,
718 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
719 .WillOnce(Invoke(this, &CellularTest::InvokeGetIMSI));
720 EXPECT_CALL(*gsm_card_proxy_,
721 GetSPN(_, _, CellularCapability::kTimeoutDefault))
722 .WillOnce(Invoke(this, &CellularTest::InvokeGetSPN));
723 EXPECT_CALL(*gsm_card_proxy_,
724 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
725 .WillOnce(Invoke(this, &CellularTest::InvokeGetMSISDN));
726 EXPECT_CALL(*gsm_network_proxy_, AccessTechnology())
727 .WillOnce(Return(MM_MODEM_GSM_ACCESS_TECH_EDGE));
728 EXPECT_CALL(*gsm_card_proxy_, EnabledFacilityLocks())
729 .WillOnce(Return(MM_MODEM_GSM_FACILITY_SIM));
730 EXPECT_CALL(*proxy_, GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
731 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
732 EXPECT_CALL(*gsm_network_proxy_,
733 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
734 .WillOnce(Invoke(this, &CellularTest::InvokeGetRegistrationInfo));
735 EXPECT_CALL(*gsm_network_proxy_, GetSignalQuality(nullptr, _, _))
736 .Times(2)
737 .WillRepeatedly(Invoke(this,
738 &CellularTest::InvokeGetSignalQuality));
739 EXPECT_CALL(*mock_serving_operator_info_, UpdateMCCMNC(_));
740 EXPECT_CALL(*mock_serving_operator_info_, UpdateOperatorName(_));
741 EXPECT_CALL(*this, TestCallback(IsSuccess()));
742 EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
743 AllowCreateGSMCardProxyFromFactory();
744
745 Error error;
746 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
747 EXPECT_TRUE(error.IsSuccess());
748 dispatcher_.DispatchPendingEvents();
749 EXPECT_EQ(kIMEI, device_->imei());
750 EXPECT_EQ(kIMSI, device_->imsi());
751 EXPECT_EQ(kTestCarrierSPN, GetCapabilityGSM()->spn_);
752 EXPECT_EQ(kMSISDN, device_->mdn());
753 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
754 ASSERT_TRUE(device_->service_.get());
755 EXPECT_EQ(kNetworkTechnologyEdge, device_->service_->network_technology());
756 EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
757 EXPECT_EQ(kStrength, device_->service_->strength());
758 EXPECT_EQ(kRoamingStateRoaming, device_->service_->roaming_state());
759 }
760
TEST_F(CellularTest,StartConnected)761 TEST_F(CellularTest, StartConnected) {
762 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
763 .WillOnce(Return(true));
764 SetCellularType(Cellular::kTypeCDMA);
765 device_->set_modem_state(Cellular::kModemStateConnected);
766 device_->set_meid(kMEID);
767 ExpectCdmaStartModem(kNetworkTechnologyEvdo);
768 Error error;
769 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
770 EXPECT_TRUE(error.IsSuccess());
771 dispatcher_.DispatchPendingEvents();
772 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
773 }
774
TEST_F(CellularTest,StartLinked)775 TEST_F(CellularTest, StartLinked) {
776 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
777 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
778 SetCellularType(Cellular::kTypeCDMA);
779 device_->set_modem_state(Cellular::kModemStateConnected);
780 device_->set_meid(kMEID);
781 ExpectCdmaStartModem(kNetworkTechnologyEvdo);
782 EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestDeviceName, _, _, _))
783 .WillOnce(Return(dhcp_config_));
784 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
785 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_)).Times(3);
786 Error error;
787 device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
788 EXPECT_TRUE(error.IsSuccess());
789 dispatcher_.DispatchPendingEvents();
790 EXPECT_EQ(Cellular::kStateLinked, device_->state_);
791 EXPECT_EQ(Service::kStateConfiguring, device_->service_->state());
792 device_->SelectService(nullptr);
793 }
794
TEST_F(CellularTest,FriendlyServiceName)795 TEST_F(CellularTest, FriendlyServiceName) {
796 // Test that the name created for the service is sensible under different
797 // scenarios w.r.t. information about the mobile network operator.
798 SetMockMobileOperatorInfoObjects();
799 CHECK(mock_home_provider_info_);
800 CHECK(mock_serving_operator_info_);
801
802 SetCellularType(Cellular::kTypeCDMA);
803 // We are not testing the behaviour of capabilities here.
804 device_->mobile_operator_info_observer_->set_capability(nullptr);
805
806 // (1) Service created, MNO not known => Default name.
807 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
808 .WillRepeatedly(Return(false));
809 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
810 .WillRepeatedly(Return(false));
811 device_->CreateService();
812 // Compare substrings explicitly using EXPECT_EQ for better error message.
813 size_t prefix_len = strlen(Cellular::kGenericServiceNamePrefix);
814 EXPECT_EQ(Cellular::kGenericServiceNamePrefix,
815 device_->service_->friendly_name().substr(0, prefix_len));
816 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
817 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
818 device_->DestroyService();
819
820 // (2) Service created, then home provider determined => Name provided by
821 // home provider.
822 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
823 .WillRepeatedly(Return(false));
824 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
825 .WillRepeatedly(Return(false));
826 device_->CreateService();
827 // Now emulate an event for updated home provider information.
828 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
829 mock_home_provider_info_->SetEmptyDefaultsForProperties();
830 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
831 .WillRepeatedly(Return(true));
832 EXPECT_CALL(*mock_home_provider_info_, operator_name())
833 .WillRepeatedly(ReturnRef(kHomeProviderName));
834 device_->mobile_operator_info_observer_->OnOperatorChanged();
835 EXPECT_EQ(kHomeProviderName, device_->service_->friendly_name());
836 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
837 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
838 device_->DestroyService();
839
840 // (3) Service created, then serving operator determined => Name provided by
841 // serving operator.
842 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
843 .WillRepeatedly(Return(false));
844 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
845 .WillRepeatedly(Return(false));
846 device_->CreateService();
847 // Now emulate an event for updated serving operator information.
848 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
849 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
850 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
851 .WillRepeatedly(Return(true));
852 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
853 .WillRepeatedly(ReturnRef(kServingOperatorName));
854 device_->mobile_operator_info_observer_->OnOperatorChanged();
855 EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
856 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
857 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
858 device_->DestroyService();
859
860 // (4) Service created, then home provider determined, then serving operator
861 // determined => final name is serving operator.
862 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
863 .WillRepeatedly(Return(false));
864 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
865 .WillRepeatedly(Return(false));
866 device_->CreateService();
867 // Now emulate an event for updated home provider information.
868 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
869 mock_home_provider_info_->SetEmptyDefaultsForProperties();
870 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
871 .WillRepeatedly(Return(true));
872 EXPECT_CALL(*mock_home_provider_info_, operator_name())
873 .WillRepeatedly(ReturnRef(kHomeProviderName));
874 device_->mobile_operator_info_observer_->OnOperatorChanged();
875 // Now emulate an event for updated serving operator information.
876 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
877 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
878 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
879 .WillRepeatedly(Return(true));
880 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
881 .WillRepeatedly(ReturnRef(kServingOperatorName));
882 device_->mobile_operator_info_observer_->OnOperatorChanged();
883 EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
884 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
885 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
886 device_->DestroyService();
887
888 // (5) Service created, then serving operator determined, then home provider
889 // determined => final name is serving operator.
890 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
891 .WillRepeatedly(Return(false));
892 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
893 .WillRepeatedly(Return(false));
894 device_->CreateService();
895 // Now emulate an event for updated serving operator information.
896 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
897 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
898 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
899 .WillRepeatedly(Return(true));
900 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
901 .WillRepeatedly(ReturnRef(kServingOperatorName));
902 device_->mobile_operator_info_observer_->OnOperatorChanged();
903 // Now emulate an event for updated home provider information.
904 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
905 mock_home_provider_info_->SetEmptyDefaultsForProperties();
906 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
907 .WillRepeatedly(Return(true));
908 EXPECT_CALL(*mock_home_provider_info_, operator_name())
909 .WillRepeatedly(ReturnRef(kHomeProviderName));
910 device_->mobile_operator_info_observer_->OnOperatorChanged();
911 EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
912 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
913 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
914 device_->DestroyService();
915
916 // (6) Serving operator known, home provider known, and then service created
917 // => Name is serving operator.
918 mock_home_provider_info_->SetEmptyDefaultsForProperties();
919 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
920 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
921 .WillRepeatedly(Return(true));
922 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
923 .WillRepeatedly(Return(true));
924 EXPECT_CALL(*mock_home_provider_info_, operator_name())
925 .WillRepeatedly(ReturnRef(kHomeProviderName));
926 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
927 .WillRepeatedly(ReturnRef(kServingOperatorName));
928 device_->CreateService();
929 EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
930 }
931
TEST_F(CellularTest,HomeProviderServingOperator)932 TEST_F(CellularTest, HomeProviderServingOperator) {
933 // Test that the the home provider information is correctly updated under
934 // different scenarios w.r.t. information about the mobile network operators.
935 SetMockMobileOperatorInfoObjects();
936 CHECK(mock_home_provider_info_);
937 CHECK(mock_serving_operator_info_);
938 Stringmap home_provider;
939 Stringmap serving_operator;
940
941
942 // (1) Neither home provider nor serving operator known.
943 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
944 .WillRepeatedly(Return(false));
945 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
946 .WillRepeatedly(Return(false));
947
948 device_->CreateService();
949
950 home_provider = device_->home_provider();
951 VerifyOperatorMap(home_provider, "", "", "");
952 serving_operator = device_->service_->serving_operator();
953 VerifyOperatorMap(serving_operator, "", "", "");
954 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
955 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
956 device_->DestroyService();
957
958 // (2) serving operator known.
959 // When home provider is not known, serving operator proxies in.
960 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
961 .WillRepeatedly(Return(false));
962 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
963 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
964 .WillRepeatedly(Return(true));
965 EXPECT_CALL(*mock_serving_operator_info_, mccmnc())
966 .WillRepeatedly(ReturnRef(kServingOperatorCode));
967 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
968 .WillRepeatedly(ReturnRef(kServingOperatorName));
969 EXPECT_CALL(*mock_serving_operator_info_, country())
970 .WillRepeatedly(ReturnRef(kServingOperatorCountry));
971
972 device_->CreateService();
973
974 home_provider = device_->home_provider();
975 VerifyOperatorMap(home_provider,
976 kServingOperatorCode,
977 kServingOperatorName,
978 kServingOperatorCountry);
979 serving_operator = device_->service_->serving_operator();
980 VerifyOperatorMap(serving_operator,
981 kServingOperatorCode,
982 kServingOperatorName,
983 kServingOperatorCountry);
984 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
985 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
986 device_->DestroyService();
987
988 // (3) home provider known.
989 // When serving operator is not known, home provider proxies in.
990 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
991 .WillRepeatedly(Return(false));
992 mock_home_provider_info_->SetEmptyDefaultsForProperties();
993 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
994 .WillRepeatedly(Return(true));
995 EXPECT_CALL(*mock_home_provider_info_, mccmnc())
996 .WillRepeatedly(ReturnRef(kHomeProviderCode));
997 EXPECT_CALL(*mock_home_provider_info_, operator_name())
998 .WillRepeatedly(ReturnRef(kHomeProviderName));
999 EXPECT_CALL(*mock_home_provider_info_, country())
1000 .WillRepeatedly(ReturnRef(kHomeProviderCountry));
1001
1002 device_->CreateService();
1003
1004 home_provider = device_->home_provider();
1005 VerifyOperatorMap(home_provider,
1006 kHomeProviderCode,
1007 kHomeProviderName,
1008 kHomeProviderCountry);
1009 serving_operator = device_->service_->serving_operator();
1010 VerifyOperatorMap(serving_operator,
1011 kHomeProviderCode,
1012 kHomeProviderName,
1013 kHomeProviderCountry);
1014 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
1015 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
1016 device_->DestroyService();
1017
1018 // (4) Serving operator known, home provider known.
1019 mock_home_provider_info_->SetEmptyDefaultsForProperties();
1020 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
1021 .WillRepeatedly(Return(true));
1022 EXPECT_CALL(*mock_home_provider_info_, mccmnc())
1023 .WillRepeatedly(ReturnRef(kHomeProviderCode));
1024 EXPECT_CALL(*mock_home_provider_info_, operator_name())
1025 .WillRepeatedly(ReturnRef(kHomeProviderName));
1026 EXPECT_CALL(*mock_home_provider_info_, country())
1027 .WillRepeatedly(ReturnRef(kHomeProviderCountry));
1028 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
1029 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
1030 .WillRepeatedly(Return(true));
1031 EXPECT_CALL(*mock_serving_operator_info_, mccmnc())
1032 .WillRepeatedly(ReturnRef(kServingOperatorCode));
1033 EXPECT_CALL(*mock_serving_operator_info_, operator_name())
1034 .WillRepeatedly(ReturnRef(kServingOperatorName));
1035 EXPECT_CALL(*mock_serving_operator_info_, country())
1036 .WillRepeatedly(ReturnRef(kServingOperatorCountry));
1037
1038 device_->CreateService();
1039
1040 home_provider = device_->home_provider();
1041 VerifyOperatorMap(home_provider,
1042 kHomeProviderCode,
1043 kHomeProviderName,
1044 kHomeProviderCountry);
1045 serving_operator = device_->service_->serving_operator();
1046 VerifyOperatorMap(serving_operator,
1047 kServingOperatorCode,
1048 kServingOperatorName,
1049 kServingOperatorCountry);
1050 }
1051
IllegalChar(char a)1052 static bool IllegalChar(char a) {
1053 return !(isalnum(a) || a == '_');
1054 }
1055
TEST_F(CellularTest,StorageIdentifier)1056 TEST_F(CellularTest, StorageIdentifier) {
1057 // Test that the storage identifier name used by the service is sensible under
1058 // different scenarios w.r.t. information about the mobile network operator.
1059 SetMockMobileOperatorInfoObjects();
1060 mock_home_provider_info_->SetEmptyDefaultsForProperties();
1061 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
1062 CHECK(mock_home_provider_info_);
1063 CHECK(mock_serving_operator_info_);
1064
1065 // See cellular_service.cc
1066 string prefix = string(kTypeCellular) + "_" +
1067 string(kTestDeviceAddress) + "_";
1068 // Service replaces ':' with '_'
1069 std::replace_if(prefix.begin(), prefix.end(), &IllegalChar, '_');
1070 const string kUuidHomeProvider = "uuidHomeProvider";
1071 const string kUuidServingOperator = "uuidServingOperator";
1072 const string kSimIdentifier = "12345123451234512345";
1073
1074 SetCellularType(Cellular::kTypeCDMA);
1075 // We are not testing the behaviour of capabilities here.
1076 device_->mobile_operator_info_observer_->set_capability(nullptr);
1077 ON_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
1078 .WillByDefault(Return(false));
1079
1080 // (1) Service created, both home provider and serving operator known =>
1081 // home provider used.
1082 mock_home_provider_info_->SetEmptyDefaultsForProperties();
1083 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
1084 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
1085 .WillRepeatedly(Return(true));
1086 EXPECT_CALL(*mock_home_provider_info_, uuid())
1087 .WillRepeatedly(ReturnRef(kUuidHomeProvider));
1088 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
1089 .WillRepeatedly(Return(true));
1090 EXPECT_CALL(*mock_serving_operator_info_, uuid())
1091 .WillRepeatedly(ReturnRef(kUuidServingOperator));
1092 device_->CreateService();
1093 EXPECT_EQ(prefix + kUuidHomeProvider,
1094 device_->service()->GetStorageIdentifier());
1095 Mock::VerifyAndClearExpectations(mock_home_provider_info_);
1096 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
1097 device_->DestroyService();
1098
1099 // Common expectation for following tests:
1100 EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
1101 .WillRepeatedly(Return(false));
1102
1103 // (2) Service created, no extra information => Default storage_id;
1104 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
1105 .WillRepeatedly(Return(false));
1106 device_->CreateService();
1107 EXPECT_EQ(prefix + device_->service()->friendly_name(),
1108 device_->service()->GetStorageIdentifier());
1109 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
1110 device_->DestroyService();
1111
1112 // (3) Service created, serving operator known, uuid known.
1113 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
1114 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
1115 .WillRepeatedly(Return(true));
1116 EXPECT_CALL(*mock_serving_operator_info_, uuid())
1117 .WillRepeatedly(ReturnRef(kUuidServingOperator));
1118 device_->CreateService();
1119 EXPECT_EQ(prefix + kUuidServingOperator,
1120 device_->service()->GetStorageIdentifier());
1121 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
1122 device_->DestroyService();
1123
1124 // (4) Service created, serving operator known, uuid not known, iccid known.
1125 mock_serving_operator_info_->SetEmptyDefaultsForProperties();
1126 EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
1127 .WillRepeatedly(Return(true));
1128 device_->set_sim_identifier(kSimIdentifier);
1129 device_->CreateService();
1130 EXPECT_EQ(prefix + kSimIdentifier,
1131 device_->service()->GetStorageIdentifier());
1132 Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
1133 device_->DestroyService();
1134 }
1135
1136 namespace {
1137
1138 MATCHER(ContainsPhoneNumber, "") {
1139 return arg.ContainsString(
1140 CellularCapabilityClassic::kConnectPropertyPhoneNumber);
1141 }
1142
1143 } // namespace
1144
TEST_F(CellularTest,Connect)1145 TEST_F(CellularTest, Connect) {
1146 Error error;
1147 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
1148 .Times(2)
1149 .WillRepeatedly(Return(true));
1150 device_->state_ = Cellular::kStateConnected;
1151 device_->Connect(&error);
1152 EXPECT_EQ(Error::kAlreadyConnected, error.type());
1153 error.Populate(Error::kSuccess);
1154
1155 device_->state_ = Cellular::kStateLinked;
1156 device_->Connect(&error);
1157 EXPECT_EQ(Error::kAlreadyConnected, error.type());
1158
1159 device_->state_ = Cellular::kStateEnabled;
1160 device_->Connect(&error);
1161 EXPECT_EQ(Error::kNotRegistered, error.type());
1162
1163 error.Reset();
1164 device_->state_ = Cellular::kStateDisabled;
1165 device_->Connect(&error);
1166 EXPECT_EQ(Error::kNotRegistered, error.type());
1167
1168 device_->state_ = Cellular::kStateRegistered;
1169 SetService();
1170
1171 device_->allow_roaming_ = false;
1172 device_->service_->roaming_state_ = kRoamingStateRoaming;
1173 device_->Connect(&error);
1174 EXPECT_EQ(Error::kNotOnHomeNetwork, error.type());
1175
1176 error.Populate(Error::kSuccess);
1177 EXPECT_CALL(*simple_proxy_,
1178 Connect(ContainsPhoneNumber(), _, _,
1179 CellularCapability::kTimeoutConnect))
1180 .Times(2)
1181 .WillRepeatedly(Invoke(this, &CellularTest::InvokeConnect));
1182 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
1183 device_->service_->roaming_state_ = kRoamingStateHome;
1184 device_->state_ = Cellular::kStateRegistered;
1185 device_->Connect(&error);
1186 EXPECT_TRUE(error.IsSuccess());
1187 dispatcher_.DispatchPendingEvents();
1188 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
1189
1190 device_->allow_roaming_ = true;
1191 device_->service_->roaming_state_ = kRoamingStateRoaming;
1192 device_->state_ = Cellular::kStateRegistered;
1193 device_->Connect(&error);
1194 EXPECT_TRUE(error.IsSuccess());
1195 dispatcher_.DispatchPendingEvents();
1196 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
1197 }
1198
TEST_F(CellularTest,Disconnect)1199 TEST_F(CellularTest, Disconnect) {
1200 Error error;
1201 device_->state_ = Cellular::kStateRegistered;
1202 device_->Disconnect(&error, "in test");
1203 EXPECT_EQ(Error::kNotConnected, error.type());
1204 error.Reset();
1205
1206 device_->state_ = Cellular::kStateConnected;
1207 EXPECT_CALL(*proxy_,
1208 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
1209 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
1210 GetCapabilityClassic()->proxy_.reset(proxy_.release());
1211 device_->Disconnect(&error, "in test");
1212 EXPECT_TRUE(error.IsSuccess());
1213 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
1214 }
1215
TEST_F(CellularTest,DisconnectFailure)1216 TEST_F(CellularTest, DisconnectFailure) {
1217 // Test the case where the underlying modem state is set
1218 // to disconnecting, but shill thinks it's still connected
1219 Error error;
1220 device_->state_ = Cellular::kStateConnected;
1221 EXPECT_CALL(*proxy_,
1222 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
1223 .Times(2)
1224 .WillRepeatedly(Invoke(this, &CellularTest::InvokeDisconnectFail));
1225 GetCapabilityClassic()->proxy_.reset(proxy_.release());
1226 device_->modem_state_ = Cellular::kModemStateDisconnecting;
1227 device_->Disconnect(&error, "in test");
1228 EXPECT_TRUE(error.IsFailure());
1229 EXPECT_EQ(Cellular::kStateConnected, device_->state_);
1230
1231 device_->modem_state_ = Cellular::kModemStateConnected;
1232 device_->Disconnect(&error, "in test");
1233 EXPECT_TRUE(error.IsFailure());
1234 EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
1235 }
1236
TEST_F(CellularTest,ConnectFailure)1237 TEST_F(CellularTest, ConnectFailure) {
1238 SetCellularType(Cellular::kTypeCDMA);
1239 device_->state_ = Cellular::kStateRegistered;
1240 SetService();
1241 ASSERT_EQ(Service::kStateIdle, device_->service_->state());
1242 EXPECT_CALL(*simple_proxy_,
1243 Connect(_, _, _, CellularCapability::kTimeoutConnect))
1244 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFail));
1245 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
1246 Error error;
1247 device_->Connect(&error);
1248 EXPECT_EQ(Service::kStateFailure, device_->service_->state());
1249 }
1250
TEST_F(CellularTest,ConnectFailureNoService)1251 TEST_F(CellularTest, ConnectFailureNoService) {
1252 // Make sure we don't crash if the connect failed and there is no
1253 // CellularService object. This can happen if the modem is enabled and
1254 // then quick disabled.
1255 SetCellularType(Cellular::kTypeCDMA);
1256 device_->state_ = Cellular::kStateRegistered;
1257 SetService();
1258 EXPECT_CALL(
1259 *simple_proxy_,
1260 Connect(_, _, _, CellularCapability::kTimeoutConnect))
1261 .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
1262 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
1263 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
1264 Error error;
1265 device_->Connect(&error);
1266 }
1267
TEST_F(CellularTest,ConnectSuccessNoService)1268 TEST_F(CellularTest, ConnectSuccessNoService) {
1269 // Make sure we don't crash if the connect succeeds but the service was
1270 // destroyed before the connect request completes.
1271 SetCellularType(Cellular::kTypeCDMA);
1272 device_->state_ = Cellular::kStateRegistered;
1273 SetService();
1274 EXPECT_CALL(
1275 *simple_proxy_,
1276 Connect(_, _, _, CellularCapability::kTimeoutConnect))
1277 .WillOnce(Invoke(this, &CellularTest::InvokeConnectSuccessNoService));
1278 EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
1279 GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
1280 Error error;
1281 device_->Connect(&error);
1282 }
1283
TEST_F(CellularTest,LinkEventWontDestroyService)1284 TEST_F(CellularTest, LinkEventWontDestroyService) {
1285 // If the network interface goes down, Cellular::LinkEvent should
1286 // drop the connection but the service object should persist.
1287 device_->state_ = Cellular::kStateLinked;
1288 CellularService* service = SetService();
1289 device_->LinkEvent(0, 0); // flags doesn't contain IFF_UP
1290 EXPECT_EQ(device_->state_, Cellular::kStateConnected);
1291 EXPECT_EQ(device_->service_, service);
1292 }
1293
TEST_F(CellularTest,UseNoArpGateway)1294 TEST_F(CellularTest, UseNoArpGateway) {
1295 EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestDeviceName, _, false, _))
1296 .WillOnce(Return(dhcp_config_));
1297 device_->AcquireIPConfig();
1298 }
1299
TEST_F(CellularTest,ModemStateChangeEnable)1300 TEST_F(CellularTest, ModemStateChangeEnable) {
1301 EXPECT_CALL(*simple_proxy_,
1302 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
1303 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemStatus));
1304 EXPECT_CALL(*cdma_proxy_, MEID()).WillOnce(Return(kMEID));
1305 EXPECT_CALL(*proxy_,
1306 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
1307 .WillOnce(Invoke(this, &CellularTest::InvokeGetModemInfo));
1308 EXPECT_CALL(*cdma_proxy_, GetRegistrationState(nullptr, _, _))
1309 .WillOnce(Invoke(this,
1310 &CellularTest::InvokeGetRegistrationStateUnregistered));
1311 EXPECT_CALL(*cdma_proxy_, GetSignalQuality(nullptr, _, _))
1312 .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
1313 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
1314 device_->state_ = Cellular::kStateDisabled;
1315 device_->set_modem_state(Cellular::kModemStateDisabled);
1316 SetCellularType(Cellular::kTypeCDMA);
1317
1318 KeyValueStore props;
1319 props.SetBool(CellularCapabilityClassic::kModemPropertyEnabled, true);
1320 device_->OnPropertiesChanged(MM_MODEM_INTERFACE, props, vector<string>());
1321 dispatcher_.DispatchPendingEvents();
1322
1323 EXPECT_EQ(Cellular::kModemStateEnabled, device_->modem_state());
1324 EXPECT_EQ(Cellular::kStateEnabled, device_->state());
1325 EXPECT_TRUE(device_->enabled());
1326 }
1327
TEST_F(CellularTest,ModemStateChangeDisable)1328 TEST_F(CellularTest, ModemStateChangeDisable) {
1329 EXPECT_CALL(*proxy_,
1330 Disconnect(_, _, CellularCapability::kTimeoutDisconnect))
1331 .WillOnce(Invoke(this, &CellularTest::InvokeDisconnect));
1332 EXPECT_CALL(*proxy_,
1333 Enable(false, _, _, CellularCapability::kTimeoutEnable))
1334 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1335 EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
1336 device_->enabled_ = true;
1337 device_->enabled_pending_ = true;
1338 device_->state_ = Cellular::kStateEnabled;
1339 device_->set_modem_state(Cellular::kModemStateEnabled);
1340 SetCellularType(Cellular::kTypeCDMA);
1341 GetCapabilityClassic()->InitProxies();
1342
1343 GetCapabilityClassic()->OnModemStateChangedSignal(kModemClassicStateEnabled,
1344 kModemClassicStateDisabled,
1345 0);
1346 dispatcher_.DispatchPendingEvents();
1347
1348 EXPECT_EQ(Cellular::kModemStateDisabled, device_->modem_state());
1349 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
1350 EXPECT_FALSE(device_->enabled());
1351 }
1352
TEST_F(CellularTest,ModemStateChangeStaleConnected)1353 TEST_F(CellularTest, ModemStateChangeStaleConnected) {
1354 // Test to make sure that we ignore stale modem Connected state transitions.
1355 // When a modem is asked to connect and before the connect completes, the
1356 // modem is disabled, it may send a stale Connected state transition after
1357 // it has been disabled.
1358 AllowCreateGSMCardProxyFromFactory();
1359 device_->state_ = Cellular::kStateDisabled;
1360 device_->modem_state_ = Cellular::kModemStateEnabling;
1361 device_->OnModemStateChanged(Cellular::kModemStateConnected);
1362 dispatcher_.DispatchPendingEvents();
1363 EXPECT_EQ(Cellular::kStateDisabled, device_->state());
1364 }
1365
TEST_F(CellularTest,ModemStateChangeValidConnected)1366 TEST_F(CellularTest, ModemStateChangeValidConnected) {
1367 device_->state_ = Cellular::kStateEnabled;
1368 device_->modem_state_ = Cellular::kModemStateConnecting;
1369 SetService();
1370 device_->OnModemStateChanged(Cellular::kModemStateConnected);
1371 EXPECT_EQ(Cellular::kStateConnected, device_->state());
1372 }
1373
TEST_F(CellularTest,ModemStateChangeLostRegistration)1374 TEST_F(CellularTest, ModemStateChangeLostRegistration) {
1375 SetCellularType(Cellular::kTypeUniversal);
1376 CellularCapabilityUniversal* capability = GetCapabilityUniversal();
1377 capability->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
1378 EXPECT_TRUE(capability->IsRegistered());
1379 device_->set_modem_state(Cellular::kModemStateRegistered);
1380 device_->OnModemStateChanged(Cellular::kModemStateEnabled);
1381 EXPECT_FALSE(capability->IsRegistered());
1382 }
1383
TEST_F(CellularTest,StartModemCallback)1384 TEST_F(CellularTest, StartModemCallback) {
1385 EXPECT_CALL(*this, TestCallback(IsSuccess()));
1386 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
1387 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
1388 Unretained(this)),
1389 Error(Error::kSuccess));
1390 EXPECT_EQ(device_->state_, Cellular::kStateEnabled);
1391 }
1392
TEST_F(CellularTest,StartModemCallbackFail)1393 TEST_F(CellularTest, StartModemCallbackFail) {
1394 EXPECT_CALL(*this, TestCallback(IsFailure()));
1395 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
1396 device_->StartModemCallback(Bind(&CellularTest::TestCallback,
1397 Unretained(this)),
1398 Error(Error::kOperationFailed));
1399 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
1400 }
1401
TEST_F(CellularTest,StopModemCallback)1402 TEST_F(CellularTest, StopModemCallback) {
1403 EXPECT_CALL(*this, TestCallback(IsSuccess()));
1404 SetMockService();
1405 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
1406 Unretained(this)),
1407 Error(Error::kSuccess));
1408 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
1409 EXPECT_FALSE(device_->service_.get());
1410 }
1411
TEST_F(CellularTest,StopModemCallbackFail)1412 TEST_F(CellularTest, StopModemCallbackFail) {
1413 EXPECT_CALL(*this, TestCallback(IsFailure()));
1414 SetMockService();
1415 device_->StopModemCallback(Bind(&CellularTest::TestCallback,
1416 Unretained(this)),
1417 Error(Error::kOperationFailed));
1418 EXPECT_EQ(device_->state_, Cellular::kStateDisabled);
1419 EXPECT_FALSE(device_->service_.get());
1420 }
1421
TEST_F(CellularTest,SetAllowRoaming)1422 TEST_F(CellularTest, SetAllowRoaming) {
1423 EXPECT_FALSE(device_->allow_roaming_);
1424 EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
1425 Error error;
1426 device_->SetAllowRoaming(true, &error);
1427 EXPECT_TRUE(error.IsSuccess());
1428 EXPECT_TRUE(device_->allow_roaming_);
1429 }
1430
1431 class TestRPCTaskDelegate :
1432 public RPCTaskDelegate,
1433 public base::SupportsWeakPtr<TestRPCTaskDelegate> {
1434 public:
GetLogin(std::string * user,std::string * password)1435 virtual void GetLogin(std::string* user, std::string* password) {}
Notify(const std::string & reason,const std::map<std::string,std::string> & dict)1436 virtual void Notify(const std::string& reason,
1437 const std::map<std::string, std::string>& dict) {}
1438 };
1439
TEST_F(CellularTest,LinkEventUpWithPPP)1440 TEST_F(CellularTest, LinkEventUpWithPPP) {
1441 // If PPP is running, don't run DHCP as well.
1442 TestRPCTaskDelegate task_delegate;
1443 base::Callback<void(pid_t, int)> death_callback;
1444 unique_ptr<NiceMock<MockExternalTask>> mock_task(
1445 new NiceMock<MockExternalTask>(modem_info_.control_interface(),
1446 &process_manager_,
1447 task_delegate.AsWeakPtr(),
1448 death_callback));
1449 EXPECT_CALL(*mock_task, OnDelete()).Times(AnyNumber());
1450 device_->ppp_task_ = std::move(mock_task);
1451 device_->state_ = Cellular::kStateConnected;
1452 EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestDeviceName, _, _, _))
1453 .Times(0);
1454 EXPECT_CALL(*dhcp_config_, RequestIP()).Times(0);
1455 device_->LinkEvent(IFF_UP, 0);
1456 }
1457
TEST_F(CellularTest,LinkEventUpWithoutPPP)1458 TEST_F(CellularTest, LinkEventUpWithoutPPP) {
1459 // If PPP is not running, fire up DHCP.
1460 device_->state_ = Cellular::kStateConnected;
1461 EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestDeviceName, _, _, _))
1462 .WillOnce(Return(dhcp_config_));
1463 EXPECT_CALL(*dhcp_config_, RequestIP());
1464 EXPECT_CALL(*dhcp_config_, ReleaseIP(_)).Times(AnyNumber());
1465 device_->LinkEvent(IFF_UP, 0);
1466 }
1467
TEST_F(CellularTest,StartPPP)1468 TEST_F(CellularTest, StartPPP) {
1469 const int kPID = 234;
1470 EXPECT_EQ(nullptr, device_->ppp_task_);
1471 StartPPP(kPID);
1472 }
1473
TEST_F(CellularTest,StartPPPAlreadyStarted)1474 TEST_F(CellularTest, StartPPPAlreadyStarted) {
1475 const int kPID = 234;
1476 StartPPP(kPID);
1477
1478 const int kPID2 = 235;
1479 StartPPP(kPID2);
1480 }
1481
TEST_F(CellularTest,StartPPPAfterEthernetUp)1482 TEST_F(CellularTest, StartPPPAfterEthernetUp) {
1483 CellularService* service(SetService());
1484 device_->state_ = Cellular::kStateLinked;
1485 device_->set_ipconfig(dhcp_config_);
1486 device_->SelectService(service);
1487 EXPECT_CALL(*dhcp_config_, ReleaseIP(_))
1488 .Times(AnyNumber())
1489 .WillRepeatedly(Return(true));
1490 const int kPID = 234;
1491 EXPECT_EQ(nullptr, device_->ppp_task_);
1492 StartPPP(kPID);
1493 EXPECT_EQ(Cellular::kStateLinked, device_->state());
1494 }
1495
TEST_F(CellularTest,GetLogin)1496 TEST_F(CellularTest, GetLogin) {
1497 // Doesn't crash when there is no service.
1498 string username_to_pppd;
1499 string password_to_pppd;
1500 EXPECT_FALSE(device_->service());
1501 device_->GetLogin(&username_to_pppd, &password_to_pppd);
1502
1503 // Provides expected username and password in normal case.
1504 const char kFakeUsername[] = "fake-user";
1505 const char kFakePassword[] = "fake-password";
1506 CellularService& service(*SetService());
1507 service.ppp_username_ = kFakeUsername;
1508 service.ppp_password_ = kFakePassword;
1509 device_->GetLogin(&username_to_pppd, &password_to_pppd);
1510 }
1511
TEST_F(CellularTest,Notify)1512 TEST_F(CellularTest, Notify) {
1513 // Common setup.
1514 MockPPPDeviceFactory* ppp_device_factory =
1515 MockPPPDeviceFactory::GetInstance();
1516 const int kPID = 91;
1517 device_->ppp_device_factory_ = ppp_device_factory;
1518 SetMockService();
1519 StartPPP(kPID);
1520
1521 const map<string, string> kEmptyArgs;
1522 device_->Notify(kPPPReasonAuthenticating, kEmptyArgs);
1523 EXPECT_TRUE(device_->is_ppp_authenticating_);
1524 device_->Notify(kPPPReasonAuthenticated, kEmptyArgs);
1525 EXPECT_FALSE(device_->is_ppp_authenticating_);
1526
1527 // Normal connect.
1528 const string kInterfaceName("fake-device");
1529 const int kInterfaceIndex = 1;
1530 scoped_refptr<MockPPPDevice> ppp_device;
1531 map<string, string> ppp_config;
1532 ppp_device =
1533 new MockPPPDevice(modem_info_.control_interface(), nullptr, nullptr,
1534 nullptr, kInterfaceName, kInterfaceIndex);
1535 ppp_config[kPPPInterfaceName] = kInterfaceName;
1536 EXPECT_CALL(device_info_, GetIndex(kInterfaceName))
1537 .WillOnce(Return(kInterfaceIndex));
1538 EXPECT_CALL(device_info_, RegisterDevice(_));
1539 EXPECT_CALL(*ppp_device_factory,
1540 CreatePPPDevice(_, _, _, _, kInterfaceName, kInterfaceIndex))
1541 .WillOnce(Return(ppp_device.get()));
1542 EXPECT_CALL(*ppp_device, SetEnabled(true));
1543 EXPECT_CALL(*ppp_device, SelectService(_));
1544 EXPECT_CALL(*ppp_device, UpdateIPConfigFromPPP(ppp_config, false));
1545 device_->Notify(kPPPReasonConnect, ppp_config);
1546 Mock::VerifyAndClearExpectations(&device_info_);
1547 Mock::VerifyAndClearExpectations(ppp_device.get());
1548
1549 // Re-connect on same network device: if pppd sends us multiple connect
1550 // events, we behave sanely.
1551 EXPECT_CALL(device_info_, GetIndex(kInterfaceName))
1552 .WillOnce(Return(kInterfaceIndex));
1553 EXPECT_CALL(*ppp_device, SetEnabled(true));
1554 EXPECT_CALL(*ppp_device, SelectService(_));
1555 EXPECT_CALL(*ppp_device, UpdateIPConfigFromPPP(ppp_config, false));
1556 device_->Notify(kPPPReasonConnect, ppp_config);
1557 Mock::VerifyAndClearExpectations(&device_info_);
1558 Mock::VerifyAndClearExpectations(ppp_device.get());
1559
1560 // Re-connect on new network device: if we still have the PPPDevice
1561 // from a prior connect, this new connect should DTRT. This is
1562 // probably an unlikely case.
1563 const string kInterfaceName2("fake-device2");
1564 const int kInterfaceIndex2 = 2;
1565 scoped_refptr<MockPPPDevice> ppp_device2;
1566 map<string, string> ppp_config2;
1567 ppp_device2 =
1568 new MockPPPDevice(modem_info_.control_interface(), nullptr, nullptr,
1569 nullptr, kInterfaceName2, kInterfaceIndex2);
1570 ppp_config2[kPPPInterfaceName] = kInterfaceName2;
1571 EXPECT_CALL(device_info_, GetIndex(kInterfaceName2))
1572 .WillOnce(Return(kInterfaceIndex2));
1573 EXPECT_CALL(device_info_,
1574 RegisterDevice(static_cast<DeviceRefPtr>(ppp_device2)));
1575 EXPECT_CALL(*ppp_device_factory,
1576 CreatePPPDevice(_, _, _, _, kInterfaceName2, kInterfaceIndex2))
1577 .WillOnce(Return(ppp_device2.get()));
1578 EXPECT_CALL(*ppp_device, SelectService(ServiceRefPtr(nullptr)));
1579 EXPECT_CALL(*ppp_device2, SetEnabled(true));
1580 EXPECT_CALL(*ppp_device2, SelectService(_));
1581 EXPECT_CALL(*ppp_device2, UpdateIPConfigFromPPP(ppp_config2, false));
1582 device_->Notify(kPPPReasonConnect, ppp_config2);
1583 Mock::VerifyAndClearExpectations(&device_info_);
1584 Mock::VerifyAndClearExpectations(ppp_device.get());
1585 Mock::VerifyAndClearExpectations(ppp_device2.get());
1586
1587 // Disconnect should report unknown failure, since we had a
1588 // Notify(kPPPReasonAuthenticated, ...).
1589 EXPECT_CALL(*ppp_device2, SetServiceFailure(Service::kFailureUnknown));
1590 device_->Notify(kPPPReasonDisconnect, kEmptyArgs);
1591 EXPECT_EQ(nullptr, device_->ppp_task_);
1592
1593 // |Cellular::ppp_task_| is destroyed on the task loop. Must dispatch once to
1594 // cleanup.
1595 dispatcher_.DispatchPendingEvents();
1596 }
1597
TEST_F(CellularTest,PPPConnectionFailedBeforeAuth)1598 TEST_F(CellularTest, PPPConnectionFailedBeforeAuth) {
1599 // Test that we properly set Service state in the case where pppd
1600 // disconnects before authenticating (as opposed to the Notify test,
1601 // where pppd disconnects after connecting).
1602 const int kPID = 52;
1603 const map<string, string> kEmptyArgs;
1604 MockCellularService* service = SetMockService();
1605 StartPPP(kPID);
1606
1607 ExpectDisconnectCapabilityUniversal();
1608 EXPECT_CALL(*service, SetFailure(Service::kFailureUnknown));
1609 device_->Notify(kPPPReasonDisconnect, kEmptyArgs);
1610 EXPECT_EQ(nullptr, device_->ppp_task_);
1611 VerifyDisconnect();
1612
1613 // |Cellular::ppp_task_| is destroyed on the task loop. Must dispatch once to
1614 // cleanup.
1615 dispatcher_.DispatchPendingEvents();
1616 }
1617
TEST_F(CellularTest,PPPConnectionFailedDuringAuth)1618 TEST_F(CellularTest, PPPConnectionFailedDuringAuth) {
1619 // Test that we properly set Service state in the case where pppd
1620 // disconnects during authentication (as opposed to the Notify test,
1621 // where pppd disconnects after connecting).
1622 const int kPID = 52;
1623 const map<string, string> kEmptyArgs;
1624 MockCellularService* service = SetMockService();
1625 StartPPP(kPID);
1626
1627 ExpectDisconnectCapabilityUniversal();
1628 EXPECT_CALL(*service, SetFailure(Service::kFailurePPPAuth));
1629 device_->Notify(kPPPReasonAuthenticating, kEmptyArgs);
1630 device_->Notify(kPPPReasonDisconnect, kEmptyArgs);
1631 EXPECT_EQ(nullptr, device_->ppp_task_);
1632 VerifyDisconnect();
1633
1634 // |Cellular::ppp_task_| is destroyed on the task loop. Must dispatch once to
1635 // cleanup.
1636 dispatcher_.DispatchPendingEvents();
1637 }
1638
TEST_F(CellularTest,PPPConnectionFailedAfterAuth)1639 TEST_F(CellularTest, PPPConnectionFailedAfterAuth) {
1640 // Test that we properly set Service state in the case where pppd
1641 // disconnects after authenticating, but before connecting (as
1642 // opposed to the Notify test, where pppd disconnects after
1643 // connecting).
1644 const int kPID = 52;
1645 const map<string, string> kEmptyArgs;
1646 MockCellularService* service = SetMockService();
1647 StartPPP(kPID);
1648
1649 EXPECT_CALL(*service, SetFailure(Service::kFailureUnknown));
1650 ExpectDisconnectCapabilityUniversal();
1651 device_->Notify(kPPPReasonAuthenticating, kEmptyArgs);
1652 device_->Notify(kPPPReasonAuthenticated, kEmptyArgs);
1653 device_->Notify(kPPPReasonDisconnect, kEmptyArgs);
1654 EXPECT_EQ(nullptr, device_->ppp_task_);
1655 VerifyDisconnect();
1656
1657 // |Cellular::ppp_task_| is destroyed on the task loop. Must dispatch once to
1658 // cleanup.
1659 dispatcher_.DispatchPendingEvents();
1660 }
1661
TEST_F(CellularTest,OnPPPDied)1662 TEST_F(CellularTest, OnPPPDied) {
1663 const int kPID = 1234;
1664 const int kExitStatus = 5;
1665 ExpectDisconnectCapabilityUniversal();
1666 device_->OnPPPDied(kPID, kExitStatus);
1667 VerifyDisconnect();
1668 }
1669
TEST_F(CellularTest,OnPPPDiedCleanupDevice)1670 TEST_F(CellularTest, OnPPPDiedCleanupDevice) {
1671 // Test that OnPPPDied causes the ppp_device_ reference to be dropped.
1672 const int kPID = 123;
1673 const int kExitStatus = 5;
1674 StartPPP(kPID);
1675 FakeUpConnectedPPP();
1676 ExpectDisconnectCapabilityUniversal();
1677 device_->OnPPPDied(kPID, kExitStatus);
1678 VerifyPPPStopped();
1679
1680 // |Cellular::ppp_task_| is destroyed on the task loop. Must dispatch once to
1681 // cleanup.
1682 dispatcher_.DispatchPendingEvents();
1683 }
1684
TEST_F(CellularTest,DropConnection)1685 TEST_F(CellularTest, DropConnection) {
1686 device_->set_ipconfig(dhcp_config_);
1687 EXPECT_CALL(*dhcp_config_, ReleaseIP(_));
1688 device_->DropConnection();
1689 Mock::VerifyAndClearExpectations(dhcp_config_.get()); // verify before dtor
1690 EXPECT_FALSE(device_->ipconfig());
1691 }
1692
TEST_F(CellularTest,DropConnectionPPP)1693 TEST_F(CellularTest, DropConnectionPPP) {
1694 scoped_refptr<MockPPPDevice> ppp_device(
1695 new MockPPPDevice(modem_info_.control_interface(),
1696 nullptr, nullptr, nullptr, "fake_ppp0", -1));
1697 EXPECT_CALL(*ppp_device, DropConnection());
1698 device_->ppp_device_ = ppp_device;
1699 device_->DropConnection();
1700 }
1701
TEST_F(CellularTest,ChangeServiceState)1702 TEST_F(CellularTest, ChangeServiceState) {
1703 MockCellularService* service(SetMockService());
1704 EXPECT_CALL(*service, SetState(_));
1705 EXPECT_CALL(*service, SetFailure(_));
1706 EXPECT_CALL(*service, SetFailureSilent(_));
1707 ON_CALL(*service, state()).WillByDefault(Return(Service::kStateUnknown));
1708
1709 // Without PPP, these should be handled by our selected_service().
1710 device_->SelectService(service);
1711 device_->SetServiceState(Service::kStateConfiguring);
1712 device_->SetServiceFailure(Service::kFailurePPPAuth);
1713 device_->SetServiceFailureSilent(Service::kFailureUnknown);
1714 Mock::VerifyAndClearExpectations(service); // before Cellular dtor
1715 }
1716
TEST_F(CellularTest,ChangeServiceStatePPP)1717 TEST_F(CellularTest, ChangeServiceStatePPP) {
1718 MockCellularService* service(SetMockService());
1719 scoped_refptr<MockPPPDevice> ppp_device(
1720 new MockPPPDevice(modem_info_.control_interface(),
1721 nullptr, nullptr, nullptr, "fake_ppp0", -1));
1722 EXPECT_CALL(*ppp_device, SetServiceState(_));
1723 EXPECT_CALL(*ppp_device, SetServiceFailure(_));
1724 EXPECT_CALL(*ppp_device, SetServiceFailureSilent(_));
1725 EXPECT_CALL(*service, SetState(_)).Times(0);
1726 EXPECT_CALL(*service, SetFailure(_)).Times(0);
1727 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
1728 device_->ppp_device_ = ppp_device;
1729
1730 // With PPP, these should all be punted over to the |ppp_device|.
1731 // Note in particular that Cellular does not manipulate |service| in
1732 // this case.
1733 device_->SetServiceState(Service::kStateConfiguring);
1734 device_->SetServiceFailure(Service::kFailurePPPAuth);
1735 device_->SetServiceFailureSilent(Service::kFailureUnknown);
1736 }
1737
TEST_F(CellularTest,StopPPPOnDisconnect)1738 TEST_F(CellularTest, StopPPPOnDisconnect) {
1739 const int kPID = 123;
1740 Error error;
1741 StartPPP(kPID);
1742 FakeUpConnectedPPP();
1743 ExpectPPPStopped();
1744 device_->Disconnect(&error, "in test");
1745 VerifyPPPStopped();
1746 }
1747
TEST_F(CellularTest,StopPPPOnSuspend)1748 TEST_F(CellularTest, StopPPPOnSuspend) {
1749 const int kPID = 123;
1750 StartPPP(kPID);
1751 FakeUpConnectedPPP();
1752 ExpectPPPStopped();
1753 device_->OnBeforeSuspend(ResultCallback());
1754 VerifyPPPStopped();
1755 }
1756
TEST_F(CellularTest,OnAfterResumeDisabledWantDisabled)1757 TEST_F(CellularTest, OnAfterResumeDisabledWantDisabled) {
1758 // The Device was disabled prior to resume, and the profile settings
1759 // indicate that the device should be disabled. We should leave
1760 // things alone.
1761
1762 // Initial state.
1763 mm1::MockModemProxy* mm1_proxy = SetupOnAfterResume();
1764 set_enabled_persistent(false);
1765 EXPECT_FALSE(device_->running());
1766 EXPECT_FALSE(device_->enabled_persistent());
1767 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1768
1769 // Resume, while device is disabled.
1770 EXPECT_CALL(*mm1_proxy, Enable(_, _, _, _)).Times(0);
1771 device_->OnAfterResume();
1772 EXPECT_FALSE(device_->running());
1773 EXPECT_FALSE(device_->enabled_persistent());
1774 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1775 }
1776
TEST_F(CellularTest,OnAfterResumeDisableInProgressWantDisabled)1777 TEST_F(CellularTest, OnAfterResumeDisableInProgressWantDisabled) {
1778 // The Device was not disabled prior to resume, but the profile
1779 // settings indicate that the device _should be_ disabled. Most
1780 // likely, we started disabling the device, but that did not
1781 // complete before we suspended. We should leave things alone.
1782
1783 // Initial state.
1784 mm1::MockModemProxy* mm1_proxy = SetupOnAfterResume();
1785 Error error;
1786 EXPECT_CALL(*mm1_proxy, Enable(true, _, _, _))
1787 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1788 device_->SetEnabled(true);
1789 EXPECT_TRUE(device_->running());
1790 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1791
1792 // Start disable.
1793 EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
1794 device_->SetEnabledPersistent(false, &error, ResultCallback());
1795 EXPECT_FALSE(device_->running()); // changes immediately
1796 EXPECT_FALSE(device_->enabled_persistent()); // changes immediately
1797 EXPECT_EQ(Cellular::kStateEnabled, device_->state_); // changes on completion
1798
1799 // Resume, with disable still in progress.
1800 device_->OnAfterResume();
1801 EXPECT_FALSE(device_->running());
1802 EXPECT_FALSE(device_->enabled_persistent());
1803 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1804
1805 // Finish the disable operation.
1806 EXPECT_CALL(*mm1_proxy, Enable(false, _, _, _))
1807 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1808 EXPECT_CALL(*mm1_proxy, SetPowerState(_, _, _, _))
1809 .WillOnce(Invoke(this, &CellularTest::InvokeSetPowerState));
1810 dispatcher_.DispatchPendingEvents();
1811 EXPECT_FALSE(device_->running());
1812 EXPECT_FALSE(device_->enabled_persistent());
1813 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1814 }
1815
TEST_F(CellularTest,OnAfterResumeDisableQueuedWantEnabled)1816 TEST_F(CellularTest, OnAfterResumeDisableQueuedWantEnabled) {
1817 // The Device was not disabled prior to resume, and the profile
1818 // settings indicate that the device should be enabled. In
1819 // particular, we went into suspend before we actually processed the
1820 // task queued by CellularCapabilityUniversal::StopModem.
1821 //
1822 // This is unlikely, and a case where we fail to do the right thing.
1823 // The tests exists to document this corner case, which we get wrong.
1824
1825 // Initial state.
1826 mm1::MockModemProxy* mm1_proxy = SetupOnAfterResume();
1827 EXPECT_CALL(*mm1_proxy, Enable(true, _, _, _))
1828 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1829 device_->SetEnabled(true);
1830 EXPECT_TRUE(device_->running());
1831 EXPECT_TRUE(device_->enabled_persistent());
1832 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1833
1834 // Start disable.
1835 device_->SetEnabled(false);
1836 EXPECT_FALSE(device_->running()); // changes immediately
1837 EXPECT_TRUE(device_->enabled_persistent()); // no change
1838 EXPECT_EQ(Cellular::kStateEnabled, device_->state_); // changes on completion
1839
1840 // Refresh proxies, since CellularCapabilityUniversal::StartModem wants
1841 // new proxies. Also, stash away references for later.
1842 PopulateProxies();
1843 SetCommonOnAfterResumeExpectations();
1844 mm1_proxy = mm1_proxy_.get();
1845 auto dbus_properties_proxy = dbus_properties_proxy_.get();
1846
1847 // Resume, with disable still in progress.
1848 EXPECT_CALL(*mm1_proxy, Enable(true, _, _, _))
1849 .WillOnce(Invoke(this, &CellularTest::InvokeEnableReturningWrongState));
1850 EXPECT_EQ(Cellular::kStateEnabled, device_->state_); // disable still pending
1851 device_->OnAfterResume();
1852 EXPECT_TRUE(device_->running()); // changes immediately
1853 EXPECT_TRUE(device_->enabled_persistent()); // no change
1854 EXPECT_EQ(Cellular::kStateDisabled, device_->state_); // by OnAfterResume
1855
1856 // Set up state that we need.
1857 KeyValueStore modem_properties;
1858 modem_properties.SetInt(MM_MODEM_PROPERTY_STATE,
1859 Cellular::kModemStateDisabled);
1860
1861 // Let the disable complete.
1862 EXPECT_CALL(*mm1_proxy, Enable(false, _, _, _))
1863 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1864 EXPECT_CALL(*mm1_proxy, SetPowerState(_, _, _, _))
1865 .WillOnce(Invoke(this, &CellularTest::InvokeSetPowerState));
1866 EXPECT_CALL(*dbus_properties_proxy, GetAll(_))
1867 .WillRepeatedly(Return(modem_properties));
1868 dispatcher_.DispatchPendingEvents();
1869 EXPECT_TRUE(device_->running()); // last changed by OnAfterResume
1870 EXPECT_TRUE(device_->enabled_persistent()); // last changed by OnAfterResume
1871 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1872
1873 // There's nothing queued up to restart the modem. Even though we
1874 // want to be running, we're stuck in the disabled state.
1875 dispatcher_.DispatchPendingEvents();
1876 EXPECT_TRUE(device_->running());
1877 EXPECT_TRUE(device_->enabled_persistent());
1878 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1879 }
1880
TEST_F(CellularTest,OnAfterResumePowerDownInProgressWantEnabled)1881 TEST_F(CellularTest, OnAfterResumePowerDownInProgressWantEnabled) {
1882 // The Device was not fully disabled prior to resume, and the
1883 // profile settings indicate that the device should be enabled. In
1884 // this case, we have disabled the device, but are waiting for the
1885 // power-down (switch to low power) to complete.
1886 //
1887 // This test emulates the behavior of the Huawei E303 dongle, when
1888 // Manager::kTerminationActionsTimeoutMilliseconds is 9500
1889 // msec. (The dongle takes 10-11 seconds to go through the whole
1890 // disable, power-down sequence).
1891 //
1892 // Eventually, the power-down would complete, and the device would
1893 // be stuck in the disabled state. To counter-act that,
1894 // OnAfterResume tries to enable the device now, even though the
1895 // device is currently enabled.
1896
1897 // Initial state.
1898 mm1::MockModemProxy* mm1_proxy = SetupOnAfterResume();
1899 EXPECT_CALL(*mm1_proxy, Enable(true, _, _, _))
1900 .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
1901 device_->SetEnabled(true);
1902 EXPECT_TRUE(device_->running());
1903 EXPECT_TRUE(device_->enabled_persistent());
1904 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1905
1906 // Start disable.
1907 ResultCallback modem_proxy_enable_callback;
1908 EXPECT_CALL(*mm1_proxy, Enable(false, _, _, _))
1909 .WillOnce(SaveArg<2>(&modem_proxy_enable_callback));
1910 device_->SetEnabled(false);
1911 dispatcher_.DispatchPendingEvents(); // SetEnabled yields a deferred task
1912 EXPECT_FALSE(device_->running()); // changes immediately
1913 EXPECT_TRUE(device_->enabled_persistent()); // no change
1914 EXPECT_EQ(Cellular::kStateEnabled, device_->state_); // changes on completion
1915
1916 // Let the disable complete. That will trigger power-down.
1917 //
1918 // Note that, unlike for mm1_proxy->Enable, we don't save the
1919 // callback for mm1_proxy->SetPowerState. We expect the callback not
1920 // to be executed, as explained in the comment about having a fresh
1921 // proxy OnAfterResume, below.
1922 Error error;
1923 ASSERT_TRUE(error.IsSuccess());
1924 EXPECT_CALL(*mm1_proxy, SetPowerState(MM_MODEM_POWER_STATE_LOW, _, _, _))
1925 .WillOnce(SetErrorTypeInArgument<1>(Error::kOperationInitiated));
1926 modem_proxy_enable_callback.Run(error);
1927
1928 // No response to power-down yet. It probably completed while the host
1929 // was asleep, and so the reply from the modem was lost.
1930
1931 // Refresh proxies, since CellularCapabilityUniversal::StartModem wants
1932 // new proxies. Also, stash away references for later.
1933 PopulateProxies();
1934 SetCommonOnAfterResumeExpectations();
1935 auto new_mm1_proxy = mm1_proxy_.get();
1936 auto dbus_properties_proxy = dbus_properties_proxy_.get();
1937
1938 // Resume.
1939 ResultCallback new_callback;
1940 EXPECT_EQ(Cellular::kStateEnabled, device_->state_); // disable still pending
1941 EXPECT_CALL(*new_mm1_proxy, Enable(true, _, _, _))
1942 .WillOnce(SaveArg<2>(&modem_proxy_enable_callback));
1943 device_->OnAfterResume();
1944 EXPECT_TRUE(device_->running()); // changes immediately
1945 EXPECT_TRUE(device_->enabled_persistent()); // no change
1946 EXPECT_EQ(Cellular::kStateDisabled, device_->state_); // by OnAfterResume
1947
1948 // We should have a fresh proxy OnAfterResume. Otherwise, we may get
1949 // confused when the SetPowerState call completes (either naturally,
1950 // or via a time-out from dbus-c++).
1951 //
1952 // The pointers must differ, because the new proxy is constructed
1953 // before the old one is destructed.
1954 EXPECT_FALSE(new_mm1_proxy == mm1_proxy);
1955
1956 // Set up state that we need.
1957 KeyValueStore modem_properties;
1958 modem_properties.SetInt(MM_MODEM_PROPERTY_STATE,
1959 Cellular::kModemStateEnabled);
1960
1961 // Let the enable complete.
1962 ASSERT_TRUE(error.IsSuccess());
1963 EXPECT_CALL(*dbus_properties_proxy, GetAll(_))
1964 .WillRepeatedly(Return(modem_properties));
1965 ASSERT_TRUE(!modem_proxy_enable_callback.is_null());
1966 modem_proxy_enable_callback.Run(error);
1967 EXPECT_TRUE(device_->running());
1968 EXPECT_TRUE(device_->enabled_persistent());
1969 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1970 }
1971
TEST_F(CellularTest,OnAfterResumeDisabledWantEnabled)1972 TEST_F(CellularTest, OnAfterResumeDisabledWantEnabled) {
1973 // This is the ideal case. The disable process completed before
1974 // going into suspend.
1975 mm1::MockModemProxy* mm1_proxy = SetupOnAfterResume();
1976 EXPECT_FALSE(device_->running());
1977 EXPECT_TRUE(device_->enabled_persistent());
1978 EXPECT_EQ(Cellular::kStateDisabled, device_->state_);
1979
1980 // Resume.
1981 ResultCallback modem_proxy_enable_callback;
1982 EXPECT_CALL(*mm1_proxy, Enable(true, _, _, _))
1983 .WillOnce(SaveArg<2>(&modem_proxy_enable_callback));
1984 device_->OnAfterResume();
1985
1986 // Complete enable.
1987 Error error;
1988 ASSERT_TRUE(error.IsSuccess());
1989 modem_proxy_enable_callback.Run(error);
1990 EXPECT_TRUE(device_->running());
1991 EXPECT_TRUE(device_->enabled_persistent());
1992 EXPECT_EQ(Cellular::kStateEnabled, device_->state_);
1993 }
1994
1995 // Custom property setters should return false, and make no changes, if
1996 // the new value is the same as the old value.
TEST_F(CellularTest,CustomSetterNoopChange)1997 TEST_F(CellularTest, CustomSetterNoopChange) {
1998 Error error;
1999 EXPECT_FALSE(device_->allow_roaming_);
2000 EXPECT_FALSE(device_->SetAllowRoaming(false, &error));
2001 EXPECT_TRUE(error.IsSuccess());
2002 }
2003
TEST_F(CellularTest,ScanImmediateFailure)2004 TEST_F(CellularTest, ScanImmediateFailure) {
2005 Error error;
2006
2007 device_->set_found_networks(kTestNetworksCellular);
2008 EXPECT_FALSE(device_->scanning_);
2009 // |InitProxies| must be called before calling any functions on the
2010 // Capability*, to set up the modem proxies.
2011 // Warning: The test loses all references to the proxies when |InitProxies| is
2012 // called.
2013 GetCapabilityGSM()->InitProxies();
2014 device_->Scan(Device::kFullScan, &error, "");
2015 EXPECT_TRUE(error.IsFailure());
2016 EXPECT_FALSE(device_->scanning_);
2017 EXPECT_EQ(kTestNetworksCellular, device_->found_networks());
2018 }
2019
TEST_F(CellularTest,ScanAsynchronousFailure)2020 TEST_F(CellularTest, ScanAsynchronousFailure) {
2021 Error error;
2022 ScanResultsCallback results_callback;
2023
2024 device_->set_found_networks(kTestNetworksCellular);
2025 EXPECT_CALL(*gsm_network_proxy_, Scan(&error, _, _))
2026 .WillOnce(DoAll(SetErrorTypeInArgument<0>(Error::kOperationInitiated),
2027 SaveArg<1>(&results_callback)));
2028 EXPECT_FALSE(device_->scanning_);
2029 // |InitProxies| must be called before calling any functions on the
2030 // Capability*, to set up the modem proxies.
2031 // Warning: The test loses all references to the proxies when |InitProxies| is
2032 // called.
2033 GetCapabilityGSM()->InitProxies();
2034 device_->Scan(Device::kFullScan, &error, "");
2035 EXPECT_TRUE(error.IsOngoing());
2036 EXPECT_TRUE(device_->scanning_);
2037
2038 // Asynchronously fail the scan.
2039 error.Populate(Error::kOperationFailed);
2040 results_callback.Run(kTestNetworksGSM, error);
2041 EXPECT_FALSE(device_->scanning_);
2042 EXPECT_TRUE(device_->found_networks().empty());
2043 }
2044
TEST_F(CellularTest,ScanSuccess)2045 TEST_F(CellularTest, ScanSuccess) {
2046 Error error;
2047 ScanResultsCallback results_callback;
2048
2049 device_->clear_found_networks();
2050 EXPECT_CALL(*gsm_network_proxy_, Scan(&error, _, _))
2051 .WillOnce(DoAll(SetErrorTypeInArgument<0>(Error::kOperationInitiated),
2052 SaveArg<1>(&results_callback)));
2053 EXPECT_FALSE(device_->scanning_);
2054 // |InitProxies| must be called before calling any functions on the
2055 // Capability*, to set up the modem proxies.
2056 // Warning: The test loses all references to the proxies when |InitProxies| is
2057 // called.
2058 GetCapabilityGSM()->InitProxies();
2059 device_->Scan(Device::kFullScan, &error, "");
2060 EXPECT_TRUE(error.IsOngoing());
2061 EXPECT_TRUE(device_->scanning_);
2062
2063 // Successfully complete the scan.
2064 const GSMScanResults gsm_results{};
2065 error.Populate(Error::kSuccess);
2066 results_callback.Run(kTestNetworksGSM, error);
2067 EXPECT_FALSE(device_->scanning_);
2068 EXPECT_EQ(kTestNetworksCellular, device_->found_networks());
2069 }
2070
TEST_F(CellularTest,EstablishLinkDHCP)2071 TEST_F(CellularTest, EstablishLinkDHCP) {
2072 unique_ptr<CellularBearer> bearer(
2073 new CellularBearer(&control_interface_, "", ""));
2074 bearer->set_ipv4_config_method(IPConfig::kMethodDHCP);
2075 SetCapabilityUniversalActiveBearer(std::move(bearer));
2076 device_->state_ = Cellular::kStateConnected;
2077
2078 MockCellularService* service = SetMockService();
2079 ON_CALL(*service, state()).WillByDefault(Return(Service::kStateUnknown));
2080
2081 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
2082 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
2083 EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestDeviceName, _, _, _))
2084 .WillOnce(Return(dhcp_config_));
2085 EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
2086 EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2087 device_->EstablishLink();
2088 EXPECT_EQ(service, device_->selected_service());
2089 Mock::VerifyAndClearExpectations(service); // before Cellular dtor
2090 }
2091
TEST_F(CellularTest,EstablishLinkPPP)2092 TEST_F(CellularTest, EstablishLinkPPP) {
2093 unique_ptr<CellularBearer> bearer(
2094 new CellularBearer(&control_interface_, "", ""));
2095 bearer->set_ipv4_config_method(IPConfig::kMethodPPP);
2096 SetCapabilityUniversalActiveBearer(std::move(bearer));
2097 device_->state_ = Cellular::kStateConnected;
2098
2099 const int kPID = 123;
2100 EXPECT_CALL(process_manager_, StartProcess(_, _, _, _, _, _))
2101 .WillOnce(Return(kPID));
2102 device_->EstablishLink();
2103 EXPECT_FALSE(device_->ipconfig()); // No DHCP client.
2104 EXPECT_FALSE(device_->selected_service());
2105 EXPECT_FALSE(device_->is_ppp_authenticating_);
2106 EXPECT_NE(nullptr, device_->ppp_task_);
2107 }
2108
TEST_F(CellularTest,EstablishLinkStatic)2109 TEST_F(CellularTest, EstablishLinkStatic) {
2110 IPAddress::Family kAddressFamily = IPAddress::kFamilyIPv4;
2111 const char kAddress[] = "10.0.0.1";
2112 const char kGateway[] = "10.0.0.254";
2113 const int32_t kSubnetPrefix = 16;
2114 const char* const kDNS[] = {"10.0.0.2", "8.8.4.4", "8.8.8.8"};
2115
2116 unique_ptr<IPConfig::Properties> ipconfig_properties(
2117 new IPConfig::Properties);
2118 ipconfig_properties->address_family = kAddressFamily;
2119 ipconfig_properties->address = kAddress;
2120 ipconfig_properties->gateway = kGateway;
2121 ipconfig_properties->subnet_prefix = kSubnetPrefix;
2122 ipconfig_properties->dns_servers = vector<string>{kDNS[0], kDNS[1], kDNS[2]};
2123
2124 unique_ptr<CellularBearer> bearer(
2125 new CellularBearer(&control_interface_, "", ""));
2126 bearer->set_ipv4_config_method(IPConfig::kMethodStatic);
2127 bearer->set_ipv4_config_properties(std::move(ipconfig_properties));
2128 SetCapabilityUniversalActiveBearer(std::move(bearer));
2129 device_->state_ = Cellular::kStateConnected;
2130
2131 MockCellularService* service = SetMockService();
2132 ON_CALL(*service, state()).WillByDefault(Return(Service::kStateUnknown));
2133
2134 EXPECT_CALL(device_info_, GetFlags(device_->interface_index(), _))
2135 .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
2136 EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
2137 device_->EstablishLink();
2138 EXPECT_EQ(service, device_->selected_service());
2139 ASSERT_TRUE(device_->ipconfig());
2140 EXPECT_EQ(kAddressFamily, device_->ipconfig()->properties().address_family);
2141 EXPECT_EQ(kAddress, device_->ipconfig()->properties().address);
2142 EXPECT_EQ(kGateway, device_->ipconfig()->properties().gateway);
2143 EXPECT_EQ(kSubnetPrefix, device_->ipconfig()->properties().subnet_prefix);
2144 ASSERT_EQ(3, device_->ipconfig()->properties().dns_servers.size());
2145 EXPECT_EQ(kDNS[0], device_->ipconfig()->properties().dns_servers[0]);
2146 EXPECT_EQ(kDNS[1], device_->ipconfig()->properties().dns_servers[1]);
2147 EXPECT_EQ(kDNS[2], device_->ipconfig()->properties().dns_servers[2]);
2148 Mock::VerifyAndClearExpectations(service); // before Cellular dtor
2149 }
2150
2151 } // namespace shill
2152