blob: e01556a97b1fe83b114f5848cc0a740f14ad8f6e [file] [log] [blame]
Darin Petkovac635a82012-01-10 16:51:58 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovb72cf402011-11-22 14:51:39 +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_service.h"
6
7#include <chromeos/dbus/service_constants.h>
8#include <gtest/gtest.h>
9
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050010#include "shill/cellular_capability.h"
Ben Chan3ecdf822012-08-06 12:29:23 -070011#include "shill/cellular_capability_cdma.h"
Darin Petkovb72cf402011-11-22 14:51:39 +010012#include "shill/mock_adaptors.h"
Ben Chan96580442012-09-19 16:19:39 -070013#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080014#include "shill/mock_metrics.h"
Eric Shienbroodc7073302012-04-03 14:41:44 -040015#include "shill/mock_profile.h"
Ben Chan19f83972012-10-03 23:25:56 -070016#include "shill/mock_store.h"
Ben Chan3ecdf822012-08-06 12:29:23 -070017#include "shill/nice_mock_control.h"
18#include "shill/proxy_factory.h"
Darin Petkovb72cf402011-11-22 14:51:39 +010019
Darin Petkov31332412012-01-28 01:50:02 +010020using std::string;
Darin Petkov9cb02682012-01-28 00:17:38 +010021using testing::_;
Eric Shienbroodc7073302012-04-03 14:41:44 -040022using testing::InSequence;
Darin Petkovb72cf402011-11-22 14:51:39 +010023using testing::NiceMock;
Ben Chan96580442012-09-19 16:19:39 -070024using testing::Return;
Darin Petkovb72cf402011-11-22 14:51:39 +010025
26namespace shill {
27
28class CellularServiceTest : public testing::Test {
29 public:
30 CellularServiceTest()
Ben Chan96580442012-09-19 16:19:39 -070031 : manager_(&control_, &dispatcher_, &metrics_, NULL),
32 device_(new Cellular(&control_,
Darin Petkovac635a82012-01-10 16:51:58 +010033 NULL,
Thieu Le3426c8f2012-01-11 17:35:11 -080034 &metrics_,
Ben Chan96580442012-09-19 16:19:39 -070035 &manager_,
Darin Petkovac635a82012-01-10 16:51:58 +010036 "usb0",
Darin Petkov31332412012-01-28 01:50:02 +010037 kAddress,
Darin Petkovac635a82012-01-10 16:51:58 +010038 3,
Ben Chan3ecdf822012-08-06 12:29:23 -070039 Cellular::kTypeCDMA,
Darin Petkovac635a82012-01-10 16:51:58 +010040 "",
41 "",
Jason Glasgowa585fc32012-06-06 11:04:09 -040042 "",
Ben Chan3ecdf822012-08-06 12:29:23 -070043 NULL,
Ben Chan62028b22012-11-05 11:20:02 -080044 NULL,
Ben Chan3ecdf822012-08-06 12:29:23 -070045 ProxyFactory::GetInstance())),
Ben Chan96580442012-09-19 16:19:39 -070046 service_(new CellularService(&control_, NULL, &metrics_, &manager_,
Thieu Le3426c8f2012-01-11 17:35:11 -080047 device_)),
Darin Petkovb72cf402011-11-22 14:51:39 +010048 adaptor_(NULL) {}
49
50 virtual ~CellularServiceTest() {
51 adaptor_ = NULL;
52 }
53
54 virtual void SetUp() {
55 adaptor_ =
56 dynamic_cast<NiceMock<ServiceMockAdaptor> *>(service_->adaptor());
57 }
58
Ben Chan3ecdf822012-08-06 12:29:23 -070059 CellularCapabilityCDMA *GetCapabilityCDMA() {
60 return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get());
Jason Glasgow82f9ab32012-04-04 14:27:19 -040061 }
62
Darin Petkovb72cf402011-11-22 14:51:39 +010063 protected:
Darin Petkov31332412012-01-28 01:50:02 +010064 static const char kAddress[];
65
Darin Petkovb72cf402011-11-22 14:51:39 +010066 NiceMockControl control_;
Ben Chan96580442012-09-19 16:19:39 -070067 EventDispatcher dispatcher_;
Thieu Le3426c8f2012-01-11 17:35:11 -080068 MockMetrics metrics_;
Ben Chan96580442012-09-19 16:19:39 -070069 MockManager manager_;
Darin Petkovac635a82012-01-10 16:51:58 +010070 CellularRefPtr device_;
Darin Petkovb72cf402011-11-22 14:51:39 +010071 CellularServiceRefPtr service_;
72 NiceMock<ServiceMockAdaptor> *adaptor_; // Owned by |service_|.
73};
74
Darin Petkov31332412012-01-28 01:50:02 +010075const char CellularServiceTest::kAddress[] = "000102030405";
76
Thieu Le9fdf1372012-05-14 15:20:48 -070077TEST_F(CellularServiceTest, Constructor) {
78 EXPECT_TRUE(service_->connectable());
79}
80
Ben Chan96580442012-09-19 16:19:39 -070081TEST_F(CellularServiceTest, SetActivationState) {
82 {
83 InSequence call_sequence;
84 EXPECT_CALL(*adaptor_, EmitStringChanged(
85 flimflam::kActivationStateProperty,
86 flimflam::kActivationStateNotActivated));
87 EXPECT_CALL(*adaptor_, EmitBoolChanged(
88 flimflam::kConnectableProperty, false));
89 EXPECT_CALL(*adaptor_, EmitStringChanged(
90 flimflam::kActivationStateProperty,
91 flimflam::kActivationStateActivating));
92 EXPECT_CALL(*adaptor_, EmitBoolChanged(
93 flimflam::kConnectableProperty, true));
94 EXPECT_CALL(*adaptor_, EmitStringChanged(
95 flimflam::kActivationStateProperty,
96 flimflam::kActivationStatePartiallyActivated));
97 EXPECT_CALL(*adaptor_, EmitStringChanged(
98 flimflam::kActivationStateProperty,
99 flimflam::kActivationStateActivated));
100 EXPECT_CALL(*adaptor_, EmitStringChanged(
101 flimflam::kActivationStateProperty,
102 flimflam::kActivationStateNotActivated));
103 EXPECT_CALL(*adaptor_, EmitBoolChanged(
104 flimflam::kConnectableProperty, false));
105 }
106 EXPECT_CALL(manager_, HasService(_)).WillRepeatedly(Return(false));
107
108 EXPECT_TRUE(service_->activation_state().empty());
109 EXPECT_TRUE(service_->connectable());
110
111 service_->SetActivationState(flimflam::kActivationStateNotActivated);
112 EXPECT_EQ(flimflam::kActivationStateNotActivated,
113 service_->activation_state());
114 EXPECT_FALSE(service_->connectable());
115
116 service_->SetActivationState(flimflam::kActivationStateActivating);
117 EXPECT_EQ(flimflam::kActivationStateActivating, service_->activation_state());
118 EXPECT_TRUE(service_->connectable());
119
120 service_->SetActivationState(flimflam::kActivationStatePartiallyActivated);
121 EXPECT_EQ(flimflam::kActivationStatePartiallyActivated,
122 service_->activation_state());
123 EXPECT_TRUE(service_->connectable());
124
125 service_->SetActivationState(flimflam::kActivationStateActivated);
126 EXPECT_EQ(flimflam::kActivationStateActivated, service_->activation_state());
127 EXPECT_TRUE(service_->connectable());
128
129 service_->SetActivationState(flimflam::kActivationStateNotActivated);
130 EXPECT_EQ(flimflam::kActivationStateNotActivated,
131 service_->activation_state());
132 EXPECT_FALSE(service_->connectable());
133}
134
Darin Petkovb72cf402011-11-22 14:51:39 +0100135TEST_F(CellularServiceTest, SetNetworkTechnology) {
136 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kNetworkTechnologyProperty,
137 flimflam::kNetworkTechnologyUmts));
138 EXPECT_TRUE(service_->network_technology().empty());
139 service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
140 EXPECT_EQ(flimflam::kNetworkTechnologyUmts, service_->network_technology());
141 service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
142}
143
144TEST_F(CellularServiceTest, SetRoamingState) {
145 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kRoamingStateProperty,
146 flimflam::kRoamingStateHome));
147 EXPECT_TRUE(service_->roaming_state().empty());
148 service_->SetRoamingState(flimflam::kRoamingStateHome);
149 EXPECT_EQ(flimflam::kRoamingStateHome, service_->roaming_state());
150 service_->SetRoamingState(flimflam::kRoamingStateHome);
151}
152
Darin Petkovac635a82012-01-10 16:51:58 +0100153TEST_F(CellularServiceTest, FriendlyName) {
154 static const char kCarrier[] = "Cellular Carrier";
Ben Chan3ecdf822012-08-06 12:29:23 -0700155 GetCapabilityCDMA()->carrier_ = kCarrier;
Thieu Le3426c8f2012-01-11 17:35:11 -0800156 service_ = new CellularService(&control_, NULL, &metrics_, NULL, device_);
Darin Petkovac635a82012-01-10 16:51:58 +0100157 EXPECT_EQ(kCarrier, service_->friendly_name());
158}
159
Darin Petkov31332412012-01-28 01:50:02 +0100160TEST_F(CellularServiceTest, SetStorageIdentifier) {
Darin Petkovdd3e8662012-02-03 13:16:20 +0100161 EXPECT_EQ(string(flimflam::kTypeCellular) + "_" +
162 kAddress + "_" + service_->friendly_name(),
Darin Petkov31332412012-01-28 01:50:02 +0100163 service_->GetStorageIdentifier());
164 service_->SetStorageIdentifier("a b c");
165 EXPECT_EQ("a_b_c", service_->GetStorageIdentifier());
166}
167
Darin Petkov9cb02682012-01-28 00:17:38 +0100168TEST_F(CellularServiceTest, SetServingOperator) {
169 EXPECT_CALL(*adaptor_,
170 EmitStringmapChanged(flimflam::kServingOperatorProperty, _));
171 static const char kCode[] = "123456";
172 static const char kName[] = "Some Cellular Operator";
173 Cellular::Operator oper;
174 service_->SetServingOperator(oper);
175 oper.SetCode(kCode);
176 oper.SetName(kName);
177 service_->SetServingOperator(oper);
178 EXPECT_EQ(kCode, service_->serving_operator().GetCode());
179 EXPECT_EQ(kName, service_->serving_operator().GetName());
180 service_->SetServingOperator(oper);
181}
182
Darin Petkov381928f2012-02-02 23:00:12 +0100183TEST_F(CellularServiceTest, SetOLP) {
184 EXPECT_CALL(*adaptor_,
185 EmitStringmapChanged(flimflam::kPaymentPortalProperty, _));
186 static const char kURL[] = "payment.url";
187 static const char kMethod[] = "GET";
188 CellularService::OLP olp;
189 service_->SetOLP(olp);
190 olp.SetURL(kURL);
191 olp.SetMethod(kMethod);
192 service_->SetOLP(olp);
193 EXPECT_EQ(kURL, service_->olp().GetURL());
194 EXPECT_EQ(kMethod, service_->olp().GetMethod());
195 service_->SetOLP(olp);
196}
197
198TEST_F(CellularServiceTest, SetUsageURL) {
199 static const char kUsageURL[] = "usage.url";
200 EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kUsageURLProperty,
201 kUsageURL));
202 EXPECT_TRUE(service_->usage_url().empty());
203 service_->SetUsageURL(kUsageURL);
204 EXPECT_EQ(kUsageURL, service_->usage_url());
205 service_->SetUsageURL(kUsageURL);
206}
207
Eric Shienbroodc7073302012-04-03 14:41:44 -0400208TEST_F(CellularServiceTest, SetApn) {
209 static const char kApn[] = "TheAPN";
210 static const char kUsername[] = "commander.data";
211 ProfileRefPtr profile(new NiceMock<MockProfile>(
212 &control_, reinterpret_cast<Manager *>(NULL)));
213 service_->set_profile(profile);
214 Error error;
215 Stringmap testapn;
216 testapn[flimflam::kApnProperty] = kApn;
217 testapn[flimflam::kApnUsernameProperty] = kUsername;
218 {
219 InSequence seq;
220 EXPECT_CALL(*adaptor_,
221 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
222 _));
223 EXPECT_CALL(*adaptor_,
224 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
225 }
226 service_->SetApn(testapn, &error);
227 EXPECT_TRUE(error.IsSuccess());
228 Stringmap resultapn = service_->GetApn(&error);
229 EXPECT_TRUE(error.IsSuccess());
230 EXPECT_EQ(2, resultapn.size());
231 Stringmap::const_iterator it = resultapn.find(flimflam::kApnProperty);
232 EXPECT_TRUE(it != resultapn.end() && it->second == kApn);
233 it = resultapn.find(flimflam::kApnUsernameProperty);
234 EXPECT_TRUE(it != resultapn.end() && it->second == kUsername);
235 EXPECT_FALSE(service_->GetUserSpecifiedApn() == NULL);
236}
237
238TEST_F(CellularServiceTest, ClearApn) {
239 static const char kApn[] = "TheAPN";
240 static const char kUsername[] = "commander.data";
241 ProfileRefPtr profile(new NiceMock<MockProfile>(
242 &control_, reinterpret_cast<Manager *>(NULL)));
243 service_->set_profile(profile);
244 Error error;
245 // Set up an APN to make sure that it later gets cleared.
246 Stringmap testapn;
247 testapn[flimflam::kApnProperty] = kApn;
248 testapn[flimflam::kApnUsernameProperty] = kUsername;
249 {
250 InSequence seq;
251 EXPECT_CALL(*adaptor_,
252 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
253 _));
254 EXPECT_CALL(*adaptor_,
255 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
256 }
257 service_->SetApn(testapn, &error);
258 Stringmap resultapn = service_->GetApn(&error);
259 ASSERT_TRUE(error.IsSuccess());
260 ASSERT_EQ(2, service_->GetApn(&error).size());
261
262 Stringmap emptyapn;
263 EXPECT_CALL(*adaptor_,
264 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
265 _)).Times(0);
266 EXPECT_CALL(*adaptor_,
267 EmitStringmapChanged(flimflam::kCellularApnProperty, _)).Times(1);
268 service_->SetApn(emptyapn, &error);
269 EXPECT_TRUE(error.IsSuccess());
270 resultapn = service_->GetApn(&error);
271 EXPECT_TRUE(resultapn.empty());
272 EXPECT_TRUE(service_->GetUserSpecifiedApn() == NULL);
273}
274
275TEST_F(CellularServiceTest, LastGoodApn) {
276 static const char kApn[] = "TheAPN";
277 static const char kUsername[] = "commander.data";
278 ProfileRefPtr profile(new NiceMock<MockProfile>(
279 &control_, reinterpret_cast<Manager *>(NULL)));
280 service_->set_profile(profile);
281 Stringmap testapn;
282 testapn[flimflam::kApnProperty] = kApn;
283 testapn[flimflam::kApnUsernameProperty] = kUsername;
284 EXPECT_CALL(*adaptor_,
285 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty, _));
286 service_->SetLastGoodApn(testapn);
287 Stringmap *resultapn = service_->GetLastGoodApn();
288 EXPECT_FALSE(resultapn == NULL);
289 EXPECT_EQ(2, resultapn->size());
290 Stringmap::const_iterator it = resultapn->find(flimflam::kApnProperty);
291 EXPECT_TRUE(it != resultapn->end() && it->second == kApn);
292 it = resultapn->find(flimflam::kApnUsernameProperty);
293 EXPECT_TRUE(it != resultapn->end() && it->second == kUsername);
294 // Now set the user-specified APN, and check that LastGoodApn got
295 // cleared.
296 Stringmap userapn;
297 userapn[flimflam::kApnProperty] = kApn;
298 userapn[flimflam::kApnUsernameProperty] = kUsername;
299 {
300 InSequence seq;
301 EXPECT_CALL(*adaptor_,
302 EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
303 _));
304 EXPECT_CALL(*adaptor_,
305 EmitStringmapChanged(flimflam::kCellularApnProperty, _));
306 }
307 Error error;
308 service_->SetApn(userapn, &error);
309 EXPECT_TRUE(service_->GetLastGoodApn() == NULL);
310}
311
Ben Chan19f83972012-10-03 23:25:56 -0700312TEST_F(CellularServiceTest, IsAutoConnectable) {
313 const char *reason = NULL;
314
315 // Auto-connect should be suppressed if the device is not running.
316 device_->running_ = false;
317 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
318 EXPECT_STREQ(CellularService::kAutoConnDeviceDisabled, reason);
319
320 device_->running_ = true;
321
322 // The following test cases are copied from ServiceTest.IsAutoConnectable
323
324 service_->set_connectable(true);
325 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
326
327 // We should not auto-connect to a Service that a user has
328 // deliberately disconnected.
329 Error error;
330 service_->UserInitiatedDisconnect(&error);
331 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
332 EXPECT_STREQ(Service::kAutoConnExplicitDisconnect, reason);
333
334 // But if the Service is reloaded, it is eligible for auto-connect
335 // again.
336 NiceMock<MockStore> storage;
337 EXPECT_CALL(storage, ContainsGroup(service_->GetStorageIdentifier()))
338 .WillOnce(Return(true));
339 EXPECT_TRUE(service_->Load(&storage));
340 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
341
342 // A non-user initiated Disconnect doesn't change anything.
343 service_->Disconnect(&error);
344 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
345
346 // A resume also re-enables auto-connect.
347 service_->UserInitiatedDisconnect(&error);
348 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
349 service_->OnAfterResume();
350 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
351
352 service_->SetState(Service::kStateConnected);
353 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
354 EXPECT_STREQ(Service::kAutoConnConnected, reason);
355
356 service_->SetState(Service::kStateAssociating);
357 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
358 EXPECT_STREQ(Service::kAutoConnConnecting, reason);
359}
360
Darin Petkovb72cf402011-11-22 14:51:39 +0100361} // namespace shill