blob: 493e75bfdddf239bafb646943f7ac879b9845d5c [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,
Ben Chan62028b22012-11-05 11:20:02 -080049 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070050 ProxyFactory::GetInstance())),
Darin Petkovcb547732011-11-09 13:55:26 +010051 proxy_(new MockModemCDMAProxy()),
Darin Petkov721ac932011-11-16 15:43:09 +010052 capability_(NULL) {}
Darin Petkovcb547732011-11-09 13:55:26 +010053
Darin Petkov3e509242011-11-10 14:46:44 +010054 virtual ~CellularCapabilityCDMATest() {
55 cellular_->service_ = NULL;
Darin Petkov721ac932011-11-16 15:43:09 +010056 capability_ = NULL;
Darin Petkov3e509242011-11-10 14:46:44 +010057 }
58
Darin Petkov721ac932011-11-16 15:43:09 +010059 virtual void SetUp() {
60 capability_ =
61 dynamic_cast<CellularCapabilityCDMA *>(cellular_->capability_.get());
Darin Petkov184c54e2011-11-15 12:44:39 +010062 }
63
Eric Shienbrood9a245532012-03-07 14:20:39 -050064 void InvokeActivate(const string &carrier, Error *error,
65 const ActivationResultCallback &callback,
66 int timeout) {
67 callback.Run(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR, Error());
68 }
69 void InvokeActivateError(const string &carrier, Error *error,
70 const ActivationResultCallback &callback,
71 int timeout) {
72 callback.Run(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL, Error());
73 }
74 void InvokeGetSignalQuality(Error *error,
75 const SignalQualityCallback &callback,
76 int timeout) {
77 callback.Run(kStrength, Error());
78 }
79 void InvokeGetRegistrationState(Error *error,
80 const RegistrationStateCallback &callback,
81 int timeout) {
82 callback.Run(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
83 MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
84 Error());
85 }
86
87 MOCK_METHOD1(TestCallback, void(const Error &error));
88
Darin Petkovcb547732011-11-09 13:55:26 +010089 protected:
90 static const char kMEID[];
Darin Petkova3d3be52011-11-14 21:34:16 +010091 static const char kTestCarrier[];
Eric Shienbrood9a245532012-03-07 14:20:39 -050092 static const unsigned int kStrength;
Darin Petkovcb547732011-11-09 13:55:26 +010093
Darin Petkov20c13ec2011-11-09 15:07:15 +010094 void SetRegistrationStateEVDO(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +010095 capability_->registration_state_evdo_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +010096 }
97
98 void SetRegistrationState1x(uint32 state) {
Darin Petkov721ac932011-11-16 15:43:09 +010099 capability_->registration_state_1x_ = state;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100100 }
101
Darin Petkov3e509242011-11-10 14:46:44 +0100102 void SetProxy() {
Darin Petkov721ac932011-11-16 15:43:09 +0100103 capability_->proxy_.reset(proxy_.release());
Darin Petkov3e509242011-11-10 14:46:44 +0100104 }
105
106 void SetService() {
107 cellular_->service_ = new CellularService(
Eric Shienbrood04e63582012-01-19 13:41:12 -0500108 &control_, &dispatcher_, &metrics_, &manager_, cellular_);
Darin Petkov3e509242011-11-10 14:46:44 +0100109 }
110
Darin Petkova3d3be52011-11-14 21:34:16 +0100111 void SetDeviceState(Cellular::State state) {
112 cellular_->state_ = state;
113 }
114
Darin Petkovcb547732011-11-09 13:55:26 +0100115 NiceMockControl control_;
116 EventDispatcher dispatcher_;
Eric Shienbrood04e63582012-01-19 13:41:12 -0500117 MockGLib glib_;
118 MockManager manager_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800119 MockMetrics metrics_;
Darin Petkovcb547732011-11-09 13:55:26 +0100120 CellularRefPtr cellular_;
121 scoped_ptr<MockModemCDMAProxy> proxy_;
Darin Petkov721ac932011-11-16 15:43:09 +0100122 CellularCapabilityCDMA *capability_; // Owned by |cellular_|.
Darin Petkovcb547732011-11-09 13:55:26 +0100123};
124
125const char CellularCapabilityCDMATest::kMEID[] = "D1234567EF8901";
Darin Petkova3d3be52011-11-14 21:34:16 +0100126const char CellularCapabilityCDMATest::kTestCarrier[] = "The Cellular Carrier";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500127const unsigned int CellularCapabilityCDMATest::kStrength = 90;
Darin Petkova3d3be52011-11-14 21:34:16 +0100128
Darin Petkov721ac932011-11-16 15:43:09 +0100129TEST_F(CellularCapabilityCDMATest, PropertyStore) {
130 EXPECT_TRUE(cellular_->store().Contains(flimflam::kPRLVersionProperty));
131}
132
Darin Petkova3d3be52011-11-14 21:34:16 +0100133TEST_F(CellularCapabilityCDMATest, Activate) {
Darin Petkova3d3be52011-11-14 21:34:16 +0100134 SetDeviceState(Cellular::kStateEnabled);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500135 EXPECT_CALL(*proxy_, Activate(kTestCarrier, _, _,
136 CellularCapability::kTimeoutActivate))
137 .WillOnce(Invoke(this,
138 &CellularCapabilityCDMATest::InvokeActivate));
139 EXPECT_CALL(*this, TestCallback(_));
Darin Petkova3d3be52011-11-14 21:34:16 +0100140 SetProxy();
141 SetService();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500142 capability_->Activate(kTestCarrier, NULL,
143 Bind(&CellularCapabilityCDMATest::TestCallback, Unretained(this)));
Darin Petkova3d3be52011-11-14 21:34:16 +0100144 EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING,
Darin Petkov721ac932011-11-16 15:43:09 +0100145 capability_->activation_state());
Darin Petkova3d3be52011-11-14 21:34:16 +0100146 EXPECT_EQ(flimflam::kActivationStateActivating,
147 cellular_->service()->activation_state());
148 EXPECT_EQ("", cellular_->service()->error());
149}
150
151TEST_F(CellularCapabilityCDMATest, ActivateError) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500152 SetDeviceState(Cellular::kStateEnabled);
153 EXPECT_CALL(*proxy_, Activate(kTestCarrier, _, _,
154 CellularCapability::kTimeoutActivate))
155 .WillOnce(Invoke(this,
156 &CellularCapabilityCDMATest::InvokeActivateError));
157 EXPECT_CALL(*this, TestCallback(_));
Darin Petkova3d3be52011-11-14 21:34:16 +0100158 SetProxy();
159 SetService();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500160 capability_->Activate(kTestCarrier, NULL,
161 Bind(&CellularCapabilityCDMATest::TestCallback, Unretained(this)));
Darin Petkova3d3be52011-11-14 21:34:16 +0100162 EXPECT_EQ(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED,
Darin Petkov721ac932011-11-16 15:43:09 +0100163 capability_->activation_state());
Darin Petkova3d3be52011-11-14 21:34:16 +0100164 EXPECT_EQ(flimflam::kActivationStateNotActivated,
165 cellular_->service()->activation_state());
166 EXPECT_EQ(flimflam::kErrorActivationFailed,
167 cellular_->service()->error());
168}
Darin Petkovcb547732011-11-09 13:55:26 +0100169
Darin Petkovae0c64e2011-11-15 15:50:27 +0100170TEST_F(CellularCapabilityCDMATest, GetActivationStateString) {
171 EXPECT_EQ(flimflam::kActivationStateActivated,
172 CellularCapabilityCDMA::GetActivationStateString(
173 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED));
174 EXPECT_EQ(flimflam::kActivationStateActivating,
175 CellularCapabilityCDMA::GetActivationStateString(
176 MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING));
177 EXPECT_EQ(flimflam::kActivationStateNotActivated,
178 CellularCapabilityCDMA::GetActivationStateString(
179 MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED));
180 EXPECT_EQ(flimflam::kActivationStatePartiallyActivated,
181 CellularCapabilityCDMA::GetActivationStateString(
182 MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED));
183 EXPECT_EQ(flimflam::kActivationStateUnknown,
184 CellularCapabilityCDMA::GetActivationStateString(123));
185}
186
187TEST_F(CellularCapabilityCDMATest, GetActivationErrorString) {
188 EXPECT_EQ(flimflam::kErrorNeedEvdo,
189 CellularCapabilityCDMA::GetActivationErrorString(
190 MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE));
191 EXPECT_EQ(flimflam::kErrorNeedHomeNetwork,
192 CellularCapabilityCDMA::GetActivationErrorString(
193 MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING));
194 EXPECT_EQ(flimflam::kErrorOtaspFailed,
195 CellularCapabilityCDMA::GetActivationErrorString(
196 MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT));
197 EXPECT_EQ(flimflam::kErrorOtaspFailed,
198 CellularCapabilityCDMA::GetActivationErrorString(
199 MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED));
200 EXPECT_EQ(flimflam::kErrorOtaspFailed,
201 CellularCapabilityCDMA::GetActivationErrorString(
202 MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED));
203 EXPECT_EQ("",
204 CellularCapabilityCDMA::GetActivationErrorString(
205 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR));
206 EXPECT_EQ(flimflam::kErrorActivationFailed,
207 CellularCapabilityCDMA::GetActivationErrorString(
208 MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL));
209 EXPECT_EQ(flimflam::kErrorActivationFailed,
210 CellularCapabilityCDMA::GetActivationErrorString(1234));
211}
212
Darin Petkovb72cf402011-11-22 14:51:39 +0100213TEST_F(CellularCapabilityCDMATest, IsRegisteredEVDO) {
214 EXPECT_FALSE(capability_->IsRegistered());
215 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
216 EXPECT_FALSE(capability_->IsRegistered());
217 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
218 EXPECT_TRUE(capability_->IsRegistered());
219 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
220 EXPECT_TRUE(capability_->IsRegistered());
221 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
222 EXPECT_TRUE(capability_->IsRegistered());
223}
224
225TEST_F(CellularCapabilityCDMATest, IsRegistered1x) {
226 EXPECT_FALSE(capability_->IsRegistered());
227 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
228 EXPECT_FALSE(capability_->IsRegistered());
229 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
230 EXPECT_TRUE(capability_->IsRegistered());
231 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
232 EXPECT_TRUE(capability_->IsRegistered());
233 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
234 EXPECT_TRUE(capability_->IsRegistered());
235}
236
Darin Petkov20c13ec2011-11-09 15:07:15 +0100237TEST_F(CellularCapabilityCDMATest, GetNetworkTechnologyString) {
Darin Petkov721ac932011-11-16 15:43:09 +0100238 EXPECT_EQ("", capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100239 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
240 EXPECT_EQ(flimflam::kNetworkTechnologyEvdo,
Darin Petkov721ac932011-11-16 15:43:09 +0100241 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100242 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
243 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
244 EXPECT_EQ(flimflam::kNetworkTechnology1Xrtt,
Darin Petkov721ac932011-11-16 15:43:09 +0100245 capability_->GetNetworkTechnologyString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100246}
247
248TEST_F(CellularCapabilityCDMATest, GetRoamingStateString) {
249 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100250 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100251 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
252 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100253 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100254 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100255 EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100256 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
257 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100258 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100259 SetRegistrationStateEVDO(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
260 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED);
261 EXPECT_EQ(flimflam::kRoamingStateUnknown,
Darin Petkov721ac932011-11-16 15:43:09 +0100262 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100263 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_HOME);
Darin Petkov721ac932011-11-16 15:43:09 +0100264 EXPECT_EQ(flimflam::kRoamingStateHome, capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100265 SetRegistrationState1x(MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING);
266 EXPECT_EQ(flimflam::kRoamingStateRoaming,
Darin Petkov721ac932011-11-16 15:43:09 +0100267 capability_->GetRoamingStateString());
Darin Petkov20c13ec2011-11-09 15:07:15 +0100268}
269
Darin Petkov3e509242011-11-10 14:46:44 +0100270TEST_F(CellularCapabilityCDMATest, GetSignalQuality) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500271 EXPECT_CALL(*proxy_,
272 GetSignalQuality(NULL, _, CellularCapability::kTimeoutDefault))
273 .WillOnce(Invoke(this,
274 &CellularCapabilityCDMATest::InvokeGetSignalQuality));
Darin Petkov3e509242011-11-10 14:46:44 +0100275 SetProxy();
276 SetService();
277 EXPECT_EQ(0, cellular_->service()->strength());
Darin Petkov721ac932011-11-16 15:43:09 +0100278 capability_->GetSignalQuality();
Darin Petkov3e509242011-11-10 14:46:44 +0100279 EXPECT_EQ(kStrength, cellular_->service()->strength());
280}
281
Darin Petkov184c54e2011-11-15 12:44:39 +0100282TEST_F(CellularCapabilityCDMATest, GetRegistrationState) {
283 EXPECT_FALSE(cellular_->service().get());
284 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
Darin Petkov721ac932011-11-16 15:43:09 +0100285 capability_->registration_state_1x());
Darin Petkov184c54e2011-11-15 12:44:39 +0100286 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
Darin Petkov721ac932011-11-16 15:43:09 +0100287 capability_->registration_state_evdo());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500288 EXPECT_CALL(*proxy_,
289 GetRegistrationState(NULL, _,
290 CellularCapability::kTimeoutDefault))
291 .WillOnce(Invoke(
292 this,
293 &CellularCapabilityCDMATest::InvokeGetRegistrationState));
Darin Petkov184c54e2011-11-15 12:44:39 +0100294 SetProxy();
Eric Shienbrood9a245532012-03-07 14:20:39 -0500295 cellular_->state_ = Cellular::kStateEnabled;
Eric Shienbrood04e63582012-01-19 13:41:12 -0500296 EXPECT_CALL(manager_, RegisterService(_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500297 capability_->GetRegistrationState();
Darin Petkov184c54e2011-11-15 12:44:39 +0100298 dispatcher_.DispatchPendingEvents();
299 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
Darin Petkov721ac932011-11-16 15:43:09 +0100300 capability_->registration_state_1x());
Darin Petkov184c54e2011-11-15 12:44:39 +0100301 EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
Darin Petkov721ac932011-11-16 15:43:09 +0100302 capability_->registration_state_evdo());
Eric Shienbrood04e63582012-01-19 13:41:12 -0500303 EXPECT_TRUE(cellular_->service().get());
Darin Petkov184c54e2011-11-15 12:44:39 +0100304}
305
Darin Petkovac635a82012-01-10 16:51:58 +0100306TEST_F(CellularCapabilityCDMATest, CreateFriendlyServiceName) {
307 CellularCapabilityCDMA::friendly_service_name_id_ = 0;
308 EXPECT_EQ("CDMANetwork0", capability_->CreateFriendlyServiceName());
309 EXPECT_EQ("CDMANetwork1", capability_->CreateFriendlyServiceName());
310 static const char kTestCarrier[] = "A Carrier";
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500311 capability_->carrier_ = kTestCarrier;
Darin Petkovac635a82012-01-10 16:51:58 +0100312 EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
313}
314
Darin Petkovcb547732011-11-09 13:55:26 +0100315} // namespace shill