blob: 2719c187a188aab43a69bb0b6e3f73469a5dfa65 [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),
Darin Petkovc63dcf02012-05-24 11:51:43 +020047 manager_(&control_, &dispatcher_, &metrics_, NULL),
Arman Ugurayed8e6102012-11-29 14:47:20 -080048 dhcp_config_(new MockDHCPConfig(&control_,
49 kTestLinkName)),
Darin Petkovd1cd7972012-05-22 15:26:15 +020050 device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
51 kTestLinkName, kTestAddress, kTestInterfaceIndex,
52 kTestPath)) {}
Ben Chanc07362b2012-05-12 10:54:11 -070053
54 virtual ~WiMaxTest() {}
55
56 protected:
Darin Petkovb72b62e2012-05-15 16:55:36 +020057 class TestProxyFactory : public ProxyFactory {
58 public:
59 explicit TestProxyFactory(WiMaxTest *test) : test_(test) {}
60
61 virtual WiMaxDeviceProxyInterface *CreateWiMaxDeviceProxy(
62 const string &/*path*/) {
63 return test_->proxy_.release();
64 }
65
66 private:
67 WiMaxTest *test_;
68
69 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
70 };
71
Darin Petkov59f2d692012-06-07 15:57:46 +020072 class Target {
73 public:
74 virtual ~Target() {}
75
76 MOCK_METHOD1(EnabledStateChanged, void(const Error &error));
77 };
78
Darin Petkovb72b62e2012-05-15 16:55:36 +020079 virtual void SetUp() {
Darin Petkovd1cd7972012-05-22 15:26:15 +020080 device_->proxy_factory_ = &proxy_factory_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080081 device_->set_dhcp_provider(&dhcp_provider_);
Darin Petkovb72b62e2012-05-15 16:55:36 +020082 }
83
84 virtual void TearDown() {
Darin Petkovc63dcf02012-05-24 11:51:43 +020085 device_->SelectService(NULL);
86 device_->pending_service_ = NULL;
Darin Petkovd1cd7972012-05-22 15:26:15 +020087 device_->proxy_factory_ = NULL;
Darin Petkovb72b62e2012-05-15 16:55:36 +020088 }
89
90 scoped_ptr<MockWiMaxDeviceProxy> proxy_;
91 TestProxyFactory proxy_factory_;
Ben Chanc07362b2012-05-12 10:54:11 -070092 NiceMockControl control_;
93 EventDispatcher dispatcher_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020094 NiceMock<MockMetrics> metrics_;
Ben Chanc07362b2012-05-12 10:54:11 -070095 MockManager manager_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080096 MockDHCPProvider dhcp_provider_;
97 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkovd1cd7972012-05-22 15:26:15 +020098 WiMaxRefPtr device_;
Ben Chanc07362b2012-05-12 10:54:11 -070099};
100
Darin Petkovb72b62e2012-05-15 16:55:36 +0200101TEST_F(WiMaxTest, Constructor) {
Darin Petkovd1cd7972012-05-22 15:26:15 +0200102 EXPECT_EQ(kTestPath, device_->path());
103 EXPECT_FALSE(device_->scanning());
Darin Petkovb72b62e2012-05-15 16:55:36 +0200104}
105
Darin Petkovb72b62e2012-05-15 16:55:36 +0200106TEST_F(WiMaxTest, StartStop) {
Darin Petkovd1cd7972012-05-22 15:26:15 +0200107 EXPECT_FALSE(device_->proxy_.get());
Darin Petkov912f0de2012-05-16 14:12:14 +0200108 EXPECT_CALL(*proxy_, Enable(_, _, _));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700109 EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200110 EXPECT_CALL(*proxy_, set_status_changed_callback(_));
Darin Petkov912f0de2012-05-16 14:12:14 +0200111 EXPECT_CALL(*proxy_, Disable(_, _, _));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200112 device_->Start(NULL, EnabledStateChangedCallback());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200113 ASSERT_TRUE(device_->proxy_.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200114
Darin Petkov3a4100c2012-06-14 11:36:59 +0200115 scoped_refptr<MockWiMaxService> service(
116 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
117 device_->pending_service_ = service;
118 EXPECT_CALL(*service, SetState(Service::kStateIdle));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200119 device_->networks_.insert("path");
120 MockWiMaxProvider provider;
121 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
122 EXPECT_CALL(provider, OnNetworksChanged());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200123 device_->StartConnectTimeout();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200124 device_->Stop(NULL, EnabledStateChangedCallback());
125 EXPECT_TRUE(device_->networks_.empty());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200126 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
127 EXPECT_FALSE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200128}
129
Darin Petkovc63dcf02012-05-24 11:51:43 +0200130TEST_F(WiMaxTest, OnServiceStopped) {
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200131 scoped_refptr<NiceMock<MockWiMaxService> > service0(
132 new NiceMock<MockWiMaxService>(
133 &control_,
134 reinterpret_cast<EventDispatcher *>(NULL),
135 &metrics_,
136 &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200137 scoped_refptr<MockWiMaxService> service1(
138 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
139 device_->SelectService(service0);
140 device_->pending_service_ = service1;
Darin Petkovd1cd7972012-05-22 15:26:15 +0200141
Darin Petkovc63dcf02012-05-24 11:51:43 +0200142 device_->OnServiceStopped(NULL);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200143 EXPECT_TRUE(device_->selected_service());
144 EXPECT_TRUE(device_->pending_service_);
145
Darin Petkovc63dcf02012-05-24 11:51:43 +0200146 device_->OnServiceStopped(service0);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200147 EXPECT_FALSE(device_->selected_service());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200148 EXPECT_TRUE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200149
Darin Petkovc63dcf02012-05-24 11:51:43 +0200150 device_->OnServiceStopped(service1);
151 EXPECT_FALSE(device_->selected_service());
152 EXPECT_FALSE(device_->pending_service_);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200153}
154
Darin Petkov9893d9c2012-05-17 15:27:31 -0700155TEST_F(WiMaxTest, OnNetworksChanged) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200156 MockWiMaxProvider provider;
157 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
158 EXPECT_CALL(provider, OnNetworksChanged());
159 device_->networks_.insert("foo");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200160 RpcIdentifiers networks;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200161 networks.push_back("bar");
162 networks.push_back("zoo");
163 networks.push_back("bar");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200164 device_->OnNetworksChanged(networks);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200165 EXPECT_EQ(2, device_->networks_.size());
166 EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
167 EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700168}
169
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200170TEST_F(WiMaxTest, OnConnectComplete) {
171 scoped_refptr<MockWiMaxService> service(
172 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
173 device_->pending_service_ = service;
174 EXPECT_CALL(*service, SetState(_)).Times(0);
175 EXPECT_TRUE(device_->pending_service_);
176 EXPECT_CALL(*service, SetState(Service::kStateFailure));
177 device_->OnConnectComplete(Error(Error::kOperationFailed));
178 EXPECT_FALSE(device_->pending_service_);
179}
180
Darin Petkova3f9f772012-05-31 12:11:28 +0200181TEST_F(WiMaxTest, OnStatusChanged) {
182 scoped_refptr<MockWiMaxService> service(
183 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
184
Darin Petkov3a4100c2012-06-14 11:36:59 +0200185 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200186 device_->pending_service_ = service;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200187 EXPECT_CALL(*service, SetState(_)).Times(0);
188 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
189 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
190 EXPECT_TRUE(device_->pending_service_);
191 EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
192
193 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200194 EXPECT_CALL(*service, SetState(Service::kStateFailure));
195 EXPECT_CALL(*service, ClearPassphrase());
196 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
197 EXPECT_FALSE(device_->pending_service_);
198
Darin Petkov3a4100c2012-06-14 11:36:59 +0200199 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200200 device_->SelectService(service);
201 EXPECT_CALL(*service, SetState(Service::kStateFailure));
202 EXPECT_CALL(*service, SetState(Service::kStateIdle));
203 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
204 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
205 EXPECT_FALSE(device_->selected_service());
206
207 device_->pending_service_ = service;
208 device_->SelectService(service);
209 EXPECT_CALL(*service, SetState(_)).Times(0);
210 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
211 device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
212 EXPECT_TRUE(device_->pending_service_);
213 EXPECT_TRUE(device_->selected_service());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200214 EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200215
216 EXPECT_CALL(*service, SetState(Service::kStateIdle));
217 device_->SelectService(NULL);
218}
219
Arman Ugurayed8e6102012-11-29 14:47:20 -0800220TEST_F(WiMaxTest, UseNoArpGateway) {
221 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestLinkName, _, _, false))
222 .WillOnce(Return(dhcp_config_));
223 device_->AcquireIPConfig();
224}
225
Darin Petkovb96a4512012-06-04 11:02:49 +0200226TEST_F(WiMaxTest, DropService) {
227 scoped_refptr<NiceMock<MockWiMaxService> > service0(
228 new NiceMock<MockWiMaxService>(
229 &control_,
230 reinterpret_cast<EventDispatcher *>(NULL),
231 &metrics_,
232 &manager_));
233 scoped_refptr<MockWiMaxService> service1(
234 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
235 device_->SelectService(service0);
236 device_->pending_service_ = service1;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200237 device_->StartConnectTimeout();
Darin Petkovb96a4512012-06-04 11:02:49 +0200238
239 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
240 EXPECT_CALL(*service1, SetState(Service::kStateIdle));
241 device_->DropService(Service::kStateIdle);
242 EXPECT_FALSE(device_->selected_service());
243 EXPECT_FALSE(device_->pending_service_);
Darin Petkov3a4100c2012-06-14 11:36:59 +0200244 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
Darin Petkovb96a4512012-06-04 11:02:49 +0200245
246 // Expect no crash.
247 device_->DropService(Service::kStateFailure);
248}
249
250TEST_F(WiMaxTest, OnDeviceVanished) {
251 device_->proxy_.reset(proxy_.release());
252 scoped_refptr<MockWiMaxService> service(
253 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
254 device_->pending_service_ = service;
255 EXPECT_CALL(*service, SetState(Service::kStateIdle));
256 device_->OnDeviceVanished();
257 EXPECT_FALSE(device_->proxy_.get());
258 EXPECT_FALSE(device_->pending_service_);
259}
260
Darin Petkov59f2d692012-06-07 15:57:46 +0200261TEST_F(WiMaxTest, OnEnableComplete) {
262 MockWiMaxProvider provider;
263 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
264 RpcIdentifiers networks(1, "path");
265 EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
266 device_->proxy_.reset(proxy_.release());
267 EXPECT_CALL(provider, OnNetworksChanged());
268 Target target;
269 EXPECT_CALL(target, EnabledStateChanged(_));
270 EnabledStateChangedCallback callback(
271 Bind(&Target::EnabledStateChanged, Unretained(&target)));
272 Error error;
273 device_->OnEnableComplete(callback, error);
274 EXPECT_EQ(1, device_->networks_.size());
275 EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
276
277 EXPECT_TRUE(device_->proxy_.get());
278 error.Populate(Error::kOperationFailed);
279 EXPECT_CALL(target, EnabledStateChanged(_));
280 device_->OnEnableComplete(callback, error);
281 EXPECT_FALSE(device_->proxy_.get());
282}
283
Darin Petkov3a4100c2012-06-14 11:36:59 +0200284TEST_F(WiMaxTest, ConnectTimeout) {
285 EXPECT_EQ(&dispatcher_, device_->dispatcher());
286 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
287 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
288 EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
289 device_->connect_timeout_seconds_);
290 device_->connect_timeout_seconds_ = 0;
291 device_->StartConnectTimeout();
292 EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
293 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
294 device_->dispatcher_ = NULL;
295 device_->StartConnectTimeout(); // Expect no crash.
296 scoped_refptr<MockWiMaxService> service(
297 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
298 device_->pending_service_ = service;
299 EXPECT_CALL(*service, SetState(Service::kStateFailure));
300 dispatcher_.DispatchPendingEvents();
301 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
302 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
303 EXPECT_FALSE(device_->pending_service_);
304}
305
306TEST_F(WiMaxTest, ConnectTo) {
307 static const char kPath[] = "/network/path";
308 scoped_refptr<MockWiMaxService> service(
309 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
310 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
311 device_->status_ = wimax_manager::kDeviceStatusScanning;
312 EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
313 EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _));
314 device_->proxy_.reset(proxy_.release());
315 Error error;
316 device_->ConnectTo(service, &error);
317 EXPECT_TRUE(error.IsSuccess());
318 EXPECT_EQ(service.get(), device_->pending_service_.get());
319 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
320 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
321
322 device_->ConnectTo(service, &error);
323 EXPECT_EQ(Error::kInProgress, error.type());
324
325 device_->pending_service_ = NULL;
326}
327
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200328TEST_F(WiMaxTest, IsIdle) {
329 EXPECT_TRUE(device_->IsIdle());
330 scoped_refptr<NiceMock<MockWiMaxService> > service(
331 new NiceMock<MockWiMaxService>(
332 &control_,
333 reinterpret_cast<EventDispatcher *>(NULL),
334 &metrics_,
335 &manager_));
336 device_->pending_service_ = service;
337 EXPECT_FALSE(device_->IsIdle());
338 device_->pending_service_ = NULL;
339 device_->SelectService(service);
340 EXPECT_FALSE(device_->IsIdle());
341}
342
Ben Chanc07362b2012-05-12 10:54:11 -0700343} // namespace shill