blob: 43df3b21d676aff1932ccf54423e7732e23f1bce [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"
14#include "shill/mock_manager.h"
15#include "shill/mock_metrics.h"
Darin Petkovd1cd7972012-05-22 15:26:15 +020016#include "shill/mock_store.h"
Ben Chanc07362b2012-05-12 10:54:11 -070017#include "shill/mock_wimax.h"
Darin Petkov1e52a1b2012-05-21 10:35:56 +020018#include "shill/mock_wimax_network_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020019#include "shill/mock_wimax_provider.h"
Ben Chanc07362b2012-05-12 10:54:11 -070020
Darin Petkove4b27022012-05-16 13:28:50 +020021using std::string;
Ben Chanc07362b2012-05-12 10:54:11 -070022using testing::_;
23using testing::NiceMock;
24using testing::Return;
Ben Chan4e5c1312012-05-18 18:45:38 -070025using wimax_manager::kEAPAnonymousIdentity;
26using wimax_manager::kEAPUserIdentity;
27using wimax_manager::kEAPUserPassword;
Ben Chanc07362b2012-05-12 10:54:11 -070028
29namespace shill {
30
31namespace {
32
33const char kTestLinkName[] = "wm0";
Darin Petkove4b27022012-05-16 13:28:50 +020034const char kTestAddress[] = "0123456789AB";
Ben Chanc07362b2012-05-12 10:54:11 -070035const int kTestInterfaceIndex = 5;
Darin Petkove4b27022012-05-16 13:28:50 +020036const char kTestPath[] = "/org/chromium/WiMaxManager/Device/wm7";
Darin Petkovd1cd7972012-05-22 15:26:15 +020037const char kTestName[] = "Test WiMAX Network";
38const char kTestNetworkId[] = "1234abcd";
Ben Chanc07362b2012-05-12 10:54:11 -070039
40} // namespace
41
42class WiMaxServiceTest : public testing::Test {
43 public:
44 WiMaxServiceTest()
Darin Petkov1e52a1b2012-05-21 10:35:56 +020045 : proxy_(new MockWiMaxNetworkProxy()),
46 manager_(&control_, NULL, NULL, NULL),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080047 metrics_(static_cast<EventDispatcher *>(NULL)),
Darin Petkovc63dcf02012-05-24 11:51:43 +020048 device_(new MockWiMax(&control_, NULL, &metrics_, &manager_,
49 kTestLinkName, kTestAddress, kTestInterfaceIndex,
50 kTestPath)),
51 service_(new WiMaxService(&control_, NULL, &metrics_, &manager_)) {
Darin Petkovd1cd7972012-05-22 15:26:15 +020052 service_->set_friendly_name(kTestName);
53 service_->set_network_id(kTestNetworkId);
54 service_->InitStorageIdentifier();
55 }
Ben Chanc07362b2012-05-12 10:54:11 -070056
57 virtual ~WiMaxServiceTest() {}
58
59 protected:
Darin Petkovc63dcf02012-05-24 11:51:43 +020060 virtual void TearDown() {
61 service_->device_ = NULL;
62 }
63
Darin Petkovb2ba39f2012-06-06 10:33:43 +020064 void ExpectUpdateService() {
65 EXPECT_CALL(manager_, HasService(_)).WillOnce(Return(true));
66 EXPECT_CALL(manager_, UpdateService(_));
67 }
68
Darin Petkov6b9b2e12012-07-10 15:51:42 +020069 void SetConnectable(bool connectable) {
70 service_->connectable_ = connectable;
71 }
72
Darin Petkov1e52a1b2012-05-21 10:35:56 +020073 scoped_ptr<MockWiMaxNetworkProxy> proxy_;
Ben Chanc07362b2012-05-12 10:54:11 -070074 NiceMockControl control_;
75 MockManager manager_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020076 NiceMock<MockMetrics> metrics_;
Darin Petkovc63dcf02012-05-24 11:51:43 +020077 scoped_refptr<MockWiMax> device_;
Ben Chanc07362b2012-05-12 10:54:11 -070078 WiMaxServiceRefPtr service_;
79};
80
Ben Chan4e5c1312012-05-18 18:45:38 -070081TEST_F(WiMaxServiceTest, GetConnectParameters) {
82 {
Darin Petkov25665aa2012-05-21 14:08:12 +020083 KeyValueStore parameters;
Ben Chan4e5c1312012-05-18 18:45:38 -070084 service_->GetConnectParameters(&parameters);
85
Darin Petkov25665aa2012-05-21 14:08:12 +020086 EXPECT_FALSE(parameters.ContainsString(kEAPAnonymousIdentity));
87 EXPECT_FALSE(parameters.ContainsString(kEAPUserIdentity));
88 EXPECT_FALSE(parameters.ContainsString(kEAPUserPassword));
Ben Chan4e5c1312012-05-18 18:45:38 -070089 }
90 {
91 Service::EapCredentials eap;
92 eap.anonymous_identity = "TestAnonymousIdentity";
93 eap.identity = "TestUserIdentity";
94 eap.password = "TestPassword";
95 service_->set_eap(eap);
96
Darin Petkov25665aa2012-05-21 14:08:12 +020097 KeyValueStore parameters;
Ben Chan4e5c1312012-05-18 18:45:38 -070098 service_->GetConnectParameters(&parameters);
99
Ben Chan4e5c1312012-05-18 18:45:38 -0700100 EXPECT_EQ(eap.anonymous_identity,
Darin Petkov25665aa2012-05-21 14:08:12 +0200101 parameters.LookupString(kEAPAnonymousIdentity, ""));
102 EXPECT_EQ(eap.identity, parameters.LookupString(kEAPUserIdentity, ""));
103 EXPECT_EQ(eap.password, parameters.LookupString(kEAPUserPassword, ""));
Ben Chan4e5c1312012-05-18 18:45:38 -0700104 }
105}
106
Darin Petkove4b27022012-05-16 13:28:50 +0200107TEST_F(WiMaxServiceTest, GetDeviceRpcId) {
108 Error error;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200109 EXPECT_EQ("/", service_->GetDeviceRpcId(&error));
110 EXPECT_EQ(Error::kNotSupported, error.type());
111 service_->device_ = device_;
112 error.Reset();
Darin Petkove4b27022012-05-16 13:28:50 +0200113 EXPECT_EQ(DeviceMockAdaptor::kRpcId, service_->GetDeviceRpcId(&error));
114 EXPECT_TRUE(error.IsSuccess());
115}
116
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200117TEST_F(WiMaxServiceTest, OnSignalStrengthChanged) {
118 const int kStrength = 55;
119 service_->OnSignalStrengthChanged(kStrength);
120 EXPECT_EQ(kStrength, service_->strength());
121}
122
Darin Petkovd1cd7972012-05-22 15:26:15 +0200123TEST_F(WiMaxServiceTest, StartStop) {
124 static const char kName[] = "My WiMAX Network";
125 const uint32 kIdentifier = 0x1234abcd;
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200126 const int kStrength = 66;
Darin Petkova3f9f772012-05-31 12:11:28 +0200127 EXPECT_FALSE(service_->connectable());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200128 EXPECT_FALSE(service_->IsStarted());
129 EXPECT_EQ(0, service_->strength());
130 EXPECT_FALSE(service_->proxy_.get());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200131 EXPECT_CALL(*proxy_, Name(_)).WillOnce(Return(kName));
132 EXPECT_CALL(*proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
133 EXPECT_CALL(*proxy_, SignalStrength(_)).WillOnce(Return(kStrength));
134 EXPECT_CALL(*proxy_, set_signal_strength_changed_callback(_));
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200135 ExpectUpdateService();
Darin Petkova3f9f772012-05-31 12:11:28 +0200136 service_->need_passphrase_ = false;
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200137 EXPECT_TRUE(service_->Start(proxy_.release()));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200138 EXPECT_TRUE(service_->IsStarted());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200139 EXPECT_EQ(kStrength, service_->strength());
140 EXPECT_EQ(kName, service_->network_name());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200141 EXPECT_EQ(kTestName, service_->friendly_name());
142 EXPECT_EQ(kTestNetworkId, service_->network_id());
Darin Petkova3f9f772012-05-31 12:11:28 +0200143 EXPECT_TRUE(service_->connectable());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200144 EXPECT_TRUE(service_->proxy_.get());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200145
146 service_->device_ = device_;
147 EXPECT_CALL(*device_, OnServiceStopped(_));
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200148 ExpectUpdateService();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200149 service_->Stop();
150 EXPECT_FALSE(service_->IsStarted());
151 EXPECT_EQ(0, service_->strength());
152 EXPECT_FALSE(service_->proxy_.get());
Darin Petkov1e52a1b2012-05-21 10:35:56 +0200153}
154
Darin Petkov8021e7f2012-05-21 12:15:00 +0200155TEST_F(WiMaxServiceTest, SetEAP) {
156 ServiceRefPtr base_service = service_;
157 EXPECT_TRUE(base_service->Is8021x());
158 EXPECT_TRUE(service_->need_passphrase_);
159 EXPECT_FALSE(base_service->connectable());
Darin Petkovc1e52732012-05-25 15:23:45 +0200160
161 // No password.
Darin Petkov8021e7f2012-05-21 12:15:00 +0200162 Service::EapCredentials eap;
163 eap.identity = "TestIdentity";
164 base_service->set_eap(eap);
165 EXPECT_TRUE(service_->need_passphrase_);
166 EXPECT_FALSE(base_service->connectable());
Darin Petkovc1e52732012-05-25 15:23:45 +0200167
168 // Not started.
Darin Petkov8021e7f2012-05-21 12:15:00 +0200169 eap.password = "TestPassword";
170 base_service->set_eap(eap);
Darin Petkova3f9f772012-05-31 12:11:28 +0200171 EXPECT_FALSE(service_->need_passphrase_);
Darin Petkovc1e52732012-05-25 15:23:45 +0200172 EXPECT_FALSE(base_service->connectable());
173
174 // Connectable.
175 service_->proxy_.reset(proxy_.release());
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200176 ExpectUpdateService();
Darin Petkovc1e52732012-05-25 15:23:45 +0200177 base_service->set_eap(eap);
Darin Petkova3f9f772012-05-31 12:11:28 +0200178 EXPECT_FALSE(service_->need_passphrase_);
Darin Petkov8021e7f2012-05-21 12:15:00 +0200179 EXPECT_TRUE(base_service->connectable());
Darin Petkova3f9f772012-05-31 12:11:28 +0200180
181 // Reset password.
Darin Petkovb2ba39f2012-06-06 10:33:43 +0200182 ExpectUpdateService();
Darin Petkova3f9f772012-05-31 12:11:28 +0200183 service_->ClearPassphrase();
184 EXPECT_TRUE(service_->need_passphrase_);
185 EXPECT_FALSE(base_service->connectable());
186 EXPECT_TRUE(base_service->eap().password.empty());
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());
218 service_->Connect(&error);
219 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();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200228 service_->Connect(&error);
229 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();
236 service_->Connect(&error);
237 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.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200242 service_->Connect(&error);
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(_, _));
246 error.Reset();
Darin Petkov3a4100c2012-06-14 11:36:59 +0200247 ExpectUpdateService();
Darin Petkovc63dcf02012-05-24 11:51:43 +0200248 service_->Disconnect(&error);
249 EXPECT_TRUE(error.IsSuccess());
250
Darin Petkova3f9f772012-05-31 12:11:28 +0200251 // Disconnect while not connected.
Darin Petkovc63dcf02012-05-24 11:51:43 +0200252 service_->Disconnect(&error);
253 EXPECT_EQ(Error::kNotConnected, error.type());
254}
255
Darin Petkovc1e52732012-05-25 15:23:45 +0200256TEST_F(WiMaxServiceTest, Unload) {
257 MockWiMaxProvider provider;
258 EXPECT_CALL(manager_, wimax_provider())
259 .Times(2)
260 .WillRepeatedly(Return(&provider));
261 Service::EapCredentials eap;
262 eap.identity = "TestUserIdentity";
263 service_->set_eap(eap);
264 EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(false));
265 EXPECT_FALSE(service_->Unload());
266 EXPECT_TRUE(service_->eap().identity.empty());
267 eap.identity = "TestUserIdentity";
268 service_->set_eap(eap);
269 EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(true));
270 EXPECT_TRUE(service_->Unload());
271 EXPECT_TRUE(service_->eap().identity.empty());
272}
273
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200274TEST_F(WiMaxServiceTest, SetState) {
275 service_->device_ = device_;
276 ServiceRefPtr base_service = service_;
277 EXPECT_EQ(Service::kStateIdle, service_->state());
278
279 EXPECT_CALL(manager_, UpdateService(_));
280 base_service->SetState(Service::kStateAssociating);
281 EXPECT_EQ(Service::kStateAssociating, service_->state());
282 EXPECT_TRUE(service_->device_);
283
284 EXPECT_CALL(manager_, UpdateService(_));
285 base_service->SetState(Service::kStateFailure);
286 EXPECT_EQ(Service::kStateFailure, service_->state());
287 EXPECT_FALSE(service_->device_);
288}
289
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200290TEST_F(WiMaxServiceTest, IsAutoConnectable) {
291 EXPECT_FALSE(service_->connectable());
292 const char *reason = "";
293
294 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
295
296 MockWiMaxProvider provider;
297 EXPECT_CALL(manager_, wimax_provider())
298 .Times(2)
299 .WillRepeatedly(Return(&provider));
300
301 SetConnectable(true);
302 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
303 EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(false));
304 reason = "";
305 EXPECT_FALSE(service_->IsAutoConnectable(&reason));
306 EXPECT_EQ(WiMaxService::kAutoConnBusy, reason);
307
308 EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
309 EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(true));
310 reason = "";
311 EXPECT_TRUE(service_->IsAutoConnectable(&reason));
312 EXPECT_STREQ("", reason);
313}
314
Ben Chanc07362b2012-05-12 10:54:11 -0700315} // namespace shill