blob: 9fe548ed47532a295b684cc77868926d8f8cb8c8 [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() {
62 cellular_->set_modem_gsm_network_proxy(network_proxy_.release());
63 }
64
Darin Petkov20c13ec2011-11-09 15:07:15 +010065 void SetAccessTechnology(uint32 technology) {
66 cellular_->gsm_.access_technology = technology;
67 }
68
69 void SetRegistrationState(uint32 state) {
70 cellular_->gsm_.registration_state = state;
71 }
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());
111 EXPECT_EQ(kTestCarrier, cellular_->spn());
112 EXPECT_EQ(kMSISDN, cellular_->mdn());
113 capability_.GetIdentifiers();
114 EXPECT_EQ(kIMEI, cellular_->imei());
115 EXPECT_EQ(kIMSI, cellular_->imsi());
116 EXPECT_EQ(kTestCarrier, cellular_->spn());
117 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 Petkovb05315f2011-11-07 10:14:25 +0100130TEST_F(CellularCapabilityGSMTest, RequirePIN) {
131 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100132 EXPECT_CALL(*card_proxy_, EnablePIN(kPIN, true)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100133 capability_.RequirePIN(kPIN, true, &error);
134 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100135 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100136 dispatcher_.DispatchPendingEvents();
137}
138
139TEST_F(CellularCapabilityGSMTest, EnterPIN) {
140 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100141 EXPECT_CALL(*card_proxy_, SendPIN(kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100142 capability_.EnterPIN(kPIN, &error);
143 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100144 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100145 dispatcher_.DispatchPendingEvents();
146}
147
148TEST_F(CellularCapabilityGSMTest, UnblockPIN) {
149 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100150 EXPECT_CALL(*card_proxy_, SendPUK(kPUK, kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100151 capability_.UnblockPIN(kPUK, kPIN, &error);
152 EXPECT_TRUE(error.IsSuccess());
Darin Petkovcb547732011-11-09 13:55:26 +0100153 SetCardProxy();
Darin Petkovb05315f2011-11-07 10:14:25 +0100154 dispatcher_.DispatchPendingEvents();
155}
156
157TEST_F(CellularCapabilityGSMTest, ChangePIN) {
158 static const char kOldPIN[] = "1111";
159 Error error;
Darin Petkovcb547732011-11-09 13:55:26 +0100160 EXPECT_CALL(*card_proxy_, ChangePIN(kOldPIN, kPIN)).Times(1);
Darin Petkovb05315f2011-11-07 10:14:25 +0100161 capability_.ChangePIN(kOldPIN, 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
Darin Petkov1272a432011-11-10 15:53:37 +0100167TEST_F(CellularCapabilityGSMTest, Scan) {
168 static const char kID0[] = "123";
169 static const char kID1[] = "456";
170 Error error;
171 capability_.Scan(&error);
172 EXPECT_TRUE(error.IsSuccess());
173 ModemGSMNetworkProxyInterface::ScanResults results;
174 results.push_back(ModemGSMNetworkProxyInterface::ScanResult());
175 results[0][CellularCapabilityGSM::kNetworkPropertyID] = kID0;
176 results.push_back(ModemGSMNetworkProxyInterface::ScanResult());
177 results[1][CellularCapabilityGSM::kNetworkPropertyID] = kID1;
178 EXPECT_CALL(*network_proxy_, Scan()).WillOnce(Return(results));
179 SetNetworkProxy();
180 capability_.found_networks_.resize(3, Stringmap());
181 dispatcher_.DispatchPendingEvents();
182 EXPECT_EQ(2, capability_.found_networks_.size());
183 EXPECT_EQ(kID0, capability_.found_networks_[0][flimflam::kNetworkIdProperty]);
184 EXPECT_EQ(kID1, capability_.found_networks_[1][flimflam::kNetworkIdProperty]);
185}
186
187TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
188 static const char kID[] = "123";
189 static const char kLongName[] = "long name";
190 static const char kShortName[] = "short name";
191 ModemGSMNetworkProxyInterface::ScanResult result;
192 result[CellularCapabilityGSM::kNetworkPropertyStatus] = "1";
193 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
194 result[CellularCapabilityGSM::kNetworkPropertyLongName] = kLongName;
195 result[CellularCapabilityGSM::kNetworkPropertyShortName] = kShortName;
196 result[CellularCapabilityGSM::kNetworkPropertyAccessTechnology] = "3";
197 result["unknown property"] = "random value";
198 Stringmap parsed = capability_.ParseScanResult(result);
199 EXPECT_EQ(5, parsed.size());
200 EXPECT_EQ("available", parsed[flimflam::kStatusProperty]);
201 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
202 EXPECT_EQ(kLongName, parsed[flimflam::kLongNameProperty]);
203 EXPECT_EQ(kShortName, parsed[flimflam::kShortNameProperty]);
204 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
205 parsed[flimflam::kTechnologyProperty]);
206}
207
208TEST_F(CellularCapabilityGSMTest, ParseScanResultProviderLookup) {
209 InitProviderDB();
210 static const char kID[] = "310210";
211 ModemGSMNetworkProxyInterface::ScanResult result;
212 result[CellularCapabilityGSM::kNetworkPropertyID] = kID;
213 Stringmap parsed = capability_.ParseScanResult(result);
214 EXPECT_EQ(2, parsed.size());
215 EXPECT_EQ(kID, parsed[flimflam::kNetworkIdProperty]);
216 EXPECT_EQ("T-Mobile", parsed[flimflam::kLongNameProperty]);
217}
218
Darin Petkov20c13ec2011-11-09 15:07:15 +0100219TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
220 EXPECT_EQ("", capability_.GetNetworkTechnologyString());
221 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
222 EXPECT_EQ("", capability_.GetNetworkTechnologyString());
223 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
224 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
225 capability_.GetNetworkTechnologyString());
226 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM_COMPACT);
227 EXPECT_EQ(flimflam::kNetworkTechnologyGsm,
228 capability_.GetNetworkTechnologyString());
229 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
230 EXPECT_EQ(flimflam::kNetworkTechnologyGprs,
231 capability_.GetNetworkTechnologyString());
232 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_EDGE);
233 EXPECT_EQ(flimflam::kNetworkTechnologyEdge,
234 capability_.GetNetworkTechnologyString());
235 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_UMTS);
236 EXPECT_EQ(flimflam::kNetworkTechnologyUmts,
237 capability_.GetNetworkTechnologyString());
238 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
239 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSDPA);
240 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
241 capability_.GetNetworkTechnologyString());
242 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSUPA);
243 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
244 capability_.GetNetworkTechnologyString());
245 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA);
246 EXPECT_EQ(flimflam::kNetworkTechnologyHspa,
247 capability_.GetNetworkTechnologyString());
248 SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_HSPA_PLUS);
249 EXPECT_EQ(flimflam::kNetworkTechnologyHspaPlus,
250 capability_.GetNetworkTechnologyString());
251}
252
253TEST_F(CellularCapabilityGSMTest, GetRoamingStateString) {
254 EXPECT_EQ(flimflam::kRoamingStateUnknown,
255 capability_.GetRoamingStateString());
256 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
257 EXPECT_EQ(flimflam::kRoamingStateHome,
258 capability_.GetRoamingStateString());
259 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING);
260 EXPECT_EQ(flimflam::kRoamingStateRoaming,
261 capability_.GetRoamingStateString());
262 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_SEARCHING);
263 EXPECT_EQ(flimflam::kRoamingStateUnknown,
264 capability_.GetRoamingStateString());
265 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_DENIED);
266 EXPECT_EQ(flimflam::kRoamingStateUnknown,
267 capability_.GetRoamingStateString());
268 SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_IDLE);
269 EXPECT_EQ(flimflam::kRoamingStateUnknown,
270 capability_.GetRoamingStateString());
271}
272
Darin Petkovb05315f2011-11-07 10:14:25 +0100273} // namespace shill