blob: 9c98538a9ffb582ba20cc05e84be0ea0e3a254ce [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb05315f2011-11-07 10:14:25 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_gsm.h"
6
Jason Glasgow4c0724a2012-04-17 15:47:40 -04007#include <string>
8#include <vector>
9
Eric Shienbrood9a245532012-03-07 14:20:39 -050010#include <base/bind.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010011#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010012#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010013#include <mm/mm-modem.h>
Darin Petkov1272a432011-11-10 15:53:37 +010014#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010015
16#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010017#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010018#include "shill/error.h"
19#include "shill/event_dispatcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010020#include "shill/mock_adaptors.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080021#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010022#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010023#include "shill/mock_modem_gsm_network_proxy.h"
Thieu Le923006b2012-04-05 16:32:58 -070024#include "shill/mock_modem_proxy.h"
25#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040026#include "shill/mock_profile.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010027#include "shill/nice_mock_control.h"
Thieu Le923006b2012-04-05 16:32:58 -070028#include "shill/proxy_factory.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010029
Eric Shienbrood9a245532012-03-07 14:20:39 -050030using base::Bind;
31using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010032using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040033using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010034using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050035using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010036using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010037using testing::Return;
38
Darin Petkovb05315f2011-11-07 10:14:25 +010039namespace shill {
40
Eric Shienbrood9a245532012-03-07 14:20:39 -050041MATCHER(IsSuccess, "") {
42 return arg.IsSuccess();
43}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050044
Darin Petkovb05315f2011-11-07 10:14:25 +010045class CellularCapabilityGSMTest : public testing::Test {
46 public:
47 CellularCapabilityGSMTest()
48 : cellular_(new Cellular(&control_,
49 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080050 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010051 NULL,
52 "",
Darin Petkov31332412012-01-28 01:50:02 +010053 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010054 0,
55 Cellular::kTypeGSM,
56 "",
57 "",
58 NULL)),
Thieu Le923006b2012-04-05 16:32:58 -070059 proxy_(new MockModemProxy()),
60 simple_proxy_(new MockModemSimpleProxy()),
Darin Petkovcb547732011-11-09 13:55:26 +010061 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010062 network_proxy_(new MockModemGSMNetworkProxy()),
Thieu Le923006b2012-04-05 16:32:58 -070063 proxy_factory_(this),
Darin Petkov721ac932011-11-16 15:43:09 +010064 capability_(NULL),
Darin Petkov3cfbf212011-11-21 16:02:09 +010065 device_adaptor_(NULL),
Darin Petkov1272a432011-11-10 15:53:37 +010066 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010067
Darin Petkov3e509242011-11-10 14:46:44 +010068 virtual ~CellularCapabilityGSMTest() {
69 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010070 mobile_provider_close_db(provider_db_);
71 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010072 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010073 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010074 }
75
76 virtual void SetUp() {
77 capability_ =
78 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010079 device_adaptor_ =
80 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010081 }
82
Thieu Le923006b2012-04-05 16:32:58 -070083 void InvokeEnable(bool enable, Error *error,
84 const ResultCallback &callback, int timeout) {
85 callback.Run(Error());
86 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050087 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
88 int timeout) {
89 callback.Run(kIMEI, Error());
90 }
91 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
92 int timeout) {
93 callback.Run(kIMSI, Error());
94 }
95 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
96 int timeout) {
97 callback.Run("310240123456789", Error());
98 }
99 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
100 int timeout) {
101 callback.Run(kMSISDN, Error());
102 }
Thieu Le923006b2012-04-05 16:32:58 -0700103 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
104 int timeout) {
105 callback.Run("", Error(Error::kOperationFailed));
106 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500107 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
108 int timeout) {
109 callback.Run(kTestCarrier, Error());
110 }
Thieu Le923006b2012-04-05 16:32:58 -0700111 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
112 int timeout) {
113 callback.Run("", Error(Error::kOperationFailed));
114 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500115 void InvokeGetSignalQuality(Error *error,
116 const SignalQualityCallback &callback,
117 int timeout) {
118 callback.Run(kStrength, Error());
119 }
120 void InvokeGetRegistrationInfo(Error *error,
121 const RegistrationInfoCallback &callback,
122 int timeout) {
123 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
124 kTestNetwork, kTestCarrier, Error());
125 }
126 void InvokeRegister(const string &network_id,
127 Error *error,
128 const ResultCallback &callback,
129 int timeout) {
130 callback.Run(Error());
131 }
132 void InvokeEnablePIN(const string &pin, bool enable,
133 Error *error, const ResultCallback &callback,
134 int timeout) {
135 callback.Run(Error());
136 }
137 void InvokeSendPIN(const string &pin, Error *error,
138 const ResultCallback &callback, int timeout) {
139 callback.Run(Error());
140 }
141 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
142 const ResultCallback &callback, int timeout) {
143 callback.Run(Error());
144 }
145 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
146 const ResultCallback &callback, int timeout) {
147 callback.Run(Error());
148 }
149 void InvokeScan(Error *error, const ScanResultsCallback &callback,
150 int timeout) {
151 GSMScanResults results;
152 results.push_back(GSMScanResult());
153 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
154 results.push_back(GSMScanResult());
155 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
156 callback.Run(results, Error());
157 }
Thieu Le923006b2012-04-05 16:32:58 -0700158 void InvokeGetModemStatus(Error *error,
159 const DBusPropertyMapCallback &callback,
160 int timeout) {
161 DBusPropertiesMap props;
162 callback.Run(props, Error());
163 }
164 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
165 int timeout) {
166 ModemHardwareInfo info;
167 callback.Run(info, Error());
168 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500169
170 MOCK_METHOD1(TestCallback, void(const Error &error));
171
Darin Petkovb05315f2011-11-07 10:14:25 +0100172 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100173 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100174 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500175 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100176 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100177 static const char kPIN[];
178 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100179 static const char kIMEI[];
180 static const char kIMSI[];
181 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500182 static const char kScanID0[];
183 static const char kScanID1[];
184 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100185
Thieu Le923006b2012-04-05 16:32:58 -0700186 class TestProxyFactory : public ProxyFactory {
187 public:
188 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
189
190 virtual ModemProxyInterface *CreateModemProxy(
191 const string &/*path*/,
192 const string &/*service*/) {
193 return test_->proxy_.release();
194 }
195
196 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
197 const string &/*path*/,
198 const string &/*service*/) {
199 return test_->simple_proxy_.release();
200 }
201
202 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
203 const string &/*path*/,
204 const string &/*service*/) {
205 return test_->card_proxy_.release();
206 }
207
208 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
209 const string &/*path*/,
210 const string &/*service*/) {
211 return test_->network_proxy_.release();
212 }
213
214 private:
215 CellularCapabilityGSMTest *test_;
216 };
217
218 void SetProxy() {
219 capability_->proxy_.reset(proxy_.release());
220 }
221
Darin Petkovcb547732011-11-09 13:55:26 +0100222 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100223 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100224 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100225
Darin Petkov1272a432011-11-10 15:53:37 +0100226 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100227 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100228 }
229
Thieu Le923006b2012-04-05 16:32:58 -0700230 void SetProxyFactory() {
231 capability_->proxy_factory_ = &proxy_factory_;
232 }
233
Darin Petkov20c13ec2011-11-09 15:07:15 +0100234 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100235 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100236 }
237
238 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100239 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100240 }
241
Darin Petkov3e509242011-11-10 14:46:44 +0100242 void SetService() {
243 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800244 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100245 }
246
Darin Petkov1272a432011-11-10 15:53:37 +0100247 void InitProviderDB() {
248 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
249 ASSERT_TRUE(provider_db_);
250 cellular_->provider_db_ = provider_db_;
251 }
252
Thieu Le923006b2012-04-05 16:32:58 -0700253 void SetupCommonStartModemExpectations() {
254 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
255 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
256 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
257 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
258
259 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
260 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
261 EXPECT_CALL(*network_proxy_,
262 Register(_, _, _, CellularCapabilityGSM::kTimeoutRegister))
263 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
264 EXPECT_CALL(*simple_proxy_,
265 GetModemStatus(_, _, CellularCapability::kTimeoutDefault))
266 .WillOnce(Invoke(this,
267 &CellularCapabilityGSMTest::InvokeGetModemStatus));
268 EXPECT_CALL(*card_proxy_,
269 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
270 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
271 EXPECT_CALL(*card_proxy_,
272 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
273 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
274 EXPECT_CALL(*network_proxy_, AccessTechnology());
275 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
276 EXPECT_CALL(*proxy_,
277 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
278 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
279 EXPECT_CALL(*network_proxy_,
280 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
281 EXPECT_CALL(*network_proxy_,
282 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
283 EXPECT_CALL(*this, TestCallback(IsSuccess()));
284 }
285
Darin Petkovb05315f2011-11-07 10:14:25 +0100286 NiceMockControl control_;
287 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800288 MockMetrics metrics_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100289 CellularRefPtr cellular_;
Thieu Le923006b2012-04-05 16:32:58 -0700290 scoped_ptr<MockModemProxy> proxy_;
291 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100292 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100293 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700294 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100295 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100296 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100297 mobile_provider_db *provider_db_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100298};
299
Darin Petkov31332412012-01-28 01:50:02 +0100300const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100301const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
302 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100303const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500304const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100305const char CellularCapabilityGSMTest::kPIN[] = "9876";
306const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100307const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100308const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100309const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500310const char CellularCapabilityGSMTest::kScanID0[] = "123";
311const char CellularCapabilityGSMTest::kScanID1[] = "456";
312const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100313
Darin Petkov721ac932011-11-16 15:43:09 +0100314TEST_F(CellularCapabilityGSMTest, PropertyStore) {
315 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
316}
317
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500318TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500319 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
320 .WillOnce(Invoke(this,
321 &CellularCapabilityGSMTest::InvokeGetIMEI));
322 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100323 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500324 ASSERT_TRUE(capability_->imei_.empty());
325 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
326 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500327 EXPECT_EQ(kIMEI, capability_->imei_);
328}
329
330TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500331 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
332 .WillOnce(Invoke(this,
333 &CellularCapabilityGSMTest::InvokeGetIMSI))
334 .WillOnce(Invoke(this,
335 &CellularCapabilityGSMTest::InvokeGetIMSI2));
336 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500337 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500338 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
339 Unretained(this));
340 ASSERT_TRUE(capability_->imsi_.empty());
341 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500342 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100344 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500345 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500346 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
347}
348
349TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500350 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
351 CellularCapability::kTimeoutDefault))
352 .WillOnce(Invoke(this,
353 &CellularCapabilityGSMTest::InvokeGetMSISDN));
354 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500355 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500356 ASSERT_TRUE(capability_->mdn_.empty());
357 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
358 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500359 EXPECT_EQ(kMSISDN, capability_->mdn_);
360}
361
362TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500363 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
364 .WillOnce(Invoke(this,
365 &CellularCapabilityGSMTest::InvokeGetSPN));
366 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500367 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500368 ASSERT_TRUE(capability_->spn_.empty());
369 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
370 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500371 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100372}
Darin Petkovb05315f2011-11-07 10:14:25 +0100373
Darin Petkov3e509242011-11-10 14:46:44 +0100374TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500375 EXPECT_CALL(*network_proxy_,
376 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
377 .WillOnce(Invoke(this,
378 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100379 SetNetworkProxy();
380 SetService();
381 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100382 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100383 EXPECT_EQ(kStrength, cellular_->service()->strength());
384}
385
Darin Petkov184c54e2011-11-15 12:44:39 +0100386TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500387 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
388 CellularCapability::kTimeoutRegister))
389 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
390 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100391 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500392 Error error;
393 capability_->RegisterOnNetwork(kTestNetwork, &error,
394 Bind(&CellularCapabilityGSMTest::TestCallback,
395 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500396 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100397}
398
Darin Petkovb72cf402011-11-22 14:51:39 +0100399TEST_F(CellularCapabilityGSMTest, IsRegistered) {
400 EXPECT_FALSE(capability_->IsRegistered());
401 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
402 EXPECT_FALSE(capability_->IsRegistered());
403 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
404 EXPECT_TRUE(capability_->IsRegistered());
405 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
406 EXPECT_FALSE(capability_->IsRegistered());
407 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
408 EXPECT_FALSE(capability_->IsRegistered());
409 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
410 EXPECT_FALSE(capability_->IsRegistered());
411 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
412 EXPECT_TRUE(capability_->IsRegistered());
413}
414
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500415TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
416 ASSERT_FALSE(capability_->IsRegistered());
417 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500418 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
419 .WillOnce(Invoke(this,
420 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500421 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500422 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500423 EXPECT_TRUE(capability_->IsRegistered());
424 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
425 capability_->registration_state_);
426}
427
Darin Petkovb05315f2011-11-07 10:14:25 +0100428TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500429 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
430 CellularCapability::kTimeoutDefault))
431 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
432 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100433 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500434 Error error;
435 capability_->RequirePIN(kPIN, true, &error,
436 Bind(&CellularCapabilityGSMTest::TestCallback,
437 Unretained(this)));
438 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100439}
440
441TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500442 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
443 CellularCapability::kTimeoutDefault))
444 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
445 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100446 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500447 Error error;
448 capability_->EnterPIN(kPIN, &error,
449 Bind(&CellularCapabilityGSMTest::TestCallback,
450 Unretained(this)));
451 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100452}
453
454TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
456 CellularCapability::kTimeoutDefault))
457 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
458 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100459 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500460 Error error;
461 capability_->UnblockPIN(kPUK, kPIN, &error,
462 Bind(&CellularCapabilityGSMTest::TestCallback,
463 Unretained(this)));
464 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100465}
466
467TEST_F(CellularCapabilityGSMTest, ChangePIN) {
468 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500469 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
470 CellularCapability::kTimeoutDefault))
471 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
472 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100473 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500474 Error error;
475 capability_->ChangePIN(kOldPIN, kPIN, &error,
476 Bind(&CellularCapabilityGSMTest::TestCallback,
477 Unretained(this)));
478 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100479}
480
Darin Petkovb7828b02012-02-03 12:34:30 +0100481namespace {
482
483MATCHER(SizeIs2, "") {
484 return arg.size() == 2;
485}
486
487} // namespace
488
Darin Petkov1272a432011-11-10 15:53:37 +0100489TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100490 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500491 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
492 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeScan));
493 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100494 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100495 EXPECT_CALL(*device_adaptor_,
496 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
497 SizeIs2()));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500498 SetNetworkProxy();
499 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
500 Unretained(this)));
501 EXPECT_TRUE(error.IsSuccess());
Darin Petkov721ac932011-11-16 15:43:09 +0100502 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500503 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100504 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500505 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100506 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100507}
508
509TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
510 static const char kID[] = "123";
511 static const char kLongName[] = "long name";
512 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500513 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100514 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
515 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
516 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
517 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
518 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
519 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100520 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100521 EXPECT_EQ(5, parsed.size());
522 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
523 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
524 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
525 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
526 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
527 parsed[flimflam::kTechnologyProperty]);
528}
529
530TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
531 InitProviderDB();
532 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500533 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100534 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100535 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100536 EXPECT_EQ(2, parsed.size());
537 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
538 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
539}
540
Darin Petkovae0c64e2011-11-15 15:50:27 +0100541TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100542 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
543 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100544 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100545 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100546 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
547 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100548 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100549 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100550}
551
552TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
553 static const char kOperatorName[] = "Swisscom";
554 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100555 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100556 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100557 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100558 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
559 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100560 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
561}
562
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100563TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
564 InitProviderDB();
565 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500566 capability_->imsi_ = "310240123456789";
567 props[CellularCapability::kPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100568 capability_->UpdateStatus(props);
569 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
570}
571
572TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
573 static const char kCountry[] = "us";
574 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500575 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100576
577 capability_->SetHomeProvider(); // No mobile provider DB available.
578 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
579 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
580 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
581
582 InitProviderDB();
583 capability_->SetHomeProvider();
584 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
585 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
586 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100587 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100588
589 Cellular::Operator oper;
590 cellular_->set_home_provider(oper);
591 capability_->spn_ = kTestCarrier;
592 capability_->SetHomeProvider();
593 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
594 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
595 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
596}
597
Darin Petkov3cfbf212011-11-21 16:02:09 +0100598namespace {
599
600MATCHER(SizeIs4, "") {
601 return arg.size() == 4;
602}
603
604} // namespace
605
606TEST_F(CellularCapabilityGSMTest, InitAPNList) {
607 InitProviderDB();
608 capability_->home_provider_ =
609 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
610 ASSERT_TRUE(capability_->home_provider_);
611 EXPECT_EQ(0, capability_->apn_list_.size());
612 EXPECT_CALL(*device_adaptor_,
613 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
614 SizeIs4()));
615 capability_->InitAPNList();
616 EXPECT_EQ(4, capability_->apn_list_.size());
617 EXPECT_EQ("wap.voicestream.com",
618 capability_->apn_list_[1][flimflam::kApnProperty]);
619 EXPECT_EQ("Web2Go/t-zones",
620 capability_->apn_list_[1][flimflam::kApnNameProperty]);
621}
622
Darin Petkov20c13ec2011-11-09 15:07:15 +0100623TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100624 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100625 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100626 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100627 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100628 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
629 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100630 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100631 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
632 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100633 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100634 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
635 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100636 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100637 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
638 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100639 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100640 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
641 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100642 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100643 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
644 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100645 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100646 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
647 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100648 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100649 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
650 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100651 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100652}
653
654TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
655 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100656 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100657 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
658 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100659 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100660 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
661 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100662 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100663 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
664 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100665 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100666 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
667 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100668 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100669 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
670 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100671 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100672}
673
Darin Petkovac635a82012-01-10 16:51:58 +0100674TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
675 CellularCapabilityGSM::friendly_service_name_id_ = 0;
676 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
677 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
678 capability_->serving_operator_.SetCode("1234");
679 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
680 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500681 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100682 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
683 static const char kTestOperator[] = "A GSM Operator";
684 capability_->serving_operator_.SetName(kTestOperator);
685 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
686 static const char kHomeProvider[] = "The GSM Home Provider";
687 cellular_->home_provider_.SetName(kHomeProvider);
688 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
689 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
690 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
691}
692
Darin Petkov31332412012-01-28 01:50:02 +0100693TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
694 SetService();
695 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100696 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100697 cellular_->service()->friendly_name(),
698 cellular_->service()->GetStorageIdentifier());
699 capability_->imsi_ = kIMSI;
700 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100701 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100702 cellular_->service()->GetStorageIdentifier());
703}
704
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400705TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100706 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
707 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
708 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
709 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
710 DBusPropertiesMap props;
711 static const char kLockType[] = "sim-pin";
712 const int kRetries = 3;
713 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
714 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
715 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
716 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
717 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
718 kLockType);
719 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
720 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400721 // Call with the 'wrong' interface and nothing should change.
722 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
723 vector<string>());
724 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
725 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
726 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
727 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
728
729 // Call with the right interface and expect changes.
Darin Petkov63138a92012-02-06 14:09:15 +0100730 EXPECT_CALL(*device_adaptor_,
731 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty, _));
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400732 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
733 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100734 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
735 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
736 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
737 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
738}
739
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400740TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
741 static const string kTmobileApn("epc.tmobile.com");
742 static const string kLastGoodApn("remembered.apn");
743 static const string kLastGoodUsername("remembered.user");
744 static const string kSuppliedApn("my.apn");
745
746 SetService();
747 capability_->imsi_ = "310240123456789";
748 InitProviderDB();
749 capability_->SetHomeProvider();
750 DBusPropertiesMap props;
751 capability_->SetupConnectProperties(&props);
752 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
753 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
754
755 ProfileRefPtr profile(new NiceMock<MockProfile>(
756 &control_, reinterpret_cast<Manager *>(NULL)));
757 cellular_->service()->set_profile(profile);
758 Stringmap apn_info;
759 apn_info[flimflam::kApnProperty] = kLastGoodApn;
760 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
761 cellular_->service()->SetLastGoodApn(apn_info);
762 props.clear();
763 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
764 capability_->SetupConnectProperties(&props);
765 // We expect the list to contain the last good APN, plus
766 // the 4 APNs from the mobile provider info database.
767 EXPECT_EQ(5, capability_->apn_try_list_.size());
768 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
769 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
770 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
771 EXPECT_EQ(kLastGoodUsername,
772 props[flimflam::kApnUsernameProperty].reader().get_string());
773
774 Error error;
775 apn_info.clear();
776 props.clear();
777 apn_info[flimflam::kApnProperty] = kSuppliedApn;
778 // Setting the APN has the side effect of clearing the LastGoodApn,
779 // so the try list will have 5 elements, with the first one being
780 // the supplied APN.
781 cellular_->service()->SetApn(apn_info, &error);
782 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
783 capability_->SetupConnectProperties(&props);
784 EXPECT_EQ(5, capability_->apn_try_list_.size());
785 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
786 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
787
788 apn_info.clear();
789 props.clear();
790 apn_info[flimflam::kApnProperty] = kLastGoodApn;
791 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
792 // Now when LastGoodAPN is set, it will be the one selected.
793 cellular_->service()->SetLastGoodApn(apn_info);
794 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
795 capability_->SetupConnectProperties(&props);
796 // We expect the list to contain the last good APN, plus
797 // the user-supplied APN, plus the 4 APNs from the mobile
798 // provider info database.
799 EXPECT_EQ(6, capability_->apn_try_list_.size());
800 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
801 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
802 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
803 EXPECT_EQ(kLastGoodUsername,
804 props[flimflam::kApnUsernameProperty].reader().get_string());
805}
806
Thieu Le923006b2012-04-05 16:32:58 -0700807TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
808 SetupCommonStartModemExpectations();
809 EXPECT_CALL(*card_proxy_,
810 GetSPN(_, _, CellularCapability::kTimeoutDefault))
811 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
812 EXPECT_CALL(*card_proxy_,
813 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
814 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
815 SetProxyFactory();
816
817 Error error;
818 capability_->StartModem(
819 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
820 dispatcher_.DispatchPendingEvents();
821}
822
823TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
824 SetupCommonStartModemExpectations();
825 EXPECT_CALL(*card_proxy_,
826 GetSPN(_, _, CellularCapability::kTimeoutDefault))
827 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
828 EXPECT_CALL(*card_proxy_,
829 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
830 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
831 SetProxyFactory();
832
833 Error error;
834 capability_->StartModem(
835 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
836 dispatcher_.DispatchPendingEvents();
837}
838
839TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
840 SetupCommonStartModemExpectations();
841 EXPECT_CALL(*card_proxy_,
842 GetSPN(_, _, CellularCapability::kTimeoutDefault))
843 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
844 EXPECT_CALL(*card_proxy_,
845 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
846 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
847 SetProxyFactory();
848
849 Error error;
850 capability_->StartModem(
851 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
852 dispatcher_.DispatchPendingEvents();
853}
854
Darin Petkovb05315f2011-11-07 10:14:25 +0100855} // namespace shill