blob: a4e2914127cbe53f51202b9309a1ef8e38904f7b [file] [log] [blame]
Darin Petkovc64fe5e2012-01-11 12:46:13 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb05315f2011-11-07 10:14:25 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/cellular_capability_gsm.h"
6
Jason Glasgow4c0724a2012-04-17 15:47:40 -04007#include <string>
8#include <vector>
9
Eric Shienbrood9a245532012-03-07 14:20:39 -050010#include <base/bind.h>
Darin Petkova4ca3c32012-08-17 16:05:24 +020011#include <base/stringprintf.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010012#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010013#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010014#include <mm/mm-modem.h>
Darin Petkov1272a432011-11-10 15:53:37 +010015#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010016
17#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010018#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010019#include "shill/error.h"
20#include "shill/event_dispatcher.h"
Gary Morainbaeefdf2012-04-30 14:53:35 -070021#include "shill/key_value_store_matcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010022#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070023#include "shill/mock_log.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080024#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010025#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010026#include "shill/mock_modem_gsm_network_proxy.h"
Thieu Le923006b2012-04-05 16:32:58 -070027#include "shill/mock_modem_proxy.h"
28#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040029#include "shill/mock_profile.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010030#include "shill/nice_mock_control.h"
Thieu Le923006b2012-04-05 16:32:58 -070031#include "shill/proxy_factory.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010032
Eric Shienbrood9a245532012-03-07 14:20:39 -050033using base::Bind;
Darin Petkova4ca3c32012-08-17 16:05:24 +020034using base::StringPrintf;
Eric Shienbrood9a245532012-03-07 14:20:39 -050035using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010036using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040037using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010038using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050039using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010040using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010041using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040042using testing::SaveArg;
Paul Stewart1e5bad52012-08-04 17:13:19 -070043using testing::StrEq;
Darin Petkovcb547732011-11-09 13:55:26 +010044
Darin Petkovb05315f2011-11-07 10:14:25 +010045namespace shill {
46
Eric Shienbrood9a245532012-03-07 14:20:39 -050047MATCHER(IsSuccess, "") {
48 return arg.IsSuccess();
49}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050050
Thieu Leb5954a22012-05-18 10:37:34 -070051MATCHER(IsFailure, "") {
52 return arg.IsFailure();
53}
54
Darin Petkovb05315f2011-11-07 10:14:25 +010055class CellularCapabilityGSMTest : public testing::Test {
56 public:
57 CellularCapabilityGSMTest()
Ben Chan3ecdf822012-08-06 12:29:23 -070058 : create_card_proxy_from_factory_(false),
59 proxy_(new MockModemProxy()),
60 simple_proxy_(new MockModemSimpleProxy()),
61 card_proxy_(new MockModemGSMCardProxy()),
62 network_proxy_(new MockModemGSMNetworkProxy()),
63 proxy_factory_(this),
64 capability_(NULL),
65 device_adaptor_(NULL),
66 provider_db_(NULL),
67 cellular_(new Cellular(&control_,
Darin Petkovb05315f2011-11-07 10:14:25 +010068 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080069 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010070 NULL,
71 "",
Darin Petkov31332412012-01-28 01:50:02 +010072 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010073 0,
74 Cellular::kTypeGSM,
75 "",
76 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040077 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070078 NULL,
Ben Chan62028b22012-11-05 11:20:02 -080079 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070080 &proxy_factory_)) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010081
Darin Petkov3e509242011-11-10 14:46:44 +010082 virtual ~CellularCapabilityGSMTest() {
83 cellular_->service_ = NULL;
Darin Petkovb4fccd22012-08-10 11:59:26 +020084 if (provider_db_) {
85 mobile_provider_close_db(provider_db_);
86 provider_db_ = NULL;
87 }
Darin Petkov721ac932011-11-16 15:43:09 +010088 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010089 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010090 }
91
92 virtual void SetUp() {
93 capability_ =
94 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010095 device_adaptor_ =
96 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010097 }
98
Thieu Le923006b2012-04-05 16:32:58 -070099 void InvokeEnable(bool enable, Error *error,
100 const ResultCallback &callback, int timeout) {
101 callback.Run(Error());
102 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500103 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
104 int timeout) {
105 callback.Run(kIMEI, Error());
106 }
107 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
108 int timeout) {
109 callback.Run(kIMSI, Error());
110 }
111 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
112 int timeout) {
113 callback.Run("310240123456789", Error());
114 }
Gary Morain82a31a02012-08-02 18:03:32 -0700115 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
116 int timeout) {
117 callback.Run("", Error(Error::kOperationFailed));
118 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500119 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
120 int timeout) {
121 callback.Run(kMSISDN, Error());
122 }
Thieu Le923006b2012-04-05 16:32:58 -0700123 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
124 int timeout) {
125 callback.Run("", Error(Error::kOperationFailed));
126 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500127 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
128 int timeout) {
129 callback.Run(kTestCarrier, Error());
130 }
Thieu Le923006b2012-04-05 16:32:58 -0700131 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
132 int timeout) {
133 callback.Run("", Error(Error::kOperationFailed));
134 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500135 void InvokeGetSignalQuality(Error *error,
136 const SignalQualityCallback &callback,
137 int timeout) {
138 callback.Run(kStrength, Error());
139 }
140 void InvokeGetRegistrationInfo(Error *error,
141 const RegistrationInfoCallback &callback,
142 int timeout) {
143 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
144 kTestNetwork, kTestCarrier, Error());
145 }
146 void InvokeRegister(const string &network_id,
147 Error *error,
148 const ResultCallback &callback,
149 int timeout) {
150 callback.Run(Error());
151 }
152 void InvokeEnablePIN(const string &pin, bool enable,
153 Error *error, const ResultCallback &callback,
154 int timeout) {
155 callback.Run(Error());
156 }
157 void InvokeSendPIN(const string &pin, Error *error,
158 const ResultCallback &callback, int timeout) {
159 callback.Run(Error());
160 }
161 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
162 const ResultCallback &callback, int timeout) {
163 callback.Run(Error());
164 }
165 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
166 const ResultCallback &callback, int timeout) {
167 callback.Run(Error());
168 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400169 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500170 GSMScanResults results;
171 results.push_back(GSMScanResult());
172 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
173 results.push_back(GSMScanResult());
174 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400175 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500176 }
Thieu Le923006b2012-04-05 16:32:58 -0700177 void InvokeGetModemStatus(Error *error,
178 const DBusPropertyMapCallback &callback,
179 int timeout) {
180 DBusPropertiesMap props;
181 callback.Run(props, Error());
182 }
183 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
184 int timeout) {
185 ModemHardwareInfo info;
186 callback.Run(info, Error());
187 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500188
Thieu Leb5954a22012-05-18 10:37:34 -0700189 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
190 const ResultCallback &callback, int timeout) {
191 callback.Run(Error(Error::kOperationFailed));
192 }
193
Eric Shienbrood9a245532012-03-07 14:20:39 -0500194 MOCK_METHOD1(TestCallback, void(const Error &error));
195
Darin Petkovb05315f2011-11-07 10:14:25 +0100196 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100197 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100198 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500199 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100200 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100201 static const char kPIN[];
202 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100203 static const char kIMEI[];
204 static const char kIMSI[];
205 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500206 static const char kScanID0[];
207 static const char kScanID1[];
208 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100209
Thieu Le923006b2012-04-05 16:32:58 -0700210 class TestProxyFactory : public ProxyFactory {
211 public:
212 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
213
214 virtual ModemProxyInterface *CreateModemProxy(
215 const string &/*path*/,
216 const string &/*service*/) {
217 return test_->proxy_.release();
218 }
219
220 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
221 const string &/*path*/,
222 const string &/*service*/) {
223 return test_->simple_proxy_.release();
224 }
225
226 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
227 const string &/*path*/,
228 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700229 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
230 // CellularCapabilityGSM::InitProperties (and thus
231 // CellularCapabilityGSM::GetIMSI) from being called during the
232 // construction. Remove this workaround after refactoring the tests.
233 return test_->create_card_proxy_from_factory_ ?
234 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700235 }
236
237 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
238 const string &/*path*/,
239 const string &/*service*/) {
240 return test_->network_proxy_.release();
241 }
242
243 private:
244 CellularCapabilityGSMTest *test_;
245 };
246
247 void SetProxy() {
248 capability_->proxy_.reset(proxy_.release());
249 }
250
Darin Petkovcb547732011-11-09 13:55:26 +0100251 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100252 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100253 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100254
Darin Petkov1272a432011-11-10 15:53:37 +0100255 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100256 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100257 }
258
Darin Petkov20c13ec2011-11-09 15:07:15 +0100259 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100260 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100261 }
262
263 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100264 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100265 }
266
Darin Petkov3e509242011-11-10 14:46:44 +0100267 void SetService() {
268 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800269 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100270 }
271
Darin Petkov1272a432011-11-10 15:53:37 +0100272 void InitProviderDB() {
273 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
274 ASSERT_TRUE(provider_db_);
275 cellular_->provider_db_ = provider_db_;
276 }
277
Thieu Leb5954a22012-05-18 10:37:34 -0700278 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700279 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
280 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
281 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
282 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700283 }
284
285 void SetupCommonStartModemExpectations() {
286 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700287
288 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
289 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700290 EXPECT_CALL(*card_proxy_,
291 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
292 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
293 EXPECT_CALL(*card_proxy_,
294 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
295 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
296 EXPECT_CALL(*network_proxy_, AccessTechnology());
297 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
298 EXPECT_CALL(*proxy_,
299 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
300 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
301 EXPECT_CALL(*network_proxy_,
302 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
303 EXPECT_CALL(*network_proxy_,
304 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
305 EXPECT_CALL(*this, TestCallback(IsSuccess()));
306 }
307
Thieu Leb5954a22012-05-18 10:37:34 -0700308 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700309 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700310 capability_->InitProxies();
311 }
312
Ben Chan3ecdf822012-08-06 12:29:23 -0700313 void AllowCreateCardProxyFromFactory() {
314 create_card_proxy_from_factory_ = true;
315 }
316
Darin Petkovb05315f2011-11-07 10:14:25 +0100317 NiceMockControl control_;
318 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800319 MockMetrics metrics_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700320 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700321 scoped_ptr<MockModemProxy> proxy_;
322 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100323 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100324 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700325 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100326 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100327 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100328 mobile_provider_db *provider_db_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700329 CellularRefPtr cellular_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400330 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100331};
332
Darin Petkov31332412012-01-28 01:50:02 +0100333const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100334const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
335 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100336const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500337const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100338const char CellularCapabilityGSMTest::kPIN[] = "9876";
339const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100340const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100341const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100342const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343const char CellularCapabilityGSMTest::kScanID0[] = "123";
344const char CellularCapabilityGSMTest::kScanID1[] = "456";
345const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100346
Darin Petkov721ac932011-11-16 15:43:09 +0100347TEST_F(CellularCapabilityGSMTest, PropertyStore) {
348 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
349}
350
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500351TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500352 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
353 .WillOnce(Invoke(this,
354 &CellularCapabilityGSMTest::InvokeGetIMEI));
355 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100356 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500357 ASSERT_TRUE(capability_->imei_.empty());
358 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
359 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500360 EXPECT_EQ(kIMEI, capability_->imei_);
361}
362
363TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500364 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
365 .WillOnce(Invoke(this,
366 &CellularCapabilityGSMTest::InvokeGetIMSI))
367 .WillOnce(Invoke(this,
368 &CellularCapabilityGSMTest::InvokeGetIMSI2));
369 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500370 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500371 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
372 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700373 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700374 EXPECT_FALSE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500375 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500376 EXPECT_EQ(kIMSI, capability_->imsi_);
Ben Chanbd3aee82012-10-16 23:52:04 -0700377 EXPECT_TRUE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500378 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100379 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500380 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500381 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
382}
383
Gary Morain82a31a02012-08-02 18:03:32 -0700384// In this test, the call to the proxy's GetIMSI() will always indicate failure,
385// which will cause the retry logic to call the proxy again a number of times.
386// Eventually, the retries expire.
387TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
388 ScopedMockLog log;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700389 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700390 ::testing::StartsWith("GetIMSI failed - ")));
391 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
392 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 1)
393 .WillRepeatedly(Invoke(this,
394 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
395 EXPECT_CALL(*this, TestCallback(IsFailure()));
396 SetCardProxy();
397 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
398 Unretained(this));
399 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700400 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700401
402 capability_->get_imsi_retries_ = 0;
403 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
404 capability_->get_imsi_retry_delay_milliseconds_);
405
406 // Set the delay to zero to speed up the test.
407 capability_->get_imsi_retry_delay_milliseconds_ = 0;
408 capability_->GetIMSI(callback);
409 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
410 dispatcher_.DispatchPendingEvents();
411 }
412 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
413 capability_->get_imsi_retries_);
414 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700415 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700416}
417
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500418TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500419 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
420 CellularCapability::kTimeoutDefault))
421 .WillOnce(Invoke(this,
422 &CellularCapabilityGSMTest::InvokeGetMSISDN));
423 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500424 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500425 ASSERT_TRUE(capability_->mdn_.empty());
426 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
427 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500428 EXPECT_EQ(kMSISDN, capability_->mdn_);
429}
430
431TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500432 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
433 .WillOnce(Invoke(this,
434 &CellularCapabilityGSMTest::InvokeGetSPN));
435 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500436 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500437 ASSERT_TRUE(capability_->spn_.empty());
438 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
439 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500440 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100441}
Darin Petkovb05315f2011-11-07 10:14:25 +0100442
Darin Petkov3e509242011-11-10 14:46:44 +0100443TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500444 EXPECT_CALL(*network_proxy_,
445 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
446 .WillOnce(Invoke(this,
447 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100448 SetNetworkProxy();
449 SetService();
450 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100451 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100452 EXPECT_EQ(kStrength, cellular_->service()->strength());
453}
454
Darin Petkov184c54e2011-11-15 12:44:39 +0100455TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500456 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
457 CellularCapability::kTimeoutRegister))
458 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
459 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100460 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500461 Error error;
462 capability_->RegisterOnNetwork(kTestNetwork, &error,
463 Bind(&CellularCapabilityGSMTest::TestCallback,
464 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500465 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100466}
467
Darin Petkovb72cf402011-11-22 14:51:39 +0100468TEST_F(CellularCapabilityGSMTest, IsRegistered) {
469 EXPECT_FALSE(capability_->IsRegistered());
470 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
471 EXPECT_FALSE(capability_->IsRegistered());
472 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
473 EXPECT_TRUE(capability_->IsRegistered());
474 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
475 EXPECT_FALSE(capability_->IsRegistered());
476 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
477 EXPECT_FALSE(capability_->IsRegistered());
478 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
479 EXPECT_FALSE(capability_->IsRegistered());
480 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
481 EXPECT_TRUE(capability_->IsRegistered());
482}
483
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500484TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
485 ASSERT_FALSE(capability_->IsRegistered());
486 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500487 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
488 .WillOnce(Invoke(this,
489 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500490 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500491 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500492 EXPECT_TRUE(capability_->IsRegistered());
493 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
494 capability_->registration_state_);
495}
496
Darin Petkovb05315f2011-11-07 10:14:25 +0100497TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500498 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
499 CellularCapability::kTimeoutDefault))
500 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
501 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100502 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500503 Error error;
504 capability_->RequirePIN(kPIN, true, &error,
505 Bind(&CellularCapabilityGSMTest::TestCallback,
506 Unretained(this)));
507 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100508}
509
510TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500511 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
512 CellularCapability::kTimeoutDefault))
513 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
514 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100515 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500516 Error error;
517 capability_->EnterPIN(kPIN, &error,
518 Bind(&CellularCapabilityGSMTest::TestCallback,
519 Unretained(this)));
520 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100521}
522
523TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500524 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
525 CellularCapability::kTimeoutDefault))
526 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
527 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100528 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500529 Error error;
530 capability_->UnblockPIN(kPUK, kPIN, &error,
531 Bind(&CellularCapabilityGSMTest::TestCallback,
532 Unretained(this)));
533 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100534}
535
536TEST_F(CellularCapabilityGSMTest, ChangePIN) {
537 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500538 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
539 CellularCapability::kTimeoutDefault))
540 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
541 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100542 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500543 Error error;
544 capability_->ChangePIN(kOldPIN, kPIN, &error,
545 Bind(&CellularCapabilityGSMTest::TestCallback,
546 Unretained(this)));
547 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100548}
549
Darin Petkovb7828b02012-02-03 12:34:30 +0100550namespace {
551
552MATCHER(SizeIs2, "") {
553 return arg.size() == 2;
554}
555
556} // namespace
557
Darin Petkov1272a432011-11-10 15:53:37 +0100558TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100559 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500560 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400561 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500562 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100563 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100564 EXPECT_CALL(*device_adaptor_,
565 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
566 SizeIs2()));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400567 EXPECT_CALL(*device_adaptor_,
568 EmitBoolChanged(flimflam::kScanningProperty, true));
569 EXPECT_FALSE(capability_->scanning_);
570
Eric Shienbrood9a245532012-03-07 14:20:39 -0500571 SetNetworkProxy();
572 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
573 Unretained(this)));
574 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400575 EXPECT_TRUE(capability_->scanning_);
576
577 // Simulate the completion of the scan...
578 EXPECT_CALL(*device_adaptor_,
579 EmitBoolChanged(flimflam::kScanningProperty, false));
580 InvokeScanReply();
581 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100582 EXPECT_EQ(2, capability_->found_networks_.size());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500583 EXPECT_EQ(kScanID0,
Darin Petkov721ac932011-11-16 15:43:09 +0100584 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500585 EXPECT_EQ(kScanID1,
Darin Petkov721ac932011-11-16 15:43:09 +0100586 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100587}
588
589TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
590 static const char kID[] = "123";
591 static const char kLongName[] = "long name";
592 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500593 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100594 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
595 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
596 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
597 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
598 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
599 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100600 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100601 EXPECT_EQ(5, parsed.size());
602 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
603 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
604 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
605 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
606 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
607 parsed[flimflam::kTechnologyProperty]);
608}
609
610TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
611 InitProviderDB();
612 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500613 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100614 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100615 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100616 EXPECT_EQ(2, parsed.size());
617 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
618 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
619}
620
Darin Petkovae0c64e2011-11-15 15:50:27 +0100621TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100622 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
623 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100624 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100625 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100626 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
627 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100628 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100629 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100630}
631
632TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
633 static const char kOperatorName[] = "Swisscom";
634 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100635 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100636 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100637 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100638 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
639 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100640 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200641
642 static const char kTestOperator[] = "Testcom";
643 capability_->serving_operator_.SetName(kTestOperator);
644 capability_->serving_operator_.SetCountry("");
645 capability_->UpdateOperatorInfo();
646 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
647 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
648 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100649}
650
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100651TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
652 InitProviderDB();
653 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500654 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400655 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100656 capability_->UpdateStatus(props);
657 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
658}
659
Darin Petkovf508c822012-09-21 13:43:17 +0200660TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
661 EXPECT_FALSE(cellular_->allow_roaming_);
662 EXPECT_FALSE(capability_->provider_requires_roaming_);
663 EXPECT_FALSE(capability_->AllowRoaming());
664 capability_->provider_requires_roaming_ = true;
665 EXPECT_TRUE(capability_->AllowRoaming());
666 capability_->provider_requires_roaming_ = false;
667 cellular_->allow_roaming_ = true;
668 EXPECT_TRUE(capability_->AllowRoaming());
669}
670
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100671TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
672 static const char kCountry[] = "us";
673 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500674 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100675
Darin Petkovf508c822012-09-21 13:43:17 +0200676 EXPECT_FALSE(capability_->home_provider_);
677 EXPECT_FALSE(capability_->provider_requires_roaming_);
678
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100679 capability_->SetHomeProvider(); // No mobile provider DB available.
680 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
681 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
682 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200683 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100684
685 InitProviderDB();
686 capability_->SetHomeProvider();
687 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
688 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
689 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100690 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200691 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200692 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100693
694 Cellular::Operator oper;
695 cellular_->set_home_provider(oper);
696 capability_->spn_ = kTestCarrier;
697 capability_->SetHomeProvider();
698 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
699 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
700 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200701 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200702
703 static const char kCubic[] = "Cubic";
704 capability_->spn_ = kCubic;
705 capability_->SetHomeProvider();
706 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
707 EXPECT_EQ("", cellular_->home_provider().GetCode());
708 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200709 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200710
711 static const char kCUBIC[] = "CUBIC";
712 capability_->spn_ = kCUBIC;
713 capability_->home_provider_ = NULL;
714 capability_->SetHomeProvider();
715 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
716 EXPECT_EQ("", cellular_->home_provider().GetCode());
717 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200718 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100719}
720
Darin Petkov3cfbf212011-11-21 16:02:09 +0100721namespace {
722
723MATCHER(SizeIs4, "") {
724 return arg.size() == 4;
725}
726
727} // namespace
728
729TEST_F(CellularCapabilityGSMTest, InitAPNList) {
730 InitProviderDB();
731 capability_->home_provider_ =
732 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
733 ASSERT_TRUE(capability_->home_provider_);
734 EXPECT_EQ(0, capability_->apn_list_.size());
735 EXPECT_CALL(*device_adaptor_,
736 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
737 SizeIs4()));
738 capability_->InitAPNList();
739 EXPECT_EQ(4, capability_->apn_list_.size());
740 EXPECT_EQ("wap.voicestream.com",
741 capability_->apn_list_[1][flimflam::kApnProperty]);
742 EXPECT_EQ("Web2Go/t-zones",
743 capability_->apn_list_[1][flimflam::kApnNameProperty]);
744}
745
Darin Petkov20c13ec2011-11-09 15:07:15 +0100746TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100747 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100748 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100749 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100750 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100751 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
752 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100753 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100754 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
755 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100756 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100757 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
758 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100759 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100760 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
761 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100762 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100763 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
764 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100765 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100766 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
767 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100768 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100769 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
770 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100771 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100772 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
773 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100774 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100775}
776
777TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
778 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100779 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100780 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
781 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100782 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100783 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
784 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100785 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100786 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
787 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100788 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100789 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
790 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100791 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100792 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
793 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100794 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100795}
796
Darin Petkovac635a82012-01-10 16:51:58 +0100797TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
798 CellularCapabilityGSM::friendly_service_name_id_ = 0;
799 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
800 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200801
Darin Petkovac635a82012-01-10 16:51:58 +0100802 capability_->serving_operator_.SetCode("1234");
803 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200804
Darin Petkovac635a82012-01-10 16:51:58 +0100805 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500806 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100807 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200808
809 static const char kHomeProvider[] = "The GSM Home Provider";
810 cellular_->home_provider_.SetName(kHomeProvider);
811 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
812 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
813 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
814
Darin Petkovac635a82012-01-10 16:51:58 +0100815 static const char kTestOperator[] = "A GSM Operator";
816 capability_->serving_operator_.SetName(kTestOperator);
817 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200818
819 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING;
820 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
821 capability_->CreateFriendlyServiceName());
Darin Petkovac635a82012-01-10 16:51:58 +0100822}
823
Darin Petkov31332412012-01-28 01:50:02 +0100824TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
825 SetService();
826 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100827 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100828 cellular_->service()->friendly_name(),
829 cellular_->service()->GetStorageIdentifier());
830 capability_->imsi_ = kIMSI;
831 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100832 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100833 cellular_->service()->GetStorageIdentifier());
834}
835
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400836TEST_F(CellularCapabilityGSMTest, OnDBusPropertiesChanged) {
Darin Petkov63138a92012-02-06 14:09:15 +0100837 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
838 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
839 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
840 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
841 DBusPropertiesMap props;
842 static const char kLockType[] = "sim-pin";
843 const int kRetries = 3;
844 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
845 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
846 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
847 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
848 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
849 kLockType);
850 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
851 kRetries);
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400852 // Call with the 'wrong' interface and nothing should change.
853 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_INTERFACE, props,
854 vector<string>());
855 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
856 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
857 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
858 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
859
Gary Morainbaeefdf2012-04-30 14:53:35 -0700860 // Call with the MM_MODEM_GSM_NETWORK_INTERFACE interface and expect a change
861 // to the enabled state of the SIM lock.
862 KeyValueStore lock_status;
863 lock_status.SetBool(flimflam::kSIMLockEnabledProperty, true);
864 lock_status.SetString(flimflam::kSIMLockTypeProperty, "");
865 lock_status.SetUint(flimflam::kSIMLockRetriesLeftProperty, 0);
866
867 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
868 flimflam::kSIMLockStatusProperty,
869 KeyValueStoreEq(lock_status)));
870
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400871 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_NETWORK_INTERFACE, props,
Jason Glasgow4c0724a2012-04-17 15:47:40 -0400872 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100873 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400874 capability_->OnDBusPropertiesChanged(MM_MODEM_GSM_CARD_INTERFACE, props,
875 vector<string>());
Darin Petkov63138a92012-02-06 14:09:15 +0100876 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700877 EXPECT_TRUE(capability_->sim_lock_status_.lock_type.empty());
878 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
879
880 // Some properties are sent on the MM_MODEM_INTERFACE.
881 capability_->sim_lock_status_.enabled = false;
882 capability_->sim_lock_status_.lock_type = "";
883 capability_->sim_lock_status_.retries_left = 0;
884 KeyValueStore lock_status2;
885 lock_status2.SetBool(flimflam::kSIMLockEnabledProperty, false);
886 lock_status2.SetString(flimflam::kSIMLockTypeProperty, kLockType);
887 lock_status2.SetUint(flimflam::kSIMLockRetriesLeftProperty, kRetries);
888 EXPECT_CALL(*device_adaptor_,
889 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty,
890 KeyValueStoreEq(lock_status2)));
891 capability_->OnDBusPropertiesChanged(MM_MODEM_INTERFACE, props,
892 vector<string>());
893 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
Darin Petkov63138a92012-02-06 14:09:15 +0100894 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
895 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
896}
897
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400898TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
899 static const string kTmobileApn("epc.tmobile.com");
900 static const string kLastGoodApn("remembered.apn");
901 static const string kLastGoodUsername("remembered.user");
902 static const string kSuppliedApn("my.apn");
903
904 SetService();
905 capability_->imsi_ = "310240123456789";
906 InitProviderDB();
907 capability_->SetHomeProvider();
908 DBusPropertiesMap props;
909 capability_->SetupConnectProperties(&props);
910 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
911 EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
912
913 ProfileRefPtr profile(new NiceMock<MockProfile>(
914 &control_, reinterpret_cast<Manager *>(NULL)));
915 cellular_->service()->set_profile(profile);
916 Stringmap apn_info;
917 apn_info[flimflam::kApnProperty] = kLastGoodApn;
918 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
919 cellular_->service()->SetLastGoodApn(apn_info);
920 props.clear();
921 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
922 capability_->SetupConnectProperties(&props);
923 // We expect the list to contain the last good APN, plus
924 // the 4 APNs from the mobile provider info database.
925 EXPECT_EQ(5, capability_->apn_try_list_.size());
926 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
927 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
928 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
929 EXPECT_EQ(kLastGoodUsername,
930 props[flimflam::kApnUsernameProperty].reader().get_string());
931
932 Error error;
933 apn_info.clear();
934 props.clear();
935 apn_info[flimflam::kApnProperty] = kSuppliedApn;
936 // Setting the APN has the side effect of clearing the LastGoodApn,
937 // so the try list will have 5 elements, with the first one being
938 // the supplied APN.
939 cellular_->service()->SetApn(apn_info, &error);
940 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
941 capability_->SetupConnectProperties(&props);
942 EXPECT_EQ(5, capability_->apn_try_list_.size());
943 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
944 EXPECT_EQ(kSuppliedApn, props[flimflam::kApnProperty].reader().get_string());
945
946 apn_info.clear();
947 props.clear();
948 apn_info[flimflam::kApnProperty] = kLastGoodApn;
949 apn_info[flimflam::kApnUsernameProperty] = kLastGoodUsername;
950 // Now when LastGoodAPN is set, it will be the one selected.
951 cellular_->service()->SetLastGoodApn(apn_info);
952 EXPECT_TRUE(props.find(flimflam::kApnProperty) == props.end());
953 capability_->SetupConnectProperties(&props);
954 // We expect the list to contain the last good APN, plus
955 // the user-supplied APN, plus the 4 APNs from the mobile
956 // provider info database.
957 EXPECT_EQ(6, capability_->apn_try_list_.size());
958 EXPECT_FALSE(props.find(flimflam::kApnProperty) == props.end());
959 EXPECT_EQ(kLastGoodApn, props[flimflam::kApnProperty].reader().get_string());
960 EXPECT_FALSE(props.find(flimflam::kApnUsernameProperty) == props.end());
961 EXPECT_EQ(kLastGoodUsername,
962 props[flimflam::kApnUsernameProperty].reader().get_string());
963}
964
Thieu Le923006b2012-04-05 16:32:58 -0700965TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
966 SetupCommonStartModemExpectations();
967 EXPECT_CALL(*card_proxy_,
968 GetSPN(_, _, CellularCapability::kTimeoutDefault))
969 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
970 EXPECT_CALL(*card_proxy_,
971 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
972 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700973 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700974
975 Error error;
976 capability_->StartModem(
977 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
978 dispatcher_.DispatchPendingEvents();
979}
980
981TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
982 SetupCommonStartModemExpectations();
983 EXPECT_CALL(*card_proxy_,
984 GetSPN(_, _, CellularCapability::kTimeoutDefault))
985 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
986 EXPECT_CALL(*card_proxy_,
987 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
988 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700989 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700990
991 Error error;
992 capability_->StartModem(
993 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
994 dispatcher_.DispatchPendingEvents();
995}
996
997TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
998 SetupCommonStartModemExpectations();
999 EXPECT_CALL(*card_proxy_,
1000 GetSPN(_, _, CellularCapability::kTimeoutDefault))
1001 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
1002 EXPECT_CALL(*card_proxy_,
1003 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
1004 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -07001005 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -07001006
1007 Error error;
1008 capability_->StartModem(
1009 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
1010 dispatcher_.DispatchPendingEvents();
1011}
1012
Thieu Leb5954a22012-05-18 10:37:34 -07001013TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
1014 // Make sure we don't crash if the connect failed and there is no
1015 // CellularService object. This can happen if the modem is enabled and
1016 // then quickly disabled.
1017 SetupCommonProxiesExpectations();
1018 EXPECT_CALL(*simple_proxy_,
1019 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
1020 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
1021 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -07001022 InitProxies();
1023 EXPECT_FALSE(capability_->cellular()->service());
1024 Error error;
1025 DBusPropertiesMap props;
1026 capability_->Connect(props, &error,
1027 Bind(&CellularCapabilityGSMTest::TestCallback,
1028 Unretained(this)));
1029}
1030
Darin Petkovb05315f2011-11-07 10:14:25 +01001031} // namespace shill