blob: 9184a9de2f53a291faabf8f0aace940f3ee417fe [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.h"
6
Darin Petkovd1cd7972012-05-22 15:26:15 +02007#include <string>
Darin Petkovd1cd7972012-05-22 15:26:15 +02008
Darin Petkov9893d9c2012-05-17 15:27:31 -07009#include <base/stringprintf.h>
Darin Petkov59f2d692012-06-07 15:57:46 +020010#include <gmock/gmock.h>
Ben Chanc07362b2012-05-12 10:54:11 -070011#include <gtest/gtest.h>
12
13#include "shill/event_dispatcher.h"
Arman Ugurayed8e6102012-11-29 14:47:20 -080014#include "shill/mock_dhcp_config.h"
15#include "shill/mock_dhcp_provider.h"
Ben Chanc07362b2012-05-12 10:54:11 -070016#include "shill/mock_manager.h"
17#include "shill/mock_metrics.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020018#include "shill/mock_wimax_device_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020019#include "shill/mock_wimax_provider.h"
Darin Petkov9893d9c2012-05-17 15:27:31 -070020#include "shill/mock_wimax_service.h"
Ben Chanc07362b2012-05-12 10:54:11 -070021#include "shill/nice_mock_control.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020022#include "shill/proxy_factory.h"
23
Darin Petkov59f2d692012-06-07 15:57:46 +020024using base::Bind;
25using base::Unretained;
Darin Petkovb72b62e2012-05-15 16:55:36 +020026using std::string;
Darin Petkov912f0de2012-05-16 14:12:14 +020027using testing::_;
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020028using testing::NiceMock;
Darin Petkov9893d9c2012-05-17 15:27:31 -070029using testing::Return;
Ben Chanc07362b2012-05-12 10:54:11 -070030
31namespace shill {
32
33namespace {
34
35const char kTestLinkName[] = "wm0";
Ben Chan4e64d2d2012-05-16 00:02:25 -070036const char kTestAddress[] = "01:23:45:67:89:ab";
Ben Chanc07362b2012-05-12 10:54:11 -070037const int kTestInterfaceIndex = 5;
Darin Petkovb72b62e2012-05-15 16:55:36 +020038const char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
Ben Chanc07362b2012-05-12 10:54:11 -070039
40} // namespace
41
42class WiMaxTest : public testing::Test {
43 public:
44 WiMaxTest()
Darin Petkovb72b62e2012-05-15 16:55:36 +020045 : proxy_(new MockWiMaxDeviceProxy()),
46 proxy_factory_(this),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080047 metrics_(&dispatcher_),
Darin Petkovc63dcf02012-05-24 11:51:43 +020048 manager_(&control_, &dispatcher_, &metrics_, NULL),
Arman Ugurayed8e6102012-11-29 14:47:20 -080049 dhcp_config_(new MockDHCPConfig(&control_,
50 kTestLinkName)),
Darin Petkovd1cd7972012-05-22 15:26:15 +020051 device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
52 kTestLinkName, kTestAddress, kTestInterfaceIndex,
53 kTestPath)) {}
Ben Chanc07362b2012-05-12 10:54:11 -070054
55 virtual ~WiMaxTest() {}
56
57 protected:
Darin Petkovb72b62e2012-05-15 16:55:36 +020058 class TestProxyFactory : public ProxyFactory {
59 public:
60 explicit TestProxyFactory(WiMaxTest *test) : test_(test) {}
61
62 virtual WiMaxDeviceProxyInterface *CreateWiMaxDeviceProxy(
63 const string &/*path*/) {
64 return test_->proxy_.release();
65 }
66
67 private:
68 WiMaxTest *test_;
69
70 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
71 };
72
Darin Petkov59f2d692012-06-07 15:57:46 +020073 class Target {
74 public:
75 virtual ~Target() {}
76
77 MOCK_METHOD1(EnabledStateChanged, void(const Error &error));
78 };
79
Darin Petkovb72b62e2012-05-15 16:55:36 +020080 virtual void SetUp() {
Darin Petkovd1cd7972012-05-22 15:26:15 +020081 device_->proxy_factory_ = &proxy_factory_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080082 device_->set_dhcp_provider(&dhcp_provider_);
Darin Petkovb72b62e2012-05-15 16:55:36 +020083 }
84
85 virtual void TearDown() {
Darin Petkovc63dcf02012-05-24 11:51:43 +020086 device_->SelectService(NULL);
87 device_->pending_service_ = NULL;
Darin Petkovd1cd7972012-05-22 15:26:15 +020088 device_->proxy_factory_ = NULL;
Darin Petkovb72b62e2012-05-15 16:55:36 +020089 }
90
91 scoped_ptr<MockWiMaxDeviceProxy> proxy_;
92 TestProxyFactory proxy_factory_;
Ben Chanc07362b2012-05-12 10:54:11 -070093 NiceMockControl control_;
94 EventDispatcher dispatcher_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020095 NiceMock<MockMetrics> metrics_;
Ben Chanc07362b2012-05-12 10:54:11 -070096 MockManager manager_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080097 MockDHCPProvider dhcp_provider_;
98 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkovd1cd7972012-05-22 15:26:15 +020099 WiMaxRefPtr device_;
Ben Chanc07362b2012-05-12 10:54:11 -0700100};
101
Darin Petkovb72b62e2012-05-15 16:55:36 +0200102TEST_F(WiMaxTest, Constructor) {
Darin Petkovd1cd7972012-05-22 15:26:15 +0200103 EXPECT_EQ(kTestPath, device_->path());
104 EXPECT_FALSE(device_->scanning());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200105}
106
Darin Petkovb72b62e2012-05-15 16:55:36 +0200107TEST_F(WiMaxTest, StartStop) {
Darin Petkovd1cd7972012-05-22 15:26:15 +0200108 EXPECT_FALSE(device_->proxy_.get());
Darin Petkov912f0de2012-05-16 14:12:14 +0200109 EXPECT_CALL(*proxy_, Enable(_, _, _));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700110 EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200111 EXPECT_CALL(*proxy_, set_status_changed_callback(_));
Darin Petkov912f0de2012-05-16 14:12:14 +0200112 EXPECT_CALL(*proxy_, Disable(_, _, _));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200113 device_->Start(NULL, EnabledStateChangedCallback());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200114 ASSERT_TRUE(device_->proxy_.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200115
Darin Petkov3a4100c2012-06-14 11:36:59 +0200116 scoped_refptr<MockWiMaxService> service(
117 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
118 device_->pending_service_ = service;
119 EXPECT_CALL(*service, SetState(Service::kStateIdle));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200120 device_->networks_.insert("path");
121 MockWiMaxProvider provider;
122 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
123 EXPECT_CALL(provider, OnNetworksChanged());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200124 device_->StartConnectTimeout();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200125 device_->Stop(NULL, EnabledStateChangedCallback());
126 EXPECT_TRUE(device_->networks_.empty());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200127 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
128 EXPECT_FALSE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200129}
130
Darin Petkovc63dcf02012-05-24 11:51:43 +0200131TEST_F(WiMaxTest, OnServiceStopped) {
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200132 scoped_refptr<NiceMock<MockWiMaxService> > service0(
133 new NiceMock<MockWiMaxService>(
134 &control_,
135 reinterpret_cast<EventDispatcher *>(NULL),
136 &metrics_,
137 &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200138 scoped_refptr<MockWiMaxService> service1(
139 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
140 device_->SelectService(service0);
141 device_->pending_service_ = service1;
Darin Petkovd1cd7972012-05-22 15:26:15 +0200142
Darin Petkovc63dcf02012-05-24 11:51:43 +0200143 device_->OnServiceStopped(NULL);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200144 EXPECT_TRUE(device_->selected_service());
145 EXPECT_TRUE(device_->pending_service_);
146
Darin Petkovc63dcf02012-05-24 11:51:43 +0200147 device_->OnServiceStopped(service0);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200148 EXPECT_FALSE(device_->selected_service());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200149 EXPECT_TRUE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200150
Darin Petkovc63dcf02012-05-24 11:51:43 +0200151 device_->OnServiceStopped(service1);
152 EXPECT_FALSE(device_->selected_service());
153 EXPECT_FALSE(device_->pending_service_);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200154}
155
Darin Petkov9893d9c2012-05-17 15:27:31 -0700156TEST_F(WiMaxTest, OnNetworksChanged) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200157 MockWiMaxProvider provider;
158 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
159 EXPECT_CALL(provider, OnNetworksChanged());
160 device_->networks_.insert("foo");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200161 RpcIdentifiers networks;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200162 networks.push_back("bar");
163 networks.push_back("zoo");
164 networks.push_back("bar");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200165 device_->OnNetworksChanged(networks);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200166 EXPECT_EQ(2, device_->networks_.size());
167 EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
168 EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700169}
170
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200171TEST_F(WiMaxTest, OnConnectComplete) {
172 scoped_refptr<MockWiMaxService> service(
173 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
174 device_->pending_service_ = service;
175 EXPECT_CALL(*service, SetState(_)).Times(0);
176 EXPECT_TRUE(device_->pending_service_);
177 EXPECT_CALL(*service, SetState(Service::kStateFailure));
178 device_->OnConnectComplete(Error(Error::kOperationFailed));
179 EXPECT_FALSE(device_->pending_service_);
180}
181
Darin Petkova3f9f772012-05-31 12:11:28 +0200182TEST_F(WiMaxTest, OnStatusChanged) {
183 scoped_refptr<MockWiMaxService> service(
184 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
185
Darin Petkov3a4100c2012-06-14 11:36:59 +0200186 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200187 device_->pending_service_ = service;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200188 EXPECT_CALL(*service, SetState(_)).Times(0);
189 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
190 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
191 EXPECT_TRUE(device_->pending_service_);
192 EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
193
194 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200195 EXPECT_CALL(*service, SetState(Service::kStateFailure));
196 EXPECT_CALL(*service, ClearPassphrase());
197 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
198 EXPECT_FALSE(device_->pending_service_);
199
Darin Petkov3a4100c2012-06-14 11:36:59 +0200200 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200201 device_->SelectService(service);
202 EXPECT_CALL(*service, SetState(Service::kStateFailure));
203 EXPECT_CALL(*service, SetState(Service::kStateIdle));
204 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
205 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
206 EXPECT_FALSE(device_->selected_service());
207
208 device_->pending_service_ = service;
209 device_->SelectService(service);
210 EXPECT_CALL(*service, SetState(_)).Times(0);
211 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
212 device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
213 EXPECT_TRUE(device_->pending_service_);
214 EXPECT_TRUE(device_->selected_service());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200215 EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200216
217 EXPECT_CALL(*service, SetState(Service::kStateIdle));
218 device_->SelectService(NULL);
219}
220
Arman Ugurayed8e6102012-11-29 14:47:20 -0800221TEST_F(WiMaxTest, UseNoArpGateway) {
222 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestLinkName, _, _, false))
223 .WillOnce(Return(dhcp_config_));
224 device_->AcquireIPConfig();
225}
226
Darin Petkovb96a4512012-06-04 11:02:49 +0200227TEST_F(WiMaxTest, DropService) {
228 scoped_refptr<NiceMock<MockWiMaxService> > service0(
229 new NiceMock<MockWiMaxService>(
230 &control_,
231 reinterpret_cast<EventDispatcher *>(NULL),
232 &metrics_,
233 &manager_));
234 scoped_refptr<MockWiMaxService> service1(
235 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
236 device_->SelectService(service0);
237 device_->pending_service_ = service1;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200238 device_->StartConnectTimeout();
Darin Petkovb96a4512012-06-04 11:02:49 +0200239
240 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
241 EXPECT_CALL(*service1, SetState(Service::kStateIdle));
242 device_->DropService(Service::kStateIdle);
243 EXPECT_FALSE(device_->selected_service());
244 EXPECT_FALSE(device_->pending_service_);
Darin Petkov3a4100c2012-06-14 11:36:59 +0200245 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
Darin Petkovb96a4512012-06-04 11:02:49 +0200246
247 // Expect no crash.
248 device_->DropService(Service::kStateFailure);
249}
250
251TEST_F(WiMaxTest, OnDeviceVanished) {
252 device_->proxy_.reset(proxy_.release());
253 scoped_refptr<MockWiMaxService> service(
254 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
255 device_->pending_service_ = service;
256 EXPECT_CALL(*service, SetState(Service::kStateIdle));
257 device_->OnDeviceVanished();
258 EXPECT_FALSE(device_->proxy_.get());
259 EXPECT_FALSE(device_->pending_service_);
260}
261
Darin Petkov59f2d692012-06-07 15:57:46 +0200262TEST_F(WiMaxTest, OnEnableComplete) {
263 MockWiMaxProvider provider;
264 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
265 RpcIdentifiers networks(1, "path");
266 EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
267 device_->proxy_.reset(proxy_.release());
268 EXPECT_CALL(provider, OnNetworksChanged());
269 Target target;
270 EXPECT_CALL(target, EnabledStateChanged(_));
271 EnabledStateChangedCallback callback(
272 Bind(&Target::EnabledStateChanged, Unretained(&target)));
273 Error error;
274 device_->OnEnableComplete(callback, error);
275 EXPECT_EQ(1, device_->networks_.size());
276 EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
277
278 EXPECT_TRUE(device_->proxy_.get());
279 error.Populate(Error::kOperationFailed);
280 EXPECT_CALL(target, EnabledStateChanged(_));
281 device_->OnEnableComplete(callback, error);
282 EXPECT_FALSE(device_->proxy_.get());
283}
284
Darin Petkov3a4100c2012-06-14 11:36:59 +0200285TEST_F(WiMaxTest, ConnectTimeout) {
286 EXPECT_EQ(&dispatcher_, device_->dispatcher());
287 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
288 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
289 EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
290 device_->connect_timeout_seconds_);
291 device_->connect_timeout_seconds_ = 0;
292 device_->StartConnectTimeout();
293 EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
294 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
295 device_->dispatcher_ = NULL;
296 device_->StartConnectTimeout(); // Expect no crash.
297 scoped_refptr<MockWiMaxService> service(
298 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
299 device_->pending_service_ = service;
300 EXPECT_CALL(*service, SetState(Service::kStateFailure));
301 dispatcher_.DispatchPendingEvents();
302 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
303 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
304 EXPECT_FALSE(device_->pending_service_);
305}
306
307TEST_F(WiMaxTest, ConnectTo) {
308 static const char kPath[] = "/network/path";
309 scoped_refptr<MockWiMaxService> service(
310 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
311 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
312 device_->status_ = wimax_manager::kDeviceStatusScanning;
313 EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
314 EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _));
315 device_->proxy_.reset(proxy_.release());
316 Error error;
317 device_->ConnectTo(service, &error);
318 EXPECT_TRUE(error.IsSuccess());
319 EXPECT_EQ(service.get(), device_->pending_service_.get());
320 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
321 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
322
323 device_->ConnectTo(service, &error);
324 EXPECT_EQ(Error::kInProgress, error.type());
325
326 device_->pending_service_ = NULL;
327}
328
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200329TEST_F(WiMaxTest, IsIdle) {
330 EXPECT_TRUE(device_->IsIdle());
331 scoped_refptr<NiceMock<MockWiMaxService> > service(
332 new NiceMock<MockWiMaxService>(
333 &control_,
334 reinterpret_cast<EventDispatcher *>(NULL),
335 &metrics_,
336 &manager_));
337 device_->pending_service_ = service;
338 EXPECT_FALSE(device_->IsIdle());
339 device_->pending_service_ = NULL;
340 device_->SelectService(service);
341 EXPECT_FALSE(device_->IsIdle());
342}
343
Ben Chanc07362b2012-05-12 10:54:11 -0700344} // namespace shill