blob: 471b6e3fe8038b47d6311a08010e3a9abc8a0ac2 [file] [log] [blame]
Ben Chanc07362b2012-05-12 10:54:11 -07001// Copyright (c) 2012 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/wimax_service.h"
6
Darin Petkove4b27022012-05-16 13:28:50 +02007#include <base/string_util.h>
8#include <chromeos/dbus/service_constants.h>
Ben Chanc07362b2012-05-12 10:54:11 -07009#include <gtest/gtest.h>
10
11#include "shill/error.h"
12#include "shill/nice_mock_control.h"
13#include "shill/mock_adaptors.h"
Paul Stewartc43cbbe2013-04-11 06:29:30 -070014#include "shill/mock_eap_credentials.h"
Ben Chanc07362b2012-05-12 10:54:11 -070015#include "shill/mock_manager.h"
16#include "shill/mock_metrics.h"
Darin Petkovd1cd7972012-05-22 15:26:15 +020017#include "shill/mock_store.h"
Ben Chanc07362b2012-05-12 10:54:11 -070018#include "shill/mock_wimax.h"
Darin Petkov1e52a1b2012-05-21 10:35:56 +020019#include "shill/mock_wimax_network_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020020#include "shill/mock_wimax_provider.h"
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070021#include "shill/service_property_change_test.h"
Ben Chanc07362b2012-05-12 10:54:11 -070022
Darin Petkove4b27022012-05-16 13:28:50 +020023using std::string;
Ben Chanc07362b2012-05-12 10:54:11 -070024using testing::_;
Paul Stewartc43cbbe2013-04-11 06:29:30 -070025using testing::Mock;
Ben Chanc07362b2012-05-12 10:54:11 -070026using testing::NiceMock;
27using testing::Return;
Ben Chan4e5c1312012-05-18 18:45:38 -070028using wimax_manager::kEAPAnonymousIdentity;
29using wimax_manager::kEAPUserIdentity;
30using wimax_manager::kEAPUserPassword;
Ben Chanc07362b2012-05-12 10:54:11 -070031
32namespace shill {
33
34namespace {
35
36const char kTestLinkName[] = "wm0";
Darin Petkove4b27022012-05-16 13:28:50 +020037const char kTestAddress[] = "0123456789AB";
Ben Chanc07362b2012-05-12 10:54:11 -070038const int kTestInterfaceIndex = 5;
Darin Petkove4b27022012-05-16 13:28:50 +020039const char kTestPath[] = "/org/chromium/WiMaxManager/Device/wm7";
Darin Petkovd1cd7972012-05-22 15:26:15 +020040const char kTestName[] = "Test WiMAX Network";
41const char kTestNetworkId[] = "1234abcd";
Ben Chanc07362b2012-05-12 10:54:11 -070042
43} // namespace
44
45class WiMaxServiceTest : public testing::Test {
46 public:
47 WiMaxServiceTest()
Darin Petkov1e52a1b2012-05-21 10:35:56 +020048 : proxy_(new MockWiMaxNetworkProxy()),
49 manager_(&control_, NULL, NULL, NULL),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080050 metrics_(static_cast<EventDispatcher *>(NULL)),
Darin Petkovc63dcf02012-05-24 11:51:43 +020051 device_(new MockWiMax(&control_, NULL, &metrics_, &manager_,
52 kTestLinkName, kTestAddress, kTestInterfaceIndex,
53 kTestPath)),
Paul Stewartc43cbbe2013-04-11 06:29:30 -070054 service_(new WiMaxService(&control_, NULL, &metrics_, &manager_)),
55 eap_(new MockEapCredentials()) {
Darin Petkovd1cd7972012-05-22 15:26:15 +020056 service_->set_friendly_name(kTestName);
57 service_->set_network_id(kTestNetworkId);
58 service_->InitStorageIdentifier();
Paul Stewartc43cbbe2013-04-11 06:29:30 -070059 service_->eap_.reset(eap_); // Passes ownership.
Darin Petkovd1cd7972012-05-22 15:26:15 +020060 }
Ben Chanc07362b2012-05-12 10:54:11 -070061
62 virtual ~WiMaxServiceTest() {}
63
64 protected:
Darin Petkovc63dcf02012-05-24 11:51:43 +020065 virtual void TearDown() {
66 service_->device_ = NULL;
67 }
68
Darin Petkovb2ba39f2012-06-06 10:33:43 +020069 void ExpectUpdateService() {
70 EXPECT_CALL(manager_, HasService(_)).WillOnce(Return(true));
71 EXPECT_CALL(manager_, UpdateService(_));
72 }
73
Darin Petkov6b9b2e12012-07-10 15:51:42 +020074 void SetConnectable(bool connectable) {
75 service_->connectable_ = connectable;
76 }
77
mukesh agrawalcbfb34e2013-04-17 19:33:25 -070078 void SetDevice(WiMaxRefPtr device) {
79 service_->SetDevice(device);
80 }
81
82 ServiceMockAdaptor *GetAdaptor() {
83 return dynamic_cast<ServiceMockAdaptor *>(service_->adaptor());
84 }
85
Darin Petkov1e52a1b2012-05-21 10:35:56 +020086 scoped_ptr<MockWiMaxNetworkProxy> proxy_;
Ben Chanc07362b2012-05-12 10:54:11 -070087 NiceMockControl control_;
88 MockManager manager_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020089 NiceMock<MockMetrics> metrics_;
Darin Petkovc63dcf02012-05-24 11:51:43 +020090 scoped_refptr<MockWiMax> device_;
Ben Chanc07362b2012-05-12 10:54:11 -070091 WiMaxServiceRefPtr service_;
Paul Stewartc43cbbe2013-04-11 06:29:30 -070092 MockEapCredentials *eap_; // Owned by |service_|.
Ben Chanc07362b2012-05-12 10:54:11 -070093};
94
Ben Chan4e5c1312012-05-18 18:45:38 -070095TEST_F(WiMaxServiceTest, GetConnectParameters) {
Paul Stewartc43cbbe2013-04-11 06:29:30 -070096 KeyValueStore parameters;
97 EXPECT_CALL(*eap_, PopulateWiMaxProperties(&parameters));
98 service_->GetConnectParameters(&parameters);
Ben Chan4e5c1312012-05-18 18:45:38 -070099}
100
Darin Petkove4b27022012-05-16 13:28:50 +0200101TEST_F(WiMaxServiceTest, GetDeviceRpcId) {
102 Error error;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200103 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
mukesh agrawald4dc0832013-03-25 14:38:26 -0700104 EXPECT_EQ(Error::kNotFound, error.type());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200105 service_->device_ = device_;
106 error.Reset();
Darin Petkove4b27022012-05-16 13:28:50 +0200107 EXPECT_EQ(DeviceMockAdaptor::kRpcId, service_->GetDeviceRpcId(&error));
108 EXPECT_TRUE(error.IsSuccess());
109}
110
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200111TEST_F(WiMaxServiceTest, OnSignalStrengthChanged) {
112 const int kStrength = 55;
113 service_->OnSignalStrengthChanged(kStrength);
114 EXPECT_EQ(kStrength, service_->strength());
115}
116
Darin Petkovd1cd7972012-05-22 15:26:15 +0200117TEST_F(WiMaxServiceTest, StartStop) {
118 static const char kName[] = "My WiMAX Network";
119 const uint32 kIdentifier = 0x1234abcd;
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200120 const int kStrength = 66;
Darin Petkova3f9f772012-05-31 12:11:28 +0200121 EXPECT_FALSE(service_->connectable());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200122 EXPECT_FALSE(service_->IsStarted());
Ben Chanf4647d42013-05-02 22:01:01 -0700123 EXPECT_FALSE(service_->IsVisible());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200124 EXPECT_EQ(0, service_->strength());
125 EXPECT_FALSE(service_->proxy_.get());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200126 EXPECT_CALL(*proxy_, Name(_)).WillOnce(Return(kName));
127 EXPECT_CALL(*proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
128 EXPECT_CALL(*proxy_, SignalStrength(_)).WillOnce(Return(kStrength));
129 EXPECT_CALL(*proxy_, set_signal_strength_changed_callback(_));
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200130 ExpectUpdateService();
Darin Petkova3f9f772012-05-31 12:11:28 +0200131 service_->need_passphrase_ = false;
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200132 EXPECT_TRUE(service_->Start(proxy_.release()));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200133 EXPECT_TRUE(service_->IsStarted());
Ben Chanf4647d42013-05-02 22:01:01 -0700134 EXPECT_TRUE(service_->IsVisible());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200135 EXPECT_EQ(kStrength, service_->strength());
136 EXPECT_EQ(kName, service_->network_name());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200137 EXPECT_EQ(kTestName, service_->friendly_name());
138 EXPECT_EQ(kTestNetworkId, service_->network_id());
Darin Petkova3f9f772012-05-31 12:11:28 +0200139 EXPECT_TRUE(service_->connectable());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200140 EXPECT_TRUE(service_->proxy_.get());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200141
142 service_->device_ = device_;
143 EXPECT_CALL(*device_, OnServiceStopped(_));
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200144 ExpectUpdateService();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200145 service_->Stop();
146 EXPECT_FALSE(service_->IsStarted());
Ben Chanf4647d42013-05-02 22:01:01 -0700147 EXPECT_FALSE(service_->IsVisible());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200148 EXPECT_EQ(0, service_->strength());
149 EXPECT_FALSE(service_->proxy_.get());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200150}
151
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700152TEST_F(WiMaxServiceTest, Connectable) {
153 EXPECT_TRUE(service_->Is8021x());
Darin Petkov8021e7f2012-05-21 12:15:00 +0200154 EXPECT_TRUE(service_->need_passphrase_);
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700155 EXPECT_FALSE(service_->connectable());
Darin Petkovc1e52732012-05-25 15:23:45 +0200156
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700157 EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
158 .WillOnce(Return(false))
159 .WillRepeatedly(Return(true));
160
161 // No WiMaxCredentials.
162 service_->OnEapCredentialsChanged();
Darin Petkov8021e7f2012-05-21 12:15:00 +0200163 EXPECT_TRUE(service_->need_passphrase_);
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700164 EXPECT_FALSE(service_->connectable());
Darin Petkovc1e52732012-05-25 15:23:45 +0200165
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700166 // Not started (no proxy).
167 service_->OnEapCredentialsChanged();
Darin Petkova3f9f772012-05-31 12:11:28 +0200168 EXPECT_FALSE(service_->need_passphrase_);
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700169 EXPECT_FALSE(service_->connectable());
Darin Petkovc1e52732012-05-25 15:23:45 +0200170
171 // Connectable.
172 service_->proxy_.reset(proxy_.release());
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200173 ExpectUpdateService();
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700174 service_->OnEapCredentialsChanged();
Darin Petkova3f9f772012-05-31 12:11:28 +0200175 EXPECT_FALSE(service_->need_passphrase_);
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700176 EXPECT_TRUE(service_->connectable());
Darin Petkova3f9f772012-05-31 12:11:28 +0200177
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700178 // Reset WimaxConnectable state.
179 Mock::VerifyAndClearExpectations(eap_);
180 EXPECT_CALL(*eap_, set_password(""));
181 EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
182 .WillRepeatedly(Return(false));
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200183 ExpectUpdateService();
Darin Petkova3f9f772012-05-31 12:11:28 +0200184 service_->ClearPassphrase();
185 EXPECT_TRUE(service_->need_passphrase_);
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700186 EXPECT_FALSE(service_->connectable());
Darin Petkov8021e7f2012-05-21 12:15:00 +0200187}
188
Darin Petkovd1cd7972012-05-22 15:26:15 +0200189TEST_F(WiMaxServiceTest, ConvertIdentifierToNetworkId) {
190 EXPECT_EQ("00000000", WiMaxService::ConvertIdentifierToNetworkId(0));
191 EXPECT_EQ("abcd1234", WiMaxService::ConvertIdentifierToNetworkId(0xabcd1234));
192 EXPECT_EQ("ffffffff", WiMaxService::ConvertIdentifierToNetworkId(0xffffffff));
193}
194
195TEST_F(WiMaxServiceTest, StorageIdentifier) {
196 static const char kStorageId[] = "wimax_test_wimax_network_1234abcd";
197 EXPECT_EQ(kStorageId, service_->GetStorageIdentifier());
198 EXPECT_EQ(kStorageId,
199 WiMaxService::CreateStorageIdentifier(kTestNetworkId, kTestName));
200}
201
202TEST_F(WiMaxServiceTest, Save) {
203 NiceMock<MockStore> storage;
204 string storage_id = service_->GetStorageIdentifier();
205 EXPECT_CALL(storage, SetString(storage_id, _, _))
206 .WillRepeatedly(Return(true));
207 EXPECT_CALL(storage, DeleteKey(storage_id, _)).WillRepeatedly(Return(true));
208 EXPECT_CALL(storage, SetString(storage_id,
209 WiMaxService::kStorageNetworkId,
210 kTestNetworkId));
211 EXPECT_TRUE(service_->Save(&storage));
212}
213
Darin Petkovc63dcf02012-05-24 11:51:43 +0200214TEST_F(WiMaxServiceTest, Connect) {
Darin Petkova3f9f772012-05-31 12:11:28 +0200215 // Connect but not connectable.
216 Error error;
217 EXPECT_FALSE(service_->connectable());
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700218 service_->Connect(&error, "in test");
Darin Petkova3f9f772012-05-31 12:11:28 +0200219 EXPECT_EQ(Error::kOperationFailed, error.type());
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200220 SetConnectable(true);
Darin Petkova3f9f772012-05-31 12:11:28 +0200221
222 // No carrier device available.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200223 MockWiMaxProvider provider;
224 scoped_refptr<MockWiMax> null_device;
225 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
226 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(null_device));
Darin Petkova3f9f772012-05-31 12:11:28 +0200227 error.Reset();
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700228 service_->Connect(&error, "in test");
Darin Petkovc63dcf02012-05-24 11:51:43 +0200229 EXPECT_EQ(Error::kNoCarrier, error.type());
230
Darin Petkova3f9f772012-05-31 12:11:28 +0200231 // Successful connect.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200232 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
233 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
234 EXPECT_CALL(*device_, ConnectTo(_, _));
235 error.Reset();
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700236 service_->Connect(&error, "in test");
Darin Petkovc63dcf02012-05-24 11:51:43 +0200237 EXPECT_TRUE(error.IsSuccess());
238
Darin Petkova3f9f772012-05-31 12:11:28 +0200239 // Connect while already connected.
Ben Chanb5310a12012-06-15 13:53:29 -0700240 // TODO(benchan): Check for error if we populate error again after changing
241 // the way that Chrome handles Error::kAlreadyConnected situation.
mukesh agrawaldc7b8442012-09-27 13:48:14 -0700242 service_->Connect(&error, "in test");
Darin Petkovc63dcf02012-05-24 11:51:43 +0200243
Darin Petkova3f9f772012-05-31 12:11:28 +0200244 // Successful disconnect.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200245 EXPECT_CALL(*device_, DisconnectFrom(_, _));
Ben Chana289f662013-05-03 15:12:01 -0700246 EXPECT_CALL(*eap_, set_password(""));
247 EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
248 .WillRepeatedly(Return(false));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200249 error.Reset();
Darin Petkov3a4100c2012-06-14 11:36:59 +0200250 ExpectUpdateService();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200251 service_->Disconnect(&error);
252 EXPECT_TRUE(error.IsSuccess());
253
Ben Chana289f662013-05-03 15:12:01 -0700254 // Verify that the EAP passphrase is cleared after the service is explicitly
255 // disconnected.
256 // TODO(benchan): Remove this check once WiMaxService no longer uses this
257 // workaroud to prompt the user for EAP credentials.
258 EXPECT_TRUE(service_->need_passphrase_);
259 EXPECT_FALSE(service_->connectable());
260
Darin Petkova3f9f772012-05-31 12:11:28 +0200261 // Disconnect while not connected.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200262 service_->Disconnect(&error);
263 EXPECT_EQ(Error::kNotConnected, error.type());
264}
265
Darin Petkovc1e52732012-05-25 15:23:45 +0200266TEST_F(WiMaxServiceTest, Unload) {
267 MockWiMaxProvider provider;
268 EXPECT_CALL(manager_, wimax_provider())
269 .Times(2)
270 .WillRepeatedly(Return(&provider));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700271 EXPECT_CALL(*eap_, Reset());
272 EXPECT_CALL(*eap_, set_password(""));
273 EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
274 .WillRepeatedly(Return(false));
Darin Petkovc1e52732012-05-25 15:23:45 +0200275 EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(false));
276 EXPECT_FALSE(service_->Unload());
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700277 Mock::VerifyAndClearExpectations(eap_);
278
279 EXPECT_CALL(*eap_, Reset());
280 EXPECT_CALL(*eap_, set_password(""));
281 EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
282 .WillRepeatedly(Return(false));
Darin Petkovc1e52732012-05-25 15:23:45 +0200283 EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(true));
284 EXPECT_TRUE(service_->Unload());
Darin Petkovc1e52732012-05-25 15:23:45 +0200285}
286
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200287TEST_F(WiMaxServiceTest, SetState) {
288 service_->device_ = device_;
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200289 EXPECT_EQ(Service::kStateIdle, service_->state());
290
291 EXPECT_CALL(manager_, UpdateService(_));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700292 service_->SetState(Service::kStateAssociating);
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200293 EXPECT_EQ(Service::kStateAssociating, service_->state());
294 EXPECT_TRUE(service_->device_);
295
296 EXPECT_CALL(manager_, UpdateService(_));
Paul Stewartc43cbbe2013-04-11 06:29:30 -0700297 service_->SetState(Service::kStateFailure);
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200298 EXPECT_EQ(Service::kStateFailure, service_->state());
299 EXPECT_FALSE(service_->device_);
300}
301
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200302TEST_F(WiMaxServiceTest, IsAutoConnectable) {
303 EXPECT_FALSE(service_->connectable());
304 const char *reason = "";
305
306 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
307
308 MockWiMaxProvider provider;
309 EXPECT_CALL(manager_, wimax_provider())
310 .Times(2)
311 .WillRepeatedly(Return(&provider));
312
313 SetConnectable(true);
314 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
315 EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(false));
316 reason = "";
317 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
318 EXPECT_EQ(WiMaxService::kAutoConnBusy, reason);
319
320 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
321 EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(true));
322 reason = "";
323 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
324 EXPECT_STREQ("", reason);
325}
326
mukesh agrawalcbfb34e2013-04-17 19:33:25 -0700327TEST_F(WiMaxServiceTest, PropertyChanges) {
328 ServiceMockAdaptor *adaptor = GetAdaptor();
329 TestCommonPropertyChanges(service_, adaptor);
330 TestAutoConnectPropertyChange(service_, adaptor);
331
332 EXPECT_CALL(*adaptor,
333 EmitRpcIdentifierChanged(flimflam::kDeviceProperty, _));
334 SetDevice(device_);
335 Mock::VerifyAndClearExpectations(adaptor);
336
337 EXPECT_CALL(*adaptor,
338 EmitRpcIdentifierChanged(flimflam::kDeviceProperty, _));
339 SetDevice(NULL);
340 Mock::VerifyAndClearExpectations(adaptor);
341}
342
mukesh agrawalbebf1b82013-04-23 15:06:33 -0700343// Custom property setters should return false, and make no changes, if
344// the new value is the same as the old value.
345TEST_F(WiMaxServiceTest, CustomSetterNoopChange) {
346 TestCustomSetterNoopChange(service_, &manager_);
347}
348
Ben Chanc07362b2012-05-12 10:54:11 -0700349} // namespace shill