blob: 72f1126515d166f36fab146eaefc961b832ddde5 [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());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500373 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500374 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500375 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100376 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500377 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500378 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
379}
380
Gary Morain82a31a02012-08-02 18:03:32 -0700381// In this test, the call to the proxy's GetIMSI() will always indicate failure,
382// which will cause the retry logic to call the proxy again a number of times.
383// Eventually, the retries expire.
384TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
385 ScopedMockLog log;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700386 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700387 ::testing::StartsWith("GetIMSI failed - ")));
388 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
389 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
390 .WillRepeatedly(Invoke(this,
391 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
392 EXPECT_CALL(*this, TestCallback(IsFailure()));
393 SetCardProxy();
394 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
395 Unretained(this));
396 EXPECT_TRUE(capability_->imsi_.empty());
397
398 capability_->get_imsi_retries_ = 0;
399 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
400 capability_->get_imsi_retry_delay_milliseconds_);
401
402 // Set the delay to zero to speed up the test.
403 capability_->get_imsi_retry_delay_milliseconds_ = 0;
404 capability_->GetIMSI(callback);
405 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
406 dispatcher_.DispatchPendingEvents();
407 }
408 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
409 capability_->get_imsi_retries_);
410 EXPECT_TRUE(capability_->imsi_.empty());
411}
412
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500413TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500414 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
415 CellularCapability::kTimeoutDefault))
416 .WillOnce(Invoke(this,
417 &CellularCapabilityGSMTest::InvokeGetMSISDN));
418 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500419 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500420 ASSERT_TRUE(capability_->mdn_.empty());
421 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
422 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500423 EXPECT_EQ(kMSISDN, capability_->mdn_);
424}
425
426TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500427 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
428 .WillOnce(Invoke(this,
429 &CellularCapabilityGSMTest::InvokeGetSPN));
430 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500431 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500432 ASSERT_TRUE(capability_->spn_.empty());
433 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
434 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500435 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100436}
Darin Petkovb05315f2011-11-07 10:14:25 +0100437
Darin Petkov3e509242011-11-10 14:46:44 +0100438TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500439 EXPECT_CALL(*network_proxy_,
440 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
441 .WillOnce(Invoke(this,
442 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100443 SetNetworkProxy();
444 SetService();
445 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100446 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100447 EXPECT_EQ(kStrength, cellular_->service()->strength());
448}
449
Darin Petkov184c54e2011-11-15 12:44:39 +0100450TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500451 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
452 CellularCapability::kTimeoutRegister))
453 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
454 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100455 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500456 Error error;
457 capability_->RegisterOnNetwork(kTestNetwork, &error,
458 Bind(&CellularCapabilityGSMTest::TestCallback,
459 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500460 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100461}
462
Darin Petkovb72cf402011-11-22 14:51:39 +0100463TEST_F(CellularCapabilityGSMTest, IsRegistered) {
464 EXPECT_FALSE(capability_->IsRegistered());
465 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
466 EXPECT_FALSE(capability_->IsRegistered());
467 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
468 EXPECT_TRUE(capability_->IsRegistered());
469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
470 EXPECT_FALSE(capability_->IsRegistered());
471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
472 EXPECT_FALSE(capability_->IsRegistered());
473 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
474 EXPECT_FALSE(capability_->IsRegistered());
475 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
476 EXPECT_TRUE(capability_->IsRegistered());
477}
478
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500479TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
480 ASSERT_FALSE(capability_->IsRegistered());
481 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500482 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
483 .WillOnce(Invoke(this,
484 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500485 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500486 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500487 EXPECT_TRUE(capability_->IsRegistered());
488 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
489 capability_->registration_state_);
490}
491
Darin Petkovb05315f2011-11-07 10:14:25 +0100492TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500493 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
494 CellularCapability::kTimeoutDefault))
495 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
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_->RequirePIN(kPIN, true, &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, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500506 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
507 CellularCapability::kTimeoutDefault))
508 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
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_->EnterPIN(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, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500519 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
520 CellularCapability::kTimeoutDefault))
521 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
522 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100523 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500524 Error error;
525 capability_->UnblockPIN(kPUK, kPIN, &error,
526 Bind(&CellularCapabilityGSMTest::TestCallback,
527 Unretained(this)));
528 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100529}
530
531TEST_F(CellularCapabilityGSMTest, ChangePIN) {
532 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500533 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
534 CellularCapability::kTimeoutDefault))
535 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
536 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100537 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500538 Error error;
539 capability_->ChangePIN(kOldPIN, kPIN, &error,
540 Bind(&CellularCapabilityGSMTest::TestCallback,
541 Unretained(this)));
542 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100543}
544
Darin Petkovb7828b02012-02-03 12:34:30 +0100545namespace {
546
547MATCHER(SizeIs2, "") {
548 return arg.size() == 2;
549}
550
551} // namespace
552
Darin Petkov1272a432011-11-10 15:53:37 +0100553TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100554 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500555 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400556 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500557 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100558 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100559 EXPECT_CALL(*device_adaptor_,
560 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
561 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400562 EXPECT_CALL(*device_adaptor_,
563 EmitBoolChanged(flimflam::kScanningProperty, true));
564 EXPECT_FALSE(capability_->scanning_);
565
Eric Shienbrood9a245532012-03-07 14:20:39 -0500566 SetNetworkProxy();
567 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
568 Unretained(this)));
569 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400570 EXPECT_TRUE(capability_->scanning_);
571
572 // Simulate the completion of the scan...
573 EXPECT_CALL(*device_adaptor_,
574 EmitBoolChanged(flimflam::kScanningProperty, false));
575 InvokeScanReply();
576 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100577 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500578 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100579 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500580 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100581 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100582}
583
584TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
585 static const char kID[] = "123";
586 static const char kLongName[] = "long name";
587 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500588 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100589 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
590 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
591 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
592 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
593 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
594 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100595 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100596 EXPECT_EQ(5, parsed.size());
597 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
598 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
599 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
600 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
601 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
602 parsed[flimflam::kTechnologyProperty]);
603}
604
605TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
606 InitProviderDB();
607 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500608 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100609 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100610 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100611 EXPECT_EQ(2, parsed.size());
612 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
613 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
614}
615
Darin Petkovae0c64e2011-11-15 15:50:27 +0100616TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100617 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
618 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100619 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100620 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100621 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
622 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100623 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100624 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100625}
626
627TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
628 static const char kOperatorName[] = "Swisscom";
629 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100630 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100631 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100632 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100633 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
634 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100635 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200636
637 static const char kTestOperator[] = "Testcom";
638 capability_->serving_operator_.SetName(kTestOperator);
639 capability_->serving_operator_.SetCountry("");
640 capability_->UpdateOperatorInfo();
641 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
642 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
643 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100644}
645
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100646TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
647 InitProviderDB();
648 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500649 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400650 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100651 capability_->UpdateStatus(props);
652 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
653}
654
655TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
656 static const char kCountry[] = "us";
657 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500658 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100659
660 capability_->SetHomeProvider(); // No mobile provider DB available.
661 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
662 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
663 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
664
665 InitProviderDB();
666 capability_->SetHomeProvider();
667 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
668 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
669 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100670 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200671 ASSERT_TRUE(capability_->home_provider_);
672 EXPECT_FALSE(capability_->home_provider_->requires_roaming);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100673
674 Cellular::Operator oper;
675 cellular_->set_home_provider(oper);
676 capability_->spn_ = kTestCarrier;
677 capability_->SetHomeProvider();
678 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
679 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
680 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200681
682 static const char kCubic[] = "Cubic";
683 capability_->spn_ = kCubic;
684 capability_->SetHomeProvider();
685 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
686 EXPECT_EQ("", cellular_->home_provider().GetCode());
687 ASSERT_TRUE(capability_->home_provider_);
688 EXPECT_TRUE(capability_->home_provider_->requires_roaming);
689
690 static const char kCUBIC[] = "CUBIC";
691 capability_->spn_ = kCUBIC;
692 capability_->home_provider_ = NULL;
693 capability_->SetHomeProvider();
694 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
695 EXPECT_EQ("", cellular_->home_provider().GetCode());
696 ASSERT_TRUE(capability_->home_provider_);
697 EXPECT_TRUE(capability_->home_provider_->requires_roaming);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100698}
699
Darin Petkov3cfbf212011-11-21 16:02:09 +0100700namespace {
701
702MATCHER(SizeIs4, "") {
703 return arg.size() == 4;
704}
705
706} // namespace
707
708TEST_F(CellularCapabilityGSMTest, InitAPNList) {
709 InitProviderDB();
710 capability_->home_provider_ =
711 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
712 ASSERT_TRUE(capability_->home_provider_);
713 EXPECT_EQ(0, capability_->apn_list_.size());
714 EXPECT_CALL(*device_adaptor_,
715 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
716 SizeIs4()));
717 capability_->InitAPNList();
718 EXPECT_EQ(4, capability_->apn_list_.size());
719 EXPECT_EQ("wap.voicestream.com",
720 capability_->apn_list_[1][flimflam::kApnProperty]);
721 EXPECT_EQ("Web2Go/t-zones",
722 capability_->apn_list_[1][flimflam::kApnNameProperty]);
723}
724
Darin Petkov20c13ec2011-11-09 15:07:15 +0100725TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100726 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100727 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100728 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100729 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100730 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
731 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100732 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100733 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
734 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100735 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100736 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
737 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100738 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100739 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
740 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100741 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100742 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
743 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100744 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100745 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
746 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100747 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100748 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
749 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100750 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100751 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
752 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100753 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100754}
755
756TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
757 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100758 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100759 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
760 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100761 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100762 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
763 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100764 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100765 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
766 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100767 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100768 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
769 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100770 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100771 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
772 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100773 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100774}
775
Darin Petkovac635a82012-01-10 16:51:58 +0100776TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
777 CellularCapabilityGSM::friendly_service_name_id_ = 0;
778 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
779 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200780
Darin Petkovac635a82012-01-10 16:51:58 +0100781 capability_->serving_operator_.SetCode("1234");
782 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200783
Darin Petkovac635a82012-01-10 16:51:58 +0100784 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500785 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100786 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200787
788 static const char kHomeProvider[] = "The GSM Home Provider";
789 cellular_->home_provider_.SetName(kHomeProvider);
790 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
791 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
792 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
793
Darin Petkovac635a82012-01-10 16:51:58 +0100794 static const char kTestOperator[] = "A GSM Operator";
795 capability_->serving_operator_.SetName(kTestOperator);
796 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200797
798 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING;
799 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
800 capability_->CreateFriendlyServiceName());
Darin Petkovac635a82012-01-10 16:51:58 +0100801}
802
Darin Petkov31332412012-01-28 01:50:02 +0100803TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
804 SetService();
805 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100806 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100807 cellular_->service()->friendly_name(),
808 cellular_->service()->GetStorageIdentifier());
809 capability_->imsi_ = kIMSI;
810 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100811 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100812 cellular_->service()->GetStorageIdentifier());
813}
814
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400815TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100816 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
817 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
818 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
819 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
820 DBusPropertiesMap props;
821 static const char kLockType[] = "sim-pin";
822 const int kRetries = 3;
823 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
824 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
825 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
826 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
827 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
828 kLockType);
829 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
830 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400831 // Call with the 'wrong' interface and nothing should change.
832 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
833 vector<string>());
834 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
835 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
836 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
837 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
838
Gary Morainbaeefdf2012-04-30 14:53:35 -0700839 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
840 // to the enabled state of the SIM lock.
841 KeyValueStore lock_status;
842 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
843 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
844 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
845
846 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
847 flimflam::kSIMLockStatusProperty,
848 KeyValueStoreEq(lock_status)));
849
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400850 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400851 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100852 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400853 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
854 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100855 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700856 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
857 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
858
859 // Some properties are sent on the MM_MODEM_INTERFACE.
860 capability_->sim_lock_status_.enabled = false;
861 capability_->sim_lock_status_.lock_type = "";
862 capability_->sim_lock_status_.retries_left = 0;
863 KeyValueStore lock_status2;
864 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
865 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
866 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
867 EXPECT_CALL(*device_adaptor_,
868 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
869 KeyValueStoreEq(lock_status2)));
870 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
871 vector<string>());
872 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100873 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
874 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
875}
876
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400877TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
878 static const string kTmobileApn("epc.tmobile.com");
879 static const string kLastGoodApn("remembered.apn");
880 static const string kLastGoodUsername("remembered.user");
881 static const string kSuppliedApn("my.apn");
882
883 SetService();
884 capability_->imsi_ = "310240123456789";
885 InitProviderDB();
886 capability_->SetHomeProvider();
887 DBusPropertiesMap props;
888 capability_->SetupConnectProperties(&props);
889 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
890 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
891
892 ProfileRefPtr profile(new NiceMock<MockProfile>(
893 &control_, reinterpret_cast<Manager *>(NULL)));
894 cellular_->service()->set_profile(profile);
895 Stringmap apn_info;
896 apn_info[flimflam::kApnProperty] = kLastGoodApn;
897 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
898 cellular_->service()->SetLastGoodApn(apn_info);
899 props.clear();
900 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
901 capability_->SetupConnectProperties(&props);
902 // We expect the list to contain the last good APN, plus
903 // the 4 APNs from the mobile provider info database.
904 EXPECT_EQ(5, capability_->apn_try_list_.size());
905 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
906 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
907 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
908 EXPECT_EQ(kLastGoodUsername,
909 props[flimflam::kApnUsernameProperty].reader().get_string());
910
911 Error error;
912 apn_info.clear();
913 props.clear();
914 apn_info[flimflam::kApnProperty] = kSuppliedApn;
915 // Setting the APN has the side effect of clearing the LastGoodApn,
916 // so the try list will have 5 elements, with the first one being
917 // the supplied APN.
918 cellular_->service()->SetApn(apn_info, &error);
919 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
920 capability_->SetupConnectProperties(&props);
921 EXPECT_EQ(5, capability_->apn_try_list_.size());
922 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
923 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
924
925 apn_info.clear();
926 props.clear();
927 apn_info[flimflam::kApnProperty] = kLastGoodApn;
928 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
929 // Now when LastGoodAPN is set, it will be the one selected.
930 cellular_->service()->SetLastGoodApn(apn_info);
931 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
932 capability_->SetupConnectProperties(&props);
933 // We expect the list to contain the last good APN, plus
934 // the user-supplied APN, plus the 4 APNs from the mobile
935 // provider info database.
936 EXPECT_EQ(6, capability_->apn_try_list_.size());
937 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
938 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
939 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
940 EXPECT_EQ(kLastGoodUsername,
941 props[flimflam::kApnUsernameProperty].reader().get_string());
942}
943
Thieu Le923006b2012-04-05 16:32:58 -0700944TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
945 SetupCommonStartModemExpectations();
946 EXPECT_CALL(*card_proxy_,
947 GetSPN(_, _, CellularCapability::kTimeoutDefault))
948 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
949 EXPECT_CALL(*card_proxy_,
950 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
951 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700952 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700953
954 Error error;
955 capability_->StartModem(
956 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
957 dispatcher_.DispatchPendingEvents();
958}
959
960TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
961 SetupCommonStartModemExpectations();
962 EXPECT_CALL(*card_proxy_,
963 GetSPN(_, _, CellularCapability::kTimeoutDefault))
964 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
965 EXPECT_CALL(*card_proxy_,
966 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
967 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700968 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700969
970 Error error;
971 capability_->StartModem(
972 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
973 dispatcher_.DispatchPendingEvents();
974}
975
976TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
977 SetupCommonStartModemExpectations();
978 EXPECT_CALL(*card_proxy_,
979 GetSPN(_, _, CellularCapability::kTimeoutDefault))
980 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
981 EXPECT_CALL(*card_proxy_,
982 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
983 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -0700984 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700985
986 Error error;
987 capability_->StartModem(
988 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
989 dispatcher_.DispatchPendingEvents();
990}
991
Thieu Leb5954a22012-05-18 10:37:34 -0700992TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
993 // Make sure we don't crash if the connect failed and there is no
994 // CellularService object. This can happen if the modem is enabled and
995 // then quickly disabled.
996 SetupCommonProxiesExpectations();
997 EXPECT_CALL(*simple_proxy_,
998 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
999 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
1000 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -07001001 InitProxies();
1002 EXPECT_FALSE(capability_->cellular()->service());
1003 Error error;
1004 DBusPropertiesMap props;
1005 capability_->Connect(props, &error,
1006 Bind(&CellularCapabilityGSMTest::TestCallback,
1007 Unretained(this)));
1008}
1009
Darin Petkovb05315f2011-11-07 10:14:25 +01001010} // namespace shill