blob: 8460003b68620ee4aad5230411ec5081863908c6 [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()
56 : cellular_(new Cellular(&control_,
57 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080058 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010059 NULL,
60 "",
Darin Petkov31332412012-01-28 01:50:02 +010061 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010062 0,
63 Cellular::kTypeGSM,
64 "",
65 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040066 "",
Darin Petkovb05315f2011-11-07 10:14:25 +010067 NULL)),
Thieu Le923006b2012-04-05 16:32:58 -070068 proxy_(new MockModemProxy()),
69 simple_proxy_(new MockModemSimpleProxy()),
Darin Petkovcb547732011-11-09 13:55:26 +010070 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010071 network_proxy_(new MockModemGSMNetworkProxy()),
Thieu Le923006b2012-04-05 16:32:58 -070072 proxy_factory_(this),
Darin Petkov721ac932011-11-16 15:43:09 +010073 capability_(NULL),
Darin Petkov3cfbf212011-11-21 16:02:09 +010074 device_adaptor_(NULL),
Darin Petkov1272a432011-11-10 15:53:37 +010075 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010076
Darin Petkov3e509242011-11-10 14:46:44 +010077 virtual ~CellularCapabilityGSMTest() {
78 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010079 mobile_provider_close_db(provider_db_);
80 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010081 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010082 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010083 }
84
85 virtual void SetUp() {
86 capability_ =
87 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010088 device_adaptor_ =
89 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010090 }
91
Thieu Le923006b2012-04-05 16:32:58 -070092 void InvokeEnable(bool enable, Error *error,
93 const ResultCallback &callback, int timeout) {
94 callback.Run(Error());
95 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050096 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
97 int timeout) {
98 callback.Run(kIMEI, Error());
99 }
100 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
101 int timeout) {
102 callback.Run(kIMSI, Error());
103 }
104 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
105 int timeout) {
106 callback.Run("310240123456789", Error());
107 }
Gary Morain82a31a02012-08-02 18:03:32 -0700108 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
109 int timeout) {
110 callback.Run("", Error(Error::kOperationFailed));
111 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500112 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
113 int timeout) {
114 callback.Run(kMSISDN, Error());
115 }
Thieu Le923006b2012-04-05 16:32:58 -0700116 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
117 int timeout) {
118 callback.Run("", Error(Error::kOperationFailed));
119 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500120 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
121 int timeout) {
122 callback.Run(kTestCarrier, Error());
123 }
Thieu Le923006b2012-04-05 16:32:58 -0700124 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
125 int timeout) {
126 callback.Run("", Error(Error::kOperationFailed));
127 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500128 void InvokeGetSignalQuality(Error *error,
129 const SignalQualityCallback &callback,
130 int timeout) {
131 callback.Run(kStrength, Error());
132 }
133 void InvokeGetRegistrationInfo(Error *error,
134 const RegistrationInfoCallback &callback,
135 int timeout) {
136 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
137 kTestNetwork, kTestCarrier, Error());
138 }
139 void InvokeRegister(const string &network_id,
140 Error *error,
141 const ResultCallback &callback,
142 int timeout) {
143 callback.Run(Error());
144 }
145 void InvokeEnablePIN(const string &pin, bool enable,
146 Error *error, const ResultCallback &callback,
147 int timeout) {
148 callback.Run(Error());
149 }
150 void InvokeSendPIN(const string &pin, Error *error,
151 const ResultCallback &callback, int timeout) {
152 callback.Run(Error());
153 }
154 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
155 const ResultCallback &callback, int timeout) {
156 callback.Run(Error());
157 }
158 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
159 const ResultCallback &callback, int timeout) {
160 callback.Run(Error());
161 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400162 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500163 GSMScanResults results;
164 results.push_back(GSMScanResult());
165 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
166 results.push_back(GSMScanResult());
167 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400168 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500169 }
Thieu Le923006b2012-04-05 16:32:58 -0700170 void InvokeGetModemStatus(Error *error,
171 const DBusPropertyMapCallback &callback,
172 int timeout) {
173 DBusPropertiesMap props;
174 callback.Run(props, Error());
175 }
176 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
177 int timeout) {
178 ModemHardwareInfo info;
179 callback.Run(info, Error());
180 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500181
Thieu Leb5954a22012-05-18 10:37:34 -0700182 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
183 const ResultCallback &callback, int timeout) {
184 callback.Run(Error(Error::kOperationFailed));
185 }
186
Eric Shienbrood9a245532012-03-07 14:20:39 -0500187 MOCK_METHOD1(TestCallback, void(const Error &error));
188
Darin Petkovb05315f2011-11-07 10:14:25 +0100189 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100190 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100191 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500192 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100193 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100194 static const char kPIN[];
195 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100196 static const char kIMEI[];
197 static const char kIMSI[];
198 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500199 static const char kScanID0[];
200 static const char kScanID1[];
201 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100202
Thieu Le923006b2012-04-05 16:32:58 -0700203 class TestProxyFactory : public ProxyFactory {
204 public:
205 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
206
207 virtual ModemProxyInterface *CreateModemProxy(
208 const string &/*path*/,
209 const string &/*service*/) {
210 return test_->proxy_.release();
211 }
212
213 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
214 const string &/*path*/,
215 const string &/*service*/) {
216 return test_->simple_proxy_.release();
217 }
218
219 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
220 const string &/*path*/,
221 const string &/*service*/) {
222 return test_->card_proxy_.release();
223 }
224
225 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
226 const string &/*path*/,
227 const string &/*service*/) {
228 return test_->network_proxy_.release();
229 }
230
231 private:
232 CellularCapabilityGSMTest *test_;
233 };
234
235 void SetProxy() {
236 capability_->proxy_.reset(proxy_.release());
237 }
238
Darin Petkovcb547732011-11-09 13:55:26 +0100239 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100240 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100241 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100242
Darin Petkov1272a432011-11-10 15:53:37 +0100243 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100244 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100245 }
246
Thieu Le923006b2012-04-05 16:32:58 -0700247 void SetProxyFactory() {
248 capability_->proxy_factory_ = &proxy_factory_;
249 }
250
Darin Petkov20c13ec2011-11-09 15:07:15 +0100251 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100252 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100253 }
254
255 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100256 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100257 }
258
Darin Petkov3e509242011-11-10 14:46:44 +0100259 void SetService() {
260 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800261 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100262 }
263
Darin Petkov1272a432011-11-10 15:53:37 +0100264 void InitProviderDB() {
265 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
266 ASSERT_TRUE(provider_db_);
267 cellular_->provider_db_ = provider_db_;
268 }
269
Thieu Leb5954a22012-05-18 10:37:34 -0700270 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700271 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
272 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
273 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
274 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700275 }
276
277 void SetupCommonStartModemExpectations() {
278 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700279
280 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
281 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700282 EXPECT_CALL(*card_proxy_,
283 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
284 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
285 EXPECT_CALL(*card_proxy_,
286 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
287 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
288 EXPECT_CALL(*network_proxy_, AccessTechnology());
289 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
290 EXPECT_CALL(*proxy_,
291 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
292 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
293 EXPECT_CALL(*network_proxy_,
294 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
295 EXPECT_CALL(*network_proxy_,
296 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
297 EXPECT_CALL(*this, TestCallback(IsSuccess()));
298 }
299
Thieu Leb5954a22012-05-18 10:37:34 -0700300 void InitProxies() {
301 capability_->InitProxies();
302 }
303
Darin Petkovb05315f2011-11-07 10:14:25 +0100304 NiceMockControl control_;
305 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800306 MockMetrics metrics_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100307 CellularRefPtr cellular_;
Thieu Le923006b2012-04-05 16:32:58 -0700308 scoped_ptr<MockModemProxy> proxy_;
309 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100310 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100311 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700312 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100313 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100314 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100315 mobile_provider_db *provider_db_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400316 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100317};
318
Darin Petkov31332412012-01-28 01:50:02 +0100319const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100320const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
321 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100322const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500323const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100324const char CellularCapabilityGSMTest::kPIN[] = "9876";
325const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100326const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100327const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100328const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500329const char CellularCapabilityGSMTest::kScanID0[] = "123";
330const char CellularCapabilityGSMTest::kScanID1[] = "456";
331const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100332
Darin Petkov721ac932011-11-16 15:43:09 +0100333TEST_F(CellularCapabilityGSMTest, PropertyStore) {
334 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
335}
336
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500337TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500338 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
339 .WillOnce(Invoke(this,
340 &CellularCapabilityGSMTest::InvokeGetIMEI));
341 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100342 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343 ASSERT_TRUE(capability_->imei_.empty());
344 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
345 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500346 EXPECT_EQ(kIMEI, capability_->imei_);
347}
348
349TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500350 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
351 .WillOnce(Invoke(this,
352 &CellularCapabilityGSMTest::InvokeGetIMSI))
353 .WillOnce(Invoke(this,
354 &CellularCapabilityGSMTest::InvokeGetIMSI2));
355 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500356 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500357 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
358 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700359 EXPECT_TRUE(capability_->imsi_.empty());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500360 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500361 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500362 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100363 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500364 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500365 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
366}
367
Gary Morain82a31a02012-08-02 18:03:32 -0700368// In this test, the call to the proxy's GetIMSI() will always indicate failure,
369// which will cause the retry logic to call the proxy again a number of times.
370// Eventually, the retries expire.
371TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
372 ScopedMockLog log;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700373 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700374 ::testing::StartsWith("GetIMSI failed - ")));
375 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
376 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
377 .WillRepeatedly(Invoke(this,
378 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
379 EXPECT_CALL(*this, TestCallback(IsFailure()));
380 SetCardProxy();
381 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
382 Unretained(this));
383 EXPECT_TRUE(capability_->imsi_.empty());
384
385 capability_->get_imsi_retries_ = 0;
386 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
387 capability_->get_imsi_retry_delay_milliseconds_);
388
389 // Set the delay to zero to speed up the test.
390 capability_->get_imsi_retry_delay_milliseconds_ = 0;
391 capability_->GetIMSI(callback);
392 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
393 dispatcher_.DispatchPendingEvents();
394 }
395 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
396 capability_->get_imsi_retries_);
397 EXPECT_TRUE(capability_->imsi_.empty());
398}
399
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500400TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500401 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
402 CellularCapability::kTimeoutDefault))
403 .WillOnce(Invoke(this,
404 &CellularCapabilityGSMTest::InvokeGetMSISDN));
405 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500406 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500407 ASSERT_TRUE(capability_->mdn_.empty());
408 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
409 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500410 EXPECT_EQ(kMSISDN, capability_->mdn_);
411}
412
413TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500414 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
415 .WillOnce(Invoke(this,
416 &CellularCapabilityGSMTest::InvokeGetSPN));
417 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500418 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500419 ASSERT_TRUE(capability_->spn_.empty());
420 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
421 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500422 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100423}
Darin Petkovb05315f2011-11-07 10:14:25 +0100424
Darin Petkov3e509242011-11-10 14:46:44 +0100425TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500426 EXPECT_CALL(*network_proxy_,
427 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
428 .WillOnce(Invoke(this,
429 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100430 SetNetworkProxy();
431 SetService();
432 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100433 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100434 EXPECT_EQ(kStrength, cellular_->service()->strength());
435}
436
Darin Petkov184c54e2011-11-15 12:44:39 +0100437TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500438 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
439 CellularCapability::kTimeoutRegister))
440 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
441 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100442 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500443 Error error;
444 capability_->RegisterOnNetwork(kTestNetwork, &error,
445 Bind(&CellularCapabilityGSMTest::TestCallback,
446 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500447 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100448}
449
Darin Petkovb72cf402011-11-22 14:51:39 +0100450TEST_F(CellularCapabilityGSMTest, IsRegistered) {
451 EXPECT_FALSE(capability_->IsRegistered());
452 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
453 EXPECT_FALSE(capability_->IsRegistered());
454 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
455 EXPECT_TRUE(capability_->IsRegistered());
456 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
457 EXPECT_FALSE(capability_->IsRegistered());
458 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
459 EXPECT_FALSE(capability_->IsRegistered());
460 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
461 EXPECT_FALSE(capability_->IsRegistered());
462 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
463 EXPECT_TRUE(capability_->IsRegistered());
464}
465
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500466TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
467 ASSERT_FALSE(capability_->IsRegistered());
468 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500469 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
470 .WillOnce(Invoke(this,
471 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500472 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500473 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500474 EXPECT_TRUE(capability_->IsRegistered());
475 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
476 capability_->registration_state_);
477}
478
Darin Petkovb05315f2011-11-07 10:14:25 +0100479TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500480 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
481 CellularCapability::kTimeoutDefault))
482 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
483 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100484 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500485 Error error;
486 capability_->RequirePIN(kPIN, true, &error,
487 Bind(&CellularCapabilityGSMTest::TestCallback,
488 Unretained(this)));
489 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100490}
491
492TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500493 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
494 CellularCapability::kTimeoutDefault))
495 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
496 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100497 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500498 Error error;
499 capability_->EnterPIN(kPIN, &error,
500 Bind(&CellularCapabilityGSMTest::TestCallback,
501 Unretained(this)));
502 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100503}
504
505TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500506 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
507 CellularCapability::kTimeoutDefault))
508 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
509 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100510 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500511 Error error;
512 capability_->UnblockPIN(kPUK, kPIN, &error,
513 Bind(&CellularCapabilityGSMTest::TestCallback,
514 Unretained(this)));
515 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100516}
517
518TEST_F(CellularCapabilityGSMTest, ChangePIN) {
519 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500520 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
521 CellularCapability::kTimeoutDefault))
522 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
523 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100524 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500525 Error error;
526 capability_->ChangePIN(kOldPIN, kPIN, &error,
527 Bind(&CellularCapabilityGSMTest::TestCallback,
528 Unretained(this)));
529 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100530}
531
Darin Petkovb7828b02012-02-03 12:34:30 +0100532namespace {
533
534MATCHER(SizeIs2, "") {
535 return arg.size() == 2;
536}
537
538} // namespace
539
Darin Petkov1272a432011-11-10 15:53:37 +0100540TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100541 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500542 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400543 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500544 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100545 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100546 EXPECT_CALL(*device_adaptor_,
547 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
548 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400549 EXPECT_CALL(*device_adaptor_,
550 EmitBoolChanged(flimflam::kScanningProperty, true));
551 EXPECT_FALSE(capability_->scanning_);
552
Eric Shienbrood9a245532012-03-07 14:20:39 -0500553 SetNetworkProxy();
554 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
555 Unretained(this)));
556 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400557 EXPECT_TRUE(capability_->scanning_);
558
559 // Simulate the completion of the scan...
560 EXPECT_CALL(*device_adaptor_,
561 EmitBoolChanged(flimflam::kScanningProperty, false));
562 InvokeScanReply();
563 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100564 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500565 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100566 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500567 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100568 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100569}
570
571TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
572 static const char kID[] = "123";
573 static const char kLongName[] = "long name";
574 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500575 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100576 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
577 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
578 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
579 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
580 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
581 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100582 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100583 EXPECT_EQ(5, parsed.size());
584 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
585 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
586 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
587 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
588 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
589 parsed[flimflam::kTechnologyProperty]);
590}
591
592TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
593 InitProviderDB();
594 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500595 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100596 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100597 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100598 EXPECT_EQ(2, parsed.size());
599 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
600 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
601}
602
Darin Petkovae0c64e2011-11-15 15:50:27 +0100603TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100604 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
605 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100606 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100607 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100608 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
609 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100610 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100611 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100612}
613
614TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
615 static const char kOperatorName[] = "Swisscom";
616 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100617 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100618 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100619 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100620 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
621 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100622 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
623}
624
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100625TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
626 InitProviderDB();
627 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500628 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400629 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100630 capability_->UpdateStatus(props);
631 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
632}
633
634TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
635 static const char kCountry[] = "us";
636 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500637 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100638
639 capability_->SetHomeProvider(); // No mobile provider DB available.
640 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
641 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
642 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
643
644 InitProviderDB();
645 capability_->SetHomeProvider();
646 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
647 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
648 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100649 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100650
651 Cellular::Operator oper;
652 cellular_->set_home_provider(oper);
653 capability_->spn_ = kTestCarrier;
654 capability_->SetHomeProvider();
655 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
656 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
657 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
658}
659
Darin Petkov3cfbf212011-11-21 16:02:09 +0100660namespace {
661
662MATCHER(SizeIs4, "") {
663 return arg.size() == 4;
664}
665
666} // namespace
667
668TEST_F(CellularCapabilityGSMTest, InitAPNList) {
669 InitProviderDB();
670 capability_->home_provider_ =
671 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
672 ASSERT_TRUE(capability_->home_provider_);
673 EXPECT_EQ(0, capability_->apn_list_.size());
674 EXPECT_CALL(*device_adaptor_,
675 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
676 SizeIs4()));
677 capability_->InitAPNList();
678 EXPECT_EQ(4, capability_->apn_list_.size());
679 EXPECT_EQ("wap.voicestream.com",
680 capability_->apn_list_[1][flimflam::kApnProperty]);
681 EXPECT_EQ("Web2Go/t-zones",
682 capability_->apn_list_[1][flimflam::kApnNameProperty]);
683}
684
Darin Petkov20c13ec2011-11-09 15:07:15 +0100685TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100686 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100687 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100688 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100689 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100690 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
691 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100692 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100693 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
694 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100695 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100696 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
697 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100698 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100699 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
700 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100701 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100702 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
703 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100704 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100705 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
706 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100707 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100708 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
709 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100710 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100711 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
712 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100713 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100714}
715
716TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
717 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100718 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100719 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
720 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100721 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100722 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
723 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100724 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100725 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
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_DENIED);
729 EXPECT_EQ(flimflam::kRoamingStateUnknown,
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_IDLE);
732 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100733 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100734}
735
Darin Petkovac635a82012-01-10 16:51:58 +0100736TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
737 CellularCapabilityGSM::friendly_service_name_id_ = 0;
738 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
739 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
740 capability_->serving_operator_.SetCode("1234");
741 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
742 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500743 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100744 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
745 static const char kTestOperator[] = "A GSM Operator";
746 capability_->serving_operator_.SetName(kTestOperator);
747 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
748 static const char kHomeProvider[] = "The GSM Home Provider";
749 cellular_->home_provider_.SetName(kHomeProvider);
750 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
751 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
752 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
753}
754
Darin Petkov31332412012-01-28 01:50:02 +0100755TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
756 SetService();
757 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100758 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100759 cellular_->service()->friendly_name(),
760 cellular_->service()->GetStorageIdentifier());
761 capability_->imsi_ = kIMSI;
762 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100763 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100764 cellular_->service()->GetStorageIdentifier());
765}
766
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400767TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100768 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
769 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
770 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
771 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
772 DBusPropertiesMap props;
773 static const char kLockType[] = "sim-pin";
774 const int kRetries = 3;
775 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
776 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
777 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
778 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
779 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
780 kLockType);
781 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
782 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400783 // Call with the 'wrong' interface and nothing should change.
784 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
785 vector<string>());
786 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
787 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
788 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
789 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
790
Gary Morainbaeefdf2012-04-30 14:53:35 -0700791 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
792 // to the enabled state of the SIM lock.
793 KeyValueStore lock_status;
794 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
795 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
796 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
797
798 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
799 flimflam::kSIMLockStatusProperty,
800 KeyValueStoreEq(lock_status)));
801
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400802 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400803 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100804 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400805 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
806 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100807 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700808 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
809 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
810
811 // Some properties are sent on the MM_MODEM_INTERFACE.
812 capability_->sim_lock_status_.enabled = false;
813 capability_->sim_lock_status_.lock_type = "";
814 capability_->sim_lock_status_.retries_left = 0;
815 KeyValueStore lock_status2;
816 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
817 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
818 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
819 EXPECT_CALL(*device_adaptor_,
820 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
821 KeyValueStoreEq(lock_status2)));
822 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
823 vector<string>());
824 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100825 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
826 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
827}
828
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400829TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
830 static const string kTmobileApn("epc.tmobile.com");
831 static const string kLastGoodApn("remembered.apn");
832 static const string kLastGoodUsername("remembered.user");
833 static const string kSuppliedApn("my.apn");
834
835 SetService();
836 capability_->imsi_ = "310240123456789";
837 InitProviderDB();
838 capability_->SetHomeProvider();
839 DBusPropertiesMap props;
840 capability_->SetupConnectProperties(&props);
841 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
842 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
843
844 ProfileRefPtr profile(new NiceMock<MockProfile>(
845 &control_, reinterpret_cast<Manager *>(NULL)));
846 cellular_->service()->set_profile(profile);
847 Stringmap apn_info;
848 apn_info[flimflam::kApnProperty] = kLastGoodApn;
849 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
850 cellular_->service()->SetLastGoodApn(apn_info);
851 props.clear();
852 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
853 capability_->SetupConnectProperties(&props);
854 // We expect the list to contain the last good APN, plus
855 // the 4 APNs from the mobile provider info database.
856 EXPECT_EQ(5, capability_->apn_try_list_.size());
857 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
858 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
859 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
860 EXPECT_EQ(kLastGoodUsername,
861 props[flimflam::kApnUsernameProperty].reader().get_string());
862
863 Error error;
864 apn_info.clear();
865 props.clear();
866 apn_info[flimflam::kApnProperty] = kSuppliedApn;
867 // Setting the APN has the side effect of clearing the LastGoodApn,
868 // so the try list will have 5 elements, with the first one being
869 // the supplied APN.
870 cellular_->service()->SetApn(apn_info, &error);
871 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
872 capability_->SetupConnectProperties(&props);
873 EXPECT_EQ(5, capability_->apn_try_list_.size());
874 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
875 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
876
877 apn_info.clear();
878 props.clear();
879 apn_info[flimflam::kApnProperty] = kLastGoodApn;
880 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
881 // Now when LastGoodAPN is set, it will be the one selected.
882 cellular_->service()->SetLastGoodApn(apn_info);
883 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
884 capability_->SetupConnectProperties(&props);
885 // We expect the list to contain the last good APN, plus
886 // the user-supplied APN, plus the 4 APNs from the mobile
887 // provider info database.
888 EXPECT_EQ(6, capability_->apn_try_list_.size());
889 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
890 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
891 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
892 EXPECT_EQ(kLastGoodUsername,
893 props[flimflam::kApnUsernameProperty].reader().get_string());
894}
895
Thieu Le923006b2012-04-05 16:32:58 -0700896TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
897 SetupCommonStartModemExpectations();
898 EXPECT_CALL(*card_proxy_,
899 GetSPN(_, _, CellularCapability::kTimeoutDefault))
900 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
901 EXPECT_CALL(*card_proxy_,
902 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
903 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
904 SetProxyFactory();
905
906 Error error;
907 capability_->StartModem(
908 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
909 dispatcher_.DispatchPendingEvents();
910}
911
912TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
913 SetupCommonStartModemExpectations();
914 EXPECT_CALL(*card_proxy_,
915 GetSPN(_, _, CellularCapability::kTimeoutDefault))
916 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
917 EXPECT_CALL(*card_proxy_,
918 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
919 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
920 SetProxyFactory();
921
922 Error error;
923 capability_->StartModem(
924 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
925 dispatcher_.DispatchPendingEvents();
926}
927
928TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
929 SetupCommonStartModemExpectations();
930 EXPECT_CALL(*card_proxy_,
931 GetSPN(_, _, CellularCapability::kTimeoutDefault))
932 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
933 EXPECT_CALL(*card_proxy_,
934 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
935 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
936 SetProxyFactory();
937
938 Error error;
939 capability_->StartModem(
940 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
941 dispatcher_.DispatchPendingEvents();
942}
943
Thieu Leb5954a22012-05-18 10:37:34 -0700944TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
945 // Make sure we don't crash if the connect failed and there is no
946 // CellularService object. This can happen if the modem is enabled and
947 // then quickly disabled.
948 SetupCommonProxiesExpectations();
949 EXPECT_CALL(*simple_proxy_,
950 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
951 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
952 EXPECT_CALL(*this, TestCallback(IsFailure()));
953 SetProxyFactory();
954 InitProxies();
955 EXPECT_FALSE(capability_->cellular()->service());
956 Error error;
957 DBusPropertiesMap props;
958 capability_->Connect(props, &error,
959 Bind(&CellularCapabilityGSMTest::TestCallback,
960 Unretained(this)));
961}
962
Darin Petkovb05315f2011-11-07 10:14:25 +0100963} // namespace shill