blob: 111e8dc053a26400d65ab48bf41c0bbeba54b95d [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"
Darin Petkov3cfbf212011-11-21 16:02:09 +010021#include "shill/mock_adaptors.h"
Gary Morain82a31a02012-08-02 18:03:32 -070022#include "shill/mock_log.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"
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070025#include "shill/mock_modem_info.h"
Thieu Le923006b2012-04-05 16:32:58 -070026#include "shill/mock_modem_proxy.h"
27#include "shill/mock_modem_simple_proxy.h"
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -040028#include "shill/mock_profile.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;
Darin Petkova4ca3c32012-08-17 16:05:24 +020032using base::StringPrintf;
Eric Shienbrood9a245532012-03-07 14:20:39 -050033using base::Unretained;
Darin Petkov31332412012-01-28 01:50:02 +010034using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040035using std::vector;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010036using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050037using testing::Invoke;
Darin Petkov3cfbf212011-11-21 16:02:09 +010038using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010039using testing::Return;
Jason Glasgowcd0349c2012-05-03 23:32:15 -040040using testing::SaveArg;
Paul Stewart1e5bad52012-08-04 17:13:19 -070041using testing::StrEq;
Darin Petkovcb547732011-11-09 13:55:26 +010042
Darin Petkovb05315f2011-11-07 10:14:25 +010043namespace shill {
44
Eric Shienbrood9a245532012-03-07 14:20:39 -050045MATCHER(IsSuccess, "") {
46 return arg.IsSuccess();
47}
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050048
Thieu Leb5954a22012-05-18 10:37:34 -070049MATCHER(IsFailure, "") {
50 return arg.IsFailure();
51}
52
Darin Petkovb05315f2011-11-07 10:14:25 +010053class CellularCapabilityGSMTest : public testing::Test {
54 public:
55 CellularCapabilityGSMTest()
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070056 : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080057 create_card_proxy_from_factory_(false),
Ben Chan3ecdf822012-08-06 12:29:23 -070058 proxy_(new MockModemProxy()),
59 simple_proxy_(new MockModemSimpleProxy()),
60 card_proxy_(new MockModemGSMCardProxy()),
61 network_proxy_(new MockModemGSMNetworkProxy()),
62 proxy_factory_(this),
63 capability_(NULL),
64 device_adaptor_(NULL),
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070065 cellular_(new Cellular(&modem_info_,
Darin Petkovb05315f2011-11-07 10:14:25 +010066 "",
Darin Petkov31332412012-01-28 01:50:02 +010067 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010068 0,
69 Cellular::kTypeGSM,
70 "",
71 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040072 "",
Thieu Lece4483e2013-01-23 15:12:03 -080073 &proxy_factory_)) {
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070074 modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
75 Technology::kCellular);
Thieu Lece4483e2013-01-23 15:12:03 -080076 }
Darin Petkovb05315f2011-11-07 10:14:25 +010077
Darin Petkov3e509242011-11-10 14:46:44 +010078 virtual ~CellularCapabilityGSMTest() {
79 cellular_->service_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010080 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010081 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010082 }
83
84 virtual void SetUp() {
85 capability_ =
86 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010087 device_adaptor_ =
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070088 dynamic_cast<DeviceMockAdaptor *>(cellular_->adaptor());
89 }
90
91 void InitProviderDB() {
92 modem_info_.SetProviderDB(kTestMobileProviderDBPath);
Darin Petkov3e509242011-11-10 14:46:44 +010093 }
94
Thieu Le923006b2012-04-05 16:32:58 -070095 void InvokeEnable(bool enable, Error *error,
96 const ResultCallback &callback, int timeout) {
97 callback.Run(Error());
98 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050099 void InvokeGetIMEI(Error *error, const GSMIdentifierCallback &callback,
100 int timeout) {
101 callback.Run(kIMEI, Error());
102 }
103 void InvokeGetIMSI(Error *error, const GSMIdentifierCallback &callback,
104 int timeout) {
105 callback.Run(kIMSI, Error());
106 }
107 void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
108 int timeout) {
109 callback.Run("310240123456789", Error());
110 }
Gary Morain82a31a02012-08-02 18:03:32 -0700111 void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
112 int timeout) {
113 callback.Run("", Error(Error::kOperationFailed));
114 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500115 void InvokeGetMSISDN(Error *error, const GSMIdentifierCallback &callback,
116 int timeout) {
117 callback.Run(kMSISDN, Error());
118 }
Thieu Le923006b2012-04-05 16:32:58 -0700119 void InvokeGetMSISDNFail(Error *error, const GSMIdentifierCallback &callback,
120 int timeout) {
121 callback.Run("", Error(Error::kOperationFailed));
122 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500123 void InvokeGetSPN(Error *error, const GSMIdentifierCallback &callback,
124 int timeout) {
125 callback.Run(kTestCarrier, Error());
126 }
Thieu Le923006b2012-04-05 16:32:58 -0700127 void InvokeGetSPNFail(Error *error, const GSMIdentifierCallback &callback,
128 int timeout) {
129 callback.Run("", Error(Error::kOperationFailed));
130 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500131 void InvokeGetSignalQuality(Error *error,
132 const SignalQualityCallback &callback,
133 int timeout) {
134 callback.Run(kStrength, Error());
135 }
136 void InvokeGetRegistrationInfo(Error *error,
137 const RegistrationInfoCallback &callback,
138 int timeout) {
139 callback.Run(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
140 kTestNetwork, kTestCarrier, Error());
141 }
142 void InvokeRegister(const string &network_id,
143 Error *error,
144 const ResultCallback &callback,
145 int timeout) {
146 callback.Run(Error());
147 }
148 void InvokeEnablePIN(const string &pin, bool enable,
149 Error *error, const ResultCallback &callback,
150 int timeout) {
151 callback.Run(Error());
152 }
153 void InvokeSendPIN(const string &pin, Error *error,
154 const ResultCallback &callback, int timeout) {
155 callback.Run(Error());
156 }
157 void InvokeSendPUK(const string &puk, const string &pin, Error *error,
158 const ResultCallback &callback, int timeout) {
159 callback.Run(Error());
160 }
161 void InvokeChangePIN(const string &old_pin, const string &pin, Error *error,
162 const ResultCallback &callback, int timeout) {
163 callback.Run(Error());
164 }
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400165 void InvokeScanReply() {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500166 GSMScanResults results;
167 results.push_back(GSMScanResult());
168 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kScanID0;
169 results.push_back(GSMScanResult());
170 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kScanID1;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400171 scan_callback_.Run(results, Error());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500172 }
Thieu Le923006b2012-04-05 16:32:58 -0700173 void InvokeGetModemStatus(Error *error,
174 const DBusPropertyMapCallback &callback,
175 int timeout) {
176 DBusPropertiesMap props;
177 callback.Run(props, Error());
178 }
179 void InvokeGetModemInfo(Error *error, const ModemInfoCallback &callback,
180 int timeout) {
181 ModemHardwareInfo info;
182 callback.Run(info, Error());
183 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500184
Thieu Leb5954a22012-05-18 10:37:34 -0700185 void InvokeConnectFail(DBusPropertiesMap props, Error *error,
186 const ResultCallback &callback, int timeout) {
187 callback.Run(Error(Error::kOperationFailed));
188 }
189
Eric Shienbrood9a245532012-03-07 14:20:39 -0500190 MOCK_METHOD1(TestCallback, void(const Error &error));
191
Darin Petkovb05315f2011-11-07 10:14:25 +0100192 protected:
Darin Petkov31332412012-01-28 01:50:02 +0100193 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +0100194 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500195 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +0100196 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +0100197 static const char kPIN[];
198 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +0100199 static const char kIMEI[];
200 static const char kIMSI[];
201 static const char kMSISDN[];
Eric Shienbrood9a245532012-03-07 14:20:39 -0500202 static const char kScanID0[];
203 static const char kScanID1[];
204 static const int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +0100205
Thieu Le923006b2012-04-05 16:32:58 -0700206 class TestProxyFactory : public ProxyFactory {
207 public:
208 explicit TestProxyFactory(CellularCapabilityGSMTest *test) : test_(test) {}
209
210 virtual ModemProxyInterface *CreateModemProxy(
211 const string &/*path*/,
212 const string &/*service*/) {
213 return test_->proxy_.release();
214 }
215
216 virtual ModemSimpleProxyInterface *CreateModemSimpleProxy(
217 const string &/*path*/,
218 const string &/*service*/) {
219 return test_->simple_proxy_.release();
220 }
221
222 virtual ModemGSMCardProxyInterface *CreateModemGSMCardProxy(
223 const string &/*path*/,
224 const string &/*service*/) {
Ben Chan3ecdf822012-08-06 12:29:23 -0700225 // TODO(benchan): This code conditionally returns a NULL pointer to avoid
226 // CellularCapabilityGSM::InitProperties (and thus
227 // CellularCapabilityGSM::GetIMSI) from being called during the
228 // construction. Remove this workaround after refactoring the tests.
229 return test_->create_card_proxy_from_factory_ ?
230 test_->card_proxy_.release() : NULL;
Thieu Le923006b2012-04-05 16:32:58 -0700231 }
232
233 virtual ModemGSMNetworkProxyInterface *CreateModemGSMNetworkProxy(
234 const string &/*path*/,
235 const string &/*service*/) {
236 return test_->network_proxy_.release();
237 }
238
239 private:
240 CellularCapabilityGSMTest *test_;
241 };
242
243 void SetProxy() {
244 capability_->proxy_.reset(proxy_.release());
245 }
246
Darin Petkovcb547732011-11-09 13:55:26 +0100247 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100248 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +0100249 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100250
Darin Petkov1272a432011-11-10 15:53:37 +0100251 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100252 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100253 }
254
Darin Petkov20c13ec2011-11-09 15:07:15 +0100255 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100256 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100257 }
258
259 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100260 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100261 }
262
Darin Petkov3e509242011-11-10 14:46:44 +0100263 void SetService() {
Prathmesh Prabhu0d36b4f2013-04-01 11:45:54 -0700264 cellular_->service_ = new CellularService(&modem_info_, cellular_);
Darin Petkov1272a432011-11-10 15:53:37 +0100265 }
266
Thieu Leb5954a22012-05-18 10:37:34 -0700267 void SetupCommonProxiesExpectations() {
Thieu Le923006b2012-04-05 16:32:58 -0700268 EXPECT_CALL(*proxy_, set_state_changed_callback(_));
269 EXPECT_CALL(*network_proxy_, set_signal_quality_callback(_));
270 EXPECT_CALL(*network_proxy_, set_network_mode_callback(_));
271 EXPECT_CALL(*network_proxy_, set_registration_info_callback(_));
Thieu Leb5954a22012-05-18 10:37:34 -0700272 }
273
274 void SetupCommonStartModemExpectations() {
275 SetupCommonProxiesExpectations();
Thieu Le923006b2012-04-05 16:32:58 -0700276
277 EXPECT_CALL(*proxy_, Enable(_, _, _, CellularCapability::kTimeoutEnable))
278 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnable));
Thieu Le923006b2012-04-05 16:32:58 -0700279 EXPECT_CALL(*card_proxy_,
280 GetIMEI(_, _, CellularCapability::kTimeoutDefault))
281 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMEI));
282 EXPECT_CALL(*card_proxy_,
283 GetIMSI(_, _, CellularCapability::kTimeoutDefault))
284 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetIMSI));
285 EXPECT_CALL(*network_proxy_, AccessTechnology());
286 EXPECT_CALL(*card_proxy_, EnabledFacilityLocks());
287 EXPECT_CALL(*proxy_,
288 GetModemInfo(_, _, CellularCapability::kTimeoutDefault))
289 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetModemInfo));
290 EXPECT_CALL(*network_proxy_,
291 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault));
292 EXPECT_CALL(*network_proxy_,
293 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault));
294 EXPECT_CALL(*this, TestCallback(IsSuccess()));
295 }
296
Thieu Leb5954a22012-05-18 10:37:34 -0700297 void InitProxies() {
Ben Chan3ecdf822012-08-06 12:29:23 -0700298 AllowCreateCardProxyFromFactory();
Thieu Leb5954a22012-05-18 10:37:34 -0700299 capability_->InitProxies();
300 }
301
Ben Chan3ecdf822012-08-06 12:29:23 -0700302 void AllowCreateCardProxyFromFactory() {
303 create_card_proxy_from_factory_ = true;
304 }
305
Darin Petkovb05315f2011-11-07 10:14:25 +0100306 EventDispatcher dispatcher_;
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700307 MockModemInfo modem_info_;
Ben Chan3ecdf822012-08-06 12:29:23 -0700308 bool create_card_proxy_from_factory_;
Thieu Le923006b2012-04-05 16:32:58 -0700309 scoped_ptr<MockModemProxy> proxy_;
310 scoped_ptr<MockModemSimpleProxy> simple_proxy_;
Darin Petkovcb547732011-11-09 13:55:26 +0100311 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100312 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Thieu Le923006b2012-04-05 16:32:58 -0700313 TestProxyFactory proxy_factory_;
Darin Petkov721ac932011-11-16 15:43:09 +0100314 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700315 DeviceMockAdaptor *device_adaptor_; // Owned by |cellular_|.
Ben Chan3ecdf822012-08-06 12:29:23 -0700316 CellularRefPtr cellular_;
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400317 ScanResultsCallback scan_callback_; // saved for testing scan operations
Darin Petkovb05315f2011-11-07 10:14:25 +0100318};
319
Darin Petkov31332412012-01-28 01:50:02 +0100320const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100321const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
322 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100323const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500324const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100325const char CellularCapabilityGSMTest::kPIN[] = "9876";
326const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100327const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100328const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100329const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500330const char CellularCapabilityGSMTest::kScanID0[] = "123";
331const char CellularCapabilityGSMTest::kScanID1[] = "456";
332const int CellularCapabilityGSMTest::kStrength = 80;
Darin Petkovcb547732011-11-09 13:55:26 +0100333
Darin Petkov721ac932011-11-16 15:43:09 +0100334TEST_F(CellularCapabilityGSMTest, PropertyStore) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700335 EXPECT_TRUE(cellular_->store().Contains(kSIMLockStatusProperty));
Darin Petkov721ac932011-11-16 15:43:09 +0100336}
337
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500338TEST_F(CellularCapabilityGSMTest, GetIMEI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500339 EXPECT_CALL(*card_proxy_, GetIMEI(_, _, CellularCapability::kTimeoutDefault))
340 .WillOnce(Invoke(this,
341 &CellularCapabilityGSMTest::InvokeGetIMEI));
342 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100343 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500344 ASSERT_TRUE(capability_->imei_.empty());
345 capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
346 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500347 EXPECT_EQ(kIMEI, capability_->imei_);
348}
349
350TEST_F(CellularCapabilityGSMTest, GetIMSI) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500351 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
352 .WillOnce(Invoke(this,
353 &CellularCapabilityGSMTest::InvokeGetIMSI))
354 .WillOnce(Invoke(this,
355 &CellularCapabilityGSMTest::InvokeGetIMSI2));
356 EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500357 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500358 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
359 Unretained(this));
Gary Morain82a31a02012-08-02 18:03:32 -0700360 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700361 EXPECT_FALSE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500362 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500363 EXPECT_EQ(kIMSI, capability_->imsi_);
Ben Chanbd3aee82012-10-16 23:52:04 -0700364 EXPECT_TRUE(capability_->sim_present_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500365 capability_->imsi_.clear();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100366 InitProviderDB();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500367 capability_->GetIMSI(callback);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500368 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
369}
370
Gary Morain82a31a02012-08-02 18:03:32 -0700371// In this test, the call to the proxy's GetIMSI() will always indicate failure,
372// which will cause the retry logic to call the proxy again a number of times.
373// Eventually, the retries expire.
374TEST_F(CellularCapabilityGSMTest, GetIMSIFails) {
375 ScopedMockLog log;
Paul Stewart1e5bad52012-08-04 17:13:19 -0700376 EXPECT_CALL(log, Log(logging::LOG_INFO, StrEq("cellular_capability_gsm.cc"),
Gary Morain82a31a02012-08-02 18:03:32 -0700377 ::testing::StartsWith("GetIMSI failed - ")));
378 EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
Arman Uguray29505ec2013-09-12 20:37:53 -0700379 .Times(CellularCapabilityGSM::kGetIMSIRetryLimit + 2)
Gary Morain82a31a02012-08-02 18:03:32 -0700380 .WillRepeatedly(Invoke(this,
381 &CellularCapabilityGSMTest::InvokeGetIMSIFails));
Arman Uguray29505ec2013-09-12 20:37:53 -0700382 EXPECT_CALL(*this, TestCallback(IsFailure())).Times(2);
Gary Morain82a31a02012-08-02 18:03:32 -0700383 SetCardProxy();
384 ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
385 Unretained(this));
386 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700387 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700388
Arman Uguray29505ec2013-09-12 20:37:53 -0700389 capability_->sim_lock_status_.lock_type = "sim-pin";
390 capability_->GetIMSI(callback);
391 EXPECT_TRUE(capability_->imsi_.empty());
392 EXPECT_TRUE(capability_->sim_present_);
393
394 capability_->sim_lock_status_.lock_type.clear();
395 capability_->sim_present_ = false;
Gary Morain82a31a02012-08-02 18:03:32 -0700396 capability_->get_imsi_retries_ = 0;
397 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
398 capability_->get_imsi_retry_delay_milliseconds_);
399
400 // Set the delay to zero to speed up the test.
401 capability_->get_imsi_retry_delay_milliseconds_ = 0;
402 capability_->GetIMSI(callback);
403 for (int i = 0; i < CellularCapabilityGSM::kGetIMSIRetryLimit; ++i) {
404 dispatcher_.DispatchPendingEvents();
405 }
406 EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
407 capability_->get_imsi_retries_);
408 EXPECT_TRUE(capability_->imsi_.empty());
Ben Chanbd3aee82012-10-16 23:52:04 -0700409 EXPECT_FALSE(capability_->sim_present_);
Gary Morain82a31a02012-08-02 18:03:32 -0700410}
411
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500412TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500413 EXPECT_CALL(*card_proxy_, GetMSISDN(_, _,
414 CellularCapability::kTimeoutDefault))
415 .WillOnce(Invoke(this,
416 &CellularCapabilityGSMTest::InvokeGetMSISDN));
417 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500418 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500419 ASSERT_TRUE(capability_->mdn_.empty());
420 capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
421 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500422 EXPECT_EQ(kMSISDN, capability_->mdn_);
423}
424
425TEST_F(CellularCapabilityGSMTest, GetSPN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500426 EXPECT_CALL(*card_proxy_, GetSPN(_, _, CellularCapability::kTimeoutDefault))
427 .WillOnce(Invoke(this,
428 &CellularCapabilityGSMTest::InvokeGetSPN));
429 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500430 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500431 ASSERT_TRUE(capability_->spn_.empty());
432 capability_->GetSPN(Bind(&CellularCapabilityGSMTest::TestCallback,
433 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500434 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100435}
Darin Petkovb05315f2011-11-07 10:14:25 +0100436
Darin Petkov3e509242011-11-10 14:46:44 +0100437TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500438 EXPECT_CALL(*network_proxy_,
439 GetSignalQuality(_, _, CellularCapability::kTimeoutDefault))
440 .WillOnce(Invoke(this,
441 &CellularCapabilityGSMTest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100442 SetNetworkProxy();
443 SetService();
444 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100445 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100446 EXPECT_EQ(kStrength, cellular_->service()->strength());
447}
448
Darin Petkov184c54e2011-11-15 12:44:39 +0100449TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500450 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, _, _,
451 CellularCapability::kTimeoutRegister))
452 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeRegister));
453 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov184c54e2011-11-15 12:44:39 +0100454 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500455 Error error;
456 capability_->RegisterOnNetwork(kTestNetwork, &error,
457 Bind(&CellularCapabilityGSMTest::TestCallback,
458 Unretained(this)));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500459 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100460}
461
Darin Petkovb72cf402011-11-22 14:51:39 +0100462TEST_F(CellularCapabilityGSMTest, IsRegistered) {
463 EXPECT_FALSE(capability_->IsRegistered());
464 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
465 EXPECT_FALSE(capability_->IsRegistered());
466 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
467 EXPECT_TRUE(capability_->IsRegistered());
468 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
469 EXPECT_FALSE(capability_->IsRegistered());
470 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
471 EXPECT_FALSE(capability_->IsRegistered());
472 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
473 EXPECT_FALSE(capability_->IsRegistered());
474 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
475 EXPECT_TRUE(capability_->IsRegistered());
476}
477
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500478TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
479 ASSERT_FALSE(capability_->IsRegistered());
480 EXPECT_CALL(*network_proxy_,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500481 GetRegistrationInfo(_, _, CellularCapability::kTimeoutDefault))
482 .WillOnce(Invoke(this,
483 &CellularCapabilityGSMTest::InvokeGetRegistrationInfo));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500484 SetNetworkProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500485 capability_->GetRegistrationState();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500486 EXPECT_TRUE(capability_->IsRegistered());
487 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
488 capability_->registration_state_);
489}
490
Darin Petkovb05315f2011-11-07 10:14:25 +0100491TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500492 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true, _, _,
493 CellularCapability::kTimeoutDefault))
494 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeEnablePIN));
495 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100496 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500497 Error error;
498 capability_->RequirePIN(kPIN, true, &error,
499 Bind(&CellularCapabilityGSMTest::TestCallback,
500 Unretained(this)));
501 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100502}
503
504TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500505 EXPECT_CALL(*card_proxy_, SendPIN(kPIN, _, _,
506 CellularCapability::kTimeoutDefault))
507 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPIN));
508 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100509 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500510 Error error;
511 capability_->EnterPIN(kPIN, &error,
512 Bind(&CellularCapabilityGSMTest::TestCallback,
513 Unretained(this)));
514 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100515}
516
517TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500518 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN, _, _,
519 CellularCapability::kTimeoutDefault))
520 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeSendPUK));
521 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100522 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500523 Error error;
524 capability_->UnblockPIN(kPUK, kPIN, &error,
525 Bind(&CellularCapabilityGSMTest::TestCallback,
526 Unretained(this)));
527 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100528}
529
530TEST_F(CellularCapabilityGSMTest, ChangePIN) {
531 static const char kOldPIN[] = "1111";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500532 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN, _, _,
533 CellularCapability::kTimeoutDefault))
534 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeChangePIN));
535 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkovcb547732011-11-09 13:55:26 +0100536 SetCardProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500537 Error error;
538 capability_->ChangePIN(kOldPIN, kPIN, &error,
539 Bind(&CellularCapabilityGSMTest::TestCallback,
540 Unretained(this)));
541 EXPECT_TRUE(error.IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100542}
543
Darin Petkovb7828b02012-02-03 12:34:30 +0100544namespace {
545
546MATCHER(SizeIs2, "") {
547 return arg.size() == 2;
548}
549
550} // namespace
551
Darin Petkov1272a432011-11-10 15:53:37 +0100552TEST_F(CellularCapabilityGSMTest, Scan) {
Darin Petkov1272a432011-11-10 15:53:37 +0100553 Error error;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500554 EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400555 .WillOnce(SaveArg<1>(&scan_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500556 EXPECT_CALL(*this, TestCallback(IsSuccess()));
Darin Petkov721ac932011-11-16 15:43:09 +0100557 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100558 EXPECT_CALL(*device_adaptor_,
Ben Chan7ea768e2013-09-20 15:08:40 -0700559 EmitStringmapsChanged(kFoundNetworksProperty, SizeIs2()));
560 EXPECT_CALL(*device_adaptor_, EmitBoolChanged(kScanningProperty, true));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400561 EXPECT_FALSE(capability_->scanning_);
562
Eric Shienbrood9a245532012-03-07 14:20:39 -0500563 SetNetworkProxy();
564 capability_->Scan(&error, Bind(&CellularCapabilityGSMTest::TestCallback,
565 Unretained(this)));
566 EXPECT_TRUE(error.IsSuccess());
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400567 EXPECT_TRUE(capability_->scanning_);
568
569 // Simulate the completion of the scan...
Ben Chan7ea768e2013-09-20 15:08:40 -0700570 EXPECT_CALL(*device_adaptor_, EmitBoolChanged(kScanningProperty, false));
Jason Glasgowcd0349c2012-05-03 23:32:15 -0400571 InvokeScanReply();
572 EXPECT_FALSE(capability_->scanning_);
Darin Petkov721ac932011-11-16 15:43:09 +0100573 EXPECT_EQ(2, capability_->found_networks_.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700574 EXPECT_EQ(kScanID0, capability_->found_networks_[0][kNetworkIdProperty]);
575 EXPECT_EQ(kScanID1, capability_->found_networks_[1][kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100576}
577
578TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
579 static const char kID[] = "123";
580 static const char kLongName[] = "long name";
581 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500582 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100583 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
584 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
585 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
586 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
587 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
588 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100589 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100590 EXPECT_EQ(5, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700591 EXPECT_EQ("available", parsed[kStatusProperty]);
592 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
593 EXPECT_EQ(kLongName, parsed[kLongNameProperty]);
594 EXPECT_EQ(kShortName, parsed[kShortNameProperty]);
595 EXPECT_EQ(kNetworkTechnologyEdge, parsed[kTechnologyProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100596}
597
598TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
599 InitProviderDB();
600 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500601 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100602 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100603 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100604 EXPECT_EQ(2, parsed.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700605 EXPECT_EQ(kID, parsed[kNetworkIdProperty]);
606 EXPECT_EQ("T-Mobile", parsed[kLongNameProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100607}
608
Darin Petkovae0c64e2011-11-15 15:50:27 +0100609TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100610 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
611 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100612 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100613 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100614 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
615 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Ben Chan7ea768e2013-09-20 15:08:40 -0700616 EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100617}
618
619TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
620 static const char kOperatorName[] = "Swisscom";
621 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100622 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100623 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100624 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100625 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
626 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100627 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200628
629 static const char kTestOperator[] = "Testcom";
630 capability_->serving_operator_.SetName(kTestOperator);
631 capability_->serving_operator_.SetCountry("");
632 capability_->UpdateOperatorInfo();
633 EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
634 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
635 EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100636}
637
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100638TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
639 InitProviderDB();
640 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500641 capability_->imsi_ = "310240123456789";
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400642 props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100643 capability_->UpdateStatus(props);
644 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
645}
646
Darin Petkovf508c822012-09-21 13:43:17 +0200647TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
648 EXPECT_FALSE(cellular_->allow_roaming_);
649 EXPECT_FALSE(capability_->provider_requires_roaming_);
650 EXPECT_FALSE(capability_->AllowRoaming());
651 capability_->provider_requires_roaming_ = true;
652 EXPECT_TRUE(capability_->AllowRoaming());
653 capability_->provider_requires_roaming_ = false;
654 cellular_->allow_roaming_ = true;
655 EXPECT_TRUE(capability_->AllowRoaming());
656}
657
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100658TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
659 static const char kCountry[] = "us";
660 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500661 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100662
Darin Petkovf508c822012-09-21 13:43:17 +0200663 EXPECT_FALSE(capability_->home_provider_);
664 EXPECT_FALSE(capability_->provider_requires_roaming_);
665
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100666 capability_->SetHomeProvider(); // No mobile provider DB available.
667 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
668 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
669 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
Darin Petkovf508c822012-09-21 13:43:17 +0200670 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100671
672 InitProviderDB();
673 capability_->SetHomeProvider();
674 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
675 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
676 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100677 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkovb4fccd22012-08-10 11:59:26 +0200678 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200679 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100680
681 Cellular::Operator oper;
682 cellular_->set_home_provider(oper);
683 capability_->spn_ = kTestCarrier;
684 capability_->SetHomeProvider();
685 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
686 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
687 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkovf508c822012-09-21 13:43:17 +0200688 EXPECT_FALSE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200689
690 static const char kCubic[] = "Cubic";
691 capability_->spn_ = kCubic;
692 capability_->SetHomeProvider();
693 EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
694 EXPECT_EQ("", cellular_->home_provider().GetCode());
695 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200696 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkovb4fccd22012-08-10 11:59:26 +0200697
698 static const char kCUBIC[] = "CUBIC";
699 capability_->spn_ = kCUBIC;
700 capability_->home_provider_ = NULL;
701 capability_->SetHomeProvider();
702 EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
703 EXPECT_EQ("", cellular_->home_provider().GetCode());
704 ASSERT_TRUE(capability_->home_provider_);
Darin Petkovf508c822012-09-21 13:43:17 +0200705 EXPECT_TRUE(capability_->provider_requires_roaming_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100706}
707
Darin Petkov3cfbf212011-11-21 16:02:09 +0100708namespace {
709
710MATCHER(SizeIs4, "") {
711 return arg.size() == 4;
712}
713
714} // namespace
715
716TEST_F(CellularCapabilityGSMTest, InitAPNList) {
717 InitProviderDB();
718 capability_->home_provider_ =
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700719 mobile_provider_lookup_by_name(modem_info_.provider_db(), "T-Mobile");
Darin Petkov3cfbf212011-11-21 16:02:09 +0100720 ASSERT_TRUE(capability_->home_provider_);
721 EXPECT_EQ(0, capability_->apn_list_.size());
722 EXPECT_CALL(*device_adaptor_,
Ben Chan7ea768e2013-09-20 15:08:40 -0700723 EmitStringmapsChanged(kCellularApnListProperty, SizeIs4()));
Darin Petkov3cfbf212011-11-21 16:02:09 +0100724 capability_->InitAPNList();
725 EXPECT_EQ(4, capability_->apn_list_.size());
726 EXPECT_EQ("wap.voicestream.com",
Ben Chan7ea768e2013-09-20 15:08:40 -0700727 capability_->apn_list_[1][kApnProperty]);
Darin Petkov3cfbf212011-11-21 16:02:09 +0100728 EXPECT_EQ("Web2Go/t-zones",
Ben Chan7ea768e2013-09-20 15:08:40 -0700729 capability_->apn_list_[1][kApnNameProperty]);
Darin Petkov3cfbf212011-11-21 16:02:09 +0100730}
731
Darin Petkov20c13ec2011-11-09 15:07:15 +0100732TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100733 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100734 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Ben Chan7ea768e2013-09-20 15:08:40 -0700735 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100736 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
Ben Chan7ea768e2013-09-20 15:08:40 -0700737 EXPECT_EQ(kNetworkTechnologyGsm, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100738 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700739 EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100740 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700741 EXPECT_EQ(kNetworkTechnologyEdge, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100742 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700743 EXPECT_EQ(kNetworkTechnologyUmts, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100744 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700745 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100746 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700747 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100748 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
Ben Chan7ea768e2013-09-20 15:08:40 -0700749 EXPECT_EQ(kNetworkTechnologyHspa, capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100750 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
Ben Chan7ea768e2013-09-20 15:08:40 -0700751 EXPECT_EQ(kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100752 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100753}
754
755TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700756 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100757 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Ben Chan7ea768e2013-09-20 15:08:40 -0700758 EXPECT_EQ(kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100759 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700760 EXPECT_EQ(kRoamingStateRoaming, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100761 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
Ben Chan7ea768e2013-09-20 15:08:40 -0700762 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100763 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
Ben Chan7ea768e2013-09-20 15:08:40 -0700764 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100765 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
Ben Chan7ea768e2013-09-20 15:08:40 -0700766 EXPECT_EQ(kRoamingStateUnknown, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100767}
768
Darin Petkovac635a82012-01-10 16:51:58 +0100769TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
770 CellularCapabilityGSM::friendly_service_name_id_ = 0;
771 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
772 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200773
Darin Petkovac635a82012-01-10 16:51:58 +0100774 capability_->serving_operator_.SetCode("1234");
775 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200776
Darin Petkovac635a82012-01-10 16:51:58 +0100777 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500778 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100779 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200780
781 static const char kHomeProvider[] = "The GSM Home Provider";
782 cellular_->home_provider_.SetName(kHomeProvider);
783 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
784 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
785 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
786
Darin Petkovac635a82012-01-10 16:51:58 +0100787 static const char kTestOperator[] = "A GSM Operator";
788 capability_->serving_operator_.SetName(kTestOperator);
789 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
Darin Petkova4ca3c32012-08-17 16:05:24 +0200790
791 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING;
792 EXPECT_EQ(StringPrintf("%s | %s", kHomeProvider, kTestOperator),
793 capability_->CreateFriendlyServiceName());
Darin Petkovac635a82012-01-10 16:51:58 +0100794}
795
Darin Petkov31332412012-01-28 01:50:02 +0100796TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
797 SetService();
798 capability_->OnServiceCreated();
Ben Chan7ea768e2013-09-20 15:08:40 -0700799 EXPECT_EQ(string(kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100800 cellular_->service()->friendly_name(),
801 cellular_->service()->GetStorageIdentifier());
802 capability_->imsi_ = kIMSI;
803 capability_->OnServiceCreated();
Ben Chan7ea768e2013-09-20 15:08:40 -0700804 EXPECT_EQ(string(kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100805 cellular_->service()->GetStorageIdentifier());
806}
807
Gaurav Shah67808222013-03-27 13:29:36 -0700808MATCHER_P(KeyValueStoreEq, value, "") {
809 bool match = value.bool_properties() == arg.bool_properties() &&
810 value.int_properties() == arg.int_properties() &&
811 value.string_properties() == arg.string_properties() &&
812 value.uint_properties() == arg.uint_properties();
Gaurav Shah67808222013-03-27 13:29:36 -0700813 if (!match) {
814 *result_listener << "\nExpected KeyValueStore:\n"
815 << "\tbool_properties: "
816 << testing::PrintToString(value.bool_properties())
817 << "\n\tint_properties: "
818 << testing::PrintToString(value.int_properties())
819 << "\n\tstring_properties: "
820 << testing::PrintToString(value.string_properties())
821 << "\n\tint_properties: "
822 << testing::PrintToString(value.uint_properties())
823 << "\nGot KeyValueStore:\n"
824 << "\tbool_properties: "
825 << testing::PrintToString(arg.bool_properties())
826 << "\n\tint_properties: "
827 << testing::PrintToString(arg.int_properties())
828 << "\n\tstring_properties: "
829 << testing::PrintToString(arg.string_properties())
830 << "\n\tuint_properties: "
831 << testing::PrintToString(arg.uint_properties());
832 }
Gaurav Shah67808222013-03-27 13:29:36 -0700833 return match;
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;
Ben Chan7ea768e2013-09-20 15:08:40 -0700863 lock_status.SetBool(kSIMLockEnabledProperty, true);
864 lock_status.SetString(kSIMLockTypeProperty, "");
865 lock_status.SetUint(kSIMLockRetriesLeftProperty, 0);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700866
867 EXPECT_CALL(*device_adaptor_, EmitKeyValueStoreChanged(
Ben Chan7ea768e2013-09-20 15:08:40 -0700868 kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700869 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;
Ben Chan7ea768e2013-09-20 15:08:40 -0700885 lock_status2.SetBool(kSIMLockEnabledProperty, false);
886 lock_status2.SetString(kSIMLockTypeProperty, kLockType);
887 lock_status2.SetUint(kSIMLockRetriesLeftProperty, kRetries);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700888 EXPECT_CALL(*device_adaptor_,
Ben Chan7ea768e2013-09-20 15:08:40 -0700889 EmitKeyValueStoreChanged(kSIMLockStatusProperty,
Gary Morainbaeefdf2012-04-30 14:53:35 -0700890 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);
Ben Chan7ea768e2013-09-20 15:08:40 -0700910 EXPECT_FALSE(props.find(kApnProperty) == props.end());
911 EXPECT_EQ(kTmobileApn, props[kApnProperty].reader().get_string());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400912
913 ProfileRefPtr profile(new NiceMock<MockProfile>(
Prathmesh Prabhu27526f12013-03-25 19:42:18 -0700914 modem_info_.control_interface(), modem_info_.metrics(),
915 modem_info_.manager()));
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400916 cellular_->service()->set_profile(profile);
917 Stringmap apn_info;
Ben Chan7ea768e2013-09-20 15:08:40 -0700918 apn_info[kApnProperty] = kLastGoodApn;
919 apn_info[kApnUsernameProperty] = kLastGoodUsername;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400920 cellular_->service()->SetLastGoodApn(apn_info);
921 props.clear();
Ben Chan7ea768e2013-09-20 15:08:40 -0700922 EXPECT_TRUE(props.find(kApnProperty) == props.end());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400923 capability_->SetupConnectProperties(&props);
924 // We expect the list to contain the last good APN, plus
925 // the 4 APNs from the mobile provider info database.
926 EXPECT_EQ(5, capability_->apn_try_list_.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700927 EXPECT_FALSE(props.find(kApnProperty) == props.end());
928 EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
929 EXPECT_FALSE(props.find(kApnUsernameProperty) == props.end());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400930 EXPECT_EQ(kLastGoodUsername,
Ben Chan7ea768e2013-09-20 15:08:40 -0700931 props[kApnUsernameProperty].reader().get_string());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400932
933 Error error;
934 apn_info.clear();
935 props.clear();
Ben Chan7ea768e2013-09-20 15:08:40 -0700936 apn_info[kApnProperty] = kSuppliedApn;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400937 // Setting the APN has the side effect of clearing the LastGoodApn,
938 // so the try list will have 5 elements, with the first one being
939 // the supplied APN.
940 cellular_->service()->SetApn(apn_info, &error);
Ben Chan7ea768e2013-09-20 15:08:40 -0700941 EXPECT_TRUE(props.find(kApnProperty) == props.end());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400942 capability_->SetupConnectProperties(&props);
943 EXPECT_EQ(5, capability_->apn_try_list_.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700944 EXPECT_FALSE(props.find(kApnProperty) == props.end());
945 EXPECT_EQ(kSuppliedApn, props[kApnProperty].reader().get_string());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400946
947 apn_info.clear();
948 props.clear();
Ben Chan7ea768e2013-09-20 15:08:40 -0700949 apn_info[kApnProperty] = kLastGoodApn;
950 apn_info[kApnUsernameProperty] = kLastGoodUsername;
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400951 // Now when LastGoodAPN is set, it will be the one selected.
952 cellular_->service()->SetLastGoodApn(apn_info);
Ben Chan7ea768e2013-09-20 15:08:40 -0700953 EXPECT_TRUE(props.find(kApnProperty) == props.end());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400954 capability_->SetupConnectProperties(&props);
955 // We expect the list to contain the last good APN, plus
956 // the user-supplied APN, plus the 4 APNs from the mobile
957 // provider info database.
958 EXPECT_EQ(6, capability_->apn_try_list_.size());
Ben Chan7ea768e2013-09-20 15:08:40 -0700959 EXPECT_FALSE(props.find(kApnProperty) == props.end());
960 EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
961 EXPECT_FALSE(props.find(kApnUsernameProperty) == props.end());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400962 EXPECT_EQ(kLastGoodUsername,
Ben Chan7ea768e2013-09-20 15:08:40 -0700963 props[kApnUsernameProperty].reader().get_string());
Eric Shienbrood30bc0ec2012-03-21 18:19:46 -0400964}
965
Thieu Le923006b2012-04-05 16:32:58 -0700966TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
967 SetupCommonStartModemExpectations();
968 EXPECT_CALL(*card_proxy_,
969 GetSPN(_, _, CellularCapability::kTimeoutDefault))
970 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
971 EXPECT_CALL(*card_proxy_,
972 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
973 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700974 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700975
976 Error error;
977 capability_->StartModem(
978 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
979 dispatcher_.DispatchPendingEvents();
980}
981
982TEST_F(CellularCapabilityGSMTest, StartModemGetSPNFail) {
983 SetupCommonStartModemExpectations();
984 EXPECT_CALL(*card_proxy_,
985 GetSPN(_, _, CellularCapability::kTimeoutDefault))
986 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPNFail));
987 EXPECT_CALL(*card_proxy_,
988 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
989 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDN));
Ben Chan3ecdf822012-08-06 12:29:23 -0700990 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -0700991
992 Error error;
993 capability_->StartModem(
994 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
995 dispatcher_.DispatchPendingEvents();
996}
997
998TEST_F(CellularCapabilityGSMTest, StartModemGetMSISDNFail) {
999 SetupCommonStartModemExpectations();
1000 EXPECT_CALL(*card_proxy_,
1001 GetSPN(_, _, CellularCapability::kTimeoutDefault))
1002 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetSPN));
1003 EXPECT_CALL(*card_proxy_,
1004 GetMSISDN(_, _, CellularCapability::kTimeoutDefault))
1005 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeGetMSISDNFail));
Ben Chan3ecdf822012-08-06 12:29:23 -07001006 AllowCreateCardProxyFromFactory();
Thieu Le923006b2012-04-05 16:32:58 -07001007
1008 Error error;
1009 capability_->StartModem(
1010 &error, Bind(&CellularCapabilityGSMTest::TestCallback, Unretained(this)));
1011 dispatcher_.DispatchPendingEvents();
1012}
1013
Thieu Leb5954a22012-05-18 10:37:34 -07001014TEST_F(CellularCapabilityGSMTest, ConnectFailureNoService) {
1015 // Make sure we don't crash if the connect failed and there is no
1016 // CellularService object. This can happen if the modem is enabled and
1017 // then quickly disabled.
1018 SetupCommonProxiesExpectations();
1019 EXPECT_CALL(*simple_proxy_,
1020 Connect(_, _, _, CellularCapabilityGSM::kTimeoutConnect))
1021 .WillOnce(Invoke(this, &CellularCapabilityGSMTest::InvokeConnectFail));
1022 EXPECT_CALL(*this, TestCallback(IsFailure()));
Thieu Leb5954a22012-05-18 10:37:34 -07001023 InitProxies();
1024 EXPECT_FALSE(capability_->cellular()->service());
1025 Error error;
1026 DBusPropertiesMap props;
1027 capability_->Connect(props, &error,
1028 Bind(&CellularCapabilityGSMTest::TestCallback,
1029 Unretained(this)));
1030}
1031
Darin Petkovb05315f2011-11-07 10:14:25 +01001032} // namespace shill