blob: 3bcdd0c54927bc8f9e5b372957d3358da5a77fdc [file] [log] [blame]
Jason Glasgowef965562012-04-10 16:12:35 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_universal.h"
6
Nathan Williams4b7c2a82012-04-13 15:19:47 -04007#include <string>
8#include <vector>
9
Jason Glasgowef965562012-04-10 16:12:35 -040010#include <base/bind.h>
Darin Petkova4ca3c32012-08-17 16:05:24 +020011#include <base/stringprintf.h>
Jason Glasgowef965562012-04-10 16:12:35 -040012#include <chromeos/dbus/service_constants.h>
13#include <gtest/gtest.h>
14#include <mobile_provider.h>
Ben Chan5c853ef2012-10-05 00:05:37 -070015#include <ModemManager/ModemManager.h>
Jason Glasgowef965562012-04-10 16:12:35 -040016
17#include "shill/cellular.h"
18#include "shill/cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040019#include "shill/dbus_adaptor.h"
Jason Glasgowef965562012-04-10 16:12:35 -040020#include "shill/error.h"
21#include "shill/event_dispatcher.h"
22#include "shill/mock_adaptors.h"
Ben Chan15786032012-11-04 21:28:02 -080023#include "shill/mock_cellular_operator_info.h"
Jason Glasgow14521872012-05-07 19:12:15 -040024#include "shill/mock_cellular_service.h"
Jason Glasgowaf583282012-04-18 15:18:22 -040025#include "shill/mock_dbus_properties_proxy.h"
Jason Glasgowef965562012-04-10 16:12:35 -040026#include "shill/mock_glib.h"
27#include "shill/mock_manager.h"
28#include "shill/mock_metrics.h"
29#include "shill/mock_mm1_modem_modem3gpp_proxy.h"
30#include "shill/mock_mm1_modem_modemcdma_proxy.h"
31#include "shill/mock_mm1_modem_proxy.h"
32#include "shill/mock_mm1_modem_simple_proxy.h"
33#include "shill/mock_mm1_sim_proxy.h"
34#include "shill/mock_profile.h"
35#include "shill/mock_rtnl_handler.h"
36#include "shill/nice_mock_control.h"
37#include "shill/proxy_factory.h"
38
39using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020040using base::StringPrintf;
Jason Glasgowef965562012-04-10 16:12:35 -040041using base::Unretained;
42using std::string;
Nathan Williams4b7c2a82012-04-13 15:19:47 -040043using std::vector;
Jason Glasgowef965562012-04-10 16:12:35 -040044using testing::InSequence;
Gary Moraine285a842012-08-15 08:23:57 -070045using testing::Mock;
Jason Glasgowef965562012-04-10 16:12:35 -040046using testing::NiceMock;
47using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040048using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040049using testing::_;
50
51namespace shill {
52
53MATCHER(IsSuccess, "") {
54 return arg.IsSuccess();
55}
56MATCHER(IsFailure, "") {
57 return arg.IsFailure();
58}
Jason Glasgow14521872012-05-07 19:12:15 -040059MATCHER_P(HasApn, expected_apn, "") {
60 string apn;
61 return (DBusProperties::GetString(arg,
62 CellularCapabilityUniversal::kConnectApn,
63 &apn) &&
64 apn == expected_apn);
65}
Jason Glasgowef965562012-04-10 16:12:35 -040066
67class CellularCapabilityUniversalTest : public testing::Test {
68 public:
69 CellularCapabilityUniversalTest()
70 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Ben Chan3ecdf822012-08-06 12:29:23 -070071 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
72 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
73 modem_proxy_(new mm1::MockModemProxy()),
74 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
75 sim_proxy_(new mm1::MockSimProxy()),
76 properties_proxy_(new MockDBusPropertiesProxy()),
77 proxy_factory_(this),
78 capability_(NULL),
79 device_adaptor_(NULL),
80 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -040081 cellular_(new Cellular(&control_,
82 &dispatcher_,
83 NULL,
84 &manager_,
85 "",
86 "",
87 0,
88 Cellular::kTypeUniversal,
89 "",
90 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040091 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070092 NULL,
Ben Chan62028b22012-11-05 11:20:02 -080093 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070094 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -040095 service_(new MockCellularService(&control_,
96 &dispatcher_,
97 &metrics_,
98 &manager_,
Ben Chan3ecdf822012-08-06 12:29:23 -070099 cellular_)) {}
Jason Glasgowef965562012-04-10 16:12:35 -0400100
101 virtual ~CellularCapabilityUniversalTest() {
102 cellular_->service_ = NULL;
103 capability_ = NULL;
104 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200105 if (provider_db_) {
106 mobile_provider_close_db(provider_db_);
107 provider_db_ = NULL;
108 }
Jason Glasgowef965562012-04-10 16:12:35 -0400109 }
110
111 virtual void SetUp() {
112 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
113 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400114 device_adaptor_ =
115 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400116 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400117 }
118
119 virtual void TearDown() {
120 capability_->proxy_factory_ = NULL;
121 }
122
Darin Petkova4ca3c32012-08-17 16:05:24 +0200123 void SetService() {
124 cellular_->service_ = new CellularService(
125 &control_, &dispatcher_, &metrics_, NULL, cellular_);
126 }
127
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400128 void InitProviderDB() {
129 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
130
131 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
132 ASSERT_TRUE(provider_db_);
133 cellular_->provider_db_ = provider_db_;
134 }
135
Jason Glasgowef965562012-04-10 16:12:35 -0400136 void InvokeEnable(bool enable, Error *error,
137 const ResultCallback &callback, int timeout) {
138 callback.Run(Error());
139 }
140 void InvokeEnableFail(bool enable, Error *error,
141 const ResultCallback &callback, int timeout) {
142 callback.Run(Error(Error::kOperationFailed));
143 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400144 void InvokeRegister(const string &operator_id, Error *error,
145 const ResultCallback &callback, int timeout) {
146 callback.Run(Error());
147 }
148
Gary Morainceba6aa2012-05-03 10:28:26 -0700149 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
150 int timeout) {
151 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
152 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400153 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
154 int timeout) {
155 error->Populate(Error::kOperationFailed);
156 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700157
158 void Set3gppProxy() {
159 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
160 }
161
Jason Glasgow14521872012-05-07 19:12:15 -0400162 void SetSimpleProxy() {
163 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
164 }
165
Thieu Le3d275392012-07-20 15:32:58 -0700166 void ReleaseCapabilityProxies() {
167 capability_->ReleaseProxies();
168 }
169
Jason Glasgowef965562012-04-10 16:12:35 -0400170 MOCK_METHOD1(TestCallback, void(const Error &error));
171
172 protected:
173 static const char kImei[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400174 static const char kSimPath[];
175 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400176
177 class TestProxyFactory : public ProxyFactory {
178 public:
179 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
180 test_(test) {}
181
182 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
183 const std::string &/* path */,
184 const std::string &/* service */) {
185 return test_->modem_3gpp_proxy_.release();
186 }
187
188 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
189 const std::string &/* path */,
190 const std::string &/* service */) {
191 return test_->modem_cdma_proxy_.release();
192 }
193
194 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
195 const std::string &/* path */,
196 const std::string &/* service */) {
197 return test_->modem_proxy_.release();
198 }
199
200 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
201 const std::string &/* path */,
202 const std::string &/* service */) {
203 return test_->modem_simple_proxy_.release();
204 }
205
206 virtual mm1::SimProxyInterface *CreateSimProxy(
207 const std::string &/* path */,
208 const std::string &/* service */) {
209 return test_->sim_proxy_.release();
210 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400211 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
212 const std::string &/* path */,
213 const std::string &/* service */) {
214 return test_->properties_proxy_.release();
215 }
Jason Glasgowef965562012-04-10 16:12:35 -0400216
217 private:
218 CellularCapabilityUniversalTest *test_;
219 };
220
221 NiceMockControl control_;
222 EventDispatcher dispatcher_;
223 MockMetrics metrics_;
224 MockGLib glib_;
225 MockManager manager_;
Jason Glasgowef965562012-04-10 16:12:35 -0400226 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
227 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
228 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
229 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
230 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400231 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400232 TestProxyFactory proxy_factory_;
233 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
234 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Ben Chan15786032012-11-04 21:28:02 -0800235 MockCellularOperatorInfo cellular_operator_info_;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400236 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700237 CellularRefPtr cellular_;
238 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400239 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400240 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400241};
242
243const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Jason Glasgowaf583282012-04-18 15:18:22 -0400244const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
245const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
246 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
247 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400248
249TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400250 // Set up mock modem properties
251 DBusPropertiesMap modem_properties;
252 string operator_name = "TestOperator";
253 string operator_code = "001400";
254
255 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
256 writer().append_uint32(kAccessTechnologies);
257
258 ::DBus::Variant v;
259 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400260 ::DBus::Struct< uint32_t, bool > quality;
261 quality._1 = 90;
262 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400263 writer << quality;
264 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
265
266 // Set up mock modem 3gpp properties
267 DBusPropertiesMap modem3gpp_properties;
268 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
269 writer().append_uint32(0);
270 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
271 writer().append_string(kImei);
272
273 EXPECT_CALL(*modem_proxy_,
274 Enable(true, _, _, CellularCapability::kTimeoutEnable))
275 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
276 EXPECT_CALL(*properties_proxy_,
277 GetAll(MM_DBUS_INTERFACE_MODEM))
278 .WillOnce(Return(modem_properties));
279 EXPECT_CALL(*properties_proxy_,
280 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
281 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400282
Gary Moraine285a842012-08-15 08:23:57 -0700283 // Let the modem report that it is initializing. StartModem() should defer
284 // enabling the modem until its state changes to disabled.
285 EXPECT_CALL(*modem_proxy_, State())
286 .WillOnce(Return(Cellular::kModemStateInitializing));
287
Jason Glasgowef965562012-04-10 16:12:35 -0400288 // After setup we lose pointers to the proxies, so it is hard to set
289 // expectations.
290 SetUp();
291
292 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700293 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400294 ResultCallback callback =
295 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
296 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700297
298 // Verify that the modem has not been eabled.
299 EXPECT_TRUE(capability_->imei_.empty());
300 EXPECT_EQ(0, capability_->access_technologies_);
301 Mock::VerifyAndClearExpectations(this);
302
303 // Change the state to kModemStateDisabling and verify that it still has not
304 // been eabled.
305 EXPECT_CALL(*this, TestCallback(_)).Times(0);
306 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
307 Cellular::kModemStateDisabling, 0);
308 EXPECT_TRUE(capability_->imei_.empty());
309 EXPECT_EQ(0, capability_->access_technologies_);
310 Mock::VerifyAndClearExpectations(this);
311
312 // Change the state of the modem to disabled and verify that it gets enabled.
313 EXPECT_CALL(*this, TestCallback(IsSuccess()));
314 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
315 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400316 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400317 EXPECT_EQ(kImei, capability_->imei_);
318 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400319}
320
321TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700322 EXPECT_CALL(*modem_proxy_, State())
323 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400324 EXPECT_CALL(*modem_proxy_,
325 Enable(true, _, _, CellularCapability::kTimeoutEnable))
326 .WillOnce(
327 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
328 EXPECT_CALL(*this, TestCallback(IsFailure()));
329 ResultCallback callback =
330 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
331 SetUp();
332
333 Error error;
334 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700335 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400336}
337
Jason Glasgow02401cc2012-05-16 10:35:37 -0400338TEST_F(CellularCapabilityUniversalTest, StopModem) {
339 // Save pointers to proxies before they are lost by the call to InitProxies
340 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
341 SetUp();
342 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
343 capability_->InitProxies();
344
345 Error error;
346 ResultCallback callback =
347 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
348 capability_->StopModem(&error, callback);
349 EXPECT_TRUE(error.IsSuccess());
350
351 ResultCallback disable_callback;
352 EXPECT_CALL(*modem_proxy,
353 Enable(false, _, _, CellularCapability::kTimeoutEnable))
354 .WillOnce(SaveArg<2>(&disable_callback));
355 dispatcher_.DispatchPendingEvents();
356
357 EXPECT_CALL(*this, TestCallback(IsSuccess()));
358 disable_callback.Run(Error(Error::kSuccess));
359}
360
361TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
362 // Save pointers to proxies before they are lost by the call to InitProxies
363 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
364 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
365 SetUp();
366 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
367 capability_->InitProxies();
368
369 ResultCallback disconnect_callback;
370 Error error;
371 ResultCallback callback =
372 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
373 EXPECT_CALL(*modem_simple_proxy,
374 Disconnect(::DBus::Path("/"), _, _,
375 CellularCapability::kTimeoutDefault))
376 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700377 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400378 capability_->StopModem(&error, callback);
379 EXPECT_TRUE(error.IsSuccess());
380
381 ResultCallback disable_callback;
382 EXPECT_CALL(*modem_proxy,
383 Enable(false, _, _, CellularCapability::kTimeoutEnable))
384 .WillOnce(SaveArg<2>(&disable_callback));
385 disconnect_callback.Run(Error(Error::kSuccess));
386
387 EXPECT_CALL(*this, TestCallback(IsSuccess()));
388 disable_callback.Run(Error(Error::kSuccess));
389}
390
Thieu Le5d6864a2012-07-20 11:43:51 -0700391TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
392 Error error;
393 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700394 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le5d6864a2012-07-20 11:43:51 -0700395 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
396 .Times(0);
397 capability_->Disconnect(&error, disconnect_callback);
398}
399
Thieu Le3d275392012-07-20 15:32:58 -0700400TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
401 Error error;
402 ResultCallback disconnect_callback;
403 capability_->bearer_path_ = "/foo";
404 EXPECT_CALL(*modem_simple_proxy_,
405 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
406 .Times(0);
407 ReleaseCapabilityProxies();
408 capability_->Disconnect(&error, disconnect_callback);
409}
410
Jason Glasgowaf583282012-04-18 15:18:22 -0400411TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
412 // Set up mock modem properties
413 DBusPropertiesMap modem_properties;
414 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
415 writer().append_uint32(kAccessTechnologies);
416 modem_properties[MM_MODEM_PROPERTY_SIM].
417 writer().append_path(kSimPath);
418
419 // Set up mock modem 3gpp properties
420 DBusPropertiesMap modem3gpp_properties;
421 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
422 writer().append_uint32(0);
423 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
424 writer().append_string(kImei);
425
426 // Set up mock modem sim properties
427 DBusPropertiesMap sim_properties;
428
429 // After setup we lose pointers to the proxies, so it is hard to set
430 // expectations.
431 EXPECT_CALL(*properties_proxy_,
432 GetAll(MM_DBUS_INTERFACE_SIM))
433 .WillOnce(Return(sim_properties));
434
435 SetUp();
436
437 EXPECT_EQ("", capability_->imei_);
438 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
439 capability_->access_technologies_);
440 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400441 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
442 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400443 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
444 modem_properties, vector<string>());
445 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
446 EXPECT_EQ(kSimPath, capability_->sim_path_);
447 EXPECT_TRUE(capability_->sim_proxy_.get());
448
449 // Changing properties on wrong interface will not have an effect
450 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
451 modem3gpp_properties,
452 vector<string>());
453 EXPECT_EQ("", capability_->imei_);
454
455 // Changing properties on the right interface gets reflected in the
456 // capabilities object
457 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
458 modem3gpp_properties,
459 vector<string>());
460 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400461
462 // Expect to see changes when the family changes
463 modem_properties.clear();
464 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
465 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
466 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
467 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
468 Times(1);
469 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
470 modem_properties,
471 vector<string>());
472 // Back to LTE
473 modem_properties.clear();
474 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
475 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
476 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
477 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
478 Times(1);
479 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
480 modem_properties,
481 vector<string>());
482
483 // LTE & CDMA - the device adaptor should not be called!
484 modem_properties.clear();
485 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
486 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
487 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
488 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
489 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
490 modem_properties,
491 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400492}
493
Ben Chanbd3aee82012-10-16 23:52:04 -0700494TEST_F(CellularCapabilityUniversalTest, SimPathChanged) {
495 // Set up mock modem SIM properties
496 const char kImsi[] = "310100000001";
497 const char kSimIdentifier[] = "9999888";
498 const char kOperatorIdentifier[] = "310240";
499 const char kOperatorName[] = "Custom SPN";
500 DBusPropertiesMap sim_properties;
501 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
502 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
503 .append_string(kSimIdentifier);
504 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
505 .append_string(kOperatorIdentifier);
506 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
507 .append_string(kOperatorName);
508
509 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
510 .Times(1).WillOnce(Return(sim_properties));
511
512 EXPECT_FALSE(capability_->sim_present_);
513 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
514 EXPECT_EQ("", capability_->sim_path_);
515 EXPECT_EQ("", capability_->imsi_);
516 EXPECT_EQ("", capability_->sim_identifier_);
517 EXPECT_EQ("", capability_->operator_id_);
518 EXPECT_EQ("", capability_->spn_);
519
520 capability_->OnSimPathChanged(kSimPath);
521 EXPECT_TRUE(capability_->sim_present_);
522 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
523 EXPECT_EQ(kSimPath, capability_->sim_path_);
524 EXPECT_EQ(kImsi, capability_->imsi_);
525 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
526 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
527 EXPECT_EQ(kOperatorName, capability_->spn_);
528
529 // Changing to the same SIM path should be a no-op.
530 capability_->OnSimPathChanged(kSimPath);
531 EXPECT_TRUE(capability_->sim_present_);
532 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
533 EXPECT_EQ(kSimPath, capability_->sim_path_);
534 EXPECT_EQ(kImsi, capability_->imsi_);
535 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
536 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
537 EXPECT_EQ(kOperatorName, capability_->spn_);
538
539 capability_->OnSimPathChanged("");
540 EXPECT_FALSE(capability_->sim_present_);
541 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
542 EXPECT_EQ("", capability_->sim_path_);
543 EXPECT_EQ("", capability_->imsi_);
544 EXPECT_EQ("", capability_->sim_identifier_);
545 EXPECT_EQ("", capability_->operator_id_);
546 EXPECT_EQ("", capability_->spn_);
547}
548
Jason Glasgowaf583282012-04-18 15:18:22 -0400549TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
550 // Set up mock modem properties
551 DBusPropertiesMap modem_properties;
552 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
553
554 // Set up mock modem sim properties
555 const char kImsi[] = "310100000001";
556 DBusPropertiesMap sim_properties;
557 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
558
559 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
560 .WillOnce(Return(sim_properties));
561
562 // After setup we lose pointers to the proxies, so it is hard to set
563 // expectations.
564 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400565 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400566
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400567 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
568 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
569 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400570 EXPECT_FALSE(capability_->sim_proxy_.get());
571 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
572 modem_properties, vector<string>());
573 EXPECT_EQ(kSimPath, capability_->sim_path_);
574 EXPECT_TRUE(capability_->sim_proxy_.get());
575 EXPECT_EQ(kImsi, capability_->imsi_);
576
577 // Updating the SIM
578 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400579 const char kCountry[] = "us";
580 const char kCode[] = "310160";
581 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400582 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400583 const char kOperatorIdentifier[] = "310240";
584 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400585 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
586 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
587 append_string(kSimIdentifier);
588 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
589 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400590 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
591 new_properties,
592 vector<string>());
593 EXPECT_EQ(kNewImsi, capability_->imsi_);
594 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
595 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400596 EXPECT_EQ("", capability_->spn_);
597 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
598 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
599 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
600 EXPECT_EQ(4, capability_->apn_list_.size());
601
602 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
603 append_string(kOperatorName);
604 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
605 new_properties,
606 vector<string>());
607 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400608 EXPECT_EQ(kOperatorName, capability_->spn_);
609}
610
Gary Morainceba6aa2012-05-03 10:28:26 -0700611MATCHER_P(SizeIs, value, "") {
612 return static_cast<size_t>(value) == arg.size();
613}
614
615// Validates that OnScanReply does not crash with a null callback.
616TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
617 Error error;
618 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
619 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
620 EXPECT_CALL(*device_adaptor_,
621 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
622 SizeIs(0)));
623 Set3gppProxy();
624 capability_->Scan(&error, ResultCallback());
625 EXPECT_TRUE(error.IsSuccess());
626}
627
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400628// Validates that the scanning property is updated
629TEST_F(CellularCapabilityUniversalTest, Scan) {
630 Error error;
631
632 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
633 .WillRepeatedly(SaveArg<1>(&scan_callback_));
634 EXPECT_CALL(*device_adaptor_,
635 EmitBoolChanged(flimflam::kScanningProperty, true));
636 Set3gppProxy();
637 capability_->Scan(&error, ResultCallback());
638 EXPECT_TRUE(capability_->scanning_);
639
640 // Simulate the completion of the scan with 2 networks in the results.
641 EXPECT_CALL(*device_adaptor_,
642 EmitBoolChanged(flimflam::kScanningProperty, false));
643 EXPECT_CALL(*device_adaptor_,
644 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
645 SizeIs(2)));
646 vector<DBusPropertiesMap> results;
647 const char kScanID0[] = "testID0";
648 const char kScanID1[] = "testID1";
649 results.push_back(DBusPropertiesMap());
650 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
651 writer().append_string(kScanID0);
652 results.push_back(DBusPropertiesMap());
653 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
654 writer().append_string(kScanID1);
655 scan_callback_.Run(results, error);
656 EXPECT_FALSE(capability_->scanning_);
657
658 // Simulate the completion of the scan with no networks in the results.
659 EXPECT_CALL(*device_adaptor_,
660 EmitBoolChanged(flimflam::kScanningProperty, true));
661 capability_->Scan(&error, ResultCallback());
662 EXPECT_TRUE(capability_->scanning_);
663 EXPECT_CALL(*device_adaptor_,
664 EmitBoolChanged(flimflam::kScanningProperty, false));
665 EXPECT_CALL(*device_adaptor_,
666 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
667 SizeIs(0)));
668 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
669 EXPECT_FALSE(capability_->scanning_);
670}
671
672// Validates expected property updates when scan fails
673TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
674 Error error;
675
676 // Test immediate error
677 {
678 InSequence seq;
679 EXPECT_CALL(*modem_3gpp_proxy_,
680 Scan(_, _, CellularCapability::kTimeoutScan))
681 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
682 EXPECT_CALL(*modem_3gpp_proxy_,
683 Scan(_, _, CellularCapability::kTimeoutScan))
684 .WillOnce(SaveArg<1>(&scan_callback_));
685 }
686 Set3gppProxy();
687 capability_->Scan(&error, ResultCallback());
688 EXPECT_FALSE(capability_->scanning_);
689 EXPECT_TRUE(error.IsFailure());
690
691 // Initiate a scan
692 error.Populate(Error::kSuccess);
693 EXPECT_CALL(*device_adaptor_,
694 EmitBoolChanged(flimflam::kScanningProperty, true));
695 capability_->Scan(&error, ResultCallback());
696 EXPECT_TRUE(capability_->scanning_);
697 EXPECT_TRUE(error.IsSuccess());
698
699 // Validate that error is returned if Scan is called while already scanning.
700 capability_->Scan(&error, ResultCallback());
701 EXPECT_TRUE(capability_->scanning_);
702 EXPECT_TRUE(error.IsFailure());
703
704 // Validate that signals are emitted even if an error is reported.
705 capability_->found_networks_.clear();
706 capability_->found_networks_.push_back(Stringmap());
707 EXPECT_CALL(*device_adaptor_,
708 EmitBoolChanged(flimflam::kScanningProperty, false));
709 EXPECT_CALL(*device_adaptor_,
710 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
711 SizeIs(0)));
712 vector<DBusPropertiesMap> results;
713 scan_callback_.Run(results, Error(Error::kOperationFailed));
714 EXPECT_FALSE(capability_->scanning_);
715}
716
Jason Glasgow14521872012-05-07 19:12:15 -0400717// Validates expected behavior of Connect function
718TEST_F(CellularCapabilityUniversalTest, Connect) {
719 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
720 SetSimpleProxy();
721 Error error;
722 DBusPropertiesMap properties;
723 capability_->apn_try_list_.clear();
724 ResultCallback callback =
725 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
726 DBus::Path bearer("/foo");
727
728 // Test connect failures
729 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
730 .WillOnce(SaveArg<2>(&connect_callback_));
731 capability_->Connect(properties, &error, callback);
732 EXPECT_TRUE(error.IsSuccess());
733 EXPECT_CALL(*this, TestCallback(IsFailure()));
734 EXPECT_CALL(*service_, ClearLastGoodApn());
735 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
736
737 // Test connect success
738 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
739 .WillOnce(SaveArg<2>(&connect_callback_));
740 capability_->Connect(properties, &error, callback);
741 EXPECT_TRUE(error.IsSuccess());
742 EXPECT_CALL(*this, TestCallback(IsSuccess()));
743 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400744
745 // Test connect failures without a service. Make sure that shill
746 // does not crash if the connect failed and there is no
747 // CellularService object. This can happen if the modem is enabled
748 // and then quickly disabled.
749 cellular_->service_ = NULL;
750 EXPECT_FALSE(capability_->cellular()->service());
751 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
752 .WillOnce(SaveArg<2>(&connect_callback_));
753 capability_->Connect(properties, &error, callback);
754 EXPECT_TRUE(error.IsSuccess());
755 EXPECT_CALL(*this, TestCallback(IsFailure()));
756 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400757}
758
759// Validates Connect iterates over APNs
760TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
761 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
762 SetSimpleProxy();
763 Error error;
764 DBusPropertiesMap properties;
765 capability_->apn_try_list_.clear();
766 ResultCallback callback =
767 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
768 DBus::Path bearer("/bearer0");
769
770 const char apn_name_foo[] = "foo";
771 const char apn_name_bar[] = "bar";
772 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
773 .WillOnce(SaveArg<2>(&connect_callback_));
774 Stringmap apn1;
775 apn1[flimflam::kApnProperty] = apn_name_foo;
776 capability_->apn_try_list_.push_back(apn1);
777 Stringmap apn2;
778 apn2[flimflam::kApnProperty] = apn_name_bar;
779 capability_->apn_try_list_.push_back(apn2);
780 capability_->FillConnectPropertyMap(&properties);
781 capability_->Connect(properties, &error, callback);
782 EXPECT_TRUE(error.IsSuccess());
783
784 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
785 .WillOnce(SaveArg<2>(&connect_callback_));
786 EXPECT_CALL(*service_, ClearLastGoodApn());
787 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
788
789 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
790 EXPECT_CALL(*this, TestCallback(IsSuccess()));
791 connect_callback_.Run(bearer, Error(Error::kSuccess));
792}
793
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400794// Validates GetTypeString and AccessTechnologyToTechnologyFamily
795TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
796 const int gsm_technologies[] = {
797 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
798 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
799 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
800 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
801 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
802 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
803 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
804 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
805 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
806 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
807 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
808 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
809 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
810 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
811 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
812 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
813 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
814 };
Ben Chan62028b22012-11-05 11:20:02 -0800815 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400816 capability_->access_technologies_ = gsm_technologies[i];
817 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
818 }
819 const int cdma_technologies[] = {
820 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
821 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
822 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
823 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
824 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
825 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
826 };
Ben Chan62028b22012-11-05 11:20:02 -0800827 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400828 capability_->access_technologies_ = cdma_technologies[i];
829 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
830 }
831 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
832 ASSERT_EQ(capability_->GetTypeString(), "");
833}
834
Darin Petkovf508c822012-09-21 13:43:17 +0200835TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
836 EXPECT_FALSE(cellular_->allow_roaming_);
837 EXPECT_FALSE(capability_->provider_requires_roaming_);
838 EXPECT_FALSE(capability_->AllowRoaming());
839 capability_->provider_requires_roaming_ = true;
840 EXPECT_TRUE(capability_->AllowRoaming());
841 capability_->provider_requires_roaming_ = false;
842 cellular_->allow_roaming_ = true;
843 EXPECT_TRUE(capability_->AllowRoaming());
844}
845
Darin Petkovb4fccd22012-08-10 11:59:26 +0200846TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
847 static const char kTestCarrier[] = "The Cellular Carrier";
848 static const char kCountry[] = "us";
849 static const char kCode[] = "310160";
850 capability_->imsi_ = "310240123456789";
851
Darin Petkovf508c822012-09-21 13:43:17 +0200852 EXPECT_FALSE(capability_->home_provider_);
853 EXPECT_FALSE(capability_->provider_requires_roaming_);
854
Darin Petkovb4fccd22012-08-10 11:59:26 +0200855 capability_->SetHomeProvider(); // No mobile provider DB available.
856 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
857 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
858 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200859 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200860
861 InitProviderDB();
862 capability_->SetHomeProvider();
863 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
864 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
865 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
866 EXPECT_EQ(4, capability_->apn_list_.size());
867 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200868 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200869
870 Cellular::Operator oper;
871 cellular_->set_home_provider(oper);
872 capability_->spn_ = kTestCarrier;
873 capability_->SetHomeProvider();
874 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
875 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
876 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200877 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200878
879 static const char kCubic[] = "Cubic";
880 capability_->spn_ = kCubic;
881 capability_->SetHomeProvider();
882 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
883 EXPECT_EQ("", cellular_->home_provider().GetCode());
884 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200885 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200886
887 static const char kCUBIC[] = "CUBIC";
888 capability_->spn_ = kCUBIC;
889 capability_->home_provider_ = NULL;
890 capability_->SetHomeProvider();
891 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
892 EXPECT_EQ("", cellular_->home_provider().GetCode());
893 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200894 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200895}
896
Darin Petkova4ca3c32012-08-17 16:05:24 +0200897TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
898 static const char kOperatorName[] = "Swisscom";
899 InitProviderDB();
900 capability_->serving_operator_.SetCode("22801");
901 SetService();
902 capability_->UpdateOperatorInfo();
903 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
904 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
905 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
906
907 static const char kTestOperator[] = "Testcom";
908 capability_->serving_operator_.SetName(kTestOperator);
909 capability_->serving_operator_.SetCountry("");
910 capability_->UpdateOperatorInfo();
911 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
912 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
913 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
914}
915
916TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
917 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
918 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
919 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
920
921 capability_->serving_operator_.SetCode("1234");
922 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
923
924 static const char kHomeProvider[] = "The GSM Home Provider";
925 cellular_->home_provider_.SetName(kHomeProvider);
926 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
927 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
928 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
929
930 static const char kTestOperator[] = "A GSM Operator";
931 capability_->serving_operator_.SetName(kTestOperator);
932 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
933
934 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
935 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
936 capability_->CreateFriendlyServiceName());
937}
938
Ben Chan15786032012-11-04 21:28:02 -0800939TEST_F(CellularCapabilityUniversalTest, IsServiceActivationRequired) {
940 capability_->mdn_ = "0000000000";
941 cellular_->cellular_operator_info_ = NULL;
942 EXPECT_FALSE(capability_->IsServiceActivationRequired());
943
944 cellular_->cellular_operator_info_ = &cellular_operator_info_;
945 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
946 .WillOnce(Return(false))
947 .WillRepeatedly(Return(true));
948 EXPECT_FALSE(capability_->IsServiceActivationRequired());
949
950 capability_->mdn_ = "";
951 EXPECT_FALSE(capability_->IsServiceActivationRequired());
952 capability_->mdn_ = "1234567890";
953 EXPECT_FALSE(capability_->IsServiceActivationRequired());
954 capability_->mdn_ = "+1-234-567-890";
955 EXPECT_FALSE(capability_->IsServiceActivationRequired());
956 capability_->mdn_ = "0000000000";
957 EXPECT_TRUE(capability_->IsServiceActivationRequired());
958 capability_->mdn_ = "0-000-000-000";
959 EXPECT_TRUE(capability_->IsServiceActivationRequired());
960 capability_->mdn_ = "+0-000-000-000";
961 EXPECT_TRUE(capability_->IsServiceActivationRequired());
962}
963
Jason Glasgowef965562012-04-10 16:12:35 -0400964} // namespace shill