blob: d8f6daebbfc86cd9560318d8d5db00369aaf1576 [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>
Darin Petkov20c13ec2011-11-09 15:07:15 +010011#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010012#include <gtest/gtest.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"
Gary Morainbaeefdf2012-04-30 14:53:35 -070020#include "shill/key_value_store_matcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010021#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070022#include "shill/mock_log.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080023#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010024#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010025#include "shill/mock_modem_gsm_network_proxy.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"
Darin Petkovb05315f2011-11-07 10:14:25 +010029#include "shill/nice_mock_control.h"
Thieu Le923006b2012-04-05 16:32:58 -070030#include "shill/proxy_factory.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010031
Eric Shienbrood9a245532012-03-07 14:20:39 -050032using base::Bind;
33using 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;
Paul Stewart1e5bad52012-08-04 17:13:19 -070041using testing::StrEq;
Darin Petkovcb547732011-11-09 13:55:26 +010042
Darin Petkovb05315f2011-11-07 10:14:25 +010043namespace shill {
44
Eric Shienbrood9a245532012-03-07 14:20:39 -050045MATCHER(IsSuccess, "") {
46 return arg.IsSuccess();
47}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050048
Thieu Leb5954a22012-05-18 10:37:34 -070049MATCHER(IsFailure, "") {
50 return arg.IsFailure();
51}
52
Darin Petkovb05315f2011-11-07 10:14:25 +010053class CellularCapabilityGSMTest : public testing::Test {
54 public:
55 CellularCapabilityGSMTest()
Ben Chan3ecdf822012-08-06 12:29:23 -070056 : create_card_proxy_from_factory_(false),
57 proxy_(new MockModemProxy()),
58 simple_proxy_(new MockModemSimpleProxy()),
59 card_proxy_(new MockModemGSMCardProxy()),
60 network_proxy_(new MockModemGSMNetworkProxy()),
61 proxy_factory_(this),
62 capability_(NULL),
63 device_adaptor_(NULL),
64 provider_db_(NULL),
65 cellular_(new Cellular(&control_,
Darin Petkovb05315f2011-11-07 10:14:25 +010066 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080067 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010068 NULL,
69 "",
Darin Petkov31332412012-01-28 01:50:02 +010070 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010071 0,
72 Cellular::kTypeGSM,
73 "",
74 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040075 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070076 NULL,
77 &proxy_factory_)) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010078
Darin Petkov3e509242011-11-10 14:46:44 +010079 virtual ~CellularCapabilityGSMTest() {
80 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010081 mobile_provider_close_db(provider_db_);
82 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010083 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010084 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010085 }
86
87 virtual void SetUp() {
88 capability_ =
89 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010090 device_adaptor_ =
91 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010092 }
93
Thieu Le923006b2012-04-05 16:32:58 -070094 void InvokeEnable(bool enable, Error *error,
95 const ResultCallback &callback, int timeout) {
96 callback.Run(Error());
97 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050098 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
99 int timeout) {
100 callback.Run(kIMEI, Error());
101 }
102 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
103 int timeout) {
104 callback.Run(kIMSI, Error());
105 }
106 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
107 int timeout) {
108 callback.Run("310240123456789", Error());
109 }
Gary Morain82a31a02012-08-02 18:03:32 -0700110 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
111 int timeout) {
112 callback.Run("", Error(Error::kOperationFailed));
113 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500114 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
115 int timeout) {
116 callback.Run(kMSISDN, Error());
117 }
Thieu Le923006b2012-04-05 16:32:58 -0700118 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
119 int timeout) {
120 callback.Run("", Error(Error::kOperationFailed));
121 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500122 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
123 int timeout) {
124 callback.Run(kTestCarrier, Error());
125 }
Thieu Le923006b2012-04-05 16:32:58 -0700126 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
127 int timeout) {
128 callback.Run("", Error(Error::kOperationFailed));
129 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500130 void InvokeGetSignalQuality(Error *error,
131 const SignalQualityCallback &callback,
132 int timeout) {
133 callback.Run(kStrength, Error());
134 }
135 void InvokeGetRegistrationInfo(Error *error,
136 const RegistrationInfoCallback &callback,
137 int timeout) {
138 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
139 kTestNetwork, kTestCarrier, Error());
140 }
141 void InvokeRegister(const string &network_id,
142 Error *error,
143 const ResultCallback &callback,
144 int timeout) {
145 callback.Run(Error());
146 }
147 void InvokeEnablePIN(const string &pin, bool enable,
148 Error *error, const ResultCallback &callback,
149 int timeout) {
150 callback.Run(Error());
151 }
152 void InvokeSendPIN(const string &pin, Error *error,
153 const ResultCallback &callback, int timeout) {
154 callback.Run(Error());
155 }
156 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
157 const ResultCallback &callback, int timeout) {
158 callback.Run(Error());
159 }
160 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
161 const ResultCallback &callback, int timeout) {
162 callback.Run(Error());
163 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400164 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500165 GSMScanResults results;
166 results.push_back(GSMScanResult());
167 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
168 results.push_back(GSMScanResult());
169 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400170 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500171 }
Thieu Le923006b2012-04-05 16:32:58 -0700172 void InvokeGetModemStatus(Error *error,
173 const DBusPropertyMapCallback &callback,
174 int timeout) {
175 DBusPropertiesMap props;
176 callback.Run(props, Error());
177 }
178 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
179 int timeout) {
180 ModemHardwareInfo info;
181 callback.Run(info, Error());
182 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500183
Thieu Leb5954a22012-05-18 10:37:34 -0700184 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
185 const ResultCallback &callback, int timeout) {
186 callback.Run(Error(Error::kOperationFailed));
187 }
188
Eric Shienbrood9a245532012-03-07 14:20:39 -0500189 MOCK_METHOD1(TestCallback, void(const Error &error));
190
Darin Petkovb05315f2011-11-07 10:14:25 +0100191 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100192 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100193 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500194 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100195 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100196 static const char kPIN[];
197 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100198 static const char kIMEI[];
199 static const char kIMSI[];
200 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500201 static const char kScanID0[];
202 static const char kScanID1[];
203 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100204
Thieu Le923006b2012-04-05 16:32:58 -0700205 class TestProxyFactory : public ProxyFactory {
206 public:
207 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
208
209 virtual ModemProxyInterface *CreateModemProxy(
210 const string &/*path*/,
211 const string &/*service*/) {
212 return test_->proxy_.release();
213 }
214
215 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
216 const string &/*path*/,
217 const string &/*service*/) {
218 return test_->simple_proxy_.release();
219 }
220
221 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
222 const string &/*path*/,
223 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700224 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
225 // CellularCapabilityGSM::InitProperties (and thus
226 // CellularCapabilityGSM::GetIMSI) from being called during the
227 // construction. Remove this workaround after refactoring the tests.
228 return test_->create_card_proxy_from_factory_ ?
229 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700230 }
231
232 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
233 const string &/*path*/,
234 const string &/*service*/) {
235 return test_->network_proxy_.release();
236 }
237
238 private:
239 CellularCapabilityGSMTest *test_;
240 };
241
242 void SetProxy() {
243 capability_->proxy_.reset(proxy_.release());
244 }
245
Darin Petkovcb547732011-11-09 13:55:26 +0100246 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100247 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100248 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100249
Darin Petkov1272a432011-11-10 15:53:37 +0100250 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100251 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100252 }
253
Darin Petkov20c13ec2011-11-09 15:07:15 +0100254 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100255 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100256 }
257
258 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100259 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100260 }
261
Darin Petkov3e509242011-11-10 14:46:44 +0100262 void SetService() {
263 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800264 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100265 }
266
Darin Petkov1272a432011-11-10 15:53:37 +0100267 void InitProviderDB() {
268 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
269 ASSERT_TRUE(provider_db_);
270 cellular_->provider_db_ = provider_db_;
271 }
272
Thieu Leb5954a22012-05-18 10:37:34 -0700273 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700274 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
275 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
276 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
277 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700278 }
279
280 void SetupCommonStartModemExpectations() {
281 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700282
283 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
284 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700285 EXPECT_CALL(*card_proxy_,
286 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
287 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
288 EXPECT_CALL(*card_proxy_,
289 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
290 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
291 EXPECT_CALL(*network_proxy_, AccessTechnology());
292 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
293 EXPECT_CALL(*proxy_,
294 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
295 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
296 EXPECT_CALL(*network_proxy_,
297 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
298 EXPECT_CALL(*network_proxy_,
299 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
300 EXPECT_CALL(*this, TestCallback(IsSuccess()));
301 }
302
Thieu Leb5954a22012-05-18 10:37:34 -0700303 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700304 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700305 capability_->InitProxies();
306 }
307
Ben Chan3ecdf822012-08-06 12:29:23 -0700308 void AllowCreateCardProxyFromFactory() {
309 create_card_proxy_from_factory_ = true;
310 }
311
Darin Petkovb05315f2011-11-07 10:14:25 +0100312 NiceMockControl control_;
313 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800314 MockMetrics metrics_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700315 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700316 scoped_ptr<MockModemProxy> proxy_;
317 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100318 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100319 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700320 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100321 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100322 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100323 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700324 CellularRefPtr cellular_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400325 ScanResultsCallback scan_callback_; // saved for testing scan operations
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 char CellularCapabilityGSMTest::kScanID0[] = "123";
339const char CellularCapabilityGSMTest::kScanID1[] = "456";
340const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100341
Darin Petkov721ac932011-11-16 15:43:09 +0100342TEST_F(CellularCapabilityGSMTest, PropertyStore) {
343 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
344}
345
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500346TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500347 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
348 .WillOnce(Invoke(this,
349 &CellularCapabilityGSMTest::InvokeGetIMEI));
350 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100351 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500352 ASSERT_TRUE(capability_->imei_.empty());
353 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
354 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500355 EXPECT_EQ(kIMEI, capability_->imei_);
356}
357
358TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500359 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
360 .WillOnce(Invoke(this,
361 &CellularCapabilityGSMTest::InvokeGetIMSI))
362 .WillOnce(Invoke(this,
363 &CellularCapabilityGSMTest::InvokeGetIMSI2));
364 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500365 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500366 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
367 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700368 EXPECT_TRUE(capability_->imsi_.empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500369 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500370 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500371 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100372 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500373 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500374 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
375}
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;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700382 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700383 ::testing::StartsWith("GetIMSI failed - ")));
384 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
385 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
386 .WillRepeatedly(Invoke(this,
387 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
388 EXPECT_CALL(*this, TestCallback(IsFailure()));
389 SetCardProxy();
390 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
391 Unretained(this));
392 EXPECT_TRUE(capability_->imsi_.empty());
393
394 capability_->get_imsi_retries_ = 0;
395 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
396 capability_->get_imsi_retry_delay_milliseconds_);
397
398 // Set the delay to zero to speed up the test.
399 capability_->get_imsi_retry_delay_milliseconds_ = 0;
400 capability_->GetIMSI(callback);
401 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
402 dispatcher_.DispatchPendingEvents();
403 }
404 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
405 capability_->get_imsi_retries_);
406 EXPECT_TRUE(capability_->imsi_.empty());
407}
408
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500409TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500410 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
411 CellularCapability::kTimeoutDefault))
412 .WillOnce(Invoke(this,
413 &CellularCapabilityGSMTest::InvokeGetMSISDN));
414 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500415 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500416 ASSERT_TRUE(capability_->mdn_.empty());
417 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
418 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500419 EXPECT_EQ(kMSISDN, capability_->mdn_);
420}
421
422TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500423 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
424 .WillOnce(Invoke(this,
425 &CellularCapabilityGSMTest::InvokeGetSPN));
426 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500427 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500428 ASSERT_TRUE(capability_->spn_.empty());
429 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
430 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500431 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100432}
Darin Petkovb05315f2011-11-07 10:14:25 +0100433
Darin Petkov3e509242011-11-10 14:46:44 +0100434TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500435 EXPECT_CALL(*network_proxy_,
436 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
437 .WillOnce(Invoke(this,
438 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100439 SetNetworkProxy();
440 SetService();
441 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100442 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100443 EXPECT_EQ(kStrength, cellular_->service()->strength());
444}
445
Darin Petkov184c54e2011-11-15 12:44:39 +0100446TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500447 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
448 CellularCapability::kTimeoutRegister))
449 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
450 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100451 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500452 Error error;
453 capability_->RegisterOnNetwork(kTestNetwork, &error,
454 Bind(&CellularCapabilityGSMTest::TestCallback,
455 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500456 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100457}
458
Darin Petkovb72cf402011-11-22 14:51:39 +0100459TEST_F(CellularCapabilityGSMTest, IsRegistered) {
460 EXPECT_FALSE(capability_->IsRegistered());
461 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
462 EXPECT_FALSE(capability_->IsRegistered());
463 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
464 EXPECT_TRUE(capability_->IsRegistered());
465 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
466 EXPECT_FALSE(capability_->IsRegistered());
467 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
468 EXPECT_FALSE(capability_->IsRegistered());
469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
470 EXPECT_FALSE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
472 EXPECT_TRUE(capability_->IsRegistered());
473}
474
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500475TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
476 ASSERT_FALSE(capability_->IsRegistered());
477 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500478 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
479 .WillOnce(Invoke(this,
480 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500481 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500482 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500483 EXPECT_TRUE(capability_->IsRegistered());
484 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
485 capability_->registration_state_);
486}
487
Darin Petkovb05315f2011-11-07 10:14:25 +0100488TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500489 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
490 CellularCapability::kTimeoutDefault))
491 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
492 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100493 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500494 Error error;
495 capability_->RequirePIN(kPIN, true, &error,
496 Bind(&CellularCapabilityGSMTest::TestCallback,
497 Unretained(this)));
498 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100499}
500
501TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500502 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
503 CellularCapability::kTimeoutDefault))
504 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
505 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100506 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500507 Error error;
508 capability_->EnterPIN(kPIN, &error,
509 Bind(&CellularCapabilityGSMTest::TestCallback,
510 Unretained(this)));
511 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100512}
513
514TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500515 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
516 CellularCapability::kTimeoutDefault))
517 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
518 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100519 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500520 Error error;
521 capability_->UnblockPIN(kPUK, kPIN, &error,
522 Bind(&CellularCapabilityGSMTest::TestCallback,
523 Unretained(this)));
524 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100525}
526
527TEST_F(CellularCapabilityGSMTest, ChangePIN) {
528 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500529 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
530 CellularCapability::kTimeoutDefault))
531 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
532 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100533 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500534 Error error;
535 capability_->ChangePIN(kOldPIN, kPIN, &error,
536 Bind(&CellularCapabilityGSMTest::TestCallback,
537 Unretained(this)));
538 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100539}
540
Darin Petkovb7828b02012-02-03 12:34:30 +0100541namespace {
542
543MATCHER(SizeIs2, "") {
544 return arg.size() == 2;
545}
546
547} // namespace
548
Darin Petkov1272a432011-11-10 15:53:37 +0100549TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100550 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500551 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400552 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500553 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100554 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100555 EXPECT_CALL(*device_adaptor_,
556 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
557 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400558 EXPECT_CALL(*device_adaptor_,
559 EmitBoolChanged(flimflam::kScanningProperty, true));
560 EXPECT_FALSE(capability_->scanning_);
561
Eric Shienbrood9a245532012-03-07 14:20:39 -0500562 SetNetworkProxy();
563 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
564 Unretained(this)));
565 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400566 EXPECT_TRUE(capability_->scanning_);
567
568 // Simulate the completion of the scan...
569 EXPECT_CALL(*device_adaptor_,
570 EmitBoolChanged(flimflam::kScanningProperty, false));
571 InvokeScanReply();
572 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100573 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500574 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100575 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500576 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100577 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100578}
579
580TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
581 static const char kID[] = "123";
582 static const char kLongName[] = "long name";
583 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500584 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100585 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
586 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
587 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
588 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
589 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
590 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100591 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100592 EXPECT_EQ(5, parsed.size());
593 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
594 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
595 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
596 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
597 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
598 parsed[flimflam::kTechnologyProperty]);
599}
600
601TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
602 InitProviderDB();
603 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500604 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100605 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100606 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100607 EXPECT_EQ(2, parsed.size());
608 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
609 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
610}
611
Darin Petkovae0c64e2011-11-15 15:50:27 +0100612TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100613 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
614 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100615 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100616 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100617 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
618 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100619 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100620 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100621}
622
623TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
624 static const char kOperatorName[] = "Swisscom";
625 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100626 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100627 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100628 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100629 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
630 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100631 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
632}
633
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100634TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
635 InitProviderDB();
636 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500637 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400638 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100639 capability_->UpdateStatus(props);
640 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
641}
642
643TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
644 static const char kCountry[] = "us";
645 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500646 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100647
648 capability_->SetHomeProvider(); // No mobile provider DB available.
649 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
650 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
651 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
652
653 InitProviderDB();
654 capability_->SetHomeProvider();
655 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
656 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
657 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100658 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100659
660 Cellular::Operator oper;
661 cellular_->set_home_provider(oper);
662 capability_->spn_ = kTestCarrier;
663 capability_->SetHomeProvider();
664 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
665 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
666 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
667}
668
Darin Petkov3cfbf212011-11-21 16:02:09 +0100669namespace {
670
671MATCHER(SizeIs4, "") {
672 return arg.size() == 4;
673}
674
675} // namespace
676
677TEST_F(CellularCapabilityGSMTest, InitAPNList) {
678 InitProviderDB();
679 capability_->home_provider_ =
680 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
681 ASSERT_TRUE(capability_->home_provider_);
682 EXPECT_EQ(0, capability_->apn_list_.size());
683 EXPECT_CALL(*device_adaptor_,
684 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
685 SizeIs4()));
686 capability_->InitAPNList();
687 EXPECT_EQ(4, capability_->apn_list_.size());
688 EXPECT_EQ("wap.voicestream.com",
689 capability_->apn_list_[1][flimflam::kApnProperty]);
690 EXPECT_EQ("Web2Go/t-zones",
691 capability_->apn_list_[1][flimflam::kApnNameProperty]);
692}
693
Darin Petkov20c13ec2011-11-09 15:07:15 +0100694TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100695 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100696 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100697 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100698 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100699 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
700 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100701 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100702 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
703 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100704 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100705 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
706 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100707 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100708 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
709 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100710 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100711 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
712 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100713 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100714 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
715 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100716 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100717 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
718 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100719 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100720 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
721 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100722 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100723}
724
725TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
726 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100727 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100728 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
729 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100730 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100731 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
732 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100733 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100734 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
735 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100736 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100737 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
738 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100739 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100740 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
741 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100742 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100743}
744
Darin Petkovac635a82012-01-10 16:51:58 +0100745TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
746 CellularCapabilityGSM::friendly_service_name_id_ = 0;
747 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
748 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
749 capability_->serving_operator_.SetCode("1234");
750 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
751 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500752 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100753 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
754 static const char kTestOperator[] = "A GSM Operator";
755 capability_->serving_operator_.SetName(kTestOperator);
756 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
757 static const char kHomeProvider[] = "The GSM Home Provider";
758 cellular_->home_provider_.SetName(kHomeProvider);
759 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
760 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
761 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
762}
763
Darin Petkov31332412012-01-28 01:50:02 +0100764TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
765 SetService();
766 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100767 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100768 cellular_->service()->friendly_name(),
769 cellular_->service()->GetStorageIdentifier());
770 capability_->imsi_ = kIMSI;
771 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100772 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100773 cellular_->service()->GetStorageIdentifier());
774}
775
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400776TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100777 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
778 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
779 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
780 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
781 DBusPropertiesMap props;
782 static const char kLockType[] = "sim-pin";
783 const int kRetries = 3;
784 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
785 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
786 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
787 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
788 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
789 kLockType);
790 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
791 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400792 // Call with the 'wrong' interface and nothing should change.
793 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
794 vector<string>());
795 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
796 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
797 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
798 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
799
Gary Morainbaeefdf2012-04-30 14:53:35 -0700800 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
801 // to the enabled state of the SIM lock.
802 KeyValueStore lock_status;
803 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
804 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
805 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
806
807 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
808 flimflam::kSIMLockStatusProperty,
809 KeyValueStoreEq(lock_status)));
810
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400811 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400812 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100813 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400814 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
815 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100816 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700817 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
818 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
819
820 // Some properties are sent on the MM_MODEM_INTERFACE.
821 capability_->sim_lock_status_.enabled = false;
822 capability_->sim_lock_status_.lock_type = "";
823 capability_->sim_lock_status_.retries_left = 0;
824 KeyValueStore lock_status2;
825 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
826 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
827 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
828 EXPECT_CALL(*device_adaptor_,
829 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
830 KeyValueStoreEq(lock_status2)));
831 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
832 vector<string>());
833 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100834 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
835 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
836}
837
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400838TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
839 static const string kTmobileApn("epc.tmobile.com");
840 static const string kLastGoodApn("remembered.apn");
841 static const string kLastGoodUsername("remembered.user");
842 static const string kSuppliedApn("my.apn");
843
844 SetService();
845 capability_->imsi_ = "310240123456789";
846 InitProviderDB();
847 capability_->SetHomeProvider();
848 DBusPropertiesMap props;
849 capability_->SetupConnectProperties(&props);
850 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
851 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
852
853 ProfileRefPtr profile(new NiceMock<MockProfile>(
854 &control_, reinterpret_cast<Manager *>(NULL)));
855 cellular_->service()->set_profile(profile);
856 Stringmap apn_info;
857 apn_info[flimflam::kApnProperty] = kLastGoodApn;
858 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
859 cellular_->service()->SetLastGoodApn(apn_info);
860 props.clear();
861 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
862 capability_->SetupConnectProperties(&props);
863 // We expect the list to contain the last good APN, plus
864 // the 4 APNs from the mobile provider info database.
865 EXPECT_EQ(5, capability_->apn_try_list_.size());
866 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
867 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
868 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
869 EXPECT_EQ(kLastGoodUsername,
870 props[flimflam::kApnUsernameProperty].reader().get_string());
871
872 Error error;
873 apn_info.clear();
874 props.clear();
875 apn_info[flimflam::kApnProperty] = kSuppliedApn;
876 // Setting the APN has the side effect of clearing the LastGoodApn,
877 // so the try list will have 5 elements, with the first one being
878 // the supplied APN.
879 cellular_->service()->SetApn(apn_info, &error);
880 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
881 capability_->SetupConnectProperties(&props);
882 EXPECT_EQ(5, capability_->apn_try_list_.size());
883 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
884 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
885
886 apn_info.clear();
887 props.clear();
888 apn_info[flimflam::kApnProperty] = kLastGoodApn;
889 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
890 // Now when LastGoodAPN is set, it will be the one selected.
891 cellular_->service()->SetLastGoodApn(apn_info);
892 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
893 capability_->SetupConnectProperties(&props);
894 // We expect the list to contain the last good APN, plus
895 // the user-supplied APN, plus the 4 APNs from the mobile
896 // provider info database.
897 EXPECT_EQ(6, capability_->apn_try_list_.size());
898 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
899 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
900 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
901 EXPECT_EQ(kLastGoodUsername,
902 props[flimflam::kApnUsernameProperty].reader().get_string());
903}
904
Thieu Le923006b2012-04-05 16:32:58 -0700905TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
906 SetupCommonStartModemExpectations();
907 EXPECT_CALL(*card_proxy_,
908 GetSPN(_, _, CellularCapability::kTimeoutDefault))
909 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
910 EXPECT_CALL(*card_proxy_,
911 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
912 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700913 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700914
915 Error error;
916 capability_->StartModem(
917 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
918 dispatcher_.DispatchPendingEvents();
919}
920
921TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
922 SetupCommonStartModemExpectations();
923 EXPECT_CALL(*card_proxy_,
924 GetSPN(_, _, CellularCapability::kTimeoutDefault))
925 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
926 EXPECT_CALL(*card_proxy_,
927 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
928 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700929 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700930
931 Error error;
932 capability_->StartModem(
933 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
934 dispatcher_.DispatchPendingEvents();
935}
936
937TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
938 SetupCommonStartModemExpectations();
939 EXPECT_CALL(*card_proxy_,
940 GetSPN(_, _, CellularCapability::kTimeoutDefault))
941 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
942 EXPECT_CALL(*card_proxy_,
943 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
944 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -0700945 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700946
947 Error error;
948 capability_->StartModem(
949 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
950 dispatcher_.DispatchPendingEvents();
951}
952
Thieu Leb5954a22012-05-18 10:37:34 -0700953TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
954 // Make sure we don't crash if the connect failed and there is no
955 // CellularService object. This can happen if the modem is enabled and
956 // then quickly disabled.
957 SetupCommonProxiesExpectations();
958 EXPECT_CALL(*simple_proxy_,
959 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
960 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
961 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -0700962 InitProxies();
963 EXPECT_FALSE(capability_->cellular()->service());
964 Error error;
965 DBusPropertiesMap props;
966 capability_->Connect(props, &error,
967 Bind(&CellularCapabilityGSMTest::TestCallback,
968 Unretained(this)));
969}
970
Darin Petkovb05315f2011-11-07 10:14:25 +0100971} // namespace shill