blob: 7deaf90ce99bdefd3c6fb474205117d7485af94f [file] [log] [blame]
Darin Petkovac635a82012-01-10 16:51:58 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovcb547732011-11-09 13:55:26 +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_cdma.h"
6
Eric Shienbrood9a245532012-03-07 14:20:39 -05007#include <base/bind.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +01008#include <chromeos/dbus/service_constants.h>
Darin Petkovcb547732011-11-09 13:55:26 +01009#include <gtest/gtest.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010010#include <mm/mm-modem.h>
Darin Petkovcb547732011-11-09 13:55:26 +010011
12#include "shill/cellular.h"
Darin Petkov3e509242011-11-10 14:46:44 +010013#include "shill/cellular_service.h"
Darin Petkovcb547732011-11-09 13:55:26 +010014#include "shill/error.h"
15#include "shill/event_dispatcher.h"
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050016#include "shill/mock_adaptors.h"
Eric Shienbrood04e63582012-01-19 13:41:12 -050017#include "shill/mock_glib.h"
18#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080019#include "shill/mock_metrics.h"
Darin Petkovcb547732011-11-09 13:55:26 +010020#include "shill/mock_modem_cdma_proxy.h"
21#include "shill/nice_mock_control.h"
Ben Chan3ecdf822012-08-06 12:29:23 -070022#include "shill/proxy_factory.h"
Darin Petkovcb547732011-11-09 13:55:26 +010023
Eric Shienbrood9a245532012-03-07 14:20:39 -050024using base::Bind;
25using base::Unretained;
26using std::string;
Darin Petkov184c54e2011-11-15 12:44:39 +010027using testing::_;
Eric Shienbrood9a245532012-03-07 14:20:39 -050028using testing::Invoke;
Darin Petkovcb547732011-11-09 13:55:26 +010029using testing::Return;
30
31namespace shill {
32
33class CellularCapabilityCDMATest : public testing::Test {
34 public:
35 CellularCapabilityCDMATest()
Eric Shienbrood04e63582012-01-19 13:41:12 -050036 : manager_(&control_, &dispatcher_, &metrics_, &glib_),
37 cellular_(new Cellular(&control_,
Darin Petkovcb547732011-11-09 13:55:26 +010038 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -080039 &metrics_,
Eric Shienbrood04e63582012-01-19 13:41:12 -050040 &manager_,
Darin Petkovcb547732011-11-09 13:55:26 +010041 "",
42 "",
43 0,
44 Cellular::kTypeCDMA,
45 "",
46 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040047 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070048 NULL,
49 ProxyFactory::GetInstance())),
Darin Petkovcb547732011-11-09 13:55:26 +010050 proxy_(new MockModemCDMAProxy()),
Darin Petkov721ac932011-11-16 15:43:09 +010051 capability_(NULL) {}
Darin Petkovcb547732011-11-09 13:55:26 +010052
Darin Petkov3e509242011-11-10 14:46:44 +010053 virtual ~CellularCapabilityCDMATest() {
54 cellular_->service_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010055 capability_ = NULL;
Darin Petkov3e509242011-11-10 14:46:44 +010056 }
57
Darin Petkov721ac932011-11-16 15:43:09 +010058 virtual void SetUp() {
59 capability_ =
60 dynamic_cast<CellularCapabilityCDMA *>(cellular_->capability_.get());
Darin Petkov184c54e2011-11-15 12:44:39 +010061 }
62
Eric Shienbrood9a245532012-03-07 14:20:39 -050063 void InvokeActivate(const string &carrier, Error *error,
64 const ActivationResultCallback &callback,
65 int timeout) {
66 callback.Run(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR, Error());
67 }
68 void InvokeActivateError(const string &carrier, Error *error,
69 const ActivationResultCallback &callback,
70 int timeout) {
71 callback.Run(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL, Error());
72 }
73 void InvokeGetSignalQuality(Error *error,
74 const SignalQualityCallback &callback,
75 int timeout) {
76 callback.Run(kStrength, Error());
77 }
78 void InvokeGetRegistrationState(Error *error,
79 const RegistrationStateCallback &callback,
80 int timeout) {
81 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
82 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
83 Error());
84 }
85
86 MOCK_METHOD1(TestCallback, void(const Error &error));
87
Darin Petkovcb547732011-11-09 13:55:26 +010088 protected:
89 static const char kMEID[];
Darin Petkova3d3be52011-11-14 21:34:16 +010090 static const char kTestCarrier[];
Eric Shienbrood9a245532012-03-07 14:20:39 -050091 static const unsigned int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +010092
Darin Petkov20c13ec2011-11-09 15:07:15 +010093 void SetRegistrationStateEVDO(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +010094 capability_->registration_state_evdo_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +010095 }
96
97 void SetRegistrationState1x(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +010098 capability_->registration_state_1x_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +010099 }
100
Darin Petkov3e509242011-11-10 14:46:44 +0100101 void SetProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100102 capability_->proxy_.reset(proxy_.release());
Darin Petkov3e509242011-11-10 14:46:44 +0100103 }
104
105 void SetService() {
106 cellular_->service_ = new CellularService(
Eric Shienbrood04e63582012-01-19 13:41:12 -0500107 &control_, &dispatcher_, &metrics_, &manager_, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100108 }
109
Darin Petkova3d3be52011-11-14 21:34:16 +0100110 void SetDeviceState(Cellular::State state) {
111 cellular_->state_ = state;
112 }
113
Darin Petkovcb547732011-11-09 13:55:26 +0100114 NiceMockControl control_;
115 EventDispatcher dispatcher_;
Eric Shienbrood04e63582012-01-19 13:41:12 -0500116 MockGLib glib_;
117 MockManager manager_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800118 MockMetrics metrics_;
Darin Petkovcb547732011-11-09 13:55:26 +0100119 CellularRefPtr cellular_;
120 scoped_ptr<MockModemCDMAProxy> proxy_;
Darin Petkov721ac932011-11-16 15:43:09 +0100121 CellularCapabilityCDMA *capability_; // Owned by |cellular_|.
Darin Petkovcb547732011-11-09 13:55:26 +0100122};
123
124const char CellularCapabilityCDMATest::kMEID[] = "D1234567EF8901";
Darin Petkova3d3be52011-11-14 21:34:16 +0100125const char CellularCapabilityCDMATest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500126const unsigned int CellularCapabilityCDMATest::kStrength = 90;
Darin Petkova3d3be52011-11-14 21:34:16 +0100127
Darin Petkov721ac932011-11-16 15:43:09 +0100128TEST_F(CellularCapabilityCDMATest, PropertyStore) {
129 EXPECT_TRUE(cellular_->store().Contains(flimflam::kPRLVersionProperty));
130}
131
Darin Petkova3d3be52011-11-14 21:34:16 +0100132TEST_F(CellularCapabilityCDMATest, Activate) {
Darin Petkova3d3be52011-11-14 21:34:16 +0100133 SetDeviceState(Cellular::kStateEnabled);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500134 EXPECT_CALL(*proxy_, Activate(kTestCarrier, _, _,
135 CellularCapability::kTimeoutActivate))
136 .WillOnce(Invoke(this,
137 &CellularCapabilityCDMATest::InvokeActivate));
138 EXPECT_CALL(*this, TestCallback(_));
Darin Petkova3d3be52011-11-14 21:34:16 +0100139 SetProxy();
140 SetService();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500141 capability_->Activate(kTestCarrier, NULL,
142 Bind(&CellularCapabilityCDMATest::TestCallback, Unretained(this)));
Darin Petkova3d3be52011-11-14 21:34:16 +0100143 EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING,
Darin Petkov721ac932011-11-16 15:43:09 +0100144 capability_->activation_state());
Darin Petkova3d3be52011-11-14 21:34:16 +0100145 EXPECT_EQ(flimflam::kActivationStateActivating,
146 cellular_->service()->activation_state());
147 EXPECT_EQ("", cellular_->service()->error());
148}
149
150TEST_F(CellularCapabilityCDMATest, ActivateError) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500151 SetDeviceState(Cellular::kStateEnabled);
152 EXPECT_CALL(*proxy_, Activate(kTestCarrier, _, _,
153 CellularCapability::kTimeoutActivate))
154 .WillOnce(Invoke(this,
155 &CellularCapabilityCDMATest::InvokeActivateError));
156 EXPECT_CALL(*this, TestCallback(_));
Darin Petkova3d3be52011-11-14 21:34:16 +0100157 SetProxy();
158 SetService();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500159 capability_->Activate(kTestCarrier, NULL,
160 Bind(&CellularCapabilityCDMATest::TestCallback, Unretained(this)));
Darin Petkova3d3be52011-11-14 21:34:16 +0100161 EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED,
Darin Petkov721ac932011-11-16 15:43:09 +0100162 capability_->activation_state());
Darin Petkova3d3be52011-11-14 21:34:16 +0100163 EXPECT_EQ(flimflam::kActivationStateNotActivated,
164 cellular_->service()->activation_state());
165 EXPECT_EQ(flimflam::kErrorActivationFailed,
166 cellular_->service()->error());
167}
Darin Petkovcb547732011-11-09 13:55:26 +0100168
Darin Petkovae0c64e2011-11-15 15:50:27 +0100169TEST_F(CellularCapabilityCDMATest, GetActivationStateString) {
170 EXPECT_EQ(flimflam::kActivationStateActivated,
171 CellularCapabilityCDMA::GetActivationStateString(
172 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED));
173 EXPECT_EQ(flimflam::kActivationStateActivating,
174 CellularCapabilityCDMA::GetActivationStateString(
175 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING));
176 EXPECT_EQ(flimflam::kActivationStateNotActivated,
177 CellularCapabilityCDMA::GetActivationStateString(
178 MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED));
179 EXPECT_EQ(flimflam::kActivationStatePartiallyActivated,
180 CellularCapabilityCDMA::GetActivationStateString(
181 MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED));
182 EXPECT_EQ(flimflam::kActivationStateUnknown,
183 CellularCapabilityCDMA::GetActivationStateString(123));
184}
185
186TEST_F(CellularCapabilityCDMATest, GetActivationErrorString) {
187 EXPECT_EQ(flimflam::kErrorNeedEvdo,
188 CellularCapabilityCDMA::GetActivationErrorString(
189 MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE));
190 EXPECT_EQ(flimflam::kErrorNeedHomeNetwork,
191 CellularCapabilityCDMA::GetActivationErrorString(
192 MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING));
193 EXPECT_EQ(flimflam::kErrorOtaspFailed,
194 CellularCapabilityCDMA::GetActivationErrorString(
195 MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT));
196 EXPECT_EQ(flimflam::kErrorOtaspFailed,
197 CellularCapabilityCDMA::GetActivationErrorString(
198 MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED));
199 EXPECT_EQ(flimflam::kErrorOtaspFailed,
200 CellularCapabilityCDMA::GetActivationErrorString(
201 MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED));
202 EXPECT_EQ("",
203 CellularCapabilityCDMA::GetActivationErrorString(
204 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR));
205 EXPECT_EQ(flimflam::kErrorActivationFailed,
206 CellularCapabilityCDMA::GetActivationErrorString(
207 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL));
208 EXPECT_EQ(flimflam::kErrorActivationFailed,
209 CellularCapabilityCDMA::GetActivationErrorString(1234));
210}
211
Darin Petkovb72cf402011-11-22 14:51:39 +0100212TEST_F(CellularCapabilityCDMATest, IsRegisteredEVDO) {
213 EXPECT_FALSE(capability_->IsRegistered());
214 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
215 EXPECT_FALSE(capability_->IsRegistered());
216 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
217 EXPECT_TRUE(capability_->IsRegistered());
218 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
219 EXPECT_TRUE(capability_->IsRegistered());
220 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
221 EXPECT_TRUE(capability_->IsRegistered());
222}
223
224TEST_F(CellularCapabilityCDMATest, IsRegistered1x) {
225 EXPECT_FALSE(capability_->IsRegistered());
226 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
227 EXPECT_FALSE(capability_->IsRegistered());
228 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
229 EXPECT_TRUE(capability_->IsRegistered());
230 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
231 EXPECT_TRUE(capability_->IsRegistered());
232 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
233 EXPECT_TRUE(capability_->IsRegistered());
234}
235
Darin Petkov20c13ec2011-11-09 15:07:15 +0100236TEST_F(CellularCapabilityCDMATest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100237 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100238 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
239 EXPECT_EQ(flimflam::kNetworkTechnologyEvdo,
Darin Petkov721ac932011-11-16 15:43:09 +0100240 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100241 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
242 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
243 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkov721ac932011-11-16 15:43:09 +0100244 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100245}
246
247TEST_F(CellularCapabilityCDMATest, GetRoamingStateString) {
248 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100249 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100250 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
251 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100252 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100253 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100254 EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100255 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
256 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100257 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100258 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
259 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
260 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100261 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100262 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100263 EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100264 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
265 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100266 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100267}
268
Darin Petkov3e509242011-11-10 14:46:44 +0100269TEST_F(CellularCapabilityCDMATest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500270 EXPECT_CALL(*proxy_,
271 GetSignalQuality(NULL, _, CellularCapability::kTimeoutDefault))
272 .WillOnce(Invoke(this,
273 &CellularCapabilityCDMATest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100274 SetProxy();
275 SetService();
276 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100277 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100278 EXPECT_EQ(kStrength, cellular_->service()->strength());
279}
280
Darin Petkov184c54e2011-11-15 12:44:39 +0100281TEST_F(CellularCapabilityCDMATest, GetRegistrationState) {
282 EXPECT_FALSE(cellular_->service().get());
283 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
Darin Petkov721ac932011-11-16 15:43:09 +0100284 capability_->registration_state_1x());
Darin Petkov184c54e2011-11-15 12:44:39 +0100285 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
Darin Petkov721ac932011-11-16 15:43:09 +0100286 capability_->registration_state_evdo());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500287 EXPECT_CALL(*proxy_,
288 GetRegistrationState(NULL, _,
289 CellularCapability::kTimeoutDefault))
290 .WillOnce(Invoke(
291 this,
292 &CellularCapabilityCDMATest::InvokeGetRegistrationState));
Darin Petkov184c54e2011-11-15 12:44:39 +0100293 SetProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500294 cellular_->state_ = Cellular::kStateEnabled;
Eric Shienbrood04e63582012-01-19 13:41:12 -0500295 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500296 capability_->GetRegistrationState();
Darin Petkov184c54e2011-11-15 12:44:39 +0100297 dispatcher_.DispatchPendingEvents();
298 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
Darin Petkov721ac932011-11-16 15:43:09 +0100299 capability_->registration_state_1x());
Darin Petkov184c54e2011-11-15 12:44:39 +0100300 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
Darin Petkov721ac932011-11-16 15:43:09 +0100301 capability_->registration_state_evdo());
Eric Shienbrood04e63582012-01-19 13:41:12 -0500302 EXPECT_TRUE(cellular_->service().get());
Darin Petkov184c54e2011-11-15 12:44:39 +0100303}
304
Darin Petkovac635a82012-01-10 16:51:58 +0100305TEST_F(CellularCapabilityCDMATest, CreateFriendlyServiceName) {
306 CellularCapabilityCDMA::friendly_service_name_id_ = 0;
307 EXPECT_EQ("CDMANetwork0", capability_->CreateFriendlyServiceName());
308 EXPECT_EQ("CDMANetwork1", capability_->CreateFriendlyServiceName());
309 static const char kTestCarrier[] = "A Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500310 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100311 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
312}
313
Darin Petkovcb547732011-11-09 13:55:26 +0100314} // namespace shill