blob: 20ca0a3ab8278235c245cee2089f48719fe713f8 [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;
Ben Chan6d0d1e72012-11-06 21:19:28 -080045using testing::Invoke;
Gary Moraine285a842012-08-15 08:23:57 -070046using testing::Mock;
Jason Glasgowef965562012-04-10 16:12:35 -040047using testing::NiceMock;
48using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040049using testing::SaveArg;
Jason Glasgowef965562012-04-10 16:12:35 -040050using testing::_;
51
52namespace shill {
53
54MATCHER(IsSuccess, "") {
55 return arg.IsSuccess();
56}
57MATCHER(IsFailure, "") {
58 return arg.IsFailure();
59}
Jason Glasgow14521872012-05-07 19:12:15 -040060MATCHER_P(HasApn, expected_apn, "") {
61 string apn;
62 return (DBusProperties::GetString(arg,
63 CellularCapabilityUniversal::kConnectApn,
64 &apn) &&
65 apn == expected_apn);
66}
Jason Glasgowef965562012-04-10 16:12:35 -040067
Ben Chan6d0d1e72012-11-06 21:19:28 -080068class MockCellularOperatorInfoGetOLPHelper {
69 public:
70 MockCellularOperatorInfoGetOLPHelper(const CellularService::OLP &olp) {
71 olp_.CopyFrom(olp);
72 }
73
74 ~MockCellularOperatorInfoGetOLPHelper() {}
75
76 bool GetOLP(const std::string &operator_id, CellularService::OLP *olp) {
77 olp->CopyFrom(olp_);
78 return true;
79 }
80
81 private:
82 CellularService::OLP olp_;
83};
84
Jason Glasgowef965562012-04-10 16:12:35 -040085class CellularCapabilityUniversalTest : public testing::Test {
86 public:
87 CellularCapabilityUniversalTest()
88 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
Ben Chan3ecdf822012-08-06 12:29:23 -070089 modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
90 modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
91 modem_proxy_(new mm1::MockModemProxy()),
92 modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
93 sim_proxy_(new mm1::MockSimProxy()),
94 properties_proxy_(new MockDBusPropertiesProxy()),
95 proxy_factory_(this),
96 capability_(NULL),
97 device_adaptor_(NULL),
98 provider_db_(NULL),
Jason Glasgowef965562012-04-10 16:12:35 -040099 cellular_(new Cellular(&control_,
100 &dispatcher_,
101 NULL,
102 &manager_,
103 "",
104 "",
105 0,
106 Cellular::kTypeUniversal,
107 "",
108 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -0400109 "",
Ben Chan3ecdf822012-08-06 12:29:23 -0700110 NULL,
Ben Chan62028b22012-11-05 11:20:02 -0800111 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -0700112 &proxy_factory_)),
Jason Glasgow14521872012-05-07 19:12:15 -0400113 service_(new MockCellularService(&control_,
114 &dispatcher_,
115 &metrics_,
116 &manager_,
Ben Chan3ecdf822012-08-06 12:29:23 -0700117 cellular_)) {}
Jason Glasgowef965562012-04-10 16:12:35 -0400118
119 virtual ~CellularCapabilityUniversalTest() {
120 cellular_->service_ = NULL;
121 capability_ = NULL;
122 device_adaptor_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +0200123 if (provider_db_) {
124 mobile_provider_close_db(provider_db_);
125 provider_db_ = NULL;
126 }
Jason Glasgowef965562012-04-10 16:12:35 -0400127 }
128
129 virtual void SetUp() {
130 capability_ = dynamic_cast<CellularCapabilityUniversal *>(
131 cellular_->capability_.get());
Jason Glasgowef965562012-04-10 16:12:35 -0400132 device_adaptor_ =
133 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Jason Glasgow14521872012-05-07 19:12:15 -0400134 cellular_->service_ = service_;
Jason Glasgowef965562012-04-10 16:12:35 -0400135 }
136
137 virtual void TearDown() {
138 capability_->proxy_factory_ = NULL;
139 }
140
Darin Petkova4ca3c32012-08-17 16:05:24 +0200141 void SetService() {
142 cellular_->service_ = new CellularService(
143 &control_, &dispatcher_, &metrics_, NULL, cellular_);
144 }
145
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400146 void InitProviderDB() {
147 const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
148
149 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
150 ASSERT_TRUE(provider_db_);
151 cellular_->provider_db_ = provider_db_;
152 }
153
Jason Glasgowef965562012-04-10 16:12:35 -0400154 void InvokeEnable(bool enable, Error *error,
155 const ResultCallback &callback, int timeout) {
156 callback.Run(Error());
157 }
158 void InvokeEnableFail(bool enable, Error *error,
159 const ResultCallback &callback, int timeout) {
160 callback.Run(Error(Error::kOperationFailed));
161 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400162 void InvokeRegister(const string &operator_id, Error *error,
163 const ResultCallback &callback, int timeout) {
164 callback.Run(Error());
165 }
166
Gary Morainceba6aa2012-05-03 10:28:26 -0700167 void InvokeScan(Error *error, const DBusPropertyMapsCallback &callback,
168 int timeout) {
169 callback.Run(CellularCapabilityUniversal::ScanResults(), Error());
170 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400171 void ScanError(Error *error, const DBusPropertyMapsCallback &callback,
172 int timeout) {
173 error->Populate(Error::kOperationFailed);
174 }
Gary Morainceba6aa2012-05-03 10:28:26 -0700175
176 void Set3gppProxy() {
177 capability_->modem_3gpp_proxy_.reset(modem_3gpp_proxy_.release());
178 }
179
Jason Glasgow14521872012-05-07 19:12:15 -0400180 void SetSimpleProxy() {
181 capability_->modem_simple_proxy_.reset(modem_simple_proxy_.release());
182 }
183
Thieu Le3d275392012-07-20 15:32:58 -0700184 void ReleaseCapabilityProxies() {
185 capability_->ReleaseProxies();
186 }
187
Jason Glasgowef965562012-04-10 16:12:35 -0400188 MOCK_METHOD1(TestCallback, void(const Error &error));
189
190 protected:
191 static const char kImei[];
Jason Glasgowaf583282012-04-18 15:18:22 -0400192 static const char kSimPath[];
193 static const uint32 kAccessTechnologies;
Jason Glasgowef965562012-04-10 16:12:35 -0400194
195 class TestProxyFactory : public ProxyFactory {
196 public:
197 explicit TestProxyFactory(CellularCapabilityUniversalTest *test) :
198 test_(test) {}
199
200 virtual mm1::ModemModem3gppProxyInterface *CreateMM1ModemModem3gppProxy(
201 const std::string &/* path */,
202 const std::string &/* service */) {
203 return test_->modem_3gpp_proxy_.release();
204 }
205
206 virtual mm1::ModemModemCdmaProxyInterface *CreateMM1ModemModemCdmaProxy(
207 const std::string &/* path */,
208 const std::string &/* service */) {
209 return test_->modem_cdma_proxy_.release();
210 }
211
212 virtual mm1::ModemProxyInterface *CreateMM1ModemProxy(
213 const std::string &/* path */,
214 const std::string &/* service */) {
215 return test_->modem_proxy_.release();
216 }
217
218 virtual mm1::ModemSimpleProxyInterface *CreateMM1ModemSimpleProxy(
219 const std::string &/* path */,
220 const std::string &/* service */) {
221 return test_->modem_simple_proxy_.release();
222 }
223
224 virtual mm1::SimProxyInterface *CreateSimProxy(
225 const std::string &/* path */,
226 const std::string &/* service */) {
227 return test_->sim_proxy_.release();
228 }
Jason Glasgowaf583282012-04-18 15:18:22 -0400229 virtual DBusPropertiesProxyInterface *CreateDBusPropertiesProxy(
230 const std::string &/* path */,
231 const std::string &/* service */) {
232 return test_->properties_proxy_.release();
233 }
Jason Glasgowef965562012-04-10 16:12:35 -0400234
235 private:
236 CellularCapabilityUniversalTest *test_;
237 };
238
239 NiceMockControl control_;
240 EventDispatcher dispatcher_;
241 MockMetrics metrics_;
242 MockGLib glib_;
243 MockManager manager_;
Jason Glasgowef965562012-04-10 16:12:35 -0400244 scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
245 scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
246 scoped_ptr<mm1::MockModemProxy> modem_proxy_;
247 scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
248 scoped_ptr<mm1::MockSimProxy> sim_proxy_;
Jason Glasgowaf583282012-04-18 15:18:22 -0400249 scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
Jason Glasgowef965562012-04-10 16:12:35 -0400250 TestProxyFactory proxy_factory_;
251 CellularCapabilityUniversal *capability_; // Owned by |cellular_|.
252 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Ben Chan15786032012-11-04 21:28:02 -0800253 MockCellularOperatorInfo cellular_operator_info_;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400254 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700255 CellularRefPtr cellular_;
256 MockCellularService *service_; // owned by cellular_
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400257 DBusPropertyMapsCallback scan_callback_; // saved for testing scan operations
Jason Glasgow14521872012-05-07 19:12:15 -0400258 DBusPathCallback connect_callback_; // saved for testing connect operations
Jason Glasgowef965562012-04-10 16:12:35 -0400259};
260
261const char CellularCapabilityUniversalTest::kImei[] = "999911110000";
Jason Glasgowaf583282012-04-18 15:18:22 -0400262const char CellularCapabilityUniversalTest::kSimPath[] = "/foo/sim";
263const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
264 MM_MODEM_ACCESS_TECHNOLOGY_LTE |
265 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
Jason Glasgowef965562012-04-10 16:12:35 -0400266
267TEST_F(CellularCapabilityUniversalTest, StartModem) {
Jason Glasgowaf583282012-04-18 15:18:22 -0400268 // Set up mock modem properties
269 DBusPropertiesMap modem_properties;
270 string operator_name = "TestOperator";
271 string operator_code = "001400";
272
273 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
274 writer().append_uint32(kAccessTechnologies);
275
276 ::DBus::Variant v;
277 ::DBus::MessageIter writer = v.writer();
Jason Glasgowef965562012-04-10 16:12:35 -0400278 ::DBus::Struct< uint32_t, bool > quality;
279 quality._1 = 90;
280 quality._2 = true;
Jason Glasgowaf583282012-04-18 15:18:22 -0400281 writer << quality;
282 modem_properties[MM_MODEM_PROPERTY_SIGNALQUALITY] = v;
283
284 // Set up mock modem 3gpp properties
285 DBusPropertiesMap modem3gpp_properties;
286 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
287 writer().append_uint32(0);
288 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
289 writer().append_string(kImei);
290
291 EXPECT_CALL(*modem_proxy_,
292 Enable(true, _, _, CellularCapability::kTimeoutEnable))
293 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeEnable));
294 EXPECT_CALL(*properties_proxy_,
295 GetAll(MM_DBUS_INTERFACE_MODEM))
296 .WillOnce(Return(modem_properties));
297 EXPECT_CALL(*properties_proxy_,
298 GetAll(MM_DBUS_INTERFACE_MODEM_MODEM3GPP))
299 .WillOnce(Return(modem3gpp_properties));
Jason Glasgowef965562012-04-10 16:12:35 -0400300
Gary Moraine285a842012-08-15 08:23:57 -0700301 // Let the modem report that it is initializing. StartModem() should defer
302 // enabling the modem until its state changes to disabled.
303 EXPECT_CALL(*modem_proxy_, State())
304 .WillOnce(Return(Cellular::kModemStateInitializing));
305
Jason Glasgowef965562012-04-10 16:12:35 -0400306 // After setup we lose pointers to the proxies, so it is hard to set
307 // expectations.
308 SetUp();
309
310 Error error;
Gary Moraine285a842012-08-15 08:23:57 -0700311 EXPECT_CALL(*this, TestCallback(_)).Times(0);
Jason Glasgowef965562012-04-10 16:12:35 -0400312 ResultCallback callback =
313 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
314 capability_->StartModem(&error, callback);
Gary Moraine285a842012-08-15 08:23:57 -0700315
316 // Verify that the modem has not been eabled.
317 EXPECT_TRUE(capability_->imei_.empty());
318 EXPECT_EQ(0, capability_->access_technologies_);
319 Mock::VerifyAndClearExpectations(this);
320
321 // Change the state to kModemStateDisabling and verify that it still has not
322 // been eabled.
323 EXPECT_CALL(*this, TestCallback(_)).Times(0);
324 capability_->OnModemStateChangedSignal(Cellular::kModemStateInitializing,
325 Cellular::kModemStateDisabling, 0);
326 EXPECT_TRUE(capability_->imei_.empty());
327 EXPECT_EQ(0, capability_->access_technologies_);
328 Mock::VerifyAndClearExpectations(this);
329
330 // Change the state of the modem to disabled and verify that it gets enabled.
331 EXPECT_CALL(*this, TestCallback(IsSuccess()));
332 capability_->OnModemStateChangedSignal(Cellular::kModemStateDisabling,
333 Cellular::kModemStateDisabled, 0);
Jason Glasgowef965562012-04-10 16:12:35 -0400334 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowaf583282012-04-18 15:18:22 -0400335 EXPECT_EQ(kImei, capability_->imei_);
336 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
Jason Glasgowef965562012-04-10 16:12:35 -0400337}
338
339TEST_F(CellularCapabilityUniversalTest, StartModemFail) {
Gary Moraine285a842012-08-15 08:23:57 -0700340 EXPECT_CALL(*modem_proxy_, State())
341 .WillOnce(Return(Cellular::kModemStateDisabled));
Jason Glasgowef965562012-04-10 16:12:35 -0400342 EXPECT_CALL(*modem_proxy_,
343 Enable(true, _, _, CellularCapability::kTimeoutEnable))
344 .WillOnce(
345 Invoke(this, &CellularCapabilityUniversalTest::InvokeEnableFail));
346 EXPECT_CALL(*this, TestCallback(IsFailure()));
347 ResultCallback callback =
348 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
349 SetUp();
350
351 Error error;
352 capability_->StartModem(&error, callback);
Thieu Lee3b36592012-08-30 17:50:26 -0700353 EXPECT_TRUE(error.IsOngoing());
Jason Glasgowef965562012-04-10 16:12:35 -0400354}
355
Jason Glasgow02401cc2012-05-16 10:35:37 -0400356TEST_F(CellularCapabilityUniversalTest, StopModem) {
357 // Save pointers to proxies before they are lost by the call to InitProxies
358 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
359 SetUp();
360 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
361 capability_->InitProxies();
362
363 Error error;
364 ResultCallback callback =
365 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
366 capability_->StopModem(&error, callback);
367 EXPECT_TRUE(error.IsSuccess());
368
369 ResultCallback disable_callback;
370 EXPECT_CALL(*modem_proxy,
371 Enable(false, _, _, CellularCapability::kTimeoutEnable))
372 .WillOnce(SaveArg<2>(&disable_callback));
373 dispatcher_.DispatchPendingEvents();
374
375 EXPECT_CALL(*this, TestCallback(IsSuccess()));
376 disable_callback.Run(Error(Error::kSuccess));
377}
378
379TEST_F(CellularCapabilityUniversalTest, StopModemConnected) {
380 // Save pointers to proxies before they are lost by the call to InitProxies
381 mm1::MockModemProxy *modem_proxy = modem_proxy_.get();
382 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
383 SetUp();
384 EXPECT_CALL(*modem_proxy, set_state_changed_callback(_));
385 capability_->InitProxies();
386
387 ResultCallback disconnect_callback;
388 Error error;
389 ResultCallback callback =
390 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
391 EXPECT_CALL(*modem_simple_proxy,
392 Disconnect(::DBus::Path("/"), _, _,
393 CellularCapability::kTimeoutDefault))
394 .WillOnce(SaveArg<2>(&disconnect_callback));
Thieu Led0012052012-07-25 16:09:09 -0700395 capability_->cellular()->modem_state_ = Cellular::kModemStateConnected;
Jason Glasgow02401cc2012-05-16 10:35:37 -0400396 capability_->StopModem(&error, callback);
397 EXPECT_TRUE(error.IsSuccess());
398
399 ResultCallback disable_callback;
400 EXPECT_CALL(*modem_proxy,
401 Enable(false, _, _, CellularCapability::kTimeoutEnable))
402 .WillOnce(SaveArg<2>(&disable_callback));
403 disconnect_callback.Run(Error(Error::kSuccess));
404
405 EXPECT_CALL(*this, TestCallback(IsSuccess()));
406 disable_callback.Run(Error(Error::kSuccess));
407}
408
Thieu Le5d6864a2012-07-20 11:43:51 -0700409TEST_F(CellularCapabilityUniversalTest, DisconnectModemNoBearer) {
410 Error error;
411 ResultCallback disconnect_callback;
Thieu Le3d275392012-07-20 15:32:58 -0700412 EXPECT_CALL(*modem_simple_proxy_,
Thieu Le5d6864a2012-07-20 11:43:51 -0700413 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
414 .Times(0);
415 capability_->Disconnect(&error, disconnect_callback);
416}
417
Thieu Le3d275392012-07-20 15:32:58 -0700418TEST_F(CellularCapabilityUniversalTest, DisconnectNoProxy) {
419 Error error;
420 ResultCallback disconnect_callback;
421 capability_->bearer_path_ = "/foo";
422 EXPECT_CALL(*modem_simple_proxy_,
423 Disconnect(_, _, _, CellularCapability::kTimeoutDefault))
424 .Times(0);
425 ReleaseCapabilityProxies();
426 capability_->Disconnect(&error, disconnect_callback);
427}
428
Jason Glasgowaf583282012-04-18 15:18:22 -0400429TEST_F(CellularCapabilityUniversalTest, PropertiesChanged) {
430 // Set up mock modem properties
431 DBusPropertiesMap modem_properties;
432 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
433 writer().append_uint32(kAccessTechnologies);
434 modem_properties[MM_MODEM_PROPERTY_SIM].
435 writer().append_path(kSimPath);
436
437 // Set up mock modem 3gpp properties
438 DBusPropertiesMap modem3gpp_properties;
439 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS].
440 writer().append_uint32(0);
441 modem3gpp_properties[MM_MODEM_MODEM3GPP_PROPERTY_IMEI].
442 writer().append_string(kImei);
443
444 // Set up mock modem sim properties
445 DBusPropertiesMap sim_properties;
446
447 // After setup we lose pointers to the proxies, so it is hard to set
448 // expectations.
449 EXPECT_CALL(*properties_proxy_,
450 GetAll(MM_DBUS_INTERFACE_SIM))
451 .WillOnce(Return(sim_properties));
452
453 SetUp();
454
455 EXPECT_EQ("", capability_->imei_);
456 EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
457 capability_->access_technologies_);
458 EXPECT_FALSE(capability_->sim_proxy_.get());
Jason Glasgowbad114b2012-05-21 15:24:16 -0400459 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
460 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm));
Jason Glasgowaf583282012-04-18 15:18:22 -0400461 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
462 modem_properties, vector<string>());
463 EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
464 EXPECT_EQ(kSimPath, capability_->sim_path_);
465 EXPECT_TRUE(capability_->sim_proxy_.get());
466
467 // Changing properties on wrong interface will not have an effect
468 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
469 modem3gpp_properties,
470 vector<string>());
471 EXPECT_EQ("", capability_->imei_);
472
473 // Changing properties on the right interface gets reflected in the
474 // capabilities object
475 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
476 modem3gpp_properties,
477 vector<string>());
478 EXPECT_EQ(kImei, capability_->imei_);
Jason Glasgowbad114b2012-05-21 15:24:16 -0400479
480 // Expect to see changes when the family changes
481 modem_properties.clear();
482 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
483 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
484 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
485 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyCdma)).
486 Times(1);
487 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
488 modem_properties,
489 vector<string>());
490 // Back to LTE
491 modem_properties.clear();
492 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
493 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE);
494 EXPECT_CALL(*device_adaptor_, EmitStringChanged(
495 flimflam::kTechnologyFamilyProperty, flimflam::kTechnologyFamilyGsm)).
496 Times(1);
497 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
498 modem_properties,
499 vector<string>());
500
501 // LTE & CDMA - the device adaptor should not be called!
502 modem_properties.clear();
503 modem_properties[MM_MODEM_PROPERTY_ACCESSTECHNOLOGIES].
504 writer().append_uint32(MM_MODEM_ACCESS_TECHNOLOGY_LTE |
505 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT);
506 EXPECT_CALL(*device_adaptor_, EmitStringChanged(_, _)).Times(0);
507 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
508 modem_properties,
509 vector<string>());
Jason Glasgowaf583282012-04-18 15:18:22 -0400510}
511
Ben Chanbd3aee82012-10-16 23:52:04 -0700512TEST_F(CellularCapabilityUniversalTest, SimPathChanged) {
513 // Set up mock modem SIM properties
514 const char kImsi[] = "310100000001";
515 const char kSimIdentifier[] = "9999888";
516 const char kOperatorIdentifier[] = "310240";
517 const char kOperatorName[] = "Custom SPN";
518 DBusPropertiesMap sim_properties;
519 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
520 sim_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer()
521 .append_string(kSimIdentifier);
522 sim_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer()
523 .append_string(kOperatorIdentifier);
524 sim_properties[MM_SIM_PROPERTY_OPERATORNAME].writer()
525 .append_string(kOperatorName);
526
527 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
528 .Times(1).WillOnce(Return(sim_properties));
529
530 EXPECT_FALSE(capability_->sim_present_);
531 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
532 EXPECT_EQ("", capability_->sim_path_);
533 EXPECT_EQ("", capability_->imsi_);
534 EXPECT_EQ("", capability_->sim_identifier_);
535 EXPECT_EQ("", capability_->operator_id_);
536 EXPECT_EQ("", capability_->spn_);
537
538 capability_->OnSimPathChanged(kSimPath);
539 EXPECT_TRUE(capability_->sim_present_);
540 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
541 EXPECT_EQ(kSimPath, capability_->sim_path_);
542 EXPECT_EQ(kImsi, capability_->imsi_);
543 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
544 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
545 EXPECT_EQ(kOperatorName, capability_->spn_);
546
547 // Changing to the same SIM path should be a no-op.
548 capability_->OnSimPathChanged(kSimPath);
549 EXPECT_TRUE(capability_->sim_present_);
550 EXPECT_TRUE(capability_->sim_proxy_ != NULL);
551 EXPECT_EQ(kSimPath, capability_->sim_path_);
552 EXPECT_EQ(kImsi, capability_->imsi_);
553 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
554 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
555 EXPECT_EQ(kOperatorName, capability_->spn_);
556
557 capability_->OnSimPathChanged("");
558 EXPECT_FALSE(capability_->sim_present_);
559 EXPECT_TRUE(capability_->sim_proxy_ == NULL);
560 EXPECT_EQ("", capability_->sim_path_);
561 EXPECT_EQ("", capability_->imsi_);
562 EXPECT_EQ("", capability_->sim_identifier_);
563 EXPECT_EQ("", capability_->operator_id_);
564 EXPECT_EQ("", capability_->spn_);
565}
566
Jason Glasgowaf583282012-04-18 15:18:22 -0400567TEST_F(CellularCapabilityUniversalTest, SimPropertiesChanged) {
568 // Set up mock modem properties
569 DBusPropertiesMap modem_properties;
570 modem_properties[MM_MODEM_PROPERTY_SIM].writer().append_path(kSimPath);
571
572 // Set up mock modem sim properties
573 const char kImsi[] = "310100000001";
574 DBusPropertiesMap sim_properties;
575 sim_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kImsi);
576
577 EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
578 .WillOnce(Return(sim_properties));
579
580 // After setup we lose pointers to the proxies, so it is hard to set
581 // expectations.
582 SetUp();
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400583 InitProviderDB();
Jason Glasgowaf583282012-04-18 15:18:22 -0400584
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400585 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
586 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
587 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Jason Glasgowaf583282012-04-18 15:18:22 -0400588 EXPECT_FALSE(capability_->sim_proxy_.get());
589 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
590 modem_properties, vector<string>());
591 EXPECT_EQ(kSimPath, capability_->sim_path_);
592 EXPECT_TRUE(capability_->sim_proxy_.get());
593 EXPECT_EQ(kImsi, capability_->imsi_);
594
595 // Updating the SIM
596 DBusPropertiesMap new_properties;
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400597 const char kCountry[] = "us";
598 const char kCode[] = "310160";
599 const char kNewImsi[] = "310240123456789";
Jason Glasgowaf583282012-04-18 15:18:22 -0400600 const char kSimIdentifier[] = "9999888";
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400601 const char kOperatorIdentifier[] = "310240";
602 const char kOperatorName[] = "Custom SPN";
Jason Glasgowaf583282012-04-18 15:18:22 -0400603 new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
604 new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
605 append_string(kSimIdentifier);
606 new_properties[MM_SIM_PROPERTY_OPERATORIDENTIFIER].writer().
607 append_string(kOperatorIdentifier);
Jason Glasgowaf583282012-04-18 15:18:22 -0400608 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
609 new_properties,
610 vector<string>());
611 EXPECT_EQ(kNewImsi, capability_->imsi_);
612 EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
613 EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
Jason Glasgow4380f0d2012-05-03 18:05:04 -0400614 EXPECT_EQ("", capability_->spn_);
615 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
616 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
617 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
618 EXPECT_EQ(4, capability_->apn_list_.size());
619
620 new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
621 append_string(kOperatorName);
622 capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
623 new_properties,
624 vector<string>());
625 EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
Jason Glasgowaf583282012-04-18 15:18:22 -0400626 EXPECT_EQ(kOperatorName, capability_->spn_);
627}
628
Gary Morainceba6aa2012-05-03 10:28:26 -0700629MATCHER_P(SizeIs, value, "") {
630 return static_cast<size_t>(value) == arg.size();
631}
632
633// Validates that OnScanReply does not crash with a null callback.
634TEST_F(CellularCapabilityUniversalTest, ScanWithNullCallback) {
635 Error error;
636 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
637 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::InvokeScan));
638 EXPECT_CALL(*device_adaptor_,
639 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
640 SizeIs(0)));
641 Set3gppProxy();
642 capability_->Scan(&error, ResultCallback());
643 EXPECT_TRUE(error.IsSuccess());
644}
645
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400646// Validates that the scanning property is updated
647TEST_F(CellularCapabilityUniversalTest, Scan) {
648 Error error;
649
650 EXPECT_CALL(*modem_3gpp_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
651 .WillRepeatedly(SaveArg<1>(&scan_callback_));
652 EXPECT_CALL(*device_adaptor_,
653 EmitBoolChanged(flimflam::kScanningProperty, true));
654 Set3gppProxy();
655 capability_->Scan(&error, ResultCallback());
656 EXPECT_TRUE(capability_->scanning_);
657
658 // Simulate the completion of the scan with 2 networks in the results.
659 EXPECT_CALL(*device_adaptor_,
660 EmitBoolChanged(flimflam::kScanningProperty, false));
661 EXPECT_CALL(*device_adaptor_,
662 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
663 SizeIs(2)));
664 vector<DBusPropertiesMap> results;
665 const char kScanID0[] = "testID0";
666 const char kScanID1[] = "testID1";
667 results.push_back(DBusPropertiesMap());
668 results[0][CellularCapabilityUniversal::kOperatorLongProperty].
669 writer().append_string(kScanID0);
670 results.push_back(DBusPropertiesMap());
671 results[1][CellularCapabilityUniversal::kOperatorLongProperty].
672 writer().append_string(kScanID1);
673 scan_callback_.Run(results, error);
674 EXPECT_FALSE(capability_->scanning_);
675
676 // Simulate the completion of the scan with no networks in the results.
677 EXPECT_CALL(*device_adaptor_,
678 EmitBoolChanged(flimflam::kScanningProperty, true));
679 capability_->Scan(&error, ResultCallback());
680 EXPECT_TRUE(capability_->scanning_);
681 EXPECT_CALL(*device_adaptor_,
682 EmitBoolChanged(flimflam::kScanningProperty, false));
683 EXPECT_CALL(*device_adaptor_,
684 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
685 SizeIs(0)));
686 scan_callback_.Run(vector<DBusPropertiesMap>(), Error());
687 EXPECT_FALSE(capability_->scanning_);
688}
689
690// Validates expected property updates when scan fails
691TEST_F(CellularCapabilityUniversalTest, ScanFailure) {
692 Error error;
693
694 // Test immediate error
695 {
696 InSequence seq;
697 EXPECT_CALL(*modem_3gpp_proxy_,
698 Scan(_, _, CellularCapability::kTimeoutScan))
699 .WillOnce(Invoke(this, &CellularCapabilityUniversalTest::ScanError));
700 EXPECT_CALL(*modem_3gpp_proxy_,
701 Scan(_, _, CellularCapability::kTimeoutScan))
702 .WillOnce(SaveArg<1>(&scan_callback_));
703 }
704 Set3gppProxy();
705 capability_->Scan(&error, ResultCallback());
706 EXPECT_FALSE(capability_->scanning_);
707 EXPECT_TRUE(error.IsFailure());
708
709 // Initiate a scan
710 error.Populate(Error::kSuccess);
711 EXPECT_CALL(*device_adaptor_,
712 EmitBoolChanged(flimflam::kScanningProperty, true));
713 capability_->Scan(&error, ResultCallback());
714 EXPECT_TRUE(capability_->scanning_);
715 EXPECT_TRUE(error.IsSuccess());
716
717 // Validate that error is returned if Scan is called while already scanning.
718 capability_->Scan(&error, ResultCallback());
719 EXPECT_TRUE(capability_->scanning_);
720 EXPECT_TRUE(error.IsFailure());
721
722 // Validate that signals are emitted even if an error is reported.
723 capability_->found_networks_.clear();
724 capability_->found_networks_.push_back(Stringmap());
725 EXPECT_CALL(*device_adaptor_,
726 EmitBoolChanged(flimflam::kScanningProperty, false));
727 EXPECT_CALL(*device_adaptor_,
728 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
729 SizeIs(0)));
730 vector<DBusPropertiesMap> results;
731 scan_callback_.Run(results, Error(Error::kOperationFailed));
732 EXPECT_FALSE(capability_->scanning_);
733}
734
Jason Glasgow14521872012-05-07 19:12:15 -0400735// Validates expected behavior of Connect function
736TEST_F(CellularCapabilityUniversalTest, Connect) {
737 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
738 SetSimpleProxy();
739 Error error;
740 DBusPropertiesMap properties;
741 capability_->apn_try_list_.clear();
742 ResultCallback callback =
743 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
744 DBus::Path bearer("/foo");
745
746 // Test connect failures
747 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
748 .WillOnce(SaveArg<2>(&connect_callback_));
749 capability_->Connect(properties, &error, callback);
750 EXPECT_TRUE(error.IsSuccess());
751 EXPECT_CALL(*this, TestCallback(IsFailure()));
752 EXPECT_CALL(*service_, ClearLastGoodApn());
753 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
754
755 // Test connect success
756 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
757 .WillOnce(SaveArg<2>(&connect_callback_));
758 capability_->Connect(properties, &error, callback);
759 EXPECT_TRUE(error.IsSuccess());
760 EXPECT_CALL(*this, TestCallback(IsSuccess()));
761 connect_callback_.Run(bearer, Error(Error::kSuccess));
Jason Glasgow7234ec32012-05-23 16:01:21 -0400762
763 // Test connect failures without a service. Make sure that shill
764 // does not crash if the connect failed and there is no
765 // CellularService object. This can happen if the modem is enabled
766 // and then quickly disabled.
767 cellular_->service_ = NULL;
768 EXPECT_FALSE(capability_->cellular()->service());
769 EXPECT_CALL(*modem_simple_proxy, Connect(_, _, _, _))
770 .WillOnce(SaveArg<2>(&connect_callback_));
771 capability_->Connect(properties, &error, callback);
772 EXPECT_TRUE(error.IsSuccess());
773 EXPECT_CALL(*this, TestCallback(IsFailure()));
774 connect_callback_.Run(bearer, Error(Error::kOperationFailed));
Jason Glasgow14521872012-05-07 19:12:15 -0400775}
776
777// Validates Connect iterates over APNs
778TEST_F(CellularCapabilityUniversalTest, ConnectApns) {
779 mm1::MockModemSimpleProxy *modem_simple_proxy = modem_simple_proxy_.get();
780 SetSimpleProxy();
781 Error error;
782 DBusPropertiesMap properties;
783 capability_->apn_try_list_.clear();
784 ResultCallback callback =
785 Bind(&CellularCapabilityUniversalTest::TestCallback, Unretained(this));
786 DBus::Path bearer("/bearer0");
787
788 const char apn_name_foo[] = "foo";
789 const char apn_name_bar[] = "bar";
790 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_foo), _, _, _))
791 .WillOnce(SaveArg<2>(&connect_callback_));
792 Stringmap apn1;
793 apn1[flimflam::kApnProperty] = apn_name_foo;
794 capability_->apn_try_list_.push_back(apn1);
795 Stringmap apn2;
796 apn2[flimflam::kApnProperty] = apn_name_bar;
797 capability_->apn_try_list_.push_back(apn2);
798 capability_->FillConnectPropertyMap(&properties);
799 capability_->Connect(properties, &error, callback);
800 EXPECT_TRUE(error.IsSuccess());
801
802 EXPECT_CALL(*modem_simple_proxy, Connect(HasApn(apn_name_bar), _, _, _))
803 .WillOnce(SaveArg<2>(&connect_callback_));
804 EXPECT_CALL(*service_, ClearLastGoodApn());
805 connect_callback_.Run(bearer, Error(Error::kInvalidApn));
806
807 EXPECT_CALL(*service_, SetLastGoodApn(apn2));
808 EXPECT_CALL(*this, TestCallback(IsSuccess()));
809 connect_callback_.Run(bearer, Error(Error::kSuccess));
810}
811
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400812// Validates GetTypeString and AccessTechnologyToTechnologyFamily
813TEST_F(CellularCapabilityUniversalTest, GetTypeString) {
814 const int gsm_technologies[] = {
815 MM_MODEM_ACCESS_TECHNOLOGY_LTE,
816 MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS,
817 MM_MODEM_ACCESS_TECHNOLOGY_HSPA,
818 MM_MODEM_ACCESS_TECHNOLOGY_HSUPA,
819 MM_MODEM_ACCESS_TECHNOLOGY_HSDPA,
820 MM_MODEM_ACCESS_TECHNOLOGY_UMTS,
821 MM_MODEM_ACCESS_TECHNOLOGY_EDGE,
822 MM_MODEM_ACCESS_TECHNOLOGY_GPRS,
823 MM_MODEM_ACCESS_TECHNOLOGY_GSM_COMPACT,
824 MM_MODEM_ACCESS_TECHNOLOGY_GSM,
825 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
826 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
827 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
828 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
829 MM_MODEM_ACCESS_TECHNOLOGY_LTE | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
830 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
831 MM_MODEM_ACCESS_TECHNOLOGY_GSM | MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
832 };
Ben Chan62028b22012-11-05 11:20:02 -0800833 for (size_t i = 0; i < arraysize(gsm_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400834 capability_->access_technologies_ = gsm_technologies[i];
835 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyGsm);
836 }
837 const int cdma_technologies[] = {
838 MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
839 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA,
840 MM_MODEM_ACCESS_TECHNOLOGY_EVDOA | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
841 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB,
842 MM_MODEM_ACCESS_TECHNOLOGY_EVDOB | MM_MODEM_ACCESS_TECHNOLOGY_EVDO0,
843 MM_MODEM_ACCESS_TECHNOLOGY_1XRTT,
844 };
Ben Chan62028b22012-11-05 11:20:02 -0800845 for (size_t i = 0; i < arraysize(cdma_technologies); ++i) {
Jason Glasgow9f09aef2012-05-08 16:26:55 -0400846 capability_->access_technologies_ = cdma_technologies[i];
847 ASSERT_EQ(capability_->GetTypeString(), flimflam::kTechnologyFamilyCdma);
848 }
849 capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
850 ASSERT_EQ(capability_->GetTypeString(), "");
851}
852
Darin Petkovf508c822012-09-21 13:43:17 +0200853TEST_F(CellularCapabilityUniversalTest, AllowRoaming) {
854 EXPECT_FALSE(cellular_->allow_roaming_);
855 EXPECT_FALSE(capability_->provider_requires_roaming_);
856 EXPECT_FALSE(capability_->AllowRoaming());
857 capability_->provider_requires_roaming_ = true;
858 EXPECT_TRUE(capability_->AllowRoaming());
859 capability_->provider_requires_roaming_ = false;
860 cellular_->allow_roaming_ = true;
861 EXPECT_TRUE(capability_->AllowRoaming());
862}
863
Darin Petkovb4fccd22012-08-10 11:59:26 +0200864TEST_F(CellularCapabilityUniversalTest, SetHomeProvider) {
865 static const char kTestCarrier[] = "The Cellular Carrier";
866 static const char kCountry[] = "us";
867 static const char kCode[] = "310160";
868 capability_->imsi_ = "310240123456789";
869
Darin Petkovf508c822012-09-21 13:43:17 +0200870 EXPECT_FALSE(capability_->home_provider_);
871 EXPECT_FALSE(capability_->provider_requires_roaming_);
872
Darin Petkovb4fccd22012-08-10 11:59:26 +0200873 capability_->SetHomeProvider(); // No mobile provider DB available.
874 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
875 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
876 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200877 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200878
879 InitProviderDB();
880 capability_->SetHomeProvider();
881 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
882 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
883 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
884 EXPECT_EQ(4, capability_->apn_list_.size());
885 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200886 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200887
888 Cellular::Operator oper;
889 cellular_->set_home_provider(oper);
890 capability_->spn_ = kTestCarrier;
891 capability_->SetHomeProvider();
892 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
893 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
894 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200895 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200896
897 static const char kCubic[] = "Cubic";
898 capability_->spn_ = kCubic;
899 capability_->SetHomeProvider();
900 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
901 EXPECT_EQ("", cellular_->home_provider().GetCode());
902 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200903 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200904
905 static const char kCUBIC[] = "CUBIC";
906 capability_->spn_ = kCUBIC;
907 capability_->home_provider_ = NULL;
908 capability_->SetHomeProvider();
909 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
910 EXPECT_EQ("", cellular_->home_provider().GetCode());
911 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200912 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200913}
914
Ben Chan6d0d1e72012-11-06 21:19:28 -0800915TEST_F(CellularCapabilityUniversalTest, UpdateOLP) {
916 CellularService::OLP test_olp;
917 test_olp.SetURL("http://testurl");
918 test_olp.SetMethod("POST");
919 test_olp.SetPostData("esn=${esn}&imei=${imei}&imsi=${imsi}&mdn=${mdn}&"
920 "meid=${meid}&min=${min}&iccid=${iccid}");
921
922 MockCellularOperatorInfoGetOLPHelper get_olp_helper(test_olp);
923
924 capability_->esn_ = "0";
925 capability_->imei_ = "1";
926 capability_->imsi_ = "2";
927 capability_->mdn_ = "3";
928 capability_->meid_= "4";
929 capability_->min_ = "5";
930 capability_->sim_identifier_ = "6";
931 capability_->operator_id_ = "123456";
932 cellular_->cellular_operator_info_ = &cellular_operator_info_;
933
934 EXPECT_CALL(cellular_operator_info_, GetOLP(capability_->operator_id_, _))
935 .WillOnce(Invoke(&get_olp_helper,
936 &MockCellularOperatorInfoGetOLPHelper::GetOLP));
937
938 SetService();
939 capability_->UpdateOLP();
940 const CellularService::OLP &olp = cellular_->service()->olp();
941 EXPECT_EQ("http://testurl", olp.GetURL());
942 EXPECT_EQ("POST", olp.GetMethod());
943 EXPECT_EQ("esn=0&imei=1&imsi=2&mdn=3&meid=4&min=5&iccid=6",
944 olp.GetPostData());
945}
946
Darin Petkova4ca3c32012-08-17 16:05:24 +0200947TEST_F(CellularCapabilityUniversalTest, UpdateOperatorInfo) {
948 static const char kOperatorName[] = "Swisscom";
949 InitProviderDB();
950 capability_->serving_operator_.SetCode("22801");
951 SetService();
952 capability_->UpdateOperatorInfo();
953 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
954 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
955 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
956
957 static const char kTestOperator[] = "Testcom";
958 capability_->serving_operator_.SetName(kTestOperator);
959 capability_->serving_operator_.SetCountry("");
960 capability_->UpdateOperatorInfo();
961 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
962 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
963 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
964}
965
966TEST_F(CellularCapabilityUniversalTest, CreateFriendlyServiceName) {
967 CellularCapabilityUniversal::friendly_service_name_id_ = 0;
968 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
969 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
970
971 capability_->serving_operator_.SetCode("1234");
972 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
973
974 static const char kHomeProvider[] = "The GSM Home Provider";
975 cellular_->home_provider_.SetName(kHomeProvider);
976 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
977 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
978 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
979
980 static const char kTestOperator[] = "A GSM Operator";
981 capability_->serving_operator_.SetName(kTestOperator);
982 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
983
984 capability_->registration_state_ = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
985 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
986 capability_->CreateFriendlyServiceName());
987}
988
Ben Chan15786032012-11-04 21:28:02 -0800989TEST_F(CellularCapabilityUniversalTest, IsServiceActivationRequired) {
990 capability_->mdn_ = "0000000000";
991 cellular_->cellular_operator_info_ = NULL;
992 EXPECT_FALSE(capability_->IsServiceActivationRequired());
993
994 cellular_->cellular_operator_info_ = &cellular_operator_info_;
995 EXPECT_CALL(cellular_operator_info_, GetOLP(_, _))
996 .WillOnce(Return(false))
997 .WillRepeatedly(Return(true));
998 EXPECT_FALSE(capability_->IsServiceActivationRequired());
999
1000 capability_->mdn_ = "";
1001 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1002 capability_->mdn_ = "1234567890";
1003 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1004 capability_->mdn_ = "+1-234-567-890";
1005 EXPECT_FALSE(capability_->IsServiceActivationRequired());
1006 capability_->mdn_ = "0000000000";
1007 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1008 capability_->mdn_ = "0-000-000-000";
1009 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1010 capability_->mdn_ = "+0-000-000-000";
1011 EXPECT_TRUE(capability_->IsServiceActivationRequired());
1012}
1013
Jason Glasgowef965562012-04-10 16:12:35 -04001014} // namespace shill