blob: 88da97aae826127f5f15f6e7e65065c920bdc496 [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb05315f2011-11-07 10:14:25 +01002// 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_gsm.h"
6
Jason Glasgow4c0724a2012-04-17 15:47:40 -04007#include <string>
8#include <vector>
9
Eric Shienbrood9a245532012-03-07 14:20:39 -050010#include <base/bind.h>
Ben Chana0ddf462014-02-06 11:32:42 -080011#include <base/strings/stringprintf.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010012#include <chromeos/dbus/service_constants.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010013#include <mm/mm-modem.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010014
15#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010016#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010017#include "shill/error.h"
18#include "shill/event_dispatcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010019#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070020#include "shill/mock_log.h"
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -070021#include "shill/mock_mobile_operator_info.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010022#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010023#include "shill/mock_modem_gsm_network_proxy.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070024#include "shill/mock_modem_info.h"
Thieu Le923006b2012-04-05 16:32:58 -070025#include "shill/mock_modem_proxy.h"
26#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040027#include "shill/mock_profile.h"
Thieu Le923006b2012-04-05 16:32:58 -070028#include "shill/proxy_factory.h"
Ben Chanbe277dd2014-02-05 17:26:47 -080029#include "shill/testing.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010030
Eric Shienbrood9a245532012-03-07 14:20:39 -050031using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020032using base::StringPrintf;
Eric Shienbrood9a245532012-03-07 14:20:39 -050033using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010034using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040035using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010036using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050037using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010038using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010039using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040040using testing::SaveArg;
Darin Petkovcb547732011-11-09 13:55:26 +010041
Darin Petkovb05315f2011-11-07 10:14:25 +010042namespace shill {
43
44class CellularCapabilityGSMTest : public testing::Test {
45 public:
46 CellularCapabilityGSMTest()
Ben Chanea18c6c2014-09-30 13:08:26 -070047 : modem_info_(nullptr, &dispatcher_, nullptr, nullptr, nullptr),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080048 create_card_proxy_from_factory_(false),
Ben Chan3ecdf822012-08-06 12:29:23 -070049 proxy_(new MockModemProxy()),
50 simple_proxy_(new MockModemSimpleProxy()),
51 card_proxy_(new MockModemGSMCardProxy()),
52 network_proxy_(new MockModemGSMNetworkProxy()),
53 proxy_factory_(this),
Ben Chanea18c6c2014-09-30 13:08:26 -070054 capability_(nullptr),
55 device_adaptor_(nullptr),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070056 cellular_(new Cellular(&modem_info_,
Darin Petkovb05315f2011-11-07 10:14:25 +010057 "",
Darin Petkov31332412012-01-28 01:50:02 +010058 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010059 0,
60 Cellular::kTypeGSM,
61 "",
62 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040063 "",
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -070064 &proxy_factory_)),
Ben Chanea18c6c2014-09-30 13:08:26 -070065 mock_home_provider_info_(nullptr),
66 mock_serving_operator_info_(nullptr) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070067 modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
68 Technology::kCellular);
Thieu Lece4483e2013-01-23 15:12:03 -080069 }
Darin Petkovb05315f2011-11-07 10:14:25 +010070
Darin Petkov3e509242011-11-10 14:46:44 +010071 virtual ~CellularCapabilityGSMTest() {
Ben Chanea18c6c2014-09-30 13:08:26 -070072 cellular_->service_ = nullptr;
73 capability_ = nullptr;
74 device_adaptor_ = nullptr;
Darin Petkov721ac932011-11-16 15:43:09 +010075 }
76
77 virtual void SetUp() {
78 capability_ =
79 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010080 device_adaptor_ =
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070081 dynamic_cast<DeviceMockAdaptor *>(cellular_->adaptor());
82 }
83
Thieu Le923006b2012-04-05 16:32:58 -070084 void InvokeEnable(bool enable, Error *error,
85 const ResultCallback &callback, int timeout) {
86 callback.Run(Error());
87 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050088 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
89 int timeout) {
90 callback.Run(kIMEI, Error());
91 }
92 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
93 int timeout) {
94 callback.Run(kIMSI, Error());
95 }
Gary Morain82a31a02012-08-02 18:03:32 -070096 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
97 int timeout) {
98 callback.Run("", Error(Error::kOperationFailed));
99 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500100 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
101 int timeout) {
102 callback.Run(kMSISDN, Error());
103 }
Thieu Le923006b2012-04-05 16:32:58 -0700104 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
105 int timeout) {
106 callback.Run("", Error(Error::kOperationFailed));
107 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500108 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
109 int timeout) {
110 callback.Run(kTestCarrier, Error());
111 }
Thieu Le923006b2012-04-05 16:32:58 -0700112 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
113 int timeout) {
114 callback.Run("", Error(Error::kOperationFailed));
115 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500116 void InvokeGetSignalQuality(Error *error,
117 const SignalQualityCallback &callback,
118 int timeout) {
119 callback.Run(kStrength, Error());
120 }
121 void InvokeGetRegistrationInfo(Error *error,
122 const RegistrationInfoCallback &callback,
123 int timeout) {
124 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
125 kTestNetwork, kTestCarrier, Error());
126 }
127 void InvokeRegister(const string &network_id,
128 Error *error,
129 const ResultCallback &callback,
130 int timeout) {
131 callback.Run(Error());
132 }
133 void InvokeEnablePIN(const string &pin, bool enable,
134 Error *error, const ResultCallback &callback,
135 int timeout) {
136 callback.Run(Error());
137 }
138 void InvokeSendPIN(const string &pin, Error *error,
139 const ResultCallback &callback, int timeout) {
140 callback.Run(Error());
141 }
142 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
143 const ResultCallback &callback, int timeout) {
144 callback.Run(Error());
145 }
146 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
147 const ResultCallback &callback, int timeout) {
148 callback.Run(Error());
149 }
Thieu Le923006b2012-04-05 16:32:58 -0700150 void InvokeGetModemStatus(Error *error,
151 const DBusPropertyMapCallback &callback,
152 int timeout) {
153 DBusPropertiesMap props;
154 callback.Run(props, Error());
155 }
156 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
157 int timeout) {
158 ModemHardwareInfo info;
159 callback.Run(info, Error());
160 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500161
Thieu Leb5954a22012-05-18 10:37:34 -0700162 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
163 const ResultCallback &callback, int timeout) {
164 callback.Run(Error(Error::kOperationFailed));
165 }
166
Eric Shienbrood9a245532012-03-07 14:20:39 -0500167 MOCK_METHOD1(TestCallback, void(const Error &error));
168
Darin Petkovb05315f2011-11-07 10:14:25 +0100169 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100170 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100171 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500172 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100173 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100174 static const char kPIN[];
175 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100176 static const char kIMEI[];
177 static const char kIMSI[];
178 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500179 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100180
Thieu Le923006b2012-04-05 16:32:58 -0700181 class TestProxyFactory : public ProxyFactory {
182 public:
183 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
184
185 virtual ModemProxyInterface *CreateModemProxy(
186 const string &/*path*/,
187 const string &/*service*/) {
188 return test_->proxy_.release();
189 }
190
191 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
192 const string &/*path*/,
193 const string &/*service*/) {
194 return test_->simple_proxy_.release();
195 }
196
197 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
198 const string &/*path*/,
199 const string &/*service*/) {
Ben Chanea18c6c2014-09-30 13:08:26 -0700200 // TODO(benchan): This code conditionally returns a nullptr to avoid
Ben Chan3ecdf822012-08-06 12:29:23 -0700201 // CellularCapabilityGSM::InitProperties (and thus
202 // CellularCapabilityGSM::GetIMSI) from being called during the
203 // construction. Remove this workaround after refactoring the tests.
204 return test_->create_card_proxy_from_factory_ ?
Ben Chanea18c6c2014-09-30 13:08:26 -0700205 test_->card_proxy_.release() : nullptr;
Thieu Le923006b2012-04-05 16:32:58 -0700206 }
207
208 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
209 const string &/*path*/,
210 const string &/*service*/) {
211 return test_->network_proxy_.release();
212 }
213
214 private:
215 CellularCapabilityGSMTest *test_;
216 };
217
218 void SetProxy() {
219 capability_->proxy_.reset(proxy_.release());
220 }
221
Darin Petkovcb547732011-11-09 13:55:26 +0100222 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100223 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100224 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100225
Darin Petkov1272a432011-11-10 15:53:37 +0100226 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100227 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100228 }
229
Ben Chan7fab8972014-08-10 17:14:46 -0700230 void SetAccessTechnology(uint32_t technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100231 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100232 }
233
Ben Chan7fab8972014-08-10 17:14:46 -0700234 void SetRegistrationState(uint32_t state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100235 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100236 }
237
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700238 void CreateService() {
239 // The following constants are never directly accessed by the tests.
240 const char kStorageIdentifier[] = "default_test_storage_id";
241 const char kFriendlyServiceName[] = "default_test_service_name";
242 const char kOperatorCode[] = "10010";
243 const char kOperatorName[] = "default_test_operator_name";
244 const char kOperatorCountry[] = "us";
245
246 // Simulate all the side-effects of Cellular::CreateService
247 auto service = new CellularService(&modem_info_, cellular_);
248 service->SetStorageIdentifier(kStorageIdentifier);
249 service->SetFriendlyName(kFriendlyServiceName);
250
Roshan Piusec77f592014-10-29 15:07:38 -0700251 Stringmap serving_operator;
252 serving_operator[kOperatorCodeKey] = kOperatorCode;
253 serving_operator[kOperatorNameKey] = kOperatorName;
254 serving_operator[kOperatorCountryKey] = kOperatorCountry;
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700255
Roshan Piusec77f592014-10-29 15:07:38 -0700256 service->set_serving_operator(serving_operator);
257 cellular_->set_home_provider(serving_operator);
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700258 cellular_->service_ = service;
259 }
260
261 void SetMockMobileOperatorInfoObjects() {
262 CHECK(!mock_home_provider_info_);
263 CHECK(!mock_serving_operator_info_);
Miao-chen Chou70190b32014-05-14 18:24:30 -0700264 mock_home_provider_info_ =
265 new MockMobileOperatorInfo(&dispatcher_, "HomeProvider");
266 mock_serving_operator_info_ =
267 new MockMobileOperatorInfo(&dispatcher_, "ServingOperator");
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700268 cellular_->set_home_provider_info(mock_home_provider_info_);
269 cellular_->set_serving_operator_info(mock_serving_operator_info_);
Darin Petkov1272a432011-11-10 15:53:37 +0100270 }
271
Thieu Leb5954a22012-05-18 10:37:34 -0700272 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700273 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
274 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
275 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
276 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700277 }
278
279 void SetupCommonStartModemExpectations() {
280 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700281
282 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
283 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700284 EXPECT_CALL(*card_proxy_,
285 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
286 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
287 EXPECT_CALL(*card_proxy_,
288 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
289 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
290 EXPECT_CALL(*network_proxy_, AccessTechnology());
291 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
292 EXPECT_CALL(*proxy_,
293 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
294 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
295 EXPECT_CALL(*network_proxy_,
296 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
297 EXPECT_CALL(*network_proxy_,
298 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
299 EXPECT_CALL(*this, TestCallback(IsSuccess()));
300 }
301
Thieu Leb5954a22012-05-18 10:37:34 -0700302 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700303 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700304 capability_->InitProxies();
305 }
306
Ben Chan3ecdf822012-08-06 12:29:23 -0700307 void AllowCreateCardProxyFromFactory() {
308 create_card_proxy_from_factory_ = true;
309 }
310
Darin Petkovb05315f2011-11-07 10:14:25 +0100311 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700312 MockModemInfo modem_info_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700313 bool create_card_proxy_from_factory_;
Ben Chanc20ed132014-10-16 12:25:03 -0700314 std::unique_ptr<MockModemProxy> proxy_;
315 std::unique_ptr<MockModemSimpleProxy> simple_proxy_;
316 std::unique_ptr<MockModemGSMCardProxy> card_proxy_;
317 std::unique_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700318 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100319 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700320 DeviceMockAdaptor *device_adaptor_; // Owned by |cellular_|.
Ben Chan3ecdf822012-08-06 12:29:23 -0700321 CellularRefPtr cellular_;
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700322
323 // Set when required and passed to |cellular_|. Owned by |cellular_|.
324 MockMobileOperatorInfo *mock_home_provider_info_;
325 MockMobileOperatorInfo *mock_serving_operator_info_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100326};
327
Darin Petkov31332412012-01-28 01:50:02 +0100328const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100329const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
330 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100331const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500332const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100333const char CellularCapabilityGSMTest::kPIN[] = "9876";
334const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100335const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100336const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100337const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500338const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100339
Darin Petkov721ac932011-11-16 15:43:09 +0100340TEST_F(CellularCapabilityGSMTest, PropertyStore) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700341 EXPECT_TRUE(cellular_->store().Contains(kSIMLockStatusProperty));
Darin Petkov721ac932011-11-16 15:43:09 +0100342}
343
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500344TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500345 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
346 .WillOnce(Invoke(this,
347 &CellularCapabilityGSMTest::InvokeGetIMEI));
348 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100349 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800350 ASSERT_TRUE(cellular_->imei().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500351 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
352 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800353 EXPECT_EQ(kIMEI, cellular_->imei());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500354}
355
356TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700357 SetMockMobileOperatorInfoObjects();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500358 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
359 .WillOnce(Invoke(this,
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700360 &CellularCapabilityGSMTest::InvokeGetIMSI));
361 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500362 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500363 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
364 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800365 EXPECT_TRUE(cellular_->imsi().empty());
366 EXPECT_FALSE(cellular_->sim_present());
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700367 EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500368 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800369 EXPECT_EQ(kIMSI, cellular_->imsi());
370 EXPECT_TRUE(cellular_->sim_present());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500371}
372
Gary Morain82a31a02012-08-02 18:03:32 -0700373// In this test, the call to the proxy's GetIMSI() will always indicate failure,
374// which will cause the retry logic to call the proxy again a number of times.
375// Eventually, the retries expire.
376TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
377 ScopedMockLog log;
Liam McLoughlinef342b42013-09-13 21:05:36 +0100378 EXPECT_CALL(log, Log(logging::LOG_INFO,
379 ::testing::EndsWith("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700380 ::testing::StartsWith("GetIMSI failed - ")));
381 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Arman Uguray29505ec2013-09-12 20:37:53 -0700382 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 2)
Gary Morain82a31a02012-08-02 18:03:32 -0700383 .WillRepeatedly(Invoke(this,
384 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
Arman Uguray29505ec2013-09-12 20:37:53 -0700385 EXPECT_CALL(*this, TestCallback(IsFailure())).Times(2);
Gary Morain82a31a02012-08-02 18:03:32 -0700386 SetCardProxy();
387 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
388 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800389 EXPECT_TRUE(cellular_->imsi().empty());
390 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700391
Arman Uguray29505ec2013-09-12 20:37:53 -0700392 capability_->sim_lock_status_.lock_type = "sim-pin";
393 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800394 EXPECT_TRUE(cellular_->imsi().empty());
395 EXPECT_TRUE(cellular_->sim_present());
Arman Uguray29505ec2013-09-12 20:37:53 -0700396
397 capability_->sim_lock_status_.lock_type.clear();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800398 cellular_->set_sim_present(false);
Gary Morain82a31a02012-08-02 18:03:32 -0700399 capability_->get_imsi_retries_ = 0;
400 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
401 capability_->get_imsi_retry_delay_milliseconds_);
402
403 // Set the delay to zero to speed up the test.
404 capability_->get_imsi_retry_delay_milliseconds_ = 0;
405 capability_->GetIMSI(callback);
406 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
407 dispatcher_.DispatchPendingEvents();
408 }
409 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
410 capability_->get_imsi_retries_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800411 EXPECT_TRUE(cellular_->imsi().empty());
412 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700413}
414
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500415TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500416 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
417 CellularCapability::kTimeoutDefault))
418 .WillOnce(Invoke(this,
419 &CellularCapabilityGSMTest::InvokeGetMSISDN));
420 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500421 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800422 ASSERT_TRUE(cellular_->mdn().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500423 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
424 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800425 EXPECT_EQ(kMSISDN, cellular_->mdn());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500426}
427
428TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500429 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
430 .WillOnce(Invoke(this,
431 &CellularCapabilityGSMTest::InvokeGetSPN));
432 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500433 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500434 ASSERT_TRUE(capability_->spn_.empty());
435 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
436 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500437 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100438}
Darin Petkovb05315f2011-11-07 10:14:25 +0100439
Darin Petkov3e509242011-11-10 14:46:44 +0100440TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500441 EXPECT_CALL(*network_proxy_,
442 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
443 .WillOnce(Invoke(this,
444 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100445 SetNetworkProxy();
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700446 CreateService();
Darin Petkov3e509242011-11-10 14:46:44 +0100447 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100448 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100449 EXPECT_EQ(kStrength, cellular_->service()->strength());
450}
451
Darin Petkov184c54e2011-11-15 12:44:39 +0100452TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500453 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
454 CellularCapability::kTimeoutRegister))
455 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
456 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100457 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500458 Error error;
459 capability_->RegisterOnNetwork(kTestNetwork, &error,
460 Bind(&CellularCapabilityGSMTest::TestCallback,
461 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800462 EXPECT_EQ(kTestNetwork, cellular_->selected_network());
Darin Petkov184c54e2011-11-15 12:44:39 +0100463}
464
Darin Petkovb72cf402011-11-22 14:51:39 +0100465TEST_F(CellularCapabilityGSMTest, IsRegistered) {
466 EXPECT_FALSE(capability_->IsRegistered());
467 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
468 EXPECT_FALSE(capability_->IsRegistered());
469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
470 EXPECT_TRUE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
472 EXPECT_FALSE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
474 EXPECT_FALSE(capability_->IsRegistered());
475 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
476 EXPECT_FALSE(capability_->IsRegistered());
477 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
478 EXPECT_TRUE(capability_->IsRegistered());
479}
480
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500481TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
482 ASSERT_FALSE(capability_->IsRegistered());
483 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
485 .WillOnce(Invoke(this,
486 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500487 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500488 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500489 EXPECT_TRUE(capability_->IsRegistered());
490 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
491 capability_->registration_state_);
492}
493
Darin Petkovb05315f2011-11-07 10:14:25 +0100494TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500495 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
496 CellularCapability::kTimeoutDefault))
497 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
498 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100499 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500500 Error error;
501 capability_->RequirePIN(kPIN, true, &error,
502 Bind(&CellularCapabilityGSMTest::TestCallback,
503 Unretained(this)));
504 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100505}
506
507TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500508 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
509 CellularCapability::kTimeoutDefault))
510 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
511 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100512 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500513 Error error;
514 capability_->EnterPIN(kPIN, &error,
515 Bind(&CellularCapabilityGSMTest::TestCallback,
516 Unretained(this)));
517 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100518}
519
520TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500521 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
522 CellularCapability::kTimeoutDefault))
523 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
524 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100525 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500526 Error error;
527 capability_->UnblockPIN(kPUK, kPIN, &error,
528 Bind(&CellularCapabilityGSMTest::TestCallback,
529 Unretained(this)));
530 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100531}
532
533TEST_F(CellularCapabilityGSMTest, ChangePIN) {
534 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500535 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
536 CellularCapability::kTimeoutDefault))
537 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
538 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100539 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500540 Error error;
541 capability_->ChangePIN(kOldPIN, kPIN, &error,
542 Bind(&CellularCapabilityGSMTest::TestCallback,
543 Unretained(this)));
544 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100545}
546
Darin Petkov1272a432011-11-10 15:53:37 +0100547
548TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
549 static const char kID[] = "123";
550 static const char kLongName[] = "long name";
551 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500552 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100553 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
554 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
555 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
556 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
557 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
558 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100559 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100560 EXPECT_EQ(5, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700561 EXPECT_EQ("available", parsed[kStatusProperty]);
562 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
563 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
564 EXPECT_EQ(kShortName, parsed[kShortNameProperty]);
565 EXPECT_EQ(kNetworkTechnologyEdge, parsed[kTechnologyProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100566}
567
568TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
Prathmesh Prabhuafe63662014-05-20 11:03:58 -0700569 static const char kID[] = "10001";
570 const string kLongName = "TestNetworkLongName";
571 // Replace the |MobileOperatorInfo| used by |ParseScanResult| by a mock.
572 auto *mock_mobile_operator_info = new MockMobileOperatorInfo(
573 &dispatcher_,
574 "MockParseScanResult");
575 capability_->mobile_operator_info_.reset(mock_mobile_operator_info);
576
577 mock_mobile_operator_info->SetEmptyDefaultsForProperties();
578 EXPECT_CALL(*mock_mobile_operator_info, UpdateMCCMNC(kID));
579 EXPECT_CALL(*mock_mobile_operator_info, IsMobileNetworkOperatorKnown()).
580 WillOnce(Return(true));
581 EXPECT_CALL(*mock_mobile_operator_info, operator_name()).
582 WillRepeatedly(ReturnRef(kLongName));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500583 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100584 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100585 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100586 EXPECT_EQ(2, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700587 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
Prathmesh Prabhuafe63662014-05-20 11:03:58 -0700588 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100589}
590
Darin Petkovae0c64e2011-11-15 15:50:27 +0100591TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100592 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
593 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700594 CreateService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100595 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100596 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
597 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Ben Chan7ea768e2013-09-20 15:08:40 -0700598 EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100599}
600
Darin Petkovf508c822012-09-21 13:43:17 +0200601TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
602 EXPECT_FALSE(cellular_->allow_roaming_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800603 EXPECT_FALSE(cellular_->provider_requires_roaming());
Darin Petkovf508c822012-09-21 13:43:17 +0200604 EXPECT_FALSE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800605 cellular_->set_provider_requires_roaming(true);
Darin Petkovf508c822012-09-21 13:43:17 +0200606 EXPECT_TRUE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800607 cellular_->set_provider_requires_roaming(false);
Darin Petkovf508c822012-09-21 13:43:17 +0200608 cellular_->allow_roaming_ = true;
609 EXPECT_TRUE(capability_->AllowRoaming());
610}
611
Darin Petkov20c13ec2011-11-09 15:07:15 +0100612TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100613 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100614 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Ben Chan7ea768e2013-09-20 15:08:40 -0700615 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100616 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
Ben Chan7ea768e2013-09-20 15:08:40 -0700617 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100618 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700619 EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100620 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700621 EXPECT_EQ(kNetworkTechnologyEdge, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100622 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700623 EXPECT_EQ(kNetworkTechnologyUmts, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100624 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700625 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100626 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700627 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100628 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700629 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100630 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700631 EXPECT_EQ(kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100632 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100633}
634
635TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700636 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100637 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Ben Chan7ea768e2013-09-20 15:08:40 -0700638 EXPECT_EQ(kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100639 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700640 EXPECT_EQ(kRoamingStateRoaming, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100641 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700642 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100643 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
Ben Chan7ea768e2013-09-20 15:08:40 -0700644 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100645 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700646 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100647}
648
Gaurav Shah67808222013-03-27 13:29:36 -0700649MATCHER_P(KeyValueStoreEq, value, "") {
650 bool match = value.bool_properties() == arg.bool_properties() &&
651 value.int_properties() == arg.int_properties() &&
652 value.string_properties() == arg.string_properties() &&
653 value.uint_properties() == arg.uint_properties();
Gaurav Shah67808222013-03-27 13:29:36 -0700654 if (!match) {
655 *result_listener << "\nExpected KeyValueStore:\n"
656 << "\tbool_properties: "
657 << testing::PrintToString(value.bool_properties())
658 << "\n\tint_properties: "
659 << testing::PrintToString(value.int_properties())
660 << "\n\tstring_properties: "
661 << testing::PrintToString(value.string_properties())
662 << "\n\tint_properties: "
663 << testing::PrintToString(value.uint_properties())
664 << "\nGot KeyValueStore:\n"
665 << "\tbool_properties: "
666 << testing::PrintToString(arg.bool_properties())
667 << "\n\tint_properties: "
668 << testing::PrintToString(arg.int_properties())
669 << "\n\tstring_properties: "
670 << testing::PrintToString(arg.string_properties())
671 << "\n\tuint_properties: "
672 << testing::PrintToString(arg.uint_properties());
673 }
Gaurav Shah67808222013-03-27 13:29:36 -0700674 return match;
675}
676
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400677TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100678 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
679 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
680 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
681 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
682 DBusPropertiesMap props;
683 static const char kLockType[] = "sim-pin";
684 const int kRetries = 3;
685 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
686 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
687 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
688 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
689 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
690 kLockType);
691 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
692 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400693 // Call with the 'wrong' interface and nothing should change.
694 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
695 vector<string>());
696 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
697 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
698 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
699 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
700
Gary Morainbaeefdf2012-04-30 14:53:35 -0700701 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
702 // to the enabled state of the SIM lock.
703 KeyValueStore lock_status;
Ben Chan7ea768e2013-09-20 15:08:40 -0700704 lock_status.SetBool(kSIMLockEnabledProperty, true);
705 lock_status.SetString(kSIMLockTypeProperty, "");
706 lock_status.SetUint(kSIMLockRetriesLeftProperty, 0);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700707
708 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
Ben Chan7ea768e2013-09-20 15:08:40 -0700709 kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700710 KeyValueStoreEq(lock_status)));
711
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400712 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400713 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100714 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400715 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
716 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100717 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700718 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
719 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
720
721 // Some properties are sent on the MM_MODEM_INTERFACE.
722 capability_->sim_lock_status_.enabled = false;
723 capability_->sim_lock_status_.lock_type = "";
724 capability_->sim_lock_status_.retries_left = 0;
725 KeyValueStore lock_status2;
Ben Chan7ea768e2013-09-20 15:08:40 -0700726 lock_status2.SetBool(kSIMLockEnabledProperty, false);
727 lock_status2.SetString(kSIMLockTypeProperty, kLockType);
728 lock_status2.SetUint(kSIMLockRetriesLeftProperty, kRetries);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700729 EXPECT_CALL(*device_adaptor_,
Ben Chan7ea768e2013-09-20 15:08:40 -0700730 EmitKeyValueStoreChanged(kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700731 KeyValueStoreEq(lock_status2)));
732 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
733 vector<string>());
734 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100735 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
736 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
737}
738
Thieu Le923006b2012-04-05 16:32:58 -0700739TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
740 SetupCommonStartModemExpectations();
741 EXPECT_CALL(*card_proxy_,
742 GetSPN(_, _, CellularCapability::kTimeoutDefault))
743 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
744 EXPECT_CALL(*card_proxy_,
745 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
746 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700747 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700748
749 Error error;
750 capability_->StartModem(
751 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
752 dispatcher_.DispatchPendingEvents();
753}
754
755TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
756 SetupCommonStartModemExpectations();
757 EXPECT_CALL(*card_proxy_,
758 GetSPN(_, _, CellularCapability::kTimeoutDefault))
759 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
760 EXPECT_CALL(*card_proxy_,
761 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
762 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700763 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700764
765 Error error;
766 capability_->StartModem(
767 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
768 dispatcher_.DispatchPendingEvents();
769}
770
771TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
772 SetupCommonStartModemExpectations();
773 EXPECT_CALL(*card_proxy_,
774 GetSPN(_, _, CellularCapability::kTimeoutDefault))
775 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
776 EXPECT_CALL(*card_proxy_,
777 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
778 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -0700779 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700780
781 Error error;
782 capability_->StartModem(
783 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
784 dispatcher_.DispatchPendingEvents();
785}
786
Thieu Leb5954a22012-05-18 10:37:34 -0700787TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
788 // Make sure we don't crash if the connect failed and there is no
789 // CellularService object. This can happen if the modem is enabled and
790 // then quickly disabled.
791 SetupCommonProxiesExpectations();
792 EXPECT_CALL(*simple_proxy_,
793 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
794 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
795 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -0700796 InitProxies();
797 EXPECT_FALSE(capability_->cellular()->service());
798 Error error;
799 DBusPropertiesMap props;
800 capability_->Connect(props, &error,
801 Bind(&CellularCapabilityGSMTest::TestCallback,
802 Unretained(this)));
803}
804
Darin Petkovb05315f2011-11-07 10:14:25 +0100805} // namespace shill