blob: 3fe22771ca700cc9d7fae67626cfe4ef8a3b0d5b [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb05315f2011-11-07 10:14:25 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_gsm.h"
6
Jason Glasgow4c0724a2012-04-17 15:47:40 -04007#include <string>
8#include <vector>
9
Eric Shienbrood9a245532012-03-07 14:20:39 -050010#include <base/bind.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010011#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010012#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010013#include <mm/mm-modem.h>
Darin Petkov1272a432011-11-10 15:53:37 +010014#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010015
16#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010017#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010018#include "shill/error.h"
19#include "shill/event_dispatcher.h"
Gary Morainbaeefdf2012-04-30 14:53:35 -070020#include "shill/key_value_store_matcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010021#include "shill/mock_adaptors.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080022#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010023#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010024#include "shill/mock_modem_gsm_network_proxy.h"
Thieu Le923006b2012-04-05 16:32:58 -070025#include "shill/mock_modem_proxy.h"
26#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040027#include "shill/mock_profile.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010028#include "shill/nice_mock_control.h"
Thieu Le923006b2012-04-05 16:32:58 -070029#include "shill/proxy_factory.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010030
Eric Shienbrood9a245532012-03-07 14:20:39 -050031using base::Bind;
32using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010033using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040034using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010035using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050036using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010037using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010038using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040039using testing::SaveArg;
Darin Petkovcb547732011-11-09 13:55:26 +010040
Darin Petkovb05315f2011-11-07 10:14:25 +010041namespace shill {
42
Eric Shienbrood9a245532012-03-07 14:20:39 -050043MATCHER(IsSuccess, "") {
44 return arg.IsSuccess();
45}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050046
Darin Petkovb05315f2011-11-07 10:14:25 +010047class CellularCapabilityGSMTest : public testing::Test {
48 public:
49 CellularCapabilityGSMTest()
50 : cellular_(new Cellular(&control_,
51 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080052 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010053 NULL,
54 "",
Darin Petkov31332412012-01-28 01:50:02 +010055 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010056 0,
57 Cellular::kTypeGSM,
58 "",
59 "",
60 NULL)),
Thieu Le923006b2012-04-05 16:32:58 -070061 proxy_(new MockModemProxy()),
62 simple_proxy_(new MockModemSimpleProxy()),
Darin Petkovcb547732011-11-09 13:55:26 +010063 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010064 network_proxy_(new MockModemGSMNetworkProxy()),
Thieu Le923006b2012-04-05 16:32:58 -070065 proxy_factory_(this),
Darin Petkov721ac932011-11-16 15:43:09 +010066 capability_(NULL),
Darin Petkov3cfbf212011-11-21 16:02:09 +010067 device_adaptor_(NULL),
Darin Petkov1272a432011-11-10 15:53:37 +010068 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010069
Darin Petkov3e509242011-11-10 14:46:44 +010070 virtual ~CellularCapabilityGSMTest() {
71 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010072 mobile_provider_close_db(provider_db_);
73 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010074 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010075 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010076 }
77
78 virtual void SetUp() {
79 capability_ =
80 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010081 device_adaptor_ =
82 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010083 }
84
Thieu Le923006b2012-04-05 16:32:58 -070085 void InvokeEnable(bool enable, Error *error,
86 const ResultCallback &callback, int timeout) {
87 callback.Run(Error());
88 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050089 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
90 int timeout) {
91 callback.Run(kIMEI, Error());
92 }
93 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
94 int timeout) {
95 callback.Run(kIMSI, Error());
96 }
97 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
98 int timeout) {
99 callback.Run("310240123456789", Error());
100 }
101 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
102 int timeout) {
103 callback.Run(kMSISDN, Error());
104 }
Thieu Le923006b2012-04-05 16:32:58 -0700105 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
106 int timeout) {
107 callback.Run("", Error(Error::kOperationFailed));
108 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500109 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
110 int timeout) {
111 callback.Run(kTestCarrier, Error());
112 }
Thieu Le923006b2012-04-05 16:32:58 -0700113 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
114 int timeout) {
115 callback.Run("", Error(Error::kOperationFailed));
116 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500117 void InvokeGetSignalQuality(Error *error,
118 const SignalQualityCallback &callback,
119 int timeout) {
120 callback.Run(kStrength, Error());
121 }
122 void InvokeGetRegistrationInfo(Error *error,
123 const RegistrationInfoCallback &callback,
124 int timeout) {
125 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
126 kTestNetwork, kTestCarrier, Error());
127 }
128 void InvokeRegister(const string &network_id,
129 Error *error,
130 const ResultCallback &callback,
131 int timeout) {
132 callback.Run(Error());
133 }
134 void InvokeEnablePIN(const string &pin, bool enable,
135 Error *error, const ResultCallback &callback,
136 int timeout) {
137 callback.Run(Error());
138 }
139 void InvokeSendPIN(const string &pin, Error *error,
140 const ResultCallback &callback, int timeout) {
141 callback.Run(Error());
142 }
143 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
144 const ResultCallback &callback, int timeout) {
145 callback.Run(Error());
146 }
147 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
148 const ResultCallback &callback, int timeout) {
149 callback.Run(Error());
150 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400151 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500152 GSMScanResults results;
153 results.push_back(GSMScanResult());
154 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
155 results.push_back(GSMScanResult());
156 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400157 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500158 }
Thieu Le923006b2012-04-05 16:32:58 -0700159 void InvokeGetModemStatus(Error *error,
160 const DBusPropertyMapCallback &callback,
161 int timeout) {
162 DBusPropertiesMap props;
163 callback.Run(props, Error());
164 }
165 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
166 int timeout) {
167 ModemHardwareInfo info;
168 callback.Run(info, Error());
169 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500170
171 MOCK_METHOD1(TestCallback, void(const Error &error));
172
Darin Petkovb05315f2011-11-07 10:14:25 +0100173 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100174 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100175 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500176 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100177 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100178 static const char kPIN[];
179 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100180 static const char kIMEI[];
181 static const char kIMSI[];
182 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500183 static const char kScanID0[];
184 static const char kScanID1[];
185 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100186
Thieu Le923006b2012-04-05 16:32:58 -0700187 class TestProxyFactory : public ProxyFactory {
188 public:
189 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
190
191 virtual ModemProxyInterface *CreateModemProxy(
192 const string &/*path*/,
193 const string &/*service*/) {
194 return test_->proxy_.release();
195 }
196
197 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
198 const string &/*path*/,
199 const string &/*service*/) {
200 return test_->simple_proxy_.release();
201 }
202
203 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
204 const string &/*path*/,
205 const string &/*service*/) {
206 return test_->card_proxy_.release();
207 }
208
209 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
210 const string &/*path*/,
211 const string &/*service*/) {
212 return test_->network_proxy_.release();
213 }
214
215 private:
216 CellularCapabilityGSMTest *test_;
217 };
218
219 void SetProxy() {
220 capability_->proxy_.reset(proxy_.release());
221 }
222
Darin Petkovcb547732011-11-09 13:55:26 +0100223 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100224 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100225 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100226
Darin Petkov1272a432011-11-10 15:53:37 +0100227 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100228 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100229 }
230
Thieu Le923006b2012-04-05 16:32:58 -0700231 void SetProxyFactory() {
232 capability_->proxy_factory_ = &proxy_factory_;
233 }
234
Darin Petkov20c13ec2011-11-09 15:07:15 +0100235 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100236 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100237 }
238
239 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100240 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100241 }
242
Darin Petkov3e509242011-11-10 14:46:44 +0100243 void SetService() {
244 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800245 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100246 }
247
Darin Petkov1272a432011-11-10 15:53:37 +0100248 void InitProviderDB() {
249 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
250 ASSERT_TRUE(provider_db_);
251 cellular_->provider_db_ = provider_db_;
252 }
253
Thieu Le923006b2012-04-05 16:32:58 -0700254 void SetupCommonStartModemExpectations() {
255 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
256 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
257 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
258 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
259
260 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
261 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700262 EXPECT_CALL(*card_proxy_,
263 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
264 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
265 EXPECT_CALL(*card_proxy_,
266 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
267 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
268 EXPECT_CALL(*network_proxy_, AccessTechnology());
269 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
270 EXPECT_CALL(*proxy_,
271 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
272 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
273 EXPECT_CALL(*network_proxy_,
274 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
275 EXPECT_CALL(*network_proxy_,
276 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
277 EXPECT_CALL(*this, TestCallback(IsSuccess()));
278 }
279
Darin Petkovb05315f2011-11-07 10:14:25 +0100280 NiceMockControl control_;
281 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800282 MockMetrics metrics_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100283 CellularRefPtr cellular_;
Thieu Le923006b2012-04-05 16:32:58 -0700284 scoped_ptr<MockModemProxy> proxy_;
285 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100286 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100287 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700288 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100289 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100290 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100291 mobile_provider_db *provider_db_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400292 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100293};
294
Darin Petkov31332412012-01-28 01:50:02 +0100295const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100296const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
297 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100298const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500299const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100300const char CellularCapabilityGSMTest::kPIN[] = "9876";
301const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100302const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100303const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100304const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500305const char CellularCapabilityGSMTest::kScanID0[] = "123";
306const char CellularCapabilityGSMTest::kScanID1[] = "456";
307const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100308
Darin Petkov721ac932011-11-16 15:43:09 +0100309TEST_F(CellularCapabilityGSMTest, PropertyStore) {
310 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
311}
312
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500313TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500314 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
315 .WillOnce(Invoke(this,
316 &CellularCapabilityGSMTest::InvokeGetIMEI));
317 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100318 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500319 ASSERT_TRUE(capability_->imei_.empty());
320 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
321 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500322 EXPECT_EQ(kIMEI, capability_->imei_);
323}
324
325TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500326 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
327 .WillOnce(Invoke(this,
328 &CellularCapabilityGSMTest::InvokeGetIMSI))
329 .WillOnce(Invoke(this,
330 &CellularCapabilityGSMTest::InvokeGetIMSI2));
331 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500332 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500333 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
334 Unretained(this));
335 ASSERT_TRUE(capability_->imsi_.empty());
336 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500337 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500338 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100339 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500340 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500341 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
342}
343
344TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500345 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
346 CellularCapability::kTimeoutDefault))
347 .WillOnce(Invoke(this,
348 &CellularCapabilityGSMTest::InvokeGetMSISDN));
349 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500350 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500351 ASSERT_TRUE(capability_->mdn_.empty());
352 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
353 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500354 EXPECT_EQ(kMSISDN, capability_->mdn_);
355}
356
357TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500358 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
359 .WillOnce(Invoke(this,
360 &CellularCapabilityGSMTest::InvokeGetSPN));
361 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500362 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500363 ASSERT_TRUE(capability_->spn_.empty());
364 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
365 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500366 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100367}
Darin Petkovb05315f2011-11-07 10:14:25 +0100368
Darin Petkov3e509242011-11-10 14:46:44 +0100369TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500370 EXPECT_CALL(*network_proxy_,
371 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
372 .WillOnce(Invoke(this,
373 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100374 SetNetworkProxy();
375 SetService();
376 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100377 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100378 EXPECT_EQ(kStrength, cellular_->service()->strength());
379}
380
Darin Petkov184c54e2011-11-15 12:44:39 +0100381TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500382 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
383 CellularCapability::kTimeoutRegister))
384 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
385 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100386 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500387 Error error;
388 capability_->RegisterOnNetwork(kTestNetwork, &error,
389 Bind(&CellularCapabilityGSMTest::TestCallback,
390 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500391 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100392}
393
Darin Petkovb72cf402011-11-22 14:51:39 +0100394TEST_F(CellularCapabilityGSMTest, IsRegistered) {
395 EXPECT_FALSE(capability_->IsRegistered());
396 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
397 EXPECT_FALSE(capability_->IsRegistered());
398 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
399 EXPECT_TRUE(capability_->IsRegistered());
400 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
401 EXPECT_FALSE(capability_->IsRegistered());
402 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
403 EXPECT_FALSE(capability_->IsRegistered());
404 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
405 EXPECT_FALSE(capability_->IsRegistered());
406 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
407 EXPECT_TRUE(capability_->IsRegistered());
408}
409
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500410TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
411 ASSERT_FALSE(capability_->IsRegistered());
412 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500413 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
414 .WillOnce(Invoke(this,
415 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500416 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500417 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500418 EXPECT_TRUE(capability_->IsRegistered());
419 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
420 capability_->registration_state_);
421}
422
Darin Petkovb05315f2011-11-07 10:14:25 +0100423TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500424 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
425 CellularCapability::kTimeoutDefault))
426 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
427 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100428 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500429 Error error;
430 capability_->RequirePIN(kPIN, true, &error,
431 Bind(&CellularCapabilityGSMTest::TestCallback,
432 Unretained(this)));
433 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100434}
435
436TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500437 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
438 CellularCapability::kTimeoutDefault))
439 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
440 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100441 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500442 Error error;
443 capability_->EnterPIN(kPIN, &error,
444 Bind(&CellularCapabilityGSMTest::TestCallback,
445 Unretained(this)));
446 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100447}
448
449TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500450 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
451 CellularCapability::kTimeoutDefault))
452 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
453 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100454 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455 Error error;
456 capability_->UnblockPIN(kPUK, kPIN, &error,
457 Bind(&CellularCapabilityGSMTest::TestCallback,
458 Unretained(this)));
459 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100460}
461
462TEST_F(CellularCapabilityGSMTest, ChangePIN) {
463 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500464 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
465 CellularCapability::kTimeoutDefault))
466 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
467 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100468 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500469 Error error;
470 capability_->ChangePIN(kOldPIN, kPIN, &error,
471 Bind(&CellularCapabilityGSMTest::TestCallback,
472 Unretained(this)));
473 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100474}
475
Darin Petkovb7828b02012-02-03 12:34:30 +0100476namespace {
477
478MATCHER(SizeIs2, "") {
479 return arg.size() == 2;
480}
481
482} // namespace
483
Darin Petkov1272a432011-11-10 15:53:37 +0100484TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100485 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500486 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400487 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500488 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100489 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100490 EXPECT_CALL(*device_adaptor_,
491 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
492 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400493 EXPECT_CALL(*device_adaptor_,
494 EmitBoolChanged(flimflam::kScanningProperty, true));
495 EXPECT_FALSE(capability_->scanning_);
496
Eric Shienbrood9a245532012-03-07 14:20:39 -0500497 SetNetworkProxy();
498 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
499 Unretained(this)));
500 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400501 EXPECT_TRUE(capability_->scanning_);
502
503 // Simulate the completion of the scan...
504 EXPECT_CALL(*device_adaptor_,
505 EmitBoolChanged(flimflam::kScanningProperty, false));
506 InvokeScanReply();
507 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100508 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500509 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100510 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500511 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100512 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100513}
514
515TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
516 static const char kID[] = "123";
517 static const char kLongName[] = "long name";
518 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500519 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100520 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
521 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
522 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
523 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
524 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
525 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100526 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100527 EXPECT_EQ(5, parsed.size());
528 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
529 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
530 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
531 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
532 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
533 parsed[flimflam::kTechnologyProperty]);
534}
535
536TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
537 InitProviderDB();
538 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500539 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100540 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100541 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100542 EXPECT_EQ(2, parsed.size());
543 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
544 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
545}
546
Darin Petkovae0c64e2011-11-15 15:50:27 +0100547TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100548 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
549 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100550 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100551 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100552 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
553 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100554 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100555 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100556}
557
558TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
559 static const char kOperatorName[] = "Swisscom";
560 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100561 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100562 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100563 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100564 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
565 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100566 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
567}
568
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100569TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
570 InitProviderDB();
571 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500572 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400573 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100574 capability_->UpdateStatus(props);
575 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
576}
577
578TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
579 static const char kCountry[] = "us";
580 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500581 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100582
583 capability_->SetHomeProvider(); // No mobile provider DB available.
584 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
585 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
586 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
587
588 InitProviderDB();
589 capability_->SetHomeProvider();
590 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
591 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
592 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100593 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100594
595 Cellular::Operator oper;
596 cellular_->set_home_provider(oper);
597 capability_->spn_ = kTestCarrier;
598 capability_->SetHomeProvider();
599 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
600 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
601 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
602}
603
Darin Petkov3cfbf212011-11-21 16:02:09 +0100604namespace {
605
606MATCHER(SizeIs4, "") {
607 return arg.size() == 4;
608}
609
610} // namespace
611
612TEST_F(CellularCapabilityGSMTest, InitAPNList) {
613 InitProviderDB();
614 capability_->home_provider_ =
615 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
616 ASSERT_TRUE(capability_->home_provider_);
617 EXPECT_EQ(0, capability_->apn_list_.size());
618 EXPECT_CALL(*device_adaptor_,
619 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
620 SizeIs4()));
621 capability_->InitAPNList();
622 EXPECT_EQ(4, capability_->apn_list_.size());
623 EXPECT_EQ("wap.voicestream.com",
624 capability_->apn_list_[1][flimflam::kApnProperty]);
625 EXPECT_EQ("Web2Go/t-zones",
626 capability_->apn_list_[1][flimflam::kApnNameProperty]);
627}
628
Darin Petkov20c13ec2011-11-09 15:07:15 +0100629TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100630 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100631 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100632 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100633 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100634 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
635 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100636 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100637 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
638 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100639 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100640 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
641 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100642 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100643 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
644 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100645 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100646 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
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_HSUPA);
650 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100651 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100652 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
653 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100654 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100655 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
656 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100657 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100658}
659
660TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
661 EXPECT_EQ(flimflam::kRoamingStateUnknown,
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_HOME);
664 EXPECT_EQ(flimflam::kRoamingStateHome,
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_ROAMING);
667 EXPECT_EQ(flimflam::kRoamingStateRoaming,
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_SEARCHING);
670 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100671 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100672 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
673 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100674 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100675 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
676 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100677 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100678}
679
Darin Petkovac635a82012-01-10 16:51:58 +0100680TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
681 CellularCapabilityGSM::friendly_service_name_id_ = 0;
682 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
683 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
684 capability_->serving_operator_.SetCode("1234");
685 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
686 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500687 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100688 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
689 static const char kTestOperator[] = "A GSM Operator";
690 capability_->serving_operator_.SetName(kTestOperator);
691 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
692 static const char kHomeProvider[] = "The GSM Home Provider";
693 cellular_->home_provider_.SetName(kHomeProvider);
694 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
695 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
696 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
697}
698
Darin Petkov31332412012-01-28 01:50:02 +0100699TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
700 SetService();
701 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100702 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100703 cellular_->service()->friendly_name(),
704 cellular_->service()->GetStorageIdentifier());
705 capability_->imsi_ = kIMSI;
706 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100707 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100708 cellular_->service()->GetStorageIdentifier());
709}
710
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400711TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100712 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
713 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
714 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
715 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
716 DBusPropertiesMap props;
717 static const char kLockType[] = "sim-pin";
718 const int kRetries = 3;
719 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
720 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
721 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
722 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
723 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
724 kLockType);
725 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
726 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400727 // Call with the 'wrong' interface and nothing should change.
728 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
729 vector<string>());
730 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
731 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
732 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
733 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
734
Gary Morainbaeefdf2012-04-30 14:53:35 -0700735 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
736 // to the enabled state of the SIM lock.
737 KeyValueStore lock_status;
738 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
739 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
740 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
741
742 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
743 flimflam::kSIMLockStatusProperty,
744 KeyValueStoreEq(lock_status)));
745
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400746 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400747 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100748 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400749 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
750 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100751 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700752 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
753 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
754
755 // Some properties are sent on the MM_MODEM_INTERFACE.
756 capability_->sim_lock_status_.enabled = false;
757 capability_->sim_lock_status_.lock_type = "";
758 capability_->sim_lock_status_.retries_left = 0;
759 KeyValueStore lock_status2;
760 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
761 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
762 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
763 EXPECT_CALL(*device_adaptor_,
764 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
765 KeyValueStoreEq(lock_status2)));
766 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
767 vector<string>());
768 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100769 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
770 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
771}
772
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400773TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
774 static const string kTmobileApn("epc.tmobile.com");
775 static const string kLastGoodApn("remembered.apn");
776 static const string kLastGoodUsername("remembered.user");
777 static const string kSuppliedApn("my.apn");
778
779 SetService();
780 capability_->imsi_ = "310240123456789";
781 InitProviderDB();
782 capability_->SetHomeProvider();
783 DBusPropertiesMap props;
784 capability_->SetupConnectProperties(&props);
785 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
786 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
787
788 ProfileRefPtr profile(new NiceMock<MockProfile>(
789 &control_, reinterpret_cast<Manager *>(NULL)));
790 cellular_->service()->set_profile(profile);
791 Stringmap apn_info;
792 apn_info[flimflam::kApnProperty] = kLastGoodApn;
793 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
794 cellular_->service()->SetLastGoodApn(apn_info);
795 props.clear();
796 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
797 capability_->SetupConnectProperties(&props);
798 // We expect the list to contain the last good APN, plus
799 // the 4 APNs from the mobile provider info database.
800 EXPECT_EQ(5, capability_->apn_try_list_.size());
801 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
802 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
803 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
804 EXPECT_EQ(kLastGoodUsername,
805 props[flimflam::kApnUsernameProperty].reader().get_string());
806
807 Error error;
808 apn_info.clear();
809 props.clear();
810 apn_info[flimflam::kApnProperty] = kSuppliedApn;
811 // Setting the APN has the side effect of clearing the LastGoodApn,
812 // so the try list will have 5 elements, with the first one being
813 // the supplied APN.
814 cellular_->service()->SetApn(apn_info, &error);
815 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
816 capability_->SetupConnectProperties(&props);
817 EXPECT_EQ(5, capability_->apn_try_list_.size());
818 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
819 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
820
821 apn_info.clear();
822 props.clear();
823 apn_info[flimflam::kApnProperty] = kLastGoodApn;
824 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
825 // Now when LastGoodAPN is set, it will be the one selected.
826 cellular_->service()->SetLastGoodApn(apn_info);
827 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
828 capability_->SetupConnectProperties(&props);
829 // We expect the list to contain the last good APN, plus
830 // the user-supplied APN, plus the 4 APNs from the mobile
831 // provider info database.
832 EXPECT_EQ(6, capability_->apn_try_list_.size());
833 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
834 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
835 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
836 EXPECT_EQ(kLastGoodUsername,
837 props[flimflam::kApnUsernameProperty].reader().get_string());
838}
839
Thieu Le923006b2012-04-05 16:32:58 -0700840TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
841 SetupCommonStartModemExpectations();
842 EXPECT_CALL(*card_proxy_,
843 GetSPN(_, _, CellularCapability::kTimeoutDefault))
844 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
845 EXPECT_CALL(*card_proxy_,
846 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
847 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
848 SetProxyFactory();
849
850 Error error;
851 capability_->StartModem(
852 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
853 dispatcher_.DispatchPendingEvents();
854}
855
856TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
857 SetupCommonStartModemExpectations();
858 EXPECT_CALL(*card_proxy_,
859 GetSPN(_, _, CellularCapability::kTimeoutDefault))
860 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
861 EXPECT_CALL(*card_proxy_,
862 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
863 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
864 SetProxyFactory();
865
866 Error error;
867 capability_->StartModem(
868 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
869 dispatcher_.DispatchPendingEvents();
870}
871
872TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
873 SetupCommonStartModemExpectations();
874 EXPECT_CALL(*card_proxy_,
875 GetSPN(_, _, CellularCapability::kTimeoutDefault))
876 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
877 EXPECT_CALL(*card_proxy_,
878 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
879 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
880 SetProxyFactory();
881
882 Error error;
883 capability_->StartModem(
884 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
885 dispatcher_.DispatchPendingEvents();
886}
887
Darin Petkovb05315f2011-11-07 10:14:25 +0100888} // namespace shill