blob: f14b97f78be84a743cc1e792e02967307e41b06d [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 Petkov1272a432011-11-10 15:53:37 +0100288TEST_F(CellularCapabilityGSMTest, Scan) {
289 static const char kID0[] = "123";
290 static const char kID1[] = "456";
291 Error error;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500292 EXPECT_CALL(*network_proxy_, Scan(_, CellularCapability::kTimeoutScan));
Darin Petkov1272a432011-11-10 15:53:37 +0100293 SetNetworkProxy();
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500294 capability_->Scan(NULL);
295 GSMScanResults results;
296 results.push_back(GSMScanResult());
297 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kID0;
298 results.push_back(GSMScanResult());
299 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kID1;
Darin Petkov721ac932011-11-16 15:43:09 +0100300 capability_->found_networks_.resize(3, Stringmap());
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500301 capability_->OnScanCallback(results, Error(), NULL);
Darin Petkov721ac932011-11-16 15:43:09 +0100302 EXPECT_EQ(2, capability_->found_networks_.size());
303 EXPECT_EQ(kID0,
304 capability_->found_networks_[0][flimflam::kNetworkIdProperty]);
305 EXPECT_EQ(kID1,
306 capability_->found_networks_[1][flimflam::kNetworkIdProperty]);
Darin Petkov1272a432011-11-10 15:53:37 +0100307}
308
309TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
310 static const char kID[] = "123";
311 static const char kLongName[] = "long name";
312 static const char kShortName[] = "short name";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500313 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100314 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
315 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
316 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
317 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
318 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
319 result["unknown property"] = "random value";
Darin Petkov721ac932011-11-16 15:43:09 +0100320 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100321 EXPECT_EQ(5, parsed.size());
322 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
323 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
324 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
325 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
326 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
327 parsed[flimflam::kTechnologyProperty]);
328}
329
330TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
331 InitProviderDB();
332 static const char kID[] = "310210";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500333 GSMScanResult result;
Darin Petkov1272a432011-11-10 15:53:37 +0100334 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
Darin Petkov721ac932011-11-16 15:43:09 +0100335 Stringmap parsed = capability_->ParseScanResult(result);
Darin Petkov1272a432011-11-10 15:53:37 +0100336 EXPECT_EQ(2, parsed.size());
337 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
338 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
339}
340
Darin Petkovae0c64e2011-11-15 15:50:27 +0100341TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
Darin Petkov721ac932011-11-16 15:43:09 +0100342 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
343 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100344 SetService();
Darin Petkovb72cf402011-11-22 14:51:39 +0100345 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100346 capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
347 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100348 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkovb72cf402011-11-22 14:51:39 +0100349 cellular_->service()->network_technology());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100350}
351
352TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
353 static const char kOperatorName[] = "Swisscom";
354 InitProviderDB();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100355 capability_->serving_operator_.SetCode("22801");
Darin Petkovae0c64e2011-11-15 15:50:27 +0100356 SetService();
Darin Petkov721ac932011-11-16 15:43:09 +0100357 capability_->UpdateOperatorInfo();
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100358 EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
359 EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100360 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
361}
362
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100363TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
364 InitProviderDB();
365 DBusPropertiesMap props;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500366 capability_->imsi_ = "310240123456789";
367 props[CellularCapability::kPropertyIMSI].writer().append_string("");
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100368 capability_->UpdateStatus(props);
369 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
370}
371
372TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
373 static const char kCountry[] = "us";
374 static const char kCode[] = "310160";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500375 capability_->imsi_ = "310240123456789";
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100376
377 capability_->SetHomeProvider(); // No mobile provider DB available.
378 EXPECT_TRUE(cellular_->home_provider().GetName().empty());
379 EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
380 EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
381
382 InitProviderDB();
383 capability_->SetHomeProvider();
384 EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
385 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
386 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
Darin Petkov3cfbf212011-11-21 16:02:09 +0100387 EXPECT_EQ(4, capability_->apn_list_.size());
Darin Petkov0a4dfeb2011-11-18 19:36:13 +0100388
389 Cellular::Operator oper;
390 cellular_->set_home_provider(oper);
391 capability_->spn_ = kTestCarrier;
392 capability_->SetHomeProvider();
393 EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
394 EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
395 EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
396}
397
Darin Petkov3cfbf212011-11-21 16:02:09 +0100398namespace {
399
400MATCHER(SizeIs4, "") {
401 return arg.size() == 4;
402}
403
404} // namespace
405
406TEST_F(CellularCapabilityGSMTest, InitAPNList) {
407 InitProviderDB();
408 capability_->home_provider_ =
409 mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
410 ASSERT_TRUE(capability_->home_provider_);
411 EXPECT_EQ(0, capability_->apn_list_.size());
412 EXPECT_CALL(*device_adaptor_,
413 EmitStringmapsChanged(flimflam::kCellularApnListProperty,
414 SizeIs4()));
415 capability_->InitAPNList();
416 EXPECT_EQ(4, capability_->apn_list_.size());
417 EXPECT_EQ("wap.voicestream.com",
418 capability_->apn_list_[1][flimflam::kApnProperty]);
419 EXPECT_EQ("Web2Go/t-zones",
420 capability_->apn_list_[1][flimflam::kApnNameProperty]);
421}
422
Darin Petkov20c13ec2011-11-09 15:07:15 +0100423TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100424 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100425 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
Darin Petkov20c13ec2011-11-09 15:07:15 +0100426 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100427 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100428 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
429 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
Darin Petkov721ac932011-11-16 15:43:09 +0100430 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100431 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
432 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
Darin Petkov721ac932011-11-16 15:43:09 +0100433 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100434 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
435 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
Darin Petkov721ac932011-11-16 15:43:09 +0100436 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100437 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
438 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
Darin Petkov721ac932011-11-16 15:43:09 +0100439 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100440 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
441 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100442 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100443 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
444 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100445 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100446 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
447 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
Darin Petkov721ac932011-11-16 15:43:09 +0100448 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100449 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
450 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
Darin Petkov721ac932011-11-16 15:43:09 +0100451 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100452}
453
454TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
455 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100456 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100457 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
458 EXPECT_EQ(flimflam::kRoamingStateHome,
Darin Petkov721ac932011-11-16 15:43:09 +0100459 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100460 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
461 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100462 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100463 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
464 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100465 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100466 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
467 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100468 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100469 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
470 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100471 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100472}
473
Darin Petkovac635a82012-01-10 16:51:58 +0100474TEST_F(CellularCapabilityGSMTest, CreateFriendlyServiceName) {
475 CellularCapabilityGSM::friendly_service_name_id_ = 0;
476 EXPECT_EQ("GSMNetwork0", capability_->CreateFriendlyServiceName());
477 EXPECT_EQ("GSMNetwork1", capability_->CreateFriendlyServiceName());
478 capability_->serving_operator_.SetCode("1234");
479 EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
480 static const char kTestCarrier[] = "A GSM Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500481 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100482 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
483 static const char kTestOperator[] = "A GSM Operator";
484 capability_->serving_operator_.SetName(kTestOperator);
485 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
486 static const char kHomeProvider[] = "The GSM Home Provider";
487 cellular_->home_provider_.SetName(kHomeProvider);
488 EXPECT_EQ(kTestOperator, capability_->CreateFriendlyServiceName());
489 capability_->registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
490 EXPECT_EQ(kHomeProvider, capability_->CreateFriendlyServiceName());
491}
492
Darin Petkov31332412012-01-28 01:50:02 +0100493TEST_F(CellularCapabilityGSMTest, SetStorageIdentifier) {
494 SetService();
495 capability_->OnServiceCreated();
496 EXPECT_EQ(string("cellular_") + kAddress + "_" +
497 cellular_->service()->friendly_name(),
498 cellular_->service()->GetStorageIdentifier());
499 capability_->imsi_ = kIMSI;
500 capability_->OnServiceCreated();
501 EXPECT_EQ(string("cellular_") + kAddress + "_" + kIMSI,
502 cellular_->service()->GetStorageIdentifier());
503}
504
Darin Petkovb05315f2011-11-07 10:14:25 +0100505} // namespace shill