blob: c6488195d881a9c16fb321a418b4bf6c7809bf10 [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
Darin Petkov20c13ec2011-11-09 15:07:15 +01007#include <chromeos/dbus/service_constants.h>
Darin Petkovb05315f2011-11-07 10:14:25 +01008#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +01009#include <mm/mm-modem.h>
Darin Petkov1272a432011-11-10 15:53:37 +010010#include <mobile_provider.h>
Darin Petkovb05315f2011-11-07 10:14:25 +010011
12#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010013#include "shill/cellular_service.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010014#include "shill/error.h"
15#include "shill/event_dispatcher.h"
Darin Petkov3cfbf212011-11-21 16:02:09 +010016#include "shill/mock_adaptors.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080017#include "shill/mock_metrics.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010018#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010019#include "shill/mock_modem_gsm_network_proxy.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010020#include "shill/nice_mock_control.h"
21
Darin Petkov31332412012-01-28 01:50:02 +010022using std::string;
Darin Petkove5bc2cb2011-12-07 14:47:32 +010023using testing::_;
Darin Petkov3cfbf212011-11-21 16:02:09 +010024using testing::NiceMock;
Darin Petkovcb547732011-11-09 13:55:26 +010025using testing::Return;
26
Darin Petkovb05315f2011-11-07 10:14:25 +010027namespace shill {
28
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050029class GSMTestAsyncCallHandler : public AsyncCallHandler {
30public:
31 explicit GSMTestAsyncCallHandler(ReturnerInterface *returner)
32 : AsyncCallHandler(returner) { }
33 virtual ~GSMTestAsyncCallHandler() { }
34
35 bool CompleteOperationWithError(const Error &error) {
36 error_.Populate(error.type(), error.message());
37 return AsyncCallHandler::CompleteOperationWithError(error);
38 }
39
40 static const Error &error() { return error_; }
41
42private:
43 // static because AsyncCallHandlers are deleted before callbacks return
44 static Error error_;
45
46 DISALLOW_COPY_AND_ASSIGN(GSMTestAsyncCallHandler);
47};
48
49Error GSMTestAsyncCallHandler::error_;
50
Darin Petkovb05315f2011-11-07 10:14:25 +010051class CellularCapabilityGSMTest : public testing::Test {
52 public:
53 CellularCapabilityGSMTest()
54 : cellular_(new Cellular(&control_,
55 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080056 &metrics_,
Darin Petkovb05315f2011-11-07 10:14:25 +010057 NULL,
58 "",
Darin Petkov31332412012-01-28 01:50:02 +010059 kAddress,
Darin Petkovb05315f2011-11-07 10:14:25 +010060 0,
61 Cellular::kTypeGSM,
62 "",
63 "",
64 NULL)),
Darin Petkovcb547732011-11-09 13:55:26 +010065 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010066 network_proxy_(new MockModemGSMNetworkProxy()),
Darin Petkov721ac932011-11-16 15:43:09 +010067 capability_(NULL),
Darin Petkov3cfbf212011-11-21 16:02:09 +010068 device_adaptor_(NULL),
Darin Petkov1272a432011-11-10 15:53:37 +010069 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010070
Darin Petkov3e509242011-11-10 14:46:44 +010071 virtual ~CellularCapabilityGSMTest() {
72 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010073 mobile_provider_close_db(provider_db_);
74 provider_db_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010075 capability_ = NULL;
Darin Petkov3cfbf212011-11-21 16:02:09 +010076 device_adaptor_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010077 }
78
79 virtual void SetUp() {
80 capability_ =
81 dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
Darin Petkov3cfbf212011-11-21 16:02:09 +010082 device_adaptor_ =
83 dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
Darin Petkov3e509242011-11-10 14:46:44 +010084 }
85
Darin Petkovb05315f2011-11-07 10:14:25 +010086 protected:
Darin Petkov31332412012-01-28 01:50:02 +010087 static const char kAddress[];
Darin Petkov1272a432011-11-10 15:53:37 +010088 static const char kTestMobileProviderDBPath[];
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050089 static const char kTestNetwork[];
Darin Petkovcb547732011-11-09 13:55:26 +010090 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +010091 static const char kPIN[];
92 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +010093 static const char kIMEI[];
94 static const char kIMSI[];
95 static const char kMSISDN[];
96
97 void SetCardProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +010098 capability_->card_proxy_.reset(card_proxy_.release());
Darin Petkovcb547732011-11-09 13:55:26 +010099 }
Darin Petkovb05315f2011-11-07 10:14:25 +0100100
Darin Petkov1272a432011-11-10 15:53:37 +0100101 void SetNetworkProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100102 capability_->network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +0100103 }
104
Darin Petkov20c13ec2011-11-09 15:07:15 +0100105 void SetAccessTechnology(uint32 technology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100106 capability_->access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100107 }
108
109 void SetRegistrationState(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +0100110 capability_->registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100111 }
112
Darin Petkov3e509242011-11-10 14:46:44 +0100113 void SetService() {
114 cellular_->service_ = new CellularService(
Thieu Le3426c8f2012-01-11 17:35:11 -0800115 &control_, &dispatcher_, &metrics_, NULL, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100116 }
117
Darin Petkov1272a432011-11-10 15:53:37 +0100118 void InitProviderDB() {
119 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
120 ASSERT_TRUE(provider_db_);
121 cellular_->provider_db_ = provider_db_;
122 }
123
Darin Petkovb05315f2011-11-07 10:14:25 +0100124 NiceMockControl control_;
125 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800126 MockMetrics metrics_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100127 CellularRefPtr cellular_;
Darin Petkovcb547732011-11-09 13:55:26 +0100128 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +0100129 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Darin Petkov721ac932011-11-16 15:43:09 +0100130 CellularCapabilityGSM *capability_; // Owned by |cellular_|.
Darin Petkov3cfbf212011-11-21 16:02:09 +0100131 NiceMock<DeviceMockAdaptor> *device_adaptor_; // Owned by |cellular_|.
Darin Petkov1272a432011-11-10 15:53:37 +0100132 mobile_provider_db *provider_db_;
Darin Petkovb05315f2011-11-07 10:14:25 +0100133};
134
Darin Petkov31332412012-01-28 01:50:02 +0100135const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
Darin Petkov1272a432011-11-10 15:53:37 +0100136const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
137 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +0100138const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500139const char CellularCapabilityGSMTest::kTestNetwork[] = "310555";
Darin Petkovb05315f2011-11-07 10:14:25 +0100140const char CellularCapabilityGSMTest::kPIN[] = "9876";
141const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +0100142const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100143const char CellularCapabilityGSMTest::kIMSI[] = "310150123456789";
Darin Petkovcb547732011-11-09 13:55:26 +0100144const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
145
Darin Petkov721ac932011-11-16 15:43:09 +0100146TEST_F(CellularCapabilityGSMTest, PropertyStore) {
147 EXPECT_TRUE(cellular_->store().Contains(flimflam::kSIMLockStatusProperty));
148}
149
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500150TEST_F(CellularCapabilityGSMTest, GetIMEI) {
151 EXPECT_CALL(*card_proxy_, GetIMEI(NULL, _));
Darin Petkovcb547732011-11-09 13:55:26 +0100152 SetCardProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500153 capability_->GetIMEI(NULL);
154 capability_->OnGetIMEICallback(kIMEI, Error(), NULL);
155 EXPECT_EQ(kIMEI, capability_->imei_);
156}
157
158TEST_F(CellularCapabilityGSMTest, GetIMSI) {
159 EXPECT_CALL(*card_proxy_, GetIMSI(NULL, _));
160 SetCardProxy();
161 capability_->GetIMSI(NULL);
162 capability_->OnGetIMSICallback(kIMSI, Error(), NULL);
163 EXPECT_EQ(kIMSI, capability_->imsi_);
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100164 InitProviderDB();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500165 capability_->OnGetIMSICallback("310240123456789", Error(), NULL);
166 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
167}
168
169TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
170 EXPECT_CALL(*card_proxy_, GetMSISDN(NULL, _));
171 SetCardProxy();
172 capability_->GetMSISDN(NULL);
173 capability_->OnGetMSISDNCallback(kMSISDN, Error(), NULL);
174 EXPECT_EQ(kMSISDN, capability_->mdn_);
175}
176
177TEST_F(CellularCapabilityGSMTest, GetSPN) {
178 EXPECT_CALL(*card_proxy_, GetSPN(NULL, _));
179 SetCardProxy();
180 capability_->GetSPN(NULL);
181 capability_->OnGetSPNCallback(kTestCarrier, Error(), NULL);
182 EXPECT_EQ(kTestCarrier, capability_->spn_);
Darin Petkovcb547732011-11-09 13:55:26 +0100183}
Darin Petkovb05315f2011-11-07 10:14:25 +0100184
Darin Petkov3e509242011-11-10 14:46:44 +0100185TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
186 const int kStrength = 80;
187 EXPECT_CALL(*network_proxy_, GetSignalQuality()).WillOnce(Return(kStrength));
188 SetNetworkProxy();
189 SetService();
190 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100191 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100192 EXPECT_EQ(kStrength, cellular_->service()->strength());
193}
194
Darin Petkov184c54e2011-11-15 12:44:39 +0100195TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500196 EXPECT_CALL(*network_proxy_, Register(kTestNetwork, NULL,
197 CellularCapability::kTimeoutRegister));
Darin Petkov184c54e2011-11-15 12:44:39 +0100198 SetNetworkProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500199 capability_->RegisterOnNetwork(kTestNetwork, NULL);
Darin Petkov184c54e2011-11-15 12:44:39 +0100200 dispatcher_.DispatchPendingEvents();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500201 capability_->OnRegisterCallback(Error(), NULL);
202 EXPECT_EQ(kTestNetwork, capability_->selected_network_);
Darin Petkov184c54e2011-11-15 12:44:39 +0100203}
204
Darin Petkovb72cf402011-11-22 14:51:39 +0100205TEST_F(CellularCapabilityGSMTest, IsRegistered) {
206 EXPECT_FALSE(capability_->IsRegistered());
207 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
208 EXPECT_FALSE(capability_->IsRegistered());
209 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
210 EXPECT_TRUE(capability_->IsRegistered());
211 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
212 EXPECT_FALSE(capability_->IsRegistered());
213 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
214 EXPECT_FALSE(capability_->IsRegistered());
215 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN);
216 EXPECT_FALSE(capability_->IsRegistered());
217 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
218 EXPECT_TRUE(capability_->IsRegistered());
219}
220
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500221TEST_F(CellularCapabilityGSMTest, GetRegistrationState) {
222 ASSERT_FALSE(capability_->IsRegistered());
223 EXPECT_CALL(*network_proxy_,
224 GetRegistrationInfo(NULL, CellularCapability::kTimeoutDefault));
225 SetNetworkProxy();
226 capability_->GetRegistrationState(NULL);
227 capability_->OnGSMRegistrationInfoChanged(
228 MM_MODEM_GSM_NETWORK_REG_STATUS_HOME, kTestNetwork, kTestCarrier,
229 Error(), NULL);
230 EXPECT_TRUE(capability_->IsRegistered());
231 EXPECT_EQ(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME,
232 capability_->registration_state_);
233}
234
Darin Petkovb05315f2011-11-07 10:14:25 +0100235TEST_F(CellularCapabilityGSMTest, RequirePIN) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500236 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true,
237 _, CellularCapability::kTimeoutDefault));
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100238 MockReturner returner;
239 EXPECT_CALL(returner, Return());
240 EXPECT_CALL(returner, ReturnError(_)).Times(0);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500241 GSMTestAsyncCallHandler *handler = new GSMTestAsyncCallHandler(&returner);
Darin Petkovcb547732011-11-09 13:55:26 +0100242 SetCardProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500243 capability_->RequirePIN(kPIN, true, handler);
244 capability_->OnPINOperationCallback(Error(), handler);
245 EXPECT_TRUE(GSMTestAsyncCallHandler::error().IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100246}
247
248TEST_F(CellularCapabilityGSMTest, EnterPIN) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500249 EXPECT_CALL(*card_proxy_,
250 SendPIN(kPIN, _, CellularCapability::kTimeoutDefault));
Darin Petkove5bc2cb2011-12-07 14:47:32 +0100251 MockReturner returner;
252 EXPECT_CALL(returner, Return());
253 EXPECT_CALL(returner, ReturnError(_)).Times(0);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500254 GSMTestAsyncCallHandler *handler = new GSMTestAsyncCallHandler(&returner);
Darin Petkovcb547732011-11-09 13:55:26 +0100255 SetCardProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500256 capability_->EnterPIN(kPIN, handler);
257 capability_->OnPINOperationCallback(Error(), handler);
258 EXPECT_TRUE(GSMTestAsyncCallHandler::error().IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100259}
260
261TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500262 EXPECT_CALL(*card_proxy_,
263 SendPUK(kPUK, kPIN, _, CellularCapability::kTimeoutDefault));
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100264 MockReturner returner;
265 EXPECT_CALL(returner, Return());
266 EXPECT_CALL(returner, ReturnError(_)).Times(0);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500267 GSMTestAsyncCallHandler *handler = new GSMTestAsyncCallHandler(&returner);
Darin Petkovcb547732011-11-09 13:55:26 +0100268 SetCardProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500269 capability_->UnblockPIN(kPUK, kPIN, handler);
270 capability_->OnPINOperationCallback(Error(), handler);
271 EXPECT_TRUE(GSMTestAsyncCallHandler::error().IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100272}
273
274TEST_F(CellularCapabilityGSMTest, ChangePIN) {
275 static const char kOldPIN[] = "1111";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500276 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN,
277 _, CellularCapability::kTimeoutDefault));
Darin Petkovc64fe5e2012-01-11 12:46:13 +0100278 MockReturner returner;
279 EXPECT_CALL(returner, Return());
280 EXPECT_CALL(returner, ReturnError(_)).Times(0);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500281 GSMTestAsyncCallHandler *handler = new GSMTestAsyncCallHandler(&returner);
Darin Petkovcb547732011-11-09 13:55:26 +0100282 SetCardProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500283 capability_->ChangePIN(kOldPIN, kPIN, handler);
284 capability_->OnPINOperationCallback(Error(), handler);
285 EXPECT_TRUE(GSMTestAsyncCallHandler::error().IsSuccess());
Darin Petkovb05315f2011-11-07 10:14:25 +0100286}
287
Darin Petkovb7828b02012-02-03 12:34:30 +0100288namespace {
289
290MATCHER(SizeIs2, "") {
291 return arg.size() == 2;
292}
293
294} // namespace
295
Darin Petkov1272a432011-11-10 15:53:37 +0100296TEST_F(CellularCapabilityGSMTest, Scan) {
297 static const char kID0[] = "123";
298 static const char kID1[] = "456";
299 Error error;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500300 EXPECT_CALL(*network_proxy_, Scan(_, CellularCapability::kTimeoutScan));
Darin Petkov1272a432011-11-10 15:53:37 +0100301 SetNetworkProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500302 capability_->Scan(NULL);
303 GSMScanResults results;
304 results.push_back(GSMScanResult());
305 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kID0;
306 results.push_back(GSMScanResult());
307 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kID1;
Darin Petkov721ac932011-11-16 15:43:09 +0100308 capability_->found_networks_.resize(3, Stringmap());
Darin Petkovb7828b02012-02-03 12:34:30 +0100309 EXPECT_CALL(*device_adaptor_,
310 EmitStringmapsChanged(flimflam::kFoundNetworksProperty,
311 SizeIs2()));
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500312 capability_->OnScanCallback(results, Error(), NULL);
Darin Petkov721ac932011-11-16 15:43:09 +0100313 EXPECT_EQ(2, capability_->found_networks_.size());
314 EXPECT_EQ(kID0,
315 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
316 EXPECT_EQ(kID1,
317 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100318}
319
320TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
321 static const char kID[] = "123";
322 static const char kLongName[] = "long name";
323 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500324 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100325 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
326 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
327 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
328 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
329 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
330 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100331 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100332 EXPECT_EQ(5, parsed.size());
333 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
334 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
335 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
336 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
337 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
338 parsed[flimflam::kTechnologyProperty]);
339}
340
341TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
342 InitProviderDB();
343 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500344 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100345 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100346 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100347 EXPECT_EQ(2, parsed.size());
348 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
349 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
350}
351
Darin Petkovae0c64e2011-11-15 15:50:27 +0100352TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100353 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
354 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100355 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100356 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100357 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
358 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100359 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100360 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100361}
362
363TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
364 static const char kOperatorName[] = "Swisscom";
365 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100366 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100367 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100368 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100369 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
370 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100371 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
372}
373
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100374TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
375 InitProviderDB();
376 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500377 capability_->imsi_ = "310240123456789";
378 props[CellularCapability::kPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100379 capability_->UpdateStatus(props);
380 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
381}
382
383TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
384 static const char kCountry[] = "us";
385 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500386 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100387
388 capability_->SetHomeProvider(); // No mobile provider DB available.
389 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
390 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
391 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
392
393 InitProviderDB();
394 capability_->SetHomeProvider();
395 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
396 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
397 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100398 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100399
400 Cellular::Operator oper;
401 cellular_->set_home_provider(oper);
402 capability_->spn_ = kTestCarrier;
403 capability_->SetHomeProvider();
404 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
405 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
406 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
407}
408
Darin Petkov3cfbf212011-11-21 16:02:09 +0100409namespace {
410
411MATCHER(SizeIs4, "") {
412 return arg.size() == 4;
413}
414
415} // namespace
416
417TEST_F(CellularCapabilityGSMTest, InitAPNList) {
418 InitProviderDB();
419 capability_->home_provider_ =
420 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
421 ASSERT_TRUE(capability_->home_provider_);
422 EXPECT_EQ(0, capability_->apn_list_.size());
423 EXPECT_CALL(*device_adaptor_,
424 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
425 SizeIs4()));
426 capability_->InitAPNList();
427 EXPECT_EQ(4, capability_->apn_list_.size());
428 EXPECT_EQ("wap.voicestream.com",
429 capability_->apn_list_[1][flimflam::kApnProperty]);
430 EXPECT_EQ("Web2Go/t-zones",
431 capability_->apn_list_[1][flimflam::kApnNameProperty]);
432}
433
Darin Petkov20c13ec2011-11-09 15:07:15 +0100434TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100435 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100436 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100437 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100438 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100439 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
440 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100441 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100442 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
443 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100444 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100445 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
446 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100447 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100448 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
449 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100450 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100451 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
452 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100453 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100454 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
455 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100456 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100457 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
458 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100459 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100460 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
461 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100462 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100463}
464
465TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
466 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100467 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100468 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
469 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100470 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100471 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
472 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100473 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100474 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
475 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100476 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100477 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
478 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100479 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100480 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
481 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100482 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100483}
484
Darin Petkovac635a82012-01-10 16:51:58 +0100485TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
486 CellularCapabilityGSM::friendly_service_name_id_ = 0;
487 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
488 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
489 capability_->serving_operator_.SetCode("1234");
490 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
491 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500492 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100493 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
494 static const char kTestOperator[] = "A GSM Operator";
495 capability_->serving_operator_.SetName(kTestOperator);
496 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
497 static const char kHomeProvider[] = "The GSM Home Provider";
498 cellular_->home_provider_.SetName(kHomeProvider);
499 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
500 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
501 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
502}
503
Darin Petkov31332412012-01-28 01:50:02 +0100504TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
505 SetService();
506 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100507 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" +
Darin Petkov31332412012-01-28 01:50:02 +0100508 cellular_->service()->friendly_name(),
509 cellular_->service()->GetStorageIdentifier());
510 capability_->imsi_ = kIMSI;
511 capability_->OnServiceCreated();
Darin Petkovdd3e8662012-02-03 13:16:20 +0100512 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" + kAddress + "_" + kIMSI,
Darin Petkov31332412012-01-28 01:50:02 +0100513 cellular_->service()->GetStorageIdentifier());
514}
515
Darin Petkov63138a92012-02-06 14:09:15 +0100516TEST_F(CellularCapabilityGSMTest, OnModemManagerPropertiesChanged) {
517 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN, capability_->access_technology_);
518 EXPECT_FALSE(capability_->sim_lock_status_.enabled);
519 EXPECT_EQ("", capability_->sim_lock_status_.lock_type);
520 EXPECT_EQ(0, capability_->sim_lock_status_.retries_left);
521 DBusPropertiesMap props;
522 static const char kLockType[] = "sim-pin";
523 const int kRetries = 3;
524 props[CellularCapabilityGSM::kPropertyAccessTechnology].writer().
525 append_uint32(MM_MODEM_GSM_ACCESS_TECH_EDGE);
526 props[CellularCapabilityGSM::kPropertyEnabledFacilityLocks].writer().
527 append_uint32(MM_MODEM_GSM_FACILITY_SIM);
528 props[CellularCapabilityGSM::kPropertyUnlockRequired].writer().append_string(
529 kLockType);
530 props[CellularCapabilityGSM::kPropertyUnlockRetries].writer().append_uint32(
531 kRetries);
532 EXPECT_CALL(*device_adaptor_,
533 EmitKeyValueStoreChanged(flimflam::kSIMLockStatusProperty, _));
534 capability_->OnModemManagerPropertiesChanged(props);
535 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_EDGE, capability_->access_technology_);
536 EXPECT_TRUE(capability_->sim_lock_status_.enabled);
537 EXPECT_EQ(kLockType, capability_->sim_lock_status_.lock_type);
538 EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
539}
540
Darin Petkovb05315f2011-11-07 10:14:25 +0100541} // namespace shill