blob: e654e03cc5c97c4198f01d7d1e46439e96afa1dd [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_);
Miao-chen Chou70190b32014-05-14 18:24:30 -0700270 mock_home_provider_info_ =
271 new MockMobileOperatorInfo(&dispatcher_, "HomeProvider");
272 mock_serving_operator_info_ =
273 new MockMobileOperatorInfo(&dispatcher_, "ServingOperator");
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700274 cellular_->set_home_provider_info(mock_home_provider_info_);
275 cellular_->set_serving_operator_info(mock_serving_operator_info_);
Darin Petkov1272a432011-11-10 15:53:37 +0100276 }
277
Thieu Leb5954a22012-05-18 10:37:34 -0700278 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700279 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
280 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
281 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
282 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700283 }
284
285 void SetupCommonStartModemExpectations() {
286 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700287
288 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
289 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700290 EXPECT_CALL(*card_proxy_,
291 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
292 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
293 EXPECT_CALL(*card_proxy_,
294 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
295 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
296 EXPECT_CALL(*network_proxy_, AccessTechnology());
297 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
298 EXPECT_CALL(*proxy_,
299 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
300 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
301 EXPECT_CALL(*network_proxy_,
302 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
303 EXPECT_CALL(*network_proxy_,
304 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
305 EXPECT_CALL(*this, TestCallback(IsSuccess()));
306 }
307
Thieu Leb5954a22012-05-18 10:37:34 -0700308 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700309 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700310 capability_->InitProxies();
311 }
312
Ben Chan3ecdf822012-08-06 12:29:23 -0700313 void AllowCreateCardProxyFromFactory() {
314 create_card_proxy_from_factory_ = true;
315 }
316
Darin Petkovb05315f2011-11-07 10:14:25 +0100317 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700318 MockModemInfo modem_info_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700319 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700320 scoped_ptr<MockModemProxy> proxy_;
321 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100322 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100323 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700324 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100325 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700326 DeviceMockAdaptor *device_adaptor_; // Owned by |cellular_|.
Ben Chan3ecdf822012-08-06 12:29:23 -0700327 CellularRefPtr cellular_;
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700328
329 // Set when required and passed to |cellular_|. Owned by |cellular_|.
330 MockMobileOperatorInfo *mock_home_provider_info_;
331 MockMobileOperatorInfo *mock_serving_operator_info_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100332};
333
Darin Petkov31332412012-01-28 01:50:02 +0100334const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100335const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
336 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100337const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500338const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100339const char CellularCapabilityGSMTest::kPIN[] = "9876";
340const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100341const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100342const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100343const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500344const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100345
Darin Petkov721ac932011-11-16 15:43:09 +0100346TEST_F(CellularCapabilityGSMTest, PropertyStore) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700347 EXPECT_TRUE(cellular_->store().Contains(kSIMLockStatusProperty));
Darin Petkov721ac932011-11-16 15:43:09 +0100348}
349
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500350TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500351 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
352 .WillOnce(Invoke(this,
353 &CellularCapabilityGSMTest::InvokeGetIMEI));
354 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100355 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800356 ASSERT_TRUE(cellular_->imei().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500357 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
358 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800359 EXPECT_EQ(kIMEI, cellular_->imei());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500360}
361
362TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700363 SetMockMobileOperatorInfoObjects();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500364 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
365 .WillOnce(Invoke(this,
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700366 &CellularCapabilityGSMTest::InvokeGetIMSI));
367 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500368 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500369 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
370 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800371 EXPECT_TRUE(cellular_->imsi().empty());
372 EXPECT_FALSE(cellular_->sim_present());
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700373 EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kIMSI));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500374 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800375 EXPECT_EQ(kIMSI, cellular_->imsi());
376 EXPECT_TRUE(cellular_->sim_present());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500377}
378
Gary Morain82a31a02012-08-02 18:03:32 -0700379// In this test, the call to the proxy's GetIMSI() will always indicate failure,
380// which will cause the retry logic to call the proxy again a number of times.
381// Eventually, the retries expire.
382TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
383 ScopedMockLog log;
Liam McLoughlinef342b42013-09-13 21:05:36 +0100384 EXPECT_CALL(log, Log(logging::LOG_INFO,
385 ::testing::EndsWith("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700386 ::testing::StartsWith("GetIMSI failed - ")));
387 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Arman Uguray29505ec2013-09-12 20:37:53 -0700388 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 2)
Gary Morain82a31a02012-08-02 18:03:32 -0700389 .WillRepeatedly(Invoke(this,
390 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
Arman Uguray29505ec2013-09-12 20:37:53 -0700391 EXPECT_CALL(*this, TestCallback(IsFailure())).Times(2);
Gary Morain82a31a02012-08-02 18:03:32 -0700392 SetCardProxy();
393 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
394 Unretained(this));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800395 EXPECT_TRUE(cellular_->imsi().empty());
396 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700397
Arman Uguray29505ec2013-09-12 20:37:53 -0700398 capability_->sim_lock_status_.lock_type = "sim-pin";
399 capability_->GetIMSI(callback);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800400 EXPECT_TRUE(cellular_->imsi().empty());
401 EXPECT_TRUE(cellular_->sim_present());
Arman Uguray29505ec2013-09-12 20:37:53 -0700402
403 capability_->sim_lock_status_.lock_type.clear();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800404 cellular_->set_sim_present(false);
Gary Morain82a31a02012-08-02 18:03:32 -0700405 capability_->get_imsi_retries_ = 0;
406 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
407 capability_->get_imsi_retry_delay_milliseconds_);
408
409 // Set the delay to zero to speed up the test.
410 capability_->get_imsi_retry_delay_milliseconds_ = 0;
411 capability_->GetIMSI(callback);
412 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
413 dispatcher_.DispatchPendingEvents();
414 }
415 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
416 capability_->get_imsi_retries_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800417 EXPECT_TRUE(cellular_->imsi().empty());
418 EXPECT_FALSE(cellular_->sim_present());
Gary Morain82a31a02012-08-02 18:03:32 -0700419}
420
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500421TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500422 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
423 CellularCapability::kTimeoutDefault))
424 .WillOnce(Invoke(this,
425 &CellularCapabilityGSMTest::InvokeGetMSISDN));
426 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500427 SetCardProxy();
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800428 ASSERT_TRUE(cellular_->mdn().empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500429 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
430 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800431 EXPECT_EQ(kMSISDN, cellular_->mdn());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500432}
433
434TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500435 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
436 .WillOnce(Invoke(this,
437 &CellularCapabilityGSMTest::InvokeGetSPN));
438 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500439 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500440 ASSERT_TRUE(capability_->spn_.empty());
441 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
442 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500443 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100444}
Darin Petkovb05315f2011-11-07 10:14:25 +0100445
Darin Petkov3e509242011-11-10 14:46:44 +0100446TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500447 EXPECT_CALL(*network_proxy_,
448 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
449 .WillOnce(Invoke(this,
450 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100451 SetNetworkProxy();
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700452 CreateService();
Darin Petkov3e509242011-11-10 14:46:44 +0100453 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100454 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100455 EXPECT_EQ(kStrength, cellular_->service()->strength());
456}
457
Darin Petkov184c54e2011-11-15 12:44:39 +0100458TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500459 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
460 CellularCapability::kTimeoutRegister))
461 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
462 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100463 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500464 Error error;
465 capability_->RegisterOnNetwork(kTestNetwork, &error,
466 Bind(&CellularCapabilityGSMTest::TestCallback,
467 Unretained(this)));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800468 EXPECT_EQ(kTestNetwork, cellular_->selected_network());
Darin Petkov184c54e2011-11-15 12:44:39 +0100469}
470
Darin Petkovb72cf402011-11-22 14:51:39 +0100471TEST_F(CellularCapabilityGSMTest, IsRegistered) {
472 EXPECT_FALSE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
474 EXPECT_FALSE(capability_->IsRegistered());
475 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
476 EXPECT_TRUE(capability_->IsRegistered());
477 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
478 EXPECT_FALSE(capability_->IsRegistered());
479 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
480 EXPECT_FALSE(capability_->IsRegistered());
481 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
482 EXPECT_FALSE(capability_->IsRegistered());
483 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
484 EXPECT_TRUE(capability_->IsRegistered());
485}
486
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500487TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
488 ASSERT_FALSE(capability_->IsRegistered());
489 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500490 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
491 .WillOnce(Invoke(this,
492 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500493 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500494 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500495 EXPECT_TRUE(capability_->IsRegistered());
496 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
497 capability_->registration_state_);
498}
499
Darin Petkovb05315f2011-11-07 10:14:25 +0100500TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500501 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
502 CellularCapability::kTimeoutDefault))
503 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
504 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100505 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500506 Error error;
507 capability_->RequirePIN(kPIN, true, &error,
508 Bind(&CellularCapabilityGSMTest::TestCallback,
509 Unretained(this)));
510 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100511}
512
513TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500514 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
515 CellularCapability::kTimeoutDefault))
516 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
517 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100518 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500519 Error error;
520 capability_->EnterPIN(kPIN, &error,
521 Bind(&CellularCapabilityGSMTest::TestCallback,
522 Unretained(this)));
523 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100524}
525
526TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500527 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
528 CellularCapability::kTimeoutDefault))
529 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
530 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100531 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500532 Error error;
533 capability_->UnblockPIN(kPUK, kPIN, &error,
534 Bind(&CellularCapabilityGSMTest::TestCallback,
535 Unretained(this)));
536 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100537}
538
539TEST_F(CellularCapabilityGSMTest, ChangePIN) {
540 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500541 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
542 CellularCapability::kTimeoutDefault))
543 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
544 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100545 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500546 Error error;
547 capability_->ChangePIN(kOldPIN, kPIN, &error,
548 Bind(&CellularCapabilityGSMTest::TestCallback,
549 Unretained(this)));
550 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100551}
552
Darin Petkov1272a432011-11-10 15:53:37 +0100553
554TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
555 static const char kID[] = "123";
556 static const char kLongName[] = "long name";
557 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500558 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100559 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
560 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
561 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
562 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
563 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
564 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100565 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100566 EXPECT_EQ(5, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700567 EXPECT_EQ("available", parsed[kStatusProperty]);
568 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
569 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
570 EXPECT_EQ(kShortName, parsed[kShortNameProperty]);
571 EXPECT_EQ(kNetworkTechnologyEdge, parsed[kTechnologyProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100572}
573
574TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
Prathmesh Prabhuafe63662014-05-20 11:03:58 -0700575 static const char kID[] = "10001";
576 const string kLongName = "TestNetworkLongName";
577 // Replace the |MobileOperatorInfo| used by |ParseScanResult| by a mock.
578 auto *mock_mobile_operator_info = new MockMobileOperatorInfo(
579 &dispatcher_,
580 "MockParseScanResult");
581 capability_->mobile_operator_info_.reset(mock_mobile_operator_info);
582
583 mock_mobile_operator_info->SetEmptyDefaultsForProperties();
584 EXPECT_CALL(*mock_mobile_operator_info, UpdateMCCMNC(kID));
585 EXPECT_CALL(*mock_mobile_operator_info, IsMobileNetworkOperatorKnown()).
586 WillOnce(Return(true));
587 EXPECT_CALL(*mock_mobile_operator_info, operator_name()).
588 WillRepeatedly(ReturnRef(kLongName));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500589 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100590 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100591 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100592 EXPECT_EQ(2, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700593 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
Prathmesh Prabhuafe63662014-05-20 11:03:58 -0700594 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100595}
596
Darin Petkovae0c64e2011-11-15 15:50:27 +0100597TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100598 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
599 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Prathmesh Prabhu6e0a8ef2014-05-05 22:30:07 -0700600 CreateService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100601 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100602 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
603 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Ben Chan7ea768e2013-09-20 15:08:40 -0700604 EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100605}
606
Darin Petkovf508c822012-09-21 13:43:17 +0200607TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
608 EXPECT_FALSE(cellular_->allow_roaming_);
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800609 EXPECT_FALSE(cellular_->provider_requires_roaming());
Darin Petkovf508c822012-09-21 13:43:17 +0200610 EXPECT_FALSE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800611 cellular_->set_provider_requires_roaming(true);
Darin Petkovf508c822012-09-21 13:43:17 +0200612 EXPECT_TRUE(capability_->AllowRoaming());
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800613 cellular_->set_provider_requires_roaming(false);
Darin Petkovf508c822012-09-21 13:43:17 +0200614 cellular_->allow_roaming_ = true;
615 EXPECT_TRUE(capability_->AllowRoaming());
616}
617
Darin Petkov20c13ec2011-11-09 15:07:15 +0100618TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100619 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100620 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Ben Chan7ea768e2013-09-20 15:08:40 -0700621 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100622 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
Ben Chan7ea768e2013-09-20 15:08:40 -0700623 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100624 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700625 EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100626 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700627 EXPECT_EQ(kNetworkTechnologyEdge, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100628 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700629 EXPECT_EQ(kNetworkTechnologyUmts, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100630 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700631 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100632 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700633 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100634 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700635 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100636 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700637 EXPECT_EQ(kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100638 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100639}
640
641TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
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_HOME);
Ben Chan7ea768e2013-09-20 15:08:40 -0700644 EXPECT_EQ(kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100645 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700646 EXPECT_EQ(kRoamingStateRoaming, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100647 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700648 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100649 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
Ben Chan7ea768e2013-09-20 15:08:40 -0700650 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100651 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700652 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100653}
654
Gaurav Shah67808222013-03-27 13:29:36 -0700655MATCHER_P(KeyValueStoreEq, value, "") {
656 bool match = value.bool_properties() == arg.bool_properties() &&
657 value.int_properties() == arg.int_properties() &&
658 value.string_properties() == arg.string_properties() &&
659 value.uint_properties() == arg.uint_properties();
Gaurav Shah67808222013-03-27 13:29:36 -0700660 if (!match) {
661 *result_listener << "\nExpected KeyValueStore:\n"
662 << "\tbool_properties: "
663 << testing::PrintToString(value.bool_properties())
664 << "\n\tint_properties: "
665 << testing::PrintToString(value.int_properties())
666 << "\n\tstring_properties: "
667 << testing::PrintToString(value.string_properties())
668 << "\n\tint_properties: "
669 << testing::PrintToString(value.uint_properties())
670 << "\nGot KeyValueStore:\n"
671 << "\tbool_properties: "
672 << testing::PrintToString(arg.bool_properties())
673 << "\n\tint_properties: "
674 << testing::PrintToString(arg.int_properties())
675 << "\n\tstring_properties: "
676 << testing::PrintToString(arg.string_properties())
677 << "\n\tuint_properties: "
678 << testing::PrintToString(arg.uint_properties());
679 }
Gaurav Shah67808222013-03-27 13:29:36 -0700680 return match;
681}
682
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400683TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100684 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
685 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
686 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
687 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
688 DBusPropertiesMap props;
689 static const char kLockType[] = "sim-pin";
690 const int kRetries = 3;
691 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
692 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
693 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
694 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
695 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
696 kLockType);
697 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
698 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400699 // Call with the 'wrong' interface and nothing should change.
700 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
701 vector<string>());
702 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
703 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
704 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
705 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
706
Gary Morainbaeefdf2012-04-30 14:53:35 -0700707 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
708 // to the enabled state of the SIM lock.
709 KeyValueStore lock_status;
Ben Chan7ea768e2013-09-20 15:08:40 -0700710 lock_status.SetBool(kSIMLockEnabledProperty, true);
711 lock_status.SetString(kSIMLockTypeProperty, "");
712 lock_status.SetUint(kSIMLockRetriesLeftProperty, 0);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700713
714 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
Ben Chan7ea768e2013-09-20 15:08:40 -0700715 kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700716 KeyValueStoreEq(lock_status)));
717
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400718 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400719 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100720 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400721 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
722 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100723 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700724 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
725 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
726
727 // Some properties are sent on the MM_MODEM_INTERFACE.
728 capability_->sim_lock_status_.enabled = false;
729 capability_->sim_lock_status_.lock_type = "";
730 capability_->sim_lock_status_.retries_left = 0;
731 KeyValueStore lock_status2;
Ben Chan7ea768e2013-09-20 15:08:40 -0700732 lock_status2.SetBool(kSIMLockEnabledProperty, false);
733 lock_status2.SetString(kSIMLockTypeProperty, kLockType);
734 lock_status2.SetUint(kSIMLockRetriesLeftProperty, kRetries);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700735 EXPECT_CALL(*device_adaptor_,
Ben Chan7ea768e2013-09-20 15:08:40 -0700736 EmitKeyValueStoreChanged(kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700737 KeyValueStoreEq(lock_status2)));
738 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
739 vector<string>());
740 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100741 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
742 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
743}
744
Thieu Le923006b2012-04-05 16:32:58 -0700745TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
746 SetupCommonStartModemExpectations();
747 EXPECT_CALL(*card_proxy_,
748 GetSPN(_, _, CellularCapability::kTimeoutDefault))
749 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
750 EXPECT_CALL(*card_proxy_,
751 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
752 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700753 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700754
755 Error error;
756 capability_->StartModem(
757 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
758 dispatcher_.DispatchPendingEvents();
759}
760
761TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
762 SetupCommonStartModemExpectations();
763 EXPECT_CALL(*card_proxy_,
764 GetSPN(_, _, CellularCapability::kTimeoutDefault))
765 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
766 EXPECT_CALL(*card_proxy_,
767 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
768 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700769 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700770
771 Error error;
772 capability_->StartModem(
773 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
774 dispatcher_.DispatchPendingEvents();
775}
776
777TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
778 SetupCommonStartModemExpectations();
779 EXPECT_CALL(*card_proxy_,
780 GetSPN(_, _, CellularCapability::kTimeoutDefault))
781 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
782 EXPECT_CALL(*card_proxy_,
783 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
784 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -0700785 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700786
787 Error error;
788 capability_->StartModem(
789 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
790 dispatcher_.DispatchPendingEvents();
791}
792
Thieu Leb5954a22012-05-18 10:37:34 -0700793TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
794 // Make sure we don't crash if the connect failed and there is no
795 // CellularService object. This can happen if the modem is enabled and
796 // then quickly disabled.
797 SetupCommonProxiesExpectations();
798 EXPECT_CALL(*simple_proxy_,
799 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
800 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
801 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -0700802 InitProxies();
803 EXPECT_FALSE(capability_->cellular()->service());
804 Error error;
805 DBusPropertiesMap props;
806 capability_->Connect(props, &error,
807 Bind(&CellularCapabilityGSMTest::TestCallback,
808 Unretained(this)));
809}
810
Darin Petkovb05315f2011-11-07 10:14:25 +0100811} // namespace shill