blob: 75912aee8dbe57ed19d95790a29a978bb647152a [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
Thieu Leb5954a22012-05-18 10:37:34 -070047MATCHER(IsFailure, "") {
48 return arg.IsFailure();
49}
50
Darin Petkovb05315f2011-11-07 10:14:25 +010051class CellularCapabilityGSMTest : public testing::Test {
52 public:
53 CellularCapabilityGSMTest()
54 : cellular_(new Cellular(&control_,
55 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080056 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010057 NULL,
58 "",
Darin Petkov31332412012-01-28 01:50:02 +010059 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010060 0,
61 Cellular::kTypeGSM,
62 "",
63 "",
64 NULL)),
Thieu Le923006b2012-04-05 16:32:58 -070065 proxy_(new MockModemProxy()),
66 simple_proxy_(new MockModemSimpleProxy()),
Darin Petkovcb547732011-11-09 13:55:26 +010067 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010068 network_proxy_(new MockModemGSMNetworkProxy()),
Thieu Le923006b2012-04-05 16:32:58 -070069 proxy_factory_(this),
Darin Petkov721ac932011-11-16 15:43:09 +010070 capability_(NULL),
Darin Petkov3cfbf212011-11-21 16:02:09 +010071 device_adaptor_(NULL),
Darin Petkov1272a432011-11-10 15:53:37 +010072 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010073
Darin Petkov3e509242011-11-10 14:46:44 +010074 virtual ~CellularCapabilityGSMTest() {
75 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010076 mobile_provider_close_db(provider_db_);
77 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010078 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010079 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010080 }
81
82 virtual void SetUp() {
83 capability_ =
84 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010085 device_adaptor_ =
86 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010087 }
88
Thieu Le923006b2012-04-05 16:32:58 -070089 void InvokeEnable(bool enable, Error *error,
90 const ResultCallback &callback, int timeout) {
91 callback.Run(Error());
92 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050093 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
94 int timeout) {
95 callback.Run(kIMEI, Error());
96 }
97 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
98 int timeout) {
99 callback.Run(kIMSI, Error());
100 }
101 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
102 int timeout) {
103 callback.Run("310240123456789", Error());
104 }
105 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
106 int timeout) {
107 callback.Run(kMSISDN, Error());
108 }
Thieu Le923006b2012-04-05 16:32:58 -0700109 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
110 int timeout) {
111 callback.Run("", Error(Error::kOperationFailed));
112 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500113 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
114 int timeout) {
115 callback.Run(kTestCarrier, Error());
116 }
Thieu Le923006b2012-04-05 16:32:58 -0700117 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
118 int timeout) {
119 callback.Run("", Error(Error::kOperationFailed));
120 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500121 void InvokeGetSignalQuality(Error *error,
122 const SignalQualityCallback &callback,
123 int timeout) {
124 callback.Run(kStrength, Error());
125 }
126 void InvokeGetRegistrationInfo(Error *error,
127 const RegistrationInfoCallback &callback,
128 int timeout) {
129 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
130 kTestNetwork, kTestCarrier, Error());
131 }
132 void InvokeRegister(const string &network_id,
133 Error *error,
134 const ResultCallback &callback,
135 int timeout) {
136 callback.Run(Error());
137 }
138 void InvokeEnablePIN(const string &pin, bool enable,
139 Error *error, const ResultCallback &callback,
140 int timeout) {
141 callback.Run(Error());
142 }
143 void InvokeSendPIN(const string &pin, Error *error,
144 const ResultCallback &callback, int timeout) {
145 callback.Run(Error());
146 }
147 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
148 const ResultCallback &callback, int timeout) {
149 callback.Run(Error());
150 }
151 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
152 const ResultCallback &callback, int timeout) {
153 callback.Run(Error());
154 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400155 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500156 GSMScanResults results;
157 results.push_back(GSMScanResult());
158 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
159 results.push_back(GSMScanResult());
160 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400161 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500162 }
Thieu Le923006b2012-04-05 16:32:58 -0700163 void InvokeGetModemStatus(Error *error,
164 const DBusPropertyMapCallback &callback,
165 int timeout) {
166 DBusPropertiesMap props;
167 callback.Run(props, Error());
168 }
169 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
170 int timeout) {
171 ModemHardwareInfo info;
172 callback.Run(info, Error());
173 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500174
Thieu Leb5954a22012-05-18 10:37:34 -0700175 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
176 const ResultCallback &callback, int timeout) {
177 callback.Run(Error(Error::kOperationFailed));
178 }
179
Eric Shienbrood9a245532012-03-07 14:20:39 -0500180 MOCK_METHOD1(TestCallback, void(const Error &error));
181
Darin Petkovb05315f2011-11-07 10:14:25 +0100182 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100183 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100184 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500185 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100186 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100187 static const char kPIN[];
188 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100189 static const char kIMEI[];
190 static const char kIMSI[];
191 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500192 static const char kScanID0[];
193 static const char kScanID1[];
194 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100195
Thieu Le923006b2012-04-05 16:32:58 -0700196 class TestProxyFactory : public ProxyFactory {
197 public:
198 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
199
200 virtual ModemProxyInterface *CreateModemProxy(
201 const string &/*path*/,
202 const string &/*service*/) {
203 return test_->proxy_.release();
204 }
205
206 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
207 const string &/*path*/,
208 const string &/*service*/) {
209 return test_->simple_proxy_.release();
210 }
211
212 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
213 const string &/*path*/,
214 const string &/*service*/) {
215 return test_->card_proxy_.release();
216 }
217
218 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
219 const string &/*path*/,
220 const string &/*service*/) {
221 return test_->network_proxy_.release();
222 }
223
224 private:
225 CellularCapabilityGSMTest *test_;
226 };
227
228 void SetProxy() {
229 capability_->proxy_.reset(proxy_.release());
230 }
231
Darin Petkovcb547732011-11-09 13:55:26 +0100232 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100233 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100234 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100235
Darin Petkov1272a432011-11-10 15:53:37 +0100236 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100237 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100238 }
239
Thieu Le923006b2012-04-05 16:32:58 -0700240 void SetProxyFactory() {
241 capability_->proxy_factory_ = &proxy_factory_;
242 }
243
Darin Petkov20c13ec2011-11-09 15:07:15 +0100244 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100245 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100246 }
247
248 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100249 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100250 }
251
Darin Petkov3e509242011-11-10 14:46:44 +0100252 void SetService() {
253 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800254 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100255 }
256
Darin Petkov1272a432011-11-10 15:53:37 +0100257 void InitProviderDB() {
258 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
259 ASSERT_TRUE(provider_db_);
260 cellular_->provider_db_ = provider_db_;
261 }
262
Thieu Leb5954a22012-05-18 10:37:34 -0700263 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700264 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
265 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
266 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
267 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700268 }
269
270 void SetupCommonStartModemExpectations() {
271 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700272
273 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
274 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700275 EXPECT_CALL(*card_proxy_,
276 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
277 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
278 EXPECT_CALL(*card_proxy_,
279 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
280 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
281 EXPECT_CALL(*network_proxy_, AccessTechnology());
282 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
283 EXPECT_CALL(*proxy_,
284 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
285 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
286 EXPECT_CALL(*network_proxy_,
287 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
288 EXPECT_CALL(*network_proxy_,
289 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
290 EXPECT_CALL(*this, TestCallback(IsSuccess()));
291 }
292
Thieu Leb5954a22012-05-18 10:37:34 -0700293 void InitProxies() {
294 capability_->InitProxies();
295 }
296
Darin Petkovb05315f2011-11-07 10:14:25 +0100297 NiceMockControl control_;
298 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800299 MockMetrics metrics_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100300 CellularRefPtr cellular_;
Thieu Le923006b2012-04-05 16:32:58 -0700301 scoped_ptr<MockModemProxy> proxy_;
302 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100303 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100304 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700305 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100306 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100307 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100308 mobile_provider_db *provider_db_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400309 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100310};
311
Darin Petkov31332412012-01-28 01:50:02 +0100312const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100313const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
314 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100315const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500316const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100317const char CellularCapabilityGSMTest::kPIN[] = "9876";
318const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100319const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100320const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100321const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500322const char CellularCapabilityGSMTest::kScanID0[] = "123";
323const char CellularCapabilityGSMTest::kScanID1[] = "456";
324const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100325
Darin Petkov721ac932011-11-16 15:43:09 +0100326TEST_F(CellularCapabilityGSMTest, PropertyStore) {
327 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
328}
329
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500330TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500331 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
332 .WillOnce(Invoke(this,
333 &CellularCapabilityGSMTest::InvokeGetIMEI));
334 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100335 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500336 ASSERT_TRUE(capability_->imei_.empty());
337 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
338 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500339 EXPECT_EQ(kIMEI, capability_->imei_);
340}
341
342TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
344 .WillOnce(Invoke(this,
345 &CellularCapabilityGSMTest::InvokeGetIMSI))
346 .WillOnce(Invoke(this,
347 &CellularCapabilityGSMTest::InvokeGetIMSI2));
348 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500349 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500350 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
351 Unretained(this));
352 ASSERT_TRUE(capability_->imsi_.empty());
353 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500354 EXPECT_EQ(kIMSI, capability_->imsi_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500355 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100356 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500357 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500358 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
359}
360
361TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500362 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
363 CellularCapability::kTimeoutDefault))
364 .WillOnce(Invoke(this,
365 &CellularCapabilityGSMTest::InvokeGetMSISDN));
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_->mdn_.empty());
369 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
370 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500371 EXPECT_EQ(kMSISDN, capability_->mdn_);
372}
373
374TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500375 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
376 .WillOnce(Invoke(this,
377 &CellularCapabilityGSMTest::InvokeGetSPN));
378 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500379 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500380 ASSERT_TRUE(capability_->spn_.empty());
381 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
382 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500383 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100384}
Darin Petkovb05315f2011-11-07 10:14:25 +0100385
Darin Petkov3e509242011-11-10 14:46:44 +0100386TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500387 EXPECT_CALL(*network_proxy_,
388 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
389 .WillOnce(Invoke(this,
390 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100391 SetNetworkProxy();
392 SetService();
393 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100394 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100395 EXPECT_EQ(kStrength, cellular_->service()->strength());
396}
397
Darin Petkov184c54e2011-11-15 12:44:39 +0100398TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500399 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
400 CellularCapability::kTimeoutRegister))
401 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
402 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100403 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500404 Error error;
405 capability_->RegisterOnNetwork(kTestNetwork, &error,
406 Bind(&CellularCapabilityGSMTest::TestCallback,
407 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500408 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100409}
410
Darin Petkovb72cf402011-11-22 14:51:39 +0100411TEST_F(CellularCapabilityGSMTest, IsRegistered) {
412 EXPECT_FALSE(capability_->IsRegistered());
413 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
414 EXPECT_FALSE(capability_->IsRegistered());
415 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
416 EXPECT_TRUE(capability_->IsRegistered());
417 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
418 EXPECT_FALSE(capability_->IsRegistered());
419 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
420 EXPECT_FALSE(capability_->IsRegistered());
421 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
422 EXPECT_FALSE(capability_->IsRegistered());
423 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
424 EXPECT_TRUE(capability_->IsRegistered());
425}
426
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500427TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
428 ASSERT_FALSE(capability_->IsRegistered());
429 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500430 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
431 .WillOnce(Invoke(this,
432 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500433 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500434 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500435 EXPECT_TRUE(capability_->IsRegistered());
436 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
437 capability_->registration_state_);
438}
439
Darin Petkovb05315f2011-11-07 10:14:25 +0100440TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500441 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
442 CellularCapability::kTimeoutDefault))
443 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
444 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100445 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500446 Error error;
447 capability_->RequirePIN(kPIN, true, &error,
448 Bind(&CellularCapabilityGSMTest::TestCallback,
449 Unretained(this)));
450 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100451}
452
453TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500454 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
455 CellularCapability::kTimeoutDefault))
456 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
457 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100458 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500459 Error error;
460 capability_->EnterPIN(kPIN, &error,
461 Bind(&CellularCapabilityGSMTest::TestCallback,
462 Unretained(this)));
463 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100464}
465
466TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500467 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
468 CellularCapability::kTimeoutDefault))
469 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
470 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100471 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500472 Error error;
473 capability_->UnblockPIN(kPUK, kPIN, &error,
474 Bind(&CellularCapabilityGSMTest::TestCallback,
475 Unretained(this)));
476 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100477}
478
479TEST_F(CellularCapabilityGSMTest, ChangePIN) {
480 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500481 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
482 CellularCapability::kTimeoutDefault))
483 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
484 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100485 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500486 Error error;
487 capability_->ChangePIN(kOldPIN, kPIN, &error,
488 Bind(&CellularCapabilityGSMTest::TestCallback,
489 Unretained(this)));
490 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100491}
492
Darin Petkovb7828b02012-02-03 12:34:30 +0100493namespace {
494
495MATCHER(SizeIs2, "") {
496 return arg.size() == 2;
497}
498
499} // namespace
500
Darin Petkov1272a432011-11-10 15:53:37 +0100501TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100502 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500503 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400504 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500505 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100506 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100507 EXPECT_CALL(*device_adaptor_,
508 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
509 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400510 EXPECT_CALL(*device_adaptor_,
511 EmitBoolChanged(flimflam::kScanningProperty, true));
512 EXPECT_FALSE(capability_->scanning_);
513
Eric Shienbrood9a245532012-03-07 14:20:39 -0500514 SetNetworkProxy();
515 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
516 Unretained(this)));
517 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400518 EXPECT_TRUE(capability_->scanning_);
519
520 // Simulate the completion of the scan...
521 EXPECT_CALL(*device_adaptor_,
522 EmitBoolChanged(flimflam::kScanningProperty, false));
523 InvokeScanReply();
524 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100525 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500526 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100527 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500528 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100529 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100530}
531
532TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
533 static const char kID[] = "123";
534 static const char kLongName[] = "long name";
535 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500536 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100537 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
538 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
539 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
540 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
541 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
542 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100543 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100544 EXPECT_EQ(5, parsed.size());
545 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
546 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
547 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
548 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
549 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
550 parsed[flimflam::kTechnologyProperty]);
551}
552
553TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
554 InitProviderDB();
555 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500556 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100557 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100558 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100559 EXPECT_EQ(2, parsed.size());
560 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
561 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
562}
563
Darin Petkovae0c64e2011-11-15 15:50:27 +0100564TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100565 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
566 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100567 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100568 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100569 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
570 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100571 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100572 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100573}
574
575TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
576 static const char kOperatorName[] = "Swisscom";
577 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100578 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100579 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100580 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100581 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
582 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100583 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
584}
585
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100586TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
587 InitProviderDB();
588 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500589 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400590 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100591 capability_->UpdateStatus(props);
592 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
593}
594
595TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
596 static const char kCountry[] = "us";
597 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500598 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100599
600 capability_->SetHomeProvider(); // No mobile provider DB available.
601 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
602 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
603 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
604
605 InitProviderDB();
606 capability_->SetHomeProvider();
607 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
608 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
609 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100610 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100611
612 Cellular::Operator oper;
613 cellular_->set_home_provider(oper);
614 capability_->spn_ = kTestCarrier;
615 capability_->SetHomeProvider();
616 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
617 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
618 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
619}
620
Darin Petkov3cfbf212011-11-21 16:02:09 +0100621namespace {
622
623MATCHER(SizeIs4, "") {
624 return arg.size() == 4;
625}
626
627} // namespace
628
629TEST_F(CellularCapabilityGSMTest, InitAPNList) {
630 InitProviderDB();
631 capability_->home_provider_ =
632 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
633 ASSERT_TRUE(capability_->home_provider_);
634 EXPECT_EQ(0, capability_->apn_list_.size());
635 EXPECT_CALL(*device_adaptor_,
636 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
637 SizeIs4()));
638 capability_->InitAPNList();
639 EXPECT_EQ(4, capability_->apn_list_.size());
640 EXPECT_EQ("wap.voicestream.com",
641 capability_->apn_list_[1][flimflam::kApnProperty]);
642 EXPECT_EQ("Web2Go/t-zones",
643 capability_->apn_list_[1][flimflam::kApnNameProperty]);
644}
645
Darin Petkov20c13ec2011-11-09 15:07:15 +0100646TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100647 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100648 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100649 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100650 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100651 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
652 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100653 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100654 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
655 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100656 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100657 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
658 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100659 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100660 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
661 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100662 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100663 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
664 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100665 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100666 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
667 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100668 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100669 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
670 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100671 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100672 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
673 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100674 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100675}
676
677TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
678 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100679 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100680 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
681 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100682 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100683 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
684 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100685 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100686 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
687 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100688 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100689 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
690 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100691 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100692 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
693 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100694 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100695}
696
Darin Petkovac635a82012-01-10 16:51:58 +0100697TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
698 CellularCapabilityGSM::friendly_service_name_id_ = 0;
699 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
700 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
701 capability_->serving_operator_.SetCode("1234");
702 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
703 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500704 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100705 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
706 static const char kTestOperator[] = "A GSM Operator";
707 capability_->serving_operator_.SetName(kTestOperator);
708 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
709 static const char kHomeProvider[] = "The GSM Home Provider";
710 cellular_->home_provider_.SetName(kHomeProvider);
711 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
712 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
713 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
714}
715
Darin Petkov31332412012-01-28 01:50:02 +0100716TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
717 SetService();
718 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100719 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100720 cellular_->service()->friendly_name(),
721 cellular_->service()->GetStorageIdentifier());
722 capability_->imsi_ = kIMSI;
723 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100724 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100725 cellular_->service()->GetStorageIdentifier());
726}
727
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400728TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100729 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
730 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
731 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
732 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
733 DBusPropertiesMap props;
734 static const char kLockType[] = "sim-pin";
735 const int kRetries = 3;
736 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
737 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
738 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
739 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
740 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
741 kLockType);
742 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
743 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400744 // Call with the 'wrong' interface and nothing should change.
745 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
746 vector<string>());
747 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
748 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
749 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
750 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
751
Gary Morainbaeefdf2012-04-30 14:53:35 -0700752 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
753 // to the enabled state of the SIM lock.
754 KeyValueStore lock_status;
755 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
756 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
757 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
758
759 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
760 flimflam::kSIMLockStatusProperty,
761 KeyValueStoreEq(lock_status)));
762
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400763 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400764 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100765 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400766 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
767 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100768 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700769 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
770 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
771
772 // Some properties are sent on the MM_MODEM_INTERFACE.
773 capability_->sim_lock_status_.enabled = false;
774 capability_->sim_lock_status_.lock_type = "";
775 capability_->sim_lock_status_.retries_left = 0;
776 KeyValueStore lock_status2;
777 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
778 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
779 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
780 EXPECT_CALL(*device_adaptor_,
781 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
782 KeyValueStoreEq(lock_status2)));
783 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
784 vector<string>());
785 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100786 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
787 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
788}
789
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400790TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
791 static const string kTmobileApn("epc.tmobile.com");
792 static const string kLastGoodApn("remembered.apn");
793 static const string kLastGoodUsername("remembered.user");
794 static const string kSuppliedApn("my.apn");
795
796 SetService();
797 capability_->imsi_ = "310240123456789";
798 InitProviderDB();
799 capability_->SetHomeProvider();
800 DBusPropertiesMap props;
801 capability_->SetupConnectProperties(&props);
802 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
803 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
804
805 ProfileRefPtr profile(new NiceMock<MockProfile>(
806 &control_, reinterpret_cast<Manager *>(NULL)));
807 cellular_->service()->set_profile(profile);
808 Stringmap apn_info;
809 apn_info[flimflam::kApnProperty] = kLastGoodApn;
810 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
811 cellular_->service()->SetLastGoodApn(apn_info);
812 props.clear();
813 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
814 capability_->SetupConnectProperties(&props);
815 // We expect the list to contain the last good APN, plus
816 // the 4 APNs from the mobile provider info database.
817 EXPECT_EQ(5, capability_->apn_try_list_.size());
818 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
819 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
820 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
821 EXPECT_EQ(kLastGoodUsername,
822 props[flimflam::kApnUsernameProperty].reader().get_string());
823
824 Error error;
825 apn_info.clear();
826 props.clear();
827 apn_info[flimflam::kApnProperty] = kSuppliedApn;
828 // Setting the APN has the side effect of clearing the LastGoodApn,
829 // so the try list will have 5 elements, with the first one being
830 // the supplied APN.
831 cellular_->service()->SetApn(apn_info, &error);
832 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
833 capability_->SetupConnectProperties(&props);
834 EXPECT_EQ(5, capability_->apn_try_list_.size());
835 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
836 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
837
838 apn_info.clear();
839 props.clear();
840 apn_info[flimflam::kApnProperty] = kLastGoodApn;
841 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
842 // Now when LastGoodAPN is set, it will be the one selected.
843 cellular_->service()->SetLastGoodApn(apn_info);
844 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
845 capability_->SetupConnectProperties(&props);
846 // We expect the list to contain the last good APN, plus
847 // the user-supplied APN, plus the 4 APNs from the mobile
848 // provider info database.
849 EXPECT_EQ(6, capability_->apn_try_list_.size());
850 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
851 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
852 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
853 EXPECT_EQ(kLastGoodUsername,
854 props[flimflam::kApnUsernameProperty].reader().get_string());
855}
856
Thieu Le923006b2012-04-05 16:32:58 -0700857TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
858 SetupCommonStartModemExpectations();
859 EXPECT_CALL(*card_proxy_,
860 GetSPN(_, _, CellularCapability::kTimeoutDefault))
861 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
862 EXPECT_CALL(*card_proxy_,
863 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
864 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
865 SetProxyFactory();
866
867 Error error;
868 capability_->StartModem(
869 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
870 dispatcher_.DispatchPendingEvents();
871}
872
873TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
874 SetupCommonStartModemExpectations();
875 EXPECT_CALL(*card_proxy_,
876 GetSPN(_, _, CellularCapability::kTimeoutDefault))
877 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
878 EXPECT_CALL(*card_proxy_,
879 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
880 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
881 SetProxyFactory();
882
883 Error error;
884 capability_->StartModem(
885 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
886 dispatcher_.DispatchPendingEvents();
887}
888
889TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
890 SetupCommonStartModemExpectations();
891 EXPECT_CALL(*card_proxy_,
892 GetSPN(_, _, CellularCapability::kTimeoutDefault))
893 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
894 EXPECT_CALL(*card_proxy_,
895 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
896 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
897 SetProxyFactory();
898
899 Error error;
900 capability_->StartModem(
901 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
902 dispatcher_.DispatchPendingEvents();
903}
904
Thieu Leb5954a22012-05-18 10:37:34 -0700905TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
906 // Make sure we don't crash if the connect failed and there is no
907 // CellularService object. This can happen if the modem is enabled and
908 // then quickly disabled.
909 SetupCommonProxiesExpectations();
910 EXPECT_CALL(*simple_proxy_,
911 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
912 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
913 EXPECT_CALL(*this, TestCallback(IsFailure()));
914 SetProxyFactory();
915 InitProxies();
916 EXPECT_FALSE(capability_->cellular()->service());
917 Error error;
918 DBusPropertiesMap props;
919 capability_->Connect(props, &error,
920 Bind(&CellularCapabilityGSMTest::TestCallback,
921 Unretained(this)));
922}
923
924
Darin Petkovb05315f2011-11-07 10:14:25 +0100925} // namespace shill