blob: 64e089706848a2d269c89c12e8976e70229cc61b [file] [log] [blame]
Darin Petkovb05315f2011-11-07 10:14:25 +01001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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"
16#include "shill/mock_modem_gsm_card_proxy.h"
Darin Petkov3e509242011-11-10 14:46:44 +010017#include "shill/mock_modem_gsm_network_proxy.h"
Darin Petkovb05315f2011-11-07 10:14:25 +010018#include "shill/nice_mock_control.h"
19
Darin Petkovcb547732011-11-09 13:55:26 +010020using testing::Return;
21
Darin Petkovb05315f2011-11-07 10:14:25 +010022namespace shill {
23
24class CellularCapabilityGSMTest : public testing::Test {
25 public:
26 CellularCapabilityGSMTest()
27 : cellular_(new Cellular(&control_,
28 &dispatcher_,
29 NULL,
30 "",
31 "",
32 0,
33 Cellular::kTypeGSM,
34 "",
35 "",
36 NULL)),
Darin Petkovcb547732011-11-09 13:55:26 +010037 card_proxy_(new MockModemGSMCardProxy()),
Darin Petkov3e509242011-11-10 14:46:44 +010038 network_proxy_(new MockModemGSMNetworkProxy()),
Darin Petkov1272a432011-11-10 15:53:37 +010039 capability_(cellular_.get()),
40 provider_db_(NULL) {}
Darin Petkovb05315f2011-11-07 10:14:25 +010041
Darin Petkov3e509242011-11-10 14:46:44 +010042 virtual ~CellularCapabilityGSMTest() {
43 cellular_->service_ = NULL;
Darin Petkov1272a432011-11-10 15:53:37 +010044 mobile_provider_close_db(provider_db_);
45 provider_db_ = NULL;
Darin Petkov3e509242011-11-10 14:46:44 +010046 }
47
Darin Petkovb05315f2011-11-07 10:14:25 +010048 protected:
Darin Petkov1272a432011-11-10 15:53:37 +010049 static const char kTestMobileProviderDBPath[];
Darin Petkovcb547732011-11-09 13:55:26 +010050 static const char kTestCarrier[];
Darin Petkovb05315f2011-11-07 10:14:25 +010051 static const char kPIN[];
52 static const char kPUK[];
Darin Petkovcb547732011-11-09 13:55:26 +010053 static const char kIMEI[];
54 static const char kIMSI[];
55 static const char kMSISDN[];
56
57 void SetCardProxy() {
58 capability_.card_proxy_.reset(card_proxy_.release());
59 }
Darin Petkovb05315f2011-11-07 10:14:25 +010060
Darin Petkov1272a432011-11-10 15:53:37 +010061 void SetNetworkProxy() {
Darin Petkov184c54e2011-11-15 12:44:39 +010062 capability_.network_proxy_.reset(network_proxy_.release());
Darin Petkov1272a432011-11-10 15:53:37 +010063 }
64
Darin Petkov20c13ec2011-11-09 15:07:15 +010065 void SetAccessTechnology(uint32 technology) {
Darin Petkovae0c64e2011-11-15 15:50:27 +010066 capability_.access_technology_ = technology;
Darin Petkov20c13ec2011-11-09 15:07:15 +010067 }
68
69 void SetRegistrationState(uint32 state) {
Darin Petkov184c54e2011-11-15 12:44:39 +010070 capability_.registration_state_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +010071 }
72
Darin Petkov3e509242011-11-10 14:46:44 +010073 void SetService() {
74 cellular_->service_ = new CellularService(
75 &control_, &dispatcher_, NULL, cellular_);
76 }
77
Darin Petkov1272a432011-11-10 15:53:37 +010078 void InitProviderDB() {
79 provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
80 ASSERT_TRUE(provider_db_);
81 cellular_->provider_db_ = provider_db_;
82 }
83
Darin Petkovb05315f2011-11-07 10:14:25 +010084 NiceMockControl control_;
85 EventDispatcher dispatcher_;
86 CellularRefPtr cellular_;
Darin Petkovcb547732011-11-09 13:55:26 +010087 scoped_ptr<MockModemGSMCardProxy> card_proxy_;
Darin Petkov3e509242011-11-10 14:46:44 +010088 scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
Darin Petkovb05315f2011-11-07 10:14:25 +010089 CellularCapabilityGSM capability_;
Darin Petkov1272a432011-11-10 15:53:37 +010090 mobile_provider_db *provider_db_;
Darin Petkovb05315f2011-11-07 10:14:25 +010091};
92
Darin Petkov1272a432011-11-10 15:53:37 +010093const char CellularCapabilityGSMTest::kTestMobileProviderDBPath[] =
94 "provider_db_unittest.bfd";
Darin Petkovcb547732011-11-09 13:55:26 +010095const char CellularCapabilityGSMTest::kTestCarrier[] = "The Cellular Carrier";
Darin Petkovb05315f2011-11-07 10:14:25 +010096const char CellularCapabilityGSMTest::kPIN[] = "9876";
97const char CellularCapabilityGSMTest::kPUK[] = "8765";
Darin Petkovcb547732011-11-09 13:55:26 +010098const char CellularCapabilityGSMTest::kIMEI[] = "987654321098765";
99const char CellularCapabilityGSMTest::kIMSI[] = "123456789012345";
100const char CellularCapabilityGSMTest::kMSISDN[] = "12345678901";
101
102TEST_F(CellularCapabilityGSMTest, GetIdentifiers) {
103 EXPECT_CALL(*card_proxy_, GetIMEI()).WillOnce(Return(kIMEI));
104 EXPECT_CALL(*card_proxy_, GetIMSI()).WillOnce(Return(kIMSI));
105 EXPECT_CALL(*card_proxy_, GetSPN()).WillOnce(Return(kTestCarrier));
106 EXPECT_CALL(*card_proxy_, GetMSISDN()).WillOnce(Return(kMSISDN));
107 SetCardProxy();
108 capability_.GetIdentifiers();
109 EXPECT_EQ(kIMEI, cellular_->imei());
110 EXPECT_EQ(kIMSI, cellular_->imsi());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100111 EXPECT_EQ(kTestCarrier, capability_.spn());
Darin Petkovcb547732011-11-09 13:55:26 +0100112 EXPECT_EQ(kMSISDN, cellular_->mdn());
113 capability_.GetIdentifiers();
114 EXPECT_EQ(kIMEI, cellular_->imei());
115 EXPECT_EQ(kIMSI, cellular_->imsi());
Darin Petkovae0c64e2011-11-15 15:50:27 +0100116 EXPECT_EQ(kTestCarrier, capability_.spn());
Darin Petkovcb547732011-11-09 13:55:26 +0100117 EXPECT_EQ(kMSISDN, cellular_->mdn());
118}
Darin Petkovb05315f2011-11-07 10:14:25 +0100119
Darin Petkov3e509242011-11-10 14:46:44 +0100120TEST_F(CellularCapabilityGSMTest, GetSignalQuality) {
121 const int kStrength = 80;
122 EXPECT_CALL(*network_proxy_, GetSignalQuality()).WillOnce(Return(kStrength));
123 SetNetworkProxy();
124 SetService();
125 EXPECT_EQ(0, cellular_->service()->strength());
126 capability_.GetSignalQuality();
127 EXPECT_EQ(kStrength, cellular_->service()->strength());
128}
129
Darin Petkov184c54e2011-11-15 12:44:39 +0100130TEST_F(CellularCapabilityGSMTest, RegisterOnNetwork) {
131 Error error;
132 EXPECT_CALL(*network_proxy_, Register(kTestCarrier)).Times(1);
133 capability_.RegisterOnNetwork(kTestCarrier, &error);
134 EXPECT_TRUE(error.IsSuccess());
135 SetNetworkProxy();
136 dispatcher_.DispatchPendingEvents();
137 EXPECT_EQ(kTestCarrier, capability_.selected_network_);
138}
139
Darin Petkovb05315f2011-11-07 10:14:25 +0100140TEST_F(CellularCapabilityGSMTest, RequirePIN) {
141 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100142 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100143 capability_.RequirePIN(kPIN, true, &error);
144 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100145 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100146 dispatcher_.DispatchPendingEvents();
147}
148
149TEST_F(CellularCapabilityGSMTest, EnterPIN) {
150 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100151 EXPECT_CALL(*card_proxy_, SendPIN(kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100152 capability_.EnterPIN(kPIN, &error);
153 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100154 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100155 dispatcher_.DispatchPendingEvents();
156}
157
158TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
159 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100160 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100161 capability_.UnblockPIN(kPUK, kPIN, &error);
162 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100163 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100164 dispatcher_.DispatchPendingEvents();
165}
166
167TEST_F(CellularCapabilityGSMTest, ChangePIN) {
168 static const char kOldPIN[] = "1111";
169 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100170 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100171 capability_.ChangePIN(kOldPIN, kPIN, &error);
172 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100173 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100174 dispatcher_.DispatchPendingEvents();
175}
176
Darin Petkov1272a432011-11-10 15:53:37 +0100177TEST_F(CellularCapabilityGSMTest, Scan) {
178 static const char kID0[] = "123";
179 static const char kID1[] = "456";
180 Error error;
181 capability_.Scan(&error);
182 EXPECT_TRUE(error.IsSuccess());
183 ModemGSMNetworkProxyInterface::ScanResults results;
184 results.push_back(ModemGSMNetworkProxyInterface::ScanResult());
185 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kID0;
186 results.push_back(ModemGSMNetworkProxyInterface::ScanResult());
187 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kID1;
188 EXPECT_CALL(*network_proxy_, Scan()).WillOnce(Return(results));
189 SetNetworkProxy();
190 capability_.found_networks_.resize(3, Stringmap());
191 dispatcher_.DispatchPendingEvents();
192 EXPECT_EQ(2, capability_.found_networks_.size());
193 EXPECT_EQ(kID0, capability_.found_networks_[0][flimflam::kNetworkIdProperty]);
194 EXPECT_EQ(kID1, capability_.found_networks_[1][flimflam::kNetworkIdProperty]);
195}
196
197TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
198 static const char kID[] = "123";
199 static const char kLongName[] = "long name";
200 static const char kShortName[] = "short name";
201 ModemGSMNetworkProxyInterface::ScanResult result;
202 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
203 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
204 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
205 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
206 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
207 result["unknown property"] = "random value";
208 Stringmap parsed = capability_.ParseScanResult(result);
209 EXPECT_EQ(5, parsed.size());
210 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
211 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
212 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
213 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
214 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
215 parsed[flimflam::kTechnologyProperty]);
216}
217
218TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
219 InitProviderDB();
220 static const char kID[] = "310210";
221 ModemGSMNetworkProxyInterface::ScanResult result;
222 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
223 Stringmap parsed = capability_.ParseScanResult(result);
224 EXPECT_EQ(2, parsed.size());
225 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
226 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
227}
228
Darin Petkovae0c64e2011-11-15 15:50:27 +0100229TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
230 capability_.SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
231 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_.access_technology_);
232 SetService();
233 capability_.registration_state_ = MM_MODEM_GSM_NETWORK_REG_STATUS_HOME;
234 capability_.SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
235 EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_.access_technology_);
236 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
237 cellular_->service()->network_tech());
238}
239
240TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
241 static const char kOperatorName[] = "Swisscom";
242 InitProviderDB();
243 capability_.network_id_ = "22801";
244 SetService();
245 capability_.UpdateOperatorInfo();
246 EXPECT_EQ(kOperatorName, capability_.operator_name_);
247 EXPECT_EQ("ch", capability_.operator_country_);
248 EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
249}
250
Darin Petkov20c13ec2011-11-09 15:07:15 +0100251TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
252 EXPECT_EQ("", capability_.GetNetworkTechnologyString());
253 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
254 EXPECT_EQ("", capability_.GetNetworkTechnologyString());
255 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
256 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
257 capability_.GetNetworkTechnologyString());
258 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
259 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
260 capability_.GetNetworkTechnologyString());
261 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
262 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
263 capability_.GetNetworkTechnologyString());
264 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
265 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
266 capability_.GetNetworkTechnologyString());
267 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
268 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
269 capability_.GetNetworkTechnologyString());
270 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
271 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
272 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
273 capability_.GetNetworkTechnologyString());
274 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
275 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
276 capability_.GetNetworkTechnologyString());
277 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
278 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
279 capability_.GetNetworkTechnologyString());
280 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
281 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
282 capability_.GetNetworkTechnologyString());
283}
284
285TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
286 EXPECT_EQ(flimflam::kRoamingStateUnknown,
287 capability_.GetRoamingStateString());
288 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
289 EXPECT_EQ(flimflam::kRoamingStateHome,
290 capability_.GetRoamingStateString());
291 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
292 EXPECT_EQ(flimflam::kRoamingStateRoaming,
293 capability_.GetRoamingStateString());
294 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
295 EXPECT_EQ(flimflam::kRoamingStateUnknown,
296 capability_.GetRoamingStateString());
297 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
298 EXPECT_EQ(flimflam::kRoamingStateUnknown,
299 capability_.GetRoamingStateString());
300 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
301 EXPECT_EQ(flimflam::kRoamingStateUnknown,
302 capability_.GetRoamingStateString());
303}
304
Darin Petkovb05315f2011-11-07 10:14:25 +0100305} // namespace shill