blob: 691b88172f02c2964eda212e13f8b8351e60e936 [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 Petkovb4fccd22012-08-10 11:59:26 +020081 if (provider_db_) {
82 mobile_provider_close_db(provider_db_);
83 provider_db_ = NULL;
84 }
Darin Petkov721ac932011-11-16 15:43:09 +010085 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010086 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010087 }
88
89 virtual void SetUp() {
90 capability_ =
91 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010092 device_adaptor_ =
93 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010094 }
95
Thieu Le923006b2012-04-05 16:32:58 -070096 void InvokeEnable(bool enable, Error *error,
97 const ResultCallback &callback, int timeout) {
98 callback.Run(Error());
99 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500100 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
101 int timeout) {
102 callback.Run(kIMEI, Error());
103 }
104 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
105 int timeout) {
106 callback.Run(kIMSI, Error());
107 }
108 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
109 int timeout) {
110 callback.Run("310240123456789", Error());
111 }
Gary Morain82a31a02012-08-02 18:03:32 -0700112 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
113 int timeout) {
114 callback.Run("", Error(Error::kOperationFailed));
115 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500116 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
117 int timeout) {
118 callback.Run(kMSISDN, Error());
119 }
Thieu Le923006b2012-04-05 16:32:58 -0700120 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
121 int timeout) {
122 callback.Run("", Error(Error::kOperationFailed));
123 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500124 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
125 int timeout) {
126 callback.Run(kTestCarrier, Error());
127 }
Thieu Le923006b2012-04-05 16:32:58 -0700128 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
129 int timeout) {
130 callback.Run("", Error(Error::kOperationFailed));
131 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500132 void InvokeGetSignalQuality(Error *error,
133 const SignalQualityCallback &callback,
134 int timeout) {
135 callback.Run(kStrength, Error());
136 }
137 void InvokeGetRegistrationInfo(Error *error,
138 const RegistrationInfoCallback &callback,
139 int timeout) {
140 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
141 kTestNetwork, kTestCarrier, Error());
142 }
143 void InvokeRegister(const string &network_id,
144 Error *error,
145 const ResultCallback &callback,
146 int timeout) {
147 callback.Run(Error());
148 }
149 void InvokeEnablePIN(const string &pin, bool enable,
150 Error *error, const ResultCallback &callback,
151 int timeout) {
152 callback.Run(Error());
153 }
154 void InvokeSendPIN(const string &pin, Error *error,
155 const ResultCallback &callback, int timeout) {
156 callback.Run(Error());
157 }
158 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
159 const ResultCallback &callback, int timeout) {
160 callback.Run(Error());
161 }
162 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
163 const ResultCallback &callback, int timeout) {
164 callback.Run(Error());
165 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400166 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500167 GSMScanResults results;
168 results.push_back(GSMScanResult());
169 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
170 results.push_back(GSMScanResult());
171 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400172 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500173 }
Thieu Le923006b2012-04-05 16:32:58 -0700174 void InvokeGetModemStatus(Error *error,
175 const DBusPropertyMapCallback &callback,
176 int timeout) {
177 DBusPropertiesMap props;
178 callback.Run(props, Error());
179 }
180 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
181 int timeout) {
182 ModemHardwareInfo info;
183 callback.Run(info, Error());
184 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500185
Thieu Leb5954a22012-05-18 10:37:34 -0700186 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
187 const ResultCallback &callback, int timeout) {
188 callback.Run(Error(Error::kOperationFailed));
189 }
190
Eric Shienbrood9a245532012-03-07 14:20:39 -0500191 MOCK_METHOD1(TestCallback, void(const Error &error));
192
Darin Petkovb05315f2011-11-07 10:14:25 +0100193 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100194 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100195 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500196 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100197 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100198 static const char kPIN[];
199 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100200 static const char kIMEI[];
201 static const char kIMSI[];
202 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500203 static const char kScanID0[];
204 static const char kScanID1[];
205 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100206
Thieu Le923006b2012-04-05 16:32:58 -0700207 class TestProxyFactory : public ProxyFactory {
208 public:
209 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
210
211 virtual ModemProxyInterface *CreateModemProxy(
212 const string &/*path*/,
213 const string &/*service*/) {
214 return test_->proxy_.release();
215 }
216
217 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
218 const string &/*path*/,
219 const string &/*service*/) {
220 return test_->simple_proxy_.release();
221 }
222
223 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
224 const string &/*path*/,
225 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700226 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
227 // CellularCapabilityGSM::InitProperties (and thus
228 // CellularCapabilityGSM::GetIMSI) from being called during the
229 // construction. Remove this workaround after refactoring the tests.
230 return test_->create_card_proxy_from_factory_ ?
231 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700232 }
233
234 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
235 const string &/*path*/,
236 const string &/*service*/) {
237 return test_->network_proxy_.release();
238 }
239
240 private:
241 CellularCapabilityGSMTest *test_;
242 };
243
244 void SetProxy() {
245 capability_->proxy_.reset(proxy_.release());
246 }
247
Darin Petkovcb547732011-11-09 13:55:26 +0100248 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100249 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100250 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100251
Darin Petkov1272a432011-11-10 15:53:37 +0100252 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100253 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100254 }
255
Darin Petkov20c13ec2011-11-09 15:07:15 +0100256 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100257 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100258 }
259
260 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100261 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100262 }
263
Darin Petkov3e509242011-11-10 14:46:44 +0100264 void SetService() {
265 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800266 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100267 }
268
Darin Petkov1272a432011-11-10 15:53:37 +0100269 void InitProviderDB() {
270 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
271 ASSERT_TRUE(provider_db_);
272 cellular_->provider_db_ = provider_db_;
273 }
274
Thieu Leb5954a22012-05-18 10:37:34 -0700275 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700276 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
277 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
278 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
279 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700280 }
281
282 void SetupCommonStartModemExpectations() {
283 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700284
285 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
286 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700287 EXPECT_CALL(*card_proxy_,
288 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
289 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
290 EXPECT_CALL(*card_proxy_,
291 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
292 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
293 EXPECT_CALL(*network_proxy_, AccessTechnology());
294 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
295 EXPECT_CALL(*proxy_,
296 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
297 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
298 EXPECT_CALL(*network_proxy_,
299 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
300 EXPECT_CALL(*network_proxy_,
301 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
302 EXPECT_CALL(*this, TestCallback(IsSuccess()));
303 }
304
Thieu Leb5954a22012-05-18 10:37:34 -0700305 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700306 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700307 capability_->InitProxies();
308 }
309
Ben Chan3ecdf822012-08-06 12:29:23 -0700310 void AllowCreateCardProxyFromFactory() {
311 create_card_proxy_from_factory_ = true;
312 }
313
Darin Petkovb05315f2011-11-07 10:14:25 +0100314 NiceMockControl control_;
315 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800316 MockMetrics metrics_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700317 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700318 scoped_ptr<MockModemProxy> proxy_;
319 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100320 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100321 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700322 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100323 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100324 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100325 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700326 CellularRefPtr cellular_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400327 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100328};
329
Darin Petkov31332412012-01-28 01:50:02 +0100330const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100331const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
332 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100333const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500334const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100335const char CellularCapabilityGSMTest::kPIN[] = "9876";
336const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100337const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100338const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100339const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500340const char CellularCapabilityGSMTest::kScanID0[] = "123";
341const char CellularCapabilityGSMTest::kScanID1[] = "456";
342const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100343
Darin Petkov721ac932011-11-16 15:43:09 +0100344TEST_F(CellularCapabilityGSMTest, PropertyStore) {
345 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
346}
347
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500348TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500349 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
350 .WillOnce(Invoke(this,
351 &CellularCapabilityGSMTest::InvokeGetIMEI));
352 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100353 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500354 ASSERT_TRUE(capability_->imei_.empty());
355 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
356 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500357 EXPECT_EQ(kIMEI, capability_->imei_);
358}
359
360TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500361 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
362 .WillOnce(Invoke(this,
363 &CellularCapabilityGSMTest::InvokeGetIMSI))
364 .WillOnce(Invoke(this,
365 &CellularCapabilityGSMTest::InvokeGetIMSI2));
366 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500367 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500368 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
369 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700370 EXPECT_TRUE(capability_->imsi_.empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500371 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500372 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500373 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100374 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500375 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500376 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
377}
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;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700384 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700385 ::testing::StartsWith("GetIMSI failed - ")));
386 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
387 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
388 .WillRepeatedly(Invoke(this,
389 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
390 EXPECT_CALL(*this, TestCallback(IsFailure()));
391 SetCardProxy();
392 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
393 Unretained(this));
394 EXPECT_TRUE(capability_->imsi_.empty());
395
396 capability_->get_imsi_retries_ = 0;
397 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
398 capability_->get_imsi_retry_delay_milliseconds_);
399
400 // Set the delay to zero to speed up the test.
401 capability_->get_imsi_retry_delay_milliseconds_ = 0;
402 capability_->GetIMSI(callback);
403 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
404 dispatcher_.DispatchPendingEvents();
405 }
406 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
407 capability_->get_imsi_retries_);
408 EXPECT_TRUE(capability_->imsi_.empty());
409}
410
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500411TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500412 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
413 CellularCapability::kTimeoutDefault))
414 .WillOnce(Invoke(this,
415 &CellularCapabilityGSMTest::InvokeGetMSISDN));
416 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500417 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500418 ASSERT_TRUE(capability_->mdn_.empty());
419 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
420 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500421 EXPECT_EQ(kMSISDN, capability_->mdn_);
422}
423
424TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500425 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
426 .WillOnce(Invoke(this,
427 &CellularCapabilityGSMTest::InvokeGetSPN));
428 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500429 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500430 ASSERT_TRUE(capability_->spn_.empty());
431 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
432 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500433 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100434}
Darin Petkovb05315f2011-11-07 10:14:25 +0100435
Darin Petkov3e509242011-11-10 14:46:44 +0100436TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500437 EXPECT_CALL(*network_proxy_,
438 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
439 .WillOnce(Invoke(this,
440 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100441 SetNetworkProxy();
442 SetService();
443 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100444 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100445 EXPECT_EQ(kStrength, cellular_->service()->strength());
446}
447
Darin Petkov184c54e2011-11-15 12:44:39 +0100448TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500449 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
450 CellularCapability::kTimeoutRegister))
451 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
452 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100453 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500454 Error error;
455 capability_->RegisterOnNetwork(kTestNetwork, &error,
456 Bind(&CellularCapabilityGSMTest::TestCallback,
457 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500458 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100459}
460
Darin Petkovb72cf402011-11-22 14:51:39 +0100461TEST_F(CellularCapabilityGSMTest, IsRegistered) {
462 EXPECT_FALSE(capability_->IsRegistered());
463 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
464 EXPECT_FALSE(capability_->IsRegistered());
465 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
466 EXPECT_TRUE(capability_->IsRegistered());
467 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
468 EXPECT_FALSE(capability_->IsRegistered());
469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
470 EXPECT_FALSE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
472 EXPECT_FALSE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
474 EXPECT_TRUE(capability_->IsRegistered());
475}
476
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500477TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
478 ASSERT_FALSE(capability_->IsRegistered());
479 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500480 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
481 .WillOnce(Invoke(this,
482 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500483 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500484 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485 EXPECT_TRUE(capability_->IsRegistered());
486 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
487 capability_->registration_state_);
488}
489
Darin Petkovb05315f2011-11-07 10:14:25 +0100490TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500491 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
492 CellularCapability::kTimeoutDefault))
493 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
494 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100495 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500496 Error error;
497 capability_->RequirePIN(kPIN, true, &error,
498 Bind(&CellularCapabilityGSMTest::TestCallback,
499 Unretained(this)));
500 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100501}
502
503TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500504 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
505 CellularCapability::kTimeoutDefault))
506 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
507 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100508 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500509 Error error;
510 capability_->EnterPIN(kPIN, &error,
511 Bind(&CellularCapabilityGSMTest::TestCallback,
512 Unretained(this)));
513 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100514}
515
516TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500517 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
518 CellularCapability::kTimeoutDefault))
519 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
520 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100521 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500522 Error error;
523 capability_->UnblockPIN(kPUK, kPIN, &error,
524 Bind(&CellularCapabilityGSMTest::TestCallback,
525 Unretained(this)));
526 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100527}
528
529TEST_F(CellularCapabilityGSMTest, ChangePIN) {
530 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500531 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
532 CellularCapability::kTimeoutDefault))
533 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
534 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100535 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500536 Error error;
537 capability_->ChangePIN(kOldPIN, kPIN, &error,
538 Bind(&CellularCapabilityGSMTest::TestCallback,
539 Unretained(this)));
540 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100541}
542
Darin Petkovb7828b02012-02-03 12:34:30 +0100543namespace {
544
545MATCHER(SizeIs2, "") {
546 return arg.size() == 2;
547}
548
549} // namespace
550
Darin Petkov1272a432011-11-10 15:53:37 +0100551TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100552 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500553 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400554 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500555 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100556 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100557 EXPECT_CALL(*device_adaptor_,
558 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
559 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400560 EXPECT_CALL(*device_adaptor_,
561 EmitBoolChanged(flimflam::kScanningProperty, true));
562 EXPECT_FALSE(capability_->scanning_);
563
Eric Shienbrood9a245532012-03-07 14:20:39 -0500564 SetNetworkProxy();
565 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
566 Unretained(this)));
567 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400568 EXPECT_TRUE(capability_->scanning_);
569
570 // Simulate the completion of the scan...
571 EXPECT_CALL(*device_adaptor_,
572 EmitBoolChanged(flimflam::kScanningProperty, false));
573 InvokeScanReply();
574 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100575 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500576 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100577 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500578 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100579 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100580}
581
582TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
583 static const char kID[] = "123";
584 static const char kLongName[] = "long name";
585 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500586 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100587 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
588 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
589 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
590 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
591 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
592 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100593 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100594 EXPECT_EQ(5, parsed.size());
595 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
596 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
597 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
598 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
599 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
600 parsed[flimflam::kTechnologyProperty]);
601}
602
603TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
604 InitProviderDB();
605 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500606 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100607 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100608 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100609 EXPECT_EQ(2, parsed.size());
610 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
611 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
612}
613
Darin Petkovae0c64e2011-11-15 15:50:27 +0100614TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100615 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
616 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100617 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100618 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100619 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
620 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100621 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100622 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100623}
624
625TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
626 static const char kOperatorName[] = "Swisscom";
627 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100628 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100629 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100630 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100631 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
632 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100633 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
634}
635
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100636TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
637 InitProviderDB();
638 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500639 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400640 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100641 capability_->UpdateStatus(props);
642 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
643}
644
645TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
646 static const char kCountry[] = "us";
647 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500648 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100649
650 capability_->SetHomeProvider(); // No mobile provider DB available.
651 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
652 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
653 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
654
655 InitProviderDB();
656 capability_->SetHomeProvider();
657 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
658 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
659 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100660 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200661 ASSERT_TRUE(capability_->home_provider_);
662 EXPECT_FALSE(capability_->home_provider_->requires_roaming);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100663
664 Cellular::Operator oper;
665 cellular_->set_home_provider(oper);
666 capability_->spn_ = kTestCarrier;
667 capability_->SetHomeProvider();
668 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
669 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
670 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200671
672 static const char kCubic[] = "Cubic";
673 capability_->spn_ = kCubic;
674 capability_->SetHomeProvider();
675 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
676 EXPECT_EQ("", cellular_->home_provider().GetCode());
677 ASSERT_TRUE(capability_->home_provider_);
678 EXPECT_TRUE(capability_->home_provider_->requires_roaming);
679
680 static const char kCUBIC[] = "CUBIC";
681 capability_->spn_ = kCUBIC;
682 capability_->home_provider_ = NULL;
683 capability_->SetHomeProvider();
684 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
685 EXPECT_EQ("", cellular_->home_provider().GetCode());
686 ASSERT_TRUE(capability_->home_provider_);
687 EXPECT_TRUE(capability_->home_provider_->requires_roaming);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100688}
689
Darin Petkov3cfbf212011-11-21 16:02:09 +0100690namespace {
691
692MATCHER(SizeIs4, "") {
693 return arg.size() == 4;
694}
695
696} // namespace
697
698TEST_F(CellularCapabilityGSMTest, InitAPNList) {
699 InitProviderDB();
700 capability_->home_provider_ =
701 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
702 ASSERT_TRUE(capability_->home_provider_);
703 EXPECT_EQ(0, capability_->apn_list_.size());
704 EXPECT_CALL(*device_adaptor_,
705 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
706 SizeIs4()));
707 capability_->InitAPNList();
708 EXPECT_EQ(4, capability_->apn_list_.size());
709 EXPECT_EQ("wap.voicestream.com",
710 capability_->apn_list_[1][flimflam::kApnProperty]);
711 EXPECT_EQ("Web2Go/t-zones",
712 capability_->apn_list_[1][flimflam::kApnNameProperty]);
713}
714
Darin Petkov20c13ec2011-11-09 15:07:15 +0100715TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100716 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100717 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100718 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100719 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100720 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
721 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100722 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100723 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
724 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100725 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100726 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
727 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100728 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100729 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
730 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100731 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100732 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
733 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100734 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100735 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
736 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100737 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100738 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
739 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100740 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100741 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
742 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100743 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100744}
745
746TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
747 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100748 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100749 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
750 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100751 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100752 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
753 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100754 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100755 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
756 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100757 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100758 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
759 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100760 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100761 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
762 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100763 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100764}
765
Darin Petkovac635a82012-01-10 16:51:58 +0100766TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
767 CellularCapabilityGSM::friendly_service_name_id_ = 0;
768 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
769 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
770 capability_->serving_operator_.SetCode("1234");
771 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
772 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500773 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100774 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
775 static const char kTestOperator[] = "A GSM Operator";
776 capability_->serving_operator_.SetName(kTestOperator);
777 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
778 static const char kHomeProvider[] = "The GSM Home Provider";
779 cellular_->home_provider_.SetName(kHomeProvider);
780 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
781 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
782 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
783}
784
Darin Petkov31332412012-01-28 01:50:02 +0100785TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
786 SetService();
787 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100788 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100789 cellular_->service()->friendly_name(),
790 cellular_->service()->GetStorageIdentifier());
791 capability_->imsi_ = kIMSI;
792 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100793 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100794 cellular_->service()->GetStorageIdentifier());
795}
796
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400797TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100798 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
799 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
800 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
801 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
802 DBusPropertiesMap props;
803 static const char kLockType[] = "sim-pin";
804 const int kRetries = 3;
805 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
806 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
807 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
808 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
809 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
810 kLockType);
811 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
812 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400813 // Call with the 'wrong' interface and nothing should change.
814 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
815 vector<string>());
816 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
817 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
818 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
819 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
820
Gary Morainbaeefdf2012-04-30 14:53:35 -0700821 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
822 // to the enabled state of the SIM lock.
823 KeyValueStore lock_status;
824 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
825 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
826 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
827
828 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
829 flimflam::kSIMLockStatusProperty,
830 KeyValueStoreEq(lock_status)));
831
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400832 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400833 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100834 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400835 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
836 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100837 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700838 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
839 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
840
841 // Some properties are sent on the MM_MODEM_INTERFACE.
842 capability_->sim_lock_status_.enabled = false;
843 capability_->sim_lock_status_.lock_type = "";
844 capability_->sim_lock_status_.retries_left = 0;
845 KeyValueStore lock_status2;
846 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
847 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
848 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
849 EXPECT_CALL(*device_adaptor_,
850 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
851 KeyValueStoreEq(lock_status2)));
852 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
853 vector<string>());
854 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100855 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
856 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
857}
858
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400859TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
860 static const string kTmobileApn("epc.tmobile.com");
861 static const string kLastGoodApn("remembered.apn");
862 static const string kLastGoodUsername("remembered.user");
863 static const string kSuppliedApn("my.apn");
864
865 SetService();
866 capability_->imsi_ = "310240123456789";
867 InitProviderDB();
868 capability_->SetHomeProvider();
869 DBusPropertiesMap props;
870 capability_->SetupConnectProperties(&props);
871 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
872 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
873
874 ProfileRefPtr profile(new NiceMock<MockProfile>(
875 &control_, reinterpret_cast<Manager *>(NULL)));
876 cellular_->service()->set_profile(profile);
877 Stringmap apn_info;
878 apn_info[flimflam::kApnProperty] = kLastGoodApn;
879 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
880 cellular_->service()->SetLastGoodApn(apn_info);
881 props.clear();
882 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
883 capability_->SetupConnectProperties(&props);
884 // We expect the list to contain the last good APN, plus
885 // the 4 APNs from the mobile provider info database.
886 EXPECT_EQ(5, capability_->apn_try_list_.size());
887 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
888 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
889 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
890 EXPECT_EQ(kLastGoodUsername,
891 props[flimflam::kApnUsernameProperty].reader().get_string());
892
893 Error error;
894 apn_info.clear();
895 props.clear();
896 apn_info[flimflam::kApnProperty] = kSuppliedApn;
897 // Setting the APN has the side effect of clearing the LastGoodApn,
898 // so the try list will have 5 elements, with the first one being
899 // the supplied APN.
900 cellular_->service()->SetApn(apn_info, &error);
901 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
902 capability_->SetupConnectProperties(&props);
903 EXPECT_EQ(5, capability_->apn_try_list_.size());
904 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
905 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
906
907 apn_info.clear();
908 props.clear();
909 apn_info[flimflam::kApnProperty] = kLastGoodApn;
910 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
911 // Now when LastGoodAPN is set, it will be the one selected.
912 cellular_->service()->SetLastGoodApn(apn_info);
913 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
914 capability_->SetupConnectProperties(&props);
915 // We expect the list to contain the last good APN, plus
916 // the user-supplied APN, plus the 4 APNs from the mobile
917 // provider info database.
918 EXPECT_EQ(6, capability_->apn_try_list_.size());
919 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
920 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
921 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
922 EXPECT_EQ(kLastGoodUsername,
923 props[flimflam::kApnUsernameProperty].reader().get_string());
924}
925
Thieu Le923006b2012-04-05 16:32:58 -0700926TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
927 SetupCommonStartModemExpectations();
928 EXPECT_CALL(*card_proxy_,
929 GetSPN(_, _, CellularCapability::kTimeoutDefault))
930 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
931 EXPECT_CALL(*card_proxy_,
932 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
933 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700934 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700935
936 Error error;
937 capability_->StartModem(
938 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
939 dispatcher_.DispatchPendingEvents();
940}
941
942TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
943 SetupCommonStartModemExpectations();
944 EXPECT_CALL(*card_proxy_,
945 GetSPN(_, _, CellularCapability::kTimeoutDefault))
946 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
947 EXPECT_CALL(*card_proxy_,
948 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
949 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700950 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700951
952 Error error;
953 capability_->StartModem(
954 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
955 dispatcher_.DispatchPendingEvents();
956}
957
958TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
959 SetupCommonStartModemExpectations();
960 EXPECT_CALL(*card_proxy_,
961 GetSPN(_, _, CellularCapability::kTimeoutDefault))
962 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
963 EXPECT_CALL(*card_proxy_,
964 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
965 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -0700966 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700967
968 Error error;
969 capability_->StartModem(
970 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
971 dispatcher_.DispatchPendingEvents();
972}
973
Thieu Leb5954a22012-05-18 10:37:34 -0700974TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
975 // Make sure we don't crash if the connect failed and there is no
976 // CellularService object. This can happen if the modem is enabled and
977 // then quickly disabled.
978 SetupCommonProxiesExpectations();
979 EXPECT_CALL(*simple_proxy_,
980 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
981 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
982 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -0700983 InitProxies();
984 EXPECT_FALSE(capability_->cellular()->service());
985 Error error;
986 DBusPropertiesMap props;
987 capability_->Connect(props, &error,
988 Bind(&CellularCapabilityGSMTest::TestCallback,
989 Unretained(this)));
990}
991
Darin Petkovb05315f2011-11-07 10:14:25 +0100992} // namespace shill