blob: 341e4d91a9154838b96273621b0c4351801980e4 [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 Petkov1272a432011-11-10 15:53:37 +010014#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010015
16#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010017#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010018#include "shill/error.h"
19#include "shill/event_dispatcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010020#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070021#include "shill/mock_log.h"
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -070022#include "shill/mock_mobile_operator_info.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010023#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010024#include "shill/mock_modem_gsm_network_proxy.h"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070025#include "shill/mock_modem_info.h"
Thieu Le923006b2012-04-05 16:32:58 -070026#include "shill/mock_modem_proxy.h"
27#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040028#include "shill/mock_profile.h"
Thieu Le923006b2012-04-05 16:32:58 -070029#include "shill/proxy_factory.h"
Ben Chanbe277dd2014-02-05 17:26:47 -080030#include "shill/testing.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010031
Eric Shienbrood9a245532012-03-07 14:20:39 -050032using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020033using base::StringPrintf;
Eric Shienbrood9a245532012-03-07 14:20:39 -050034using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010035using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040036using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010037using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050038using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010039using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010040using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040041using testing::SaveArg;
Darin Petkovcb547732011-11-09 13:55:26 +010042
Darin Petkovb05315f2011-11-07 10:14:25 +010043namespace shill {
44
45class CellularCapabilityGSMTest : public testing::Test {
46 public:
47 CellularCapabilityGSMTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070048 : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080049 create_card_proxy_from_factory_(false),
Ben Chan3ecdf822012-08-06 12:29:23 -070050 proxy_(new MockModemProxy()),
51 simple_proxy_(new MockModemSimpleProxy()),
52 card_proxy_(new MockModemGSMCardProxy()),
53 network_proxy_(new MockModemGSMNetworkProxy()),
54 proxy_factory_(this),
55 capability_(NULL),
56 device_adaptor_(NULL),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070057 cellular_(new Cellular(&modem_info_,
Darin Petkovb05315f2011-11-07 10:14:25 +010058 "",
Darin Petkov31332412012-01-28 01:50:02 +010059 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010060 0,
61 Cellular::kTypeGSM,
62 "",
63 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040064 "",
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -070065 &proxy_factory_)),
66 mock_home_provider_info_(NULL),
67 mock_serving_operator_info_(NULL) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070068 modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
69 Technology::kCellular);
Thieu Lece4483e2013-01-23 15:12:03 -080070 }
Darin Petkovb05315f2011-11-07 10:14:25 +010071
Darin Petkov3e509242011-11-10 14:46:44 +010072 virtual ~CellularCapabilityGSMTest() {
73 cellular_->service_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010074 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010075 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010076 }
77
78 virtual void SetUp() {
79 capability_ =
80 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010081 device_adaptor_ =
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070082 dynamic_cast<DeviceMockAdaptor *>(cellular_->adaptor());
83 }
84
85 void InitProviderDB() {
86 modem_info_.SetProviderDB(kTestMobileProviderDBPath);
Darin Petkov3e509242011-11-10 14:46:44 +010087 }
88
Thieu Le923006b2012-04-05 16:32:58 -070089 void InvokeEnable(bool enable, Error *error,
90 const ResultCallback &callback, int timeout) {
91 callback.Run(Error());
92 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050093 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
94 int timeout) {
95 callback.Run(kIMEI, Error());
96 }
97 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
98 int timeout) {
99 callback.Run(kIMSI, Error());
100 }
Gary Morain82a31a02012-08-02 18:03:32 -0700101 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
102 int timeout) {
103 callback.Run("", Error(Error::kOperationFailed));
104 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500105 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
106 int timeout) {
107 callback.Run(kMSISDN, Error());
108 }
Thieu Le923006b2012-04-05 16:32:58 -0700109 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
110 int timeout) {
111 callback.Run("", Error(Error::kOperationFailed));
112 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500113 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
114 int timeout) {
115 callback.Run(kTestCarrier, Error());
116 }
Thieu Le923006b2012-04-05 16:32:58 -0700117 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
118 int timeout) {
119 callback.Run("", Error(Error::kOperationFailed));
120 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500121 void InvokeGetSignalQuality(Error *error,
122 const SignalQualityCallback &callback,
123 int timeout) {
124 callback.Run(kStrength, Error());
125 }
126 void InvokeGetRegistrationInfo(Error *error,
127 const RegistrationInfoCallback &callback,
128 int timeout) {
129 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
130 kTestNetwork, kTestCarrier, Error());
131 }
132 void InvokeRegister(const string &network_id,
133 Error *error,
134 const ResultCallback &callback,
135 int timeout) {
136 callback.Run(Error());
137 }
138 void InvokeEnablePIN(const string &pin, bool enable,
139 Error *error, const ResultCallback &callback,
140 int timeout) {
141 callback.Run(Error());
142 }
143 void InvokeSendPIN(const string &pin, Error *error,
144 const ResultCallback &callback, int timeout) {
145 callback.Run(Error());
146 }
147 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
148 const ResultCallback &callback, int timeout) {
149 callback.Run(Error());
150 }
151 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
152 const ResultCallback &callback, int timeout) {
153 callback.Run(Error());
154 }
Thieu Le923006b2012-04-05 16:32:58 -0700155 void InvokeGetModemStatus(Error *error,
156 const DBusPropertyMapCallback &callback,
157 int timeout) {
158 DBusPropertiesMap props;
159 callback.Run(props, Error());
160 }
161 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
162 int timeout) {
163 ModemHardwareInfo info;
164 callback.Run(info, Error());
165 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500166
Thieu Leb5954a22012-05-18 10:37:34 -0700167 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
168 const ResultCallback &callback, int timeout) {
169 callback.Run(Error(Error::kOperationFailed));
170 }
171
Eric Shienbrood9a245532012-03-07 14:20:39 -0500172 MOCK_METHOD1(TestCallback, void(const Error &error));
173
Darin Petkovb05315f2011-11-07 10:14:25 +0100174 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100175 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100176 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500177 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100178 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100179 static const char kPIN[];
180 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100181 static const char kIMEI[];
182 static const char kIMSI[];
183 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500184 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100185
Thieu Le923006b2012-04-05 16:32:58 -0700186 class TestProxyFactory : public ProxyFactory {
187 public:
188 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
189
190 virtual ModemProxyInterface *CreateModemProxy(
191 const string &/*path*/,
192 const string &/*service*/) {
193 return test_->proxy_.release();
194 }
195
196 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
197 const string &/*path*/,
198 const string &/*service*/) {
199 return test_->simple_proxy_.release();
200 }
201
202 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
203 const string &/*path*/,
204 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700205 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
206 // CellularCapabilityGSM::InitProperties (and thus
207 // CellularCapabilityGSM::GetIMSI) from being called during the
208 // construction. Remove this workaround after refactoring the tests.
209 return test_->create_card_proxy_from_factory_ ?
210 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700211 }
212
213 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
214 const string &/*path*/,
215 const string &/*service*/) {
216 return test_->network_proxy_.release();
217 }
218
219 private:
220 CellularCapabilityGSMTest *test_;
221 };
222
223 void SetProxy() {
224 capability_->proxy_.reset(proxy_.release());
225 }
226
Darin Petkovcb547732011-11-09 13:55:26 +0100227 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100228 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100229 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100230
Darin Petkov1272a432011-11-10 15:53:37 +0100231 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100232 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100233 }
234
Darin Petkov20c13ec2011-11-09 15:07:15 +0100235 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100236 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100237 }
238
239 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100240 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100241 }
242
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700243 void CreateService() {
244 // The following constants are never directly accessed by the tests.
245 const char kStorageIdentifier[] = "default_test_storage_id";
246 const char kFriendlyServiceName[] = "default_test_service_name";
247 const char kOperatorCode[] = "10010";
248 const char kOperatorName[] = "default_test_operator_name";
249 const char kOperatorCountry[] = "us";
250
251 // Simulate all the side-effects of Cellular::CreateService
252 auto service = new CellularService(&modem_info_, cellular_);
253 service->SetStorageIdentifier(kStorageIdentifier);
254 service->SetFriendlyName(kFriendlyServiceName);
255
256 Cellular::Operator oper;
257 oper.SetCode(kOperatorCode);
258 oper.SetName(kOperatorName);
259 oper.SetCountry(kOperatorCountry);
260
261 service->SetServingOperator(oper);
262
263 cellular_->set_home_provider(oper);
264 cellular_->service_ = service;
265 }
266
267 void SetMockMobileOperatorInfoObjects() {
268 CHECK(!mock_home_provider_info_);
269 CHECK(!mock_serving_operator_info_);
270 mock_home_provider_info_ = new MockMobileOperatorInfo(&dispatcher_);
271 mock_serving_operator_info_ = new MockMobileOperatorInfo(&dispatcher_);
272 cellular_->set_home_provider_info(mock_home_provider_info_);
273 cellular_->set_serving_operator_info(mock_serving_operator_info_);
Darin Petkov1272a432011-11-10 15:53:37 +0100274 }
275
Thieu Leb5954a22012-05-18 10:37:34 -0700276 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700277 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
278 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
279 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
280 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700281 }
282
283 void SetupCommonStartModemExpectations() {
284 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700285
286 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
287 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700288 EXPECT_CALL(*card_proxy_,
289 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
290 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
291 EXPECT_CALL(*card_proxy_,
292 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
293 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
294 EXPECT_CALL(*network_proxy_, AccessTechnology());
295 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
296 EXPECT_CALL(*proxy_,
297 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
298 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
299 EXPECT_CALL(*network_proxy_,
300 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
301 EXPECT_CALL(*network_proxy_,
302 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
303 EXPECT_CALL(*this, TestCallback(IsSuccess()));
304 }
305
Thieu Leb5954a22012-05-18 10:37:34 -0700306 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700307 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700308 capability_->InitProxies();
309 }
310
Ben Chan3ecdf822012-08-06 12:29:23 -0700311 void AllowCreateCardProxyFromFactory() {
312 create_card_proxy_from_factory_ = true;
313 }
314
Darin Petkovb05315f2011-11-07 10:14:25 +0100315 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700316 MockModemInfo modem_info_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700317 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700318 scoped_ptr<MockModemProxy> proxy_;
319 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100320 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100321 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700322 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100323 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700324 DeviceMockAdaptor *device_adaptor_; // Owned by |cellular_|.
Ben Chan3ecdf822012-08-06 12:29:23 -0700325 CellularRefPtr cellular_;
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700326
327 // Set when required and passed to |cellular_|. Owned by |cellular_|.
328 MockMobileOperatorInfo *mock_home_provider_info_;
329 MockMobileOperatorInfo *mock_serving_operator_info_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100330};
331
Darin Petkov31332412012-01-28 01:50:02 +0100332const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100333const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
334 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100335const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500336const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100337const char CellularCapabilityGSMTest::kPIN[] = "9876";
338const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100339const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100340const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100341const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500342const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100343
Darin Petkov721ac932011-11-16 15:43:09 +0100344TEST_F(CellularCapabilityGSMTest, PropertyStore) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700345 EXPECT_TRUE(cellular_->store().Contains(kSIMLockStatusProperty));
Darin Petkov721ac932011-11-16 15:43:09 +0100346}
347
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500348TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500349 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
350 .WillOnce(Invoke(this,
351 &CellularCapabilityGSMTest::InvokeGetIMEI));
352 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100353 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800354 ASSERT_TRUE(cellular_->imei().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500355 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
356 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800357 EXPECT_EQ(kIMEI, cellular_->imei());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500358}
359
360TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700361 SetMockMobileOperatorInfoObjects();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500362 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
363 .WillOnce(Invoke(this,
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700364 &CellularCapabilityGSMTest::InvokeGetIMSI));
365 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500366 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500367 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
368 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800369 EXPECT_TRUE(cellular_->imsi().empty());
370 EXPECT_FALSE(cellular_->sim_present());
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700371 EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500372 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800373 EXPECT_EQ(kIMSI, cellular_->imsi());
374 EXPECT_TRUE(cellular_->sim_present());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500375}
376
Gary Morain82a31a02012-08-02 18:03:32 -0700377// In this test, the call to the proxy's GetIMSI() will always indicate failure,
378// which will cause the retry logic to call the proxy again a number of times.
379// Eventually, the retries expire.
380TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
381 ScopedMockLog log;
Liam McLoughlinef342b42013-09-13 21:05:36 +0100382 EXPECT_CALL(log, Log(logging::LOG_INFO,
383 ::testing::EndsWith("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700384 ::testing::StartsWith("GetIMSI failed - ")));
385 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Arman Uguray29505ec2013-09-12 20:37:53 -0700386 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 2)
Gary Morain82a31a02012-08-02 18:03:32 -0700387 .WillRepeatedly(Invoke(this,
388 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
Arman Uguray29505ec2013-09-12 20:37:53 -0700389 EXPECT_CALL(*this, TestCallback(IsFailure())).Times(2);
Gary Morain82a31a02012-08-02 18:03:32 -0700390 SetCardProxy();
391 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
392 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800393 EXPECT_TRUE(cellular_->imsi().empty());
394 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700395
Arman Uguray29505ec2013-09-12 20:37:53 -0700396 capability_->sim_lock_status_.lock_type = "sim-pin";
397 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800398 EXPECT_TRUE(cellular_->imsi().empty());
399 EXPECT_TRUE(cellular_->sim_present());
Arman Uguray29505ec2013-09-12 20:37:53 -0700400
401 capability_->sim_lock_status_.lock_type.clear();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800402 cellular_->set_sim_present(false);
Gary Morain82a31a02012-08-02 18:03:32 -0700403 capability_->get_imsi_retries_ = 0;
404 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
405 capability_->get_imsi_retry_delay_milliseconds_);
406
407 // Set the delay to zero to speed up the test.
408 capability_->get_imsi_retry_delay_milliseconds_ = 0;
409 capability_->GetIMSI(callback);
410 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
411 dispatcher_.DispatchPendingEvents();
412 }
413 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
414 capability_->get_imsi_retries_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800415 EXPECT_TRUE(cellular_->imsi().empty());
416 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700417}
418
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500419TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500420 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
421 CellularCapability::kTimeoutDefault))
422 .WillOnce(Invoke(this,
423 &CellularCapabilityGSMTest::InvokeGetMSISDN));
424 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500425 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800426 ASSERT_TRUE(cellular_->mdn().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500427 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
428 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800429 EXPECT_EQ(kMSISDN, cellular_->mdn());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500430}
431
432TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500433 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
434 .WillOnce(Invoke(this,
435 &CellularCapabilityGSMTest::InvokeGetSPN));
436 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500437 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500438 ASSERT_TRUE(capability_->spn_.empty());
439 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
440 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500441 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100442}
Darin Petkovb05315f2011-11-07 10:14:25 +0100443
Darin Petkov3e509242011-11-10 14:46:44 +0100444TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500445 EXPECT_CALL(*network_proxy_,
446 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
447 .WillOnce(Invoke(this,
448 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100449 SetNetworkProxy();
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700450 CreateService();
Darin Petkov3e509242011-11-10 14:46:44 +0100451 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100452 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100453 EXPECT_EQ(kStrength, cellular_->service()->strength());
454}
455
Darin Petkov184c54e2011-11-15 12:44:39 +0100456TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500457 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
458 CellularCapability::kTimeoutRegister))
459 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
460 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100461 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500462 Error error;
463 capability_->RegisterOnNetwork(kTestNetwork, &error,
464 Bind(&CellularCapabilityGSMTest::TestCallback,
465 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800466 EXPECT_EQ(kTestNetwork, cellular_->selected_network());
Darin Petkov184c54e2011-11-15 12:44:39 +0100467}
468
Darin Petkovb72cf402011-11-22 14:51:39 +0100469TEST_F(CellularCapabilityGSMTest, IsRegistered) {
470 EXPECT_FALSE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
472 EXPECT_FALSE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
474 EXPECT_TRUE(capability_->IsRegistered());
475 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
476 EXPECT_FALSE(capability_->IsRegistered());
477 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
478 EXPECT_FALSE(capability_->IsRegistered());
479 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
480 EXPECT_FALSE(capability_->IsRegistered());
481 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
482 EXPECT_TRUE(capability_->IsRegistered());
483}
484
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
486 ASSERT_FALSE(capability_->IsRegistered());
487 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500488 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
489 .WillOnce(Invoke(this,
490 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500491 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500492 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500493 EXPECT_TRUE(capability_->IsRegistered());
494 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
495 capability_->registration_state_);
496}
497
Darin Petkovb05315f2011-11-07 10:14:25 +0100498TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500499 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
500 CellularCapability::kTimeoutDefault))
501 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
502 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100503 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500504 Error error;
505 capability_->RequirePIN(kPIN, true, &error,
506 Bind(&CellularCapabilityGSMTest::TestCallback,
507 Unretained(this)));
508 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100509}
510
511TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500512 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
513 CellularCapability::kTimeoutDefault))
514 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
515 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100516 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500517 Error error;
518 capability_->EnterPIN(kPIN, &error,
519 Bind(&CellularCapabilityGSMTest::TestCallback,
520 Unretained(this)));
521 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100522}
523
524TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500525 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
526 CellularCapability::kTimeoutDefault))
527 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
528 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100529 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500530 Error error;
531 capability_->UnblockPIN(kPUK, kPIN, &error,
532 Bind(&CellularCapabilityGSMTest::TestCallback,
533 Unretained(this)));
534 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100535}
536
537TEST_F(CellularCapabilityGSMTest, ChangePIN) {
538 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500539 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
540 CellularCapability::kTimeoutDefault))
541 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
542 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100543 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500544 Error error;
545 capability_->ChangePIN(kOldPIN, kPIN, &error,
546 Bind(&CellularCapabilityGSMTest::TestCallback,
547 Unretained(this)));
548 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100549}
550
Darin Petkov1272a432011-11-10 15:53:37 +0100551
552TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
553 static const char kID[] = "123";
554 static const char kLongName[] = "long name";
555 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500556 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100557 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
558 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
559 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
560 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
561 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
562 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100563 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100564 EXPECT_EQ(5, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700565 EXPECT_EQ("available", parsed[kStatusProperty]);
566 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
567 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
568 EXPECT_EQ(kShortName, parsed[kShortNameProperty]);
569 EXPECT_EQ(kNetworkTechnologyEdge, parsed[kTechnologyProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100570}
571
572TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
573 InitProviderDB();
574 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500575 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100576 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100577 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100578 EXPECT_EQ(2, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700579 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
580 EXPECT_EQ("T-Mobile", parsed[kLongNameProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100581}
582
Darin Petkovae0c64e2011-11-15 15:50:27 +0100583TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100584 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
585 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700586 CreateService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100587 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100588 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
589 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Ben Chan7ea768e2013-09-20 15:08:40 -0700590 EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100591}
592
Darin Petkovf508c822012-09-21 13:43:17 +0200593TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
594 EXPECT_FALSE(cellular_->allow_roaming_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800595 EXPECT_FALSE(cellular_->provider_requires_roaming());
Darin Petkovf508c822012-09-21 13:43:17 +0200596 EXPECT_FALSE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800597 cellular_->set_provider_requires_roaming(true);
Darin Petkovf508c822012-09-21 13:43:17 +0200598 EXPECT_TRUE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800599 cellular_->set_provider_requires_roaming(false);
Darin Petkovf508c822012-09-21 13:43:17 +0200600 cellular_->allow_roaming_ = true;
601 EXPECT_TRUE(capability_->AllowRoaming());
602}
603
Darin Petkov3cfbf212011-11-21 16:02:09 +0100604namespace {
605
606MATCHER(SizeIs4, "") {
607 return arg.size() == 4;
608}
609
610} // namespace
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