blob: 5829ed9bd34e0acdc163638fa2e3608e92fcca00 [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 Petkova4ca3c32012-08-17 16:05:24 +020011#include <base/stringprintf.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010012#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010013#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010014#include <mm/mm-modem.h>
Darin Petkov1272a432011-11-10 15:53:37 +010015#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010016
17#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010018#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010019#include "shill/error.h"
20#include "shill/event_dispatcher.h"
Gary Morainbaeefdf2012-04-30 14:53:35 -070021#include "shill/key_value_store_matcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010022#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070023#include "shill/mock_log.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080024#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010025#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010026#include "shill/mock_modem_gsm_network_proxy.h"
Thieu Le923006b2012-04-05 16:32:58 -070027#include "shill/mock_modem_proxy.h"
28#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040029#include "shill/mock_profile.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010030#include "shill/nice_mock_control.h"
Thieu Le923006b2012-04-05 16:32:58 -070031#include "shill/proxy_factory.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010032
Eric Shienbrood9a245532012-03-07 14:20:39 -050033using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020034using base::StringPrintf;
Eric Shienbrood9a245532012-03-07 14:20:39 -050035using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010036using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040037using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010038using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050039using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010040using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010041using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040042using testing::SaveArg;
Paul Stewart1e5bad52012-08-04 17:13:19 -070043using testing::StrEq;
Darin Petkovcb547732011-11-09 13:55:26 +010044
Darin Petkovb05315f2011-11-07 10:14:25 +010045namespace shill {
46
Eric Shienbrood9a245532012-03-07 14:20:39 -050047MATCHER(IsSuccess, "") {
48 return arg.IsSuccess();
49}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050050
Thieu Leb5954a22012-05-18 10:37:34 -070051MATCHER(IsFailure, "") {
52 return arg.IsFailure();
53}
54
Darin Petkovb05315f2011-11-07 10:14:25 +010055class CellularCapabilityGSMTest : public testing::Test {
56 public:
57 CellularCapabilityGSMTest()
Ben Chan3ecdf822012-08-06 12:29:23 -070058 : create_card_proxy_from_factory_(false),
59 proxy_(new MockModemProxy()),
60 simple_proxy_(new MockModemSimpleProxy()),
61 card_proxy_(new MockModemGSMCardProxy()),
62 network_proxy_(new MockModemGSMNetworkProxy()),
63 proxy_factory_(this),
64 capability_(NULL),
65 device_adaptor_(NULL),
66 provider_db_(NULL),
67 cellular_(new Cellular(&control_,
Darin Petkovb05315f2011-11-07 10:14:25 +010068 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080069 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010070 NULL,
71 "",
Darin Petkov31332412012-01-28 01:50:02 +010072 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010073 0,
74 Cellular::kTypeGSM,
75 "",
76 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040077 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070078 NULL,
79 &proxy_factory_)) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010080
Darin Petkov3e509242011-11-10 14:46:44 +010081 virtual ~CellularCapabilityGSMTest() {
82 cellular_->service_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +020083 if (provider_db_) {
84 mobile_provider_close_db(provider_db_);
85 provider_db_ = NULL;
86 }
Darin Petkov721ac932011-11-16 15:43:09 +010087 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010088 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010089 }
90
91 virtual void SetUp() {
92 capability_ =
93 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010094 device_adaptor_ =
95 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010096 }
97
Thieu Le923006b2012-04-05 16:32:58 -070098 void InvokeEnable(bool enable, Error *error,
99 const ResultCallback &callback, int timeout) {
100 callback.Run(Error());
101 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500102 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
103 int timeout) {
104 callback.Run(kIMEI, Error());
105 }
106 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
107 int timeout) {
108 callback.Run(kIMSI, Error());
109 }
110 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
111 int timeout) {
112 callback.Run("310240123456789", Error());
113 }
Gary Morain82a31a02012-08-02 18:03:32 -0700114 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
115 int timeout) {
116 callback.Run("", Error(Error::kOperationFailed));
117 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500118 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
119 int timeout) {
120 callback.Run(kMSISDN, Error());
121 }
Thieu Le923006b2012-04-05 16:32:58 -0700122 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
123 int timeout) {
124 callback.Run("", Error(Error::kOperationFailed));
125 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500126 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
127 int timeout) {
128 callback.Run(kTestCarrier, Error());
129 }
Thieu Le923006b2012-04-05 16:32:58 -0700130 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
131 int timeout) {
132 callback.Run("", Error(Error::kOperationFailed));
133 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500134 void InvokeGetSignalQuality(Error *error,
135 const SignalQualityCallback &callback,
136 int timeout) {
137 callback.Run(kStrength, Error());
138 }
139 void InvokeGetRegistrationInfo(Error *error,
140 const RegistrationInfoCallback &callback,
141 int timeout) {
142 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
143 kTestNetwork, kTestCarrier, Error());
144 }
145 void InvokeRegister(const string &network_id,
146 Error *error,
147 const ResultCallback &callback,
148 int timeout) {
149 callback.Run(Error());
150 }
151 void InvokeEnablePIN(const string &pin, bool enable,
152 Error *error, const ResultCallback &callback,
153 int timeout) {
154 callback.Run(Error());
155 }
156 void InvokeSendPIN(const string &pin, Error *error,
157 const ResultCallback &callback, int timeout) {
158 callback.Run(Error());
159 }
160 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
161 const ResultCallback &callback, int timeout) {
162 callback.Run(Error());
163 }
164 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
165 const ResultCallback &callback, int timeout) {
166 callback.Run(Error());
167 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400168 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500169 GSMScanResults results;
170 results.push_back(GSMScanResult());
171 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
172 results.push_back(GSMScanResult());
173 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400174 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500175 }
Thieu Le923006b2012-04-05 16:32:58 -0700176 void InvokeGetModemStatus(Error *error,
177 const DBusPropertyMapCallback &callback,
178 int timeout) {
179 DBusPropertiesMap props;
180 callback.Run(props, Error());
181 }
182 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
183 int timeout) {
184 ModemHardwareInfo info;
185 callback.Run(info, Error());
186 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500187
Thieu Leb5954a22012-05-18 10:37:34 -0700188 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
189 const ResultCallback &callback, int timeout) {
190 callback.Run(Error(Error::kOperationFailed));
191 }
192
Eric Shienbrood9a245532012-03-07 14:20:39 -0500193 MOCK_METHOD1(TestCallback, void(const Error &error));
194
Darin Petkovb05315f2011-11-07 10:14:25 +0100195 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100196 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100197 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500198 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100199 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100200 static const char kPIN[];
201 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100202 static const char kIMEI[];
203 static const char kIMSI[];
204 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500205 static const char kScanID0[];
206 static const char kScanID1[];
207 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100208
Thieu Le923006b2012-04-05 16:32:58 -0700209 class TestProxyFactory : public ProxyFactory {
210 public:
211 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
212
213 virtual ModemProxyInterface *CreateModemProxy(
214 const string &/*path*/,
215 const string &/*service*/) {
216 return test_->proxy_.release();
217 }
218
219 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
220 const string &/*path*/,
221 const string &/*service*/) {
222 return test_->simple_proxy_.release();
223 }
224
225 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
226 const string &/*path*/,
227 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700228 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
229 // CellularCapabilityGSM::InitProperties (and thus
230 // CellularCapabilityGSM::GetIMSI) from being called during the
231 // construction. Remove this workaround after refactoring the tests.
232 return test_->create_card_proxy_from_factory_ ?
233 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700234 }
235
236 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
237 const string &/*path*/,
238 const string &/*service*/) {
239 return test_->network_proxy_.release();
240 }
241
242 private:
243 CellularCapabilityGSMTest *test_;
244 };
245
246 void SetProxy() {
247 capability_->proxy_.reset(proxy_.release());
248 }
249
Darin Petkovcb547732011-11-09 13:55:26 +0100250 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100251 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100252 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100253
Darin Petkov1272a432011-11-10 15:53:37 +0100254 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100255 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100256 }
257
Darin Petkov20c13ec2011-11-09 15:07:15 +0100258 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100259 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100260 }
261
262 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100263 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100264 }
265
Darin Petkov3e509242011-11-10 14:46:44 +0100266 void SetService() {
267 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800268 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100269 }
270
Darin Petkov1272a432011-11-10 15:53:37 +0100271 void InitProviderDB() {
272 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
273 ASSERT_TRUE(provider_db_);
274 cellular_->provider_db_ = provider_db_;
275 }
276
Thieu Leb5954a22012-05-18 10:37:34 -0700277 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700278 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
279 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
280 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
281 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700282 }
283
284 void SetupCommonStartModemExpectations() {
285 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700286
287 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
288 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700289 EXPECT_CALL(*card_proxy_,
290 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
291 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
292 EXPECT_CALL(*card_proxy_,
293 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
294 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
295 EXPECT_CALL(*network_proxy_, AccessTechnology());
296 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
297 EXPECT_CALL(*proxy_,
298 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
299 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
300 EXPECT_CALL(*network_proxy_,
301 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
302 EXPECT_CALL(*network_proxy_,
303 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
304 EXPECT_CALL(*this, TestCallback(IsSuccess()));
305 }
306
Thieu Leb5954a22012-05-18 10:37:34 -0700307 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700308 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700309 capability_->InitProxies();
310 }
311
Ben Chan3ecdf822012-08-06 12:29:23 -0700312 void AllowCreateCardProxyFromFactory() {
313 create_card_proxy_from_factory_ = true;
314 }
315
Darin Petkovb05315f2011-11-07 10:14:25 +0100316 NiceMockControl control_;
317 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800318 MockMetrics metrics_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700319 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700320 scoped_ptr<MockModemProxy> proxy_;
321 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100322 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100323 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700324 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100325 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100326 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100327 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700328 CellularRefPtr cellular_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400329 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100330};
331
Darin Petkov31332412012-01-28 01:50:02 +0100332const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100333const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
334 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100335const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500336const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100337const char CellularCapabilityGSMTest::kPIN[] = "9876";
338const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100339const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100340const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100341const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500342const char CellularCapabilityGSMTest::kScanID0[] = "123";
343const char CellularCapabilityGSMTest::kScanID1[] = "456";
344const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100345
Darin Petkov721ac932011-11-16 15:43:09 +0100346TEST_F(CellularCapabilityGSMTest, PropertyStore) {
347 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
348}
349
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500350TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500351 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
352 .WillOnce(Invoke(this,
353 &CellularCapabilityGSMTest::InvokeGetIMEI));
354 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100355 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500356 ASSERT_TRUE(capability_->imei_.empty());
357 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
358 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500359 EXPECT_EQ(kIMEI, capability_->imei_);
360}
361
362TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500363 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
364 .WillOnce(Invoke(this,
365 &CellularCapabilityGSMTest::InvokeGetIMSI))
366 .WillOnce(Invoke(this,
367 &CellularCapabilityGSMTest::InvokeGetIMSI2));
368 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500369 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500370 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
371 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700372 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700373 EXPECT_FALSE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500374 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500375 EXPECT_EQ(kIMSI, capability_->imsi_);
Ben Chanbd3aee82012-10-16 23:52:04 -0700376 EXPECT_TRUE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500377 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100378 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500379 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500380 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
381}
382
Gary Morain82a31a02012-08-02 18:03:32 -0700383// In this test, the call to the proxy's GetIMSI() will always indicate failure,
384// which will cause the retry logic to call the proxy again a number of times.
385// Eventually, the retries expire.
386TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
387 ScopedMockLog log;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700388 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700389 ::testing::StartsWith("GetIMSI failed - ")));
390 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
391 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
392 .WillRepeatedly(Invoke(this,
393 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
394 EXPECT_CALL(*this, TestCallback(IsFailure()));
395 SetCardProxy();
396 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
397 Unretained(this));
398 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700399 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700400
401 capability_->get_imsi_retries_ = 0;
402 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
403 capability_->get_imsi_retry_delay_milliseconds_);
404
405 // Set the delay to zero to speed up the test.
406 capability_->get_imsi_retry_delay_milliseconds_ = 0;
407 capability_->GetIMSI(callback);
408 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
409 dispatcher_.DispatchPendingEvents();
410 }
411 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
412 capability_->get_imsi_retries_);
413 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700414 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700415}
416
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500417TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500418 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
419 CellularCapability::kTimeoutDefault))
420 .WillOnce(Invoke(this,
421 &CellularCapabilityGSMTest::InvokeGetMSISDN));
422 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500423 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500424 ASSERT_TRUE(capability_->mdn_.empty());
425 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
426 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500427 EXPECT_EQ(kMSISDN, capability_->mdn_);
428}
429
430TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500431 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
432 .WillOnce(Invoke(this,
433 &CellularCapabilityGSMTest::InvokeGetSPN));
434 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500435 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500436 ASSERT_TRUE(capability_->spn_.empty());
437 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
438 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500439 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100440}
Darin Petkovb05315f2011-11-07 10:14:25 +0100441
Darin Petkov3e509242011-11-10 14:46:44 +0100442TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500443 EXPECT_CALL(*network_proxy_,
444 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
445 .WillOnce(Invoke(this,
446 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100447 SetNetworkProxy();
448 SetService();
449 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100450 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100451 EXPECT_EQ(kStrength, cellular_->service()->strength());
452}
453
Darin Petkov184c54e2011-11-15 12:44:39 +0100454TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
456 CellularCapability::kTimeoutRegister))
457 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
458 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100459 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500460 Error error;
461 capability_->RegisterOnNetwork(kTestNetwork, &error,
462 Bind(&CellularCapabilityGSMTest::TestCallback,
463 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500464 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100465}
466
Darin Petkovb72cf402011-11-22 14:51:39 +0100467TEST_F(CellularCapabilityGSMTest, IsRegistered) {
468 EXPECT_FALSE(capability_->IsRegistered());
469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
470 EXPECT_FALSE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
472 EXPECT_TRUE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
474 EXPECT_FALSE(capability_->IsRegistered());
475 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
476 EXPECT_FALSE(capability_->IsRegistered());
477 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
478 EXPECT_FALSE(capability_->IsRegistered());
479 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
480 EXPECT_TRUE(capability_->IsRegistered());
481}
482
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500483TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
484 ASSERT_FALSE(capability_->IsRegistered());
485 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500486 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
487 .WillOnce(Invoke(this,
488 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500489 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500490 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500491 EXPECT_TRUE(capability_->IsRegistered());
492 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
493 capability_->registration_state_);
494}
495
Darin Petkovb05315f2011-11-07 10:14:25 +0100496TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500497 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
498 CellularCapability::kTimeoutDefault))
499 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
500 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100501 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500502 Error error;
503 capability_->RequirePIN(kPIN, true, &error,
504 Bind(&CellularCapabilityGSMTest::TestCallback,
505 Unretained(this)));
506 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100507}
508
509TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500510 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
511 CellularCapability::kTimeoutDefault))
512 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
513 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100514 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500515 Error error;
516 capability_->EnterPIN(kPIN, &error,
517 Bind(&CellularCapabilityGSMTest::TestCallback,
518 Unretained(this)));
519 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100520}
521
522TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500523 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
524 CellularCapability::kTimeoutDefault))
525 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
526 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100527 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500528 Error error;
529 capability_->UnblockPIN(kPUK, kPIN, &error,
530 Bind(&CellularCapabilityGSMTest::TestCallback,
531 Unretained(this)));
532 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100533}
534
535TEST_F(CellularCapabilityGSMTest, ChangePIN) {
536 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500537 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
538 CellularCapability::kTimeoutDefault))
539 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
540 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100541 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500542 Error error;
543 capability_->ChangePIN(kOldPIN, kPIN, &error,
544 Bind(&CellularCapabilityGSMTest::TestCallback,
545 Unretained(this)));
546 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100547}
548
Darin Petkovb7828b02012-02-03 12:34:30 +0100549namespace {
550
551MATCHER(SizeIs2, "") {
552 return arg.size() == 2;
553}
554
555} // namespace
556
Darin Petkov1272a432011-11-10 15:53:37 +0100557TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100558 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500559 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400560 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500561 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100562 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100563 EXPECT_CALL(*device_adaptor_,
564 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
565 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400566 EXPECT_CALL(*device_adaptor_,
567 EmitBoolChanged(flimflam::kScanningProperty, true));
568 EXPECT_FALSE(capability_->scanning_);
569
Eric Shienbrood9a245532012-03-07 14:20:39 -0500570 SetNetworkProxy();
571 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
572 Unretained(this)));
573 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400574 EXPECT_TRUE(capability_->scanning_);
575
576 // Simulate the completion of the scan...
577 EXPECT_CALL(*device_adaptor_,
578 EmitBoolChanged(flimflam::kScanningProperty, false));
579 InvokeScanReply();
580 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100581 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500582 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100583 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500584 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100585 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100586}
587
588TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
589 static const char kID[] = "123";
590 static const char kLongName[] = "long name";
591 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500592 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100593 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
594 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
595 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
596 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
597 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
598 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100599 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100600 EXPECT_EQ(5, parsed.size());
601 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
602 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
603 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
604 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
605 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
606 parsed[flimflam::kTechnologyProperty]);
607}
608
609TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
610 InitProviderDB();
611 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500612 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100613 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100614 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100615 EXPECT_EQ(2, parsed.size());
616 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
617 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
618}
619
Darin Petkovae0c64e2011-11-15 15:50:27 +0100620TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100621 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
622 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100623 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100624 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100625 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
626 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100627 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100628 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100629}
630
631TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
632 static const char kOperatorName[] = "Swisscom";
633 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100634 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100635 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100636 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100637 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
638 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100639 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200640
641 static const char kTestOperator[] = "Testcom";
642 capability_->serving_operator_.SetName(kTestOperator);
643 capability_->serving_operator_.SetCountry("");
644 capability_->UpdateOperatorInfo();
645 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
646 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
647 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100648}
649
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100650TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
651 InitProviderDB();
652 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500653 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400654 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100655 capability_->UpdateStatus(props);
656 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
657}
658
Darin Petkovf508c822012-09-21 13:43:17 +0200659TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
660 EXPECT_FALSE(cellular_->allow_roaming_);
661 EXPECT_FALSE(capability_->provider_requires_roaming_);
662 EXPECT_FALSE(capability_->AllowRoaming());
663 capability_->provider_requires_roaming_ = true;
664 EXPECT_TRUE(capability_->AllowRoaming());
665 capability_->provider_requires_roaming_ = false;
666 cellular_->allow_roaming_ = true;
667 EXPECT_TRUE(capability_->AllowRoaming());
668}
669
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100670TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
671 static const char kCountry[] = "us";
672 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500673 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100674
Darin Petkovf508c822012-09-21 13:43:17 +0200675 EXPECT_FALSE(capability_->home_provider_);
676 EXPECT_FALSE(capability_->provider_requires_roaming_);
677
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100678 capability_->SetHomeProvider(); // No mobile provider DB available.
679 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
680 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
681 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200682 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100683
684 InitProviderDB();
685 capability_->SetHomeProvider();
686 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
687 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
688 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100689 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200690 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200691 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100692
693 Cellular::Operator oper;
694 cellular_->set_home_provider(oper);
695 capability_->spn_ = kTestCarrier;
696 capability_->SetHomeProvider();
697 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
698 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
699 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200700 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200701
702 static const char kCubic[] = "Cubic";
703 capability_->spn_ = kCubic;
704 capability_->SetHomeProvider();
705 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
706 EXPECT_EQ("", cellular_->home_provider().GetCode());
707 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200708 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200709
710 static const char kCUBIC[] = "CUBIC";
711 capability_->spn_ = kCUBIC;
712 capability_->home_provider_ = NULL;
713 capability_->SetHomeProvider();
714 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
715 EXPECT_EQ("", cellular_->home_provider().GetCode());
716 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200717 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100718}
719
Darin Petkov3cfbf212011-11-21 16:02:09 +0100720namespace {
721
722MATCHER(SizeIs4, "") {
723 return arg.size() == 4;
724}
725
726} // namespace
727
728TEST_F(CellularCapabilityGSMTest, InitAPNList) {
729 InitProviderDB();
730 capability_->home_provider_ =
731 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
732 ASSERT_TRUE(capability_->home_provider_);
733 EXPECT_EQ(0, capability_->apn_list_.size());
734 EXPECT_CALL(*device_adaptor_,
735 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
736 SizeIs4()));
737 capability_->InitAPNList();
738 EXPECT_EQ(4, capability_->apn_list_.size());
739 EXPECT_EQ("wap.voicestream.com",
740 capability_->apn_list_[1][flimflam::kApnProperty]);
741 EXPECT_EQ("Web2Go/t-zones",
742 capability_->apn_list_[1][flimflam::kApnNameProperty]);
743}
744
Darin Petkov20c13ec2011-11-09 15:07:15 +0100745TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100746 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100747 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100748 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100749 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100750 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
751 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100752 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100753 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
754 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100755 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100756 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
757 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100758 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100759 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
760 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100761 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100762 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
763 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100764 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100765 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
766 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100767 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100768 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
769 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100770 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100771 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
772 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100773 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100774}
775
776TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
777 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100778 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100779 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
780 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100781 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100782 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
783 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100784 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100785 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
786 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100787 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100788 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
789 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100790 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100791 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
792 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100793 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100794}
795
Darin Petkovac635a82012-01-10 16:51:58 +0100796TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
797 CellularCapabilityGSM::friendly_service_name_id_ = 0;
798 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
799 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200800
Darin Petkovac635a82012-01-10 16:51:58 +0100801 capability_->serving_operator_.SetCode("1234");
802 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200803
Darin Petkovac635a82012-01-10 16:51:58 +0100804 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500805 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100806 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200807
808 static const char kHomeProvider[] = "The GSM Home Provider";
809 cellular_->home_provider_.SetName(kHomeProvider);
810 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
811 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
812 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
813
Darin Petkovac635a82012-01-10 16:51:58 +0100814 static const char kTestOperator[] = "A GSM Operator";
815 capability_->serving_operator_.SetName(kTestOperator);
816 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200817
818 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING;
819 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
820 capability_->CreateFriendlyServiceName());
Darin Petkovac635a82012-01-10 16:51:58 +0100821}
822
Darin Petkov31332412012-01-28 01:50:02 +0100823TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
824 SetService();
825 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100826 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100827 cellular_->service()->friendly_name(),
828 cellular_->service()->GetStorageIdentifier());
829 capability_->imsi_ = kIMSI;
830 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100831 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100832 cellular_->service()->GetStorageIdentifier());
833}
834
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400835TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100836 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
837 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
838 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
839 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
840 DBusPropertiesMap props;
841 static const char kLockType[] = "sim-pin";
842 const int kRetries = 3;
843 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
844 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
845 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
846 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
847 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
848 kLockType);
849 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
850 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400851 // Call with the 'wrong' interface and nothing should change.
852 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
853 vector<string>());
854 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
855 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
856 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
857 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
858
Gary Morainbaeefdf2012-04-30 14:53:35 -0700859 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
860 // to the enabled state of the SIM lock.
861 KeyValueStore lock_status;
862 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
863 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
864 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
865
866 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
867 flimflam::kSIMLockStatusProperty,
868 KeyValueStoreEq(lock_status)));
869
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400870 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400871 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100872 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400873 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
874 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100875 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700876 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
877 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
878
879 // Some properties are sent on the MM_MODEM_INTERFACE.
880 capability_->sim_lock_status_.enabled = false;
881 capability_->sim_lock_status_.lock_type = "";
882 capability_->sim_lock_status_.retries_left = 0;
883 KeyValueStore lock_status2;
884 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
885 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
886 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
887 EXPECT_CALL(*device_adaptor_,
888 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
889 KeyValueStoreEq(lock_status2)));
890 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
891 vector<string>());
892 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100893 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
894 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
895}
896
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400897TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
898 static const string kTmobileApn("epc.tmobile.com");
899 static const string kLastGoodApn("remembered.apn");
900 static const string kLastGoodUsername("remembered.user");
901 static const string kSuppliedApn("my.apn");
902
903 SetService();
904 capability_->imsi_ = "310240123456789";
905 InitProviderDB();
906 capability_->SetHomeProvider();
907 DBusPropertiesMap props;
908 capability_->SetupConnectProperties(&props);
909 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
910 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
911
912 ProfileRefPtr profile(new NiceMock<MockProfile>(
913 &control_, reinterpret_cast<Manager *>(NULL)));
914 cellular_->service()->set_profile(profile);
915 Stringmap apn_info;
916 apn_info[flimflam::kApnProperty] = kLastGoodApn;
917 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
918 cellular_->service()->SetLastGoodApn(apn_info);
919 props.clear();
920 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
921 capability_->SetupConnectProperties(&props);
922 // We expect the list to contain the last good APN, plus
923 // the 4 APNs from the mobile provider info database.
924 EXPECT_EQ(5, capability_->apn_try_list_.size());
925 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
926 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
927 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
928 EXPECT_EQ(kLastGoodUsername,
929 props[flimflam::kApnUsernameProperty].reader().get_string());
930
931 Error error;
932 apn_info.clear();
933 props.clear();
934 apn_info[flimflam::kApnProperty] = kSuppliedApn;
935 // Setting the APN has the side effect of clearing the LastGoodApn,
936 // so the try list will have 5 elements, with the first one being
937 // the supplied APN.
938 cellular_->service()->SetApn(apn_info, &error);
939 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
940 capability_->SetupConnectProperties(&props);
941 EXPECT_EQ(5, capability_->apn_try_list_.size());
942 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
943 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
944
945 apn_info.clear();
946 props.clear();
947 apn_info[flimflam::kApnProperty] = kLastGoodApn;
948 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
949 // Now when LastGoodAPN is set, it will be the one selected.
950 cellular_->service()->SetLastGoodApn(apn_info);
951 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
952 capability_->SetupConnectProperties(&props);
953 // We expect the list to contain the last good APN, plus
954 // the user-supplied APN, plus the 4 APNs from the mobile
955 // provider info database.
956 EXPECT_EQ(6, capability_->apn_try_list_.size());
957 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
958 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
959 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
960 EXPECT_EQ(kLastGoodUsername,
961 props[flimflam::kApnUsernameProperty].reader().get_string());
962}
963
Thieu Le923006b2012-04-05 16:32:58 -0700964TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
965 SetupCommonStartModemExpectations();
966 EXPECT_CALL(*card_proxy_,
967 GetSPN(_, _, CellularCapability::kTimeoutDefault))
968 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
969 EXPECT_CALL(*card_proxy_,
970 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
971 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700972 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700973
974 Error error;
975 capability_->StartModem(
976 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
977 dispatcher_.DispatchPendingEvents();
978}
979
980TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
981 SetupCommonStartModemExpectations();
982 EXPECT_CALL(*card_proxy_,
983 GetSPN(_, _, CellularCapability::kTimeoutDefault))
984 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
985 EXPECT_CALL(*card_proxy_,
986 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
987 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700988 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700989
990 Error error;
991 capability_->StartModem(
992 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
993 dispatcher_.DispatchPendingEvents();
994}
995
996TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
997 SetupCommonStartModemExpectations();
998 EXPECT_CALL(*card_proxy_,
999 GetSPN(_, _, CellularCapability::kTimeoutDefault))
1000 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
1001 EXPECT_CALL(*card_proxy_,
1002 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
1003 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -07001004 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -07001005
1006 Error error;
1007 capability_->StartModem(
1008 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
1009 dispatcher_.DispatchPendingEvents();
1010}
1011
Thieu Leb5954a22012-05-18 10:37:34 -07001012TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
1013 // Make sure we don't crash if the connect failed and there is no
1014 // CellularService object. This can happen if the modem is enabled and
1015 // then quickly disabled.
1016 SetupCommonProxiesExpectations();
1017 EXPECT_CALL(*simple_proxy_,
1018 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
1019 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
1020 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -07001021 InitProxies();
1022 EXPECT_FALSE(capability_->cellular()->service());
1023 Error error;
1024 DBusPropertiesMap props;
1025 capability_->Connect(props, &error,
1026 Bind(&CellularCapabilityGSMTest::TestCallback,
1027 Unretained(this)));
1028}
1029
Darin Petkovb05315f2011-11-07 10:14:25 +01001030} // namespace shill