blob: c890592b9f94d416bd28dfc9b7d40ca03ce8843f [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"
Ben Chanc07362b2012-05-12 10:54:11 -070014#include "shill/mock_manager.h"
15#include "shill/mock_metrics.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020016#include "shill/mock_wimax_device_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020017#include "shill/mock_wimax_provider.h"
Darin Petkov9893d9c2012-05-17 15:27:31 -070018#include "shill/mock_wimax_service.h"
Ben Chanc07362b2012-05-12 10:54:11 -070019#include "shill/nice_mock_control.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020020#include "shill/proxy_factory.h"
21
Darin Petkov59f2d692012-06-07 15:57:46 +020022using base::Bind;
23using base::Unretained;
Darin Petkovb72b62e2012-05-15 16:55:36 +020024using std::string;
Darin Petkov912f0de2012-05-16 14:12:14 +020025using testing::_;
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020026using testing::NiceMock;
Darin Petkov9893d9c2012-05-17 15:27:31 -070027using testing::Return;
Ben Chanc07362b2012-05-12 10:54:11 -070028
29namespace shill {
30
31namespace {
32
33const char kTestLinkName[] = "wm0";
Ben Chan4e64d2d2012-05-16 00:02:25 -070034const char kTestAddress[] = "01:23:45:67:89:ab";
Ben Chanc07362b2012-05-12 10:54:11 -070035const int kTestInterfaceIndex = 5;
Darin Petkovb72b62e2012-05-15 16:55:36 +020036const char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
Ben Chanc07362b2012-05-12 10:54:11 -070037
38} // namespace
39
40class WiMaxTest : public testing::Test {
41 public:
42 WiMaxTest()
Darin Petkovb72b62e2012-05-15 16:55:36 +020043 : proxy_(new MockWiMaxDeviceProxy()),
44 proxy_factory_(this),
Darin Petkovc63dcf02012-05-24 11:51:43 +020045 manager_(&control_, &dispatcher_, &metrics_, NULL),
Darin Petkovd1cd7972012-05-22 15:26:15 +020046 device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
47 kTestLinkName, kTestAddress, kTestInterfaceIndex,
48 kTestPath)) {}
Ben Chanc07362b2012-05-12 10:54:11 -070049
50 virtual ~WiMaxTest() {}
51
52 protected:
Darin Petkovb72b62e2012-05-15 16:55:36 +020053 class TestProxyFactory : public ProxyFactory {
54 public:
55 explicit TestProxyFactory(WiMaxTest *test) : test_(test) {}
56
57 virtual WiMaxDeviceProxyInterface *CreateWiMaxDeviceProxy(
58 const string &/*path*/) {
59 return test_->proxy_.release();
60 }
61
62 private:
63 WiMaxTest *test_;
64
65 DISALLOW_COPY_AND_ASSIGN(TestProxyFactory);
66 };
67
Darin Petkov59f2d692012-06-07 15:57:46 +020068 class Target {
69 public:
70 virtual ~Target() {}
71
72 MOCK_METHOD1(EnabledStateChanged, void(const Error &error));
73 };
74
Darin Petkovb72b62e2012-05-15 16:55:36 +020075 virtual void SetUp() {
Darin Petkovd1cd7972012-05-22 15:26:15 +020076 device_->proxy_factory_ = &proxy_factory_;
Darin Petkovb72b62e2012-05-15 16:55:36 +020077 }
78
79 virtual void TearDown() {
Darin Petkovc63dcf02012-05-24 11:51:43 +020080 device_->SelectService(NULL);
81 device_->pending_service_ = NULL;
Darin Petkovd1cd7972012-05-22 15:26:15 +020082 device_->proxy_factory_ = NULL;
Darin Petkovb72b62e2012-05-15 16:55:36 +020083 }
84
85 scoped_ptr<MockWiMaxDeviceProxy> proxy_;
86 TestProxyFactory proxy_factory_;
Ben Chanc07362b2012-05-12 10:54:11 -070087 NiceMockControl control_;
88 EventDispatcher dispatcher_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020089 NiceMock<MockMetrics> metrics_;
Ben Chanc07362b2012-05-12 10:54:11 -070090 MockManager manager_;
Darin Petkovd1cd7972012-05-22 15:26:15 +020091 WiMaxRefPtr device_;
Ben Chanc07362b2012-05-12 10:54:11 -070092};
93
Darin Petkovb72b62e2012-05-15 16:55:36 +020094TEST_F(WiMaxTest, Constructor) {
Darin Petkovd1cd7972012-05-22 15:26:15 +020095 EXPECT_EQ(kTestPath, device_->path());
96 EXPECT_FALSE(device_->scanning());
Darin Petkovb72b62e2012-05-15 16:55:36 +020097}
98
Darin Petkovb72b62e2012-05-15 16:55:36 +020099TEST_F(WiMaxTest, StartStop) {
Darin Petkovd1cd7972012-05-22 15:26:15 +0200100 EXPECT_FALSE(device_->proxy_.get());
Darin Petkov912f0de2012-05-16 14:12:14 +0200101 EXPECT_CALL(*proxy_, Enable(_, _, _));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700102 EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200103 EXPECT_CALL(*proxy_, set_status_changed_callback(_));
Darin Petkov912f0de2012-05-16 14:12:14 +0200104 EXPECT_CALL(*proxy_, Disable(_, _, _));
Darin Petkovd1cd7972012-05-22 15:26:15 +0200105 device_->Start(NULL, EnabledStateChangedCallback());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200106 ASSERT_TRUE(device_->proxy_.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +0200107
Darin Petkov3a4100c2012-06-14 11:36:59 +0200108 scoped_refptr<MockWiMaxService> service(
109 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
110 device_->pending_service_ = service;
111 EXPECT_CALL(*service, SetState(Service::kStateIdle));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200112 device_->networks_.insert("path");
113 MockWiMaxProvider provider;
114 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
115 EXPECT_CALL(provider, OnNetworksChanged());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200116 device_->StartConnectTimeout();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200117 device_->Stop(NULL, EnabledStateChangedCallback());
118 EXPECT_TRUE(device_->networks_.empty());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200119 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
120 EXPECT_FALSE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200121}
122
Darin Petkovc63dcf02012-05-24 11:51:43 +0200123TEST_F(WiMaxTest, OnServiceStopped) {
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200124 scoped_refptr<NiceMock<MockWiMaxService> > service0(
125 new NiceMock<MockWiMaxService>(
126 &control_,
127 reinterpret_cast<EventDispatcher *>(NULL),
128 &metrics_,
129 &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200130 scoped_refptr<MockWiMaxService> service1(
131 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
132 device_->SelectService(service0);
133 device_->pending_service_ = service1;
Darin Petkovd1cd7972012-05-22 15:26:15 +0200134
Darin Petkovc63dcf02012-05-24 11:51:43 +0200135 device_->OnServiceStopped(NULL);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200136 EXPECT_TRUE(device_->selected_service());
137 EXPECT_TRUE(device_->pending_service_);
138
Darin Petkovc63dcf02012-05-24 11:51:43 +0200139 device_->OnServiceStopped(service0);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200140 EXPECT_FALSE(device_->selected_service());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200141 EXPECT_TRUE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200142
Darin Petkovc63dcf02012-05-24 11:51:43 +0200143 device_->OnServiceStopped(service1);
144 EXPECT_FALSE(device_->selected_service());
145 EXPECT_FALSE(device_->pending_service_);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200146}
147
Darin Petkov9893d9c2012-05-17 15:27:31 -0700148TEST_F(WiMaxTest, OnNetworksChanged) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200149 MockWiMaxProvider provider;
150 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
151 EXPECT_CALL(provider, OnNetworksChanged());
152 device_->networks_.insert("foo");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200153 RpcIdentifiers networks;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200154 networks.push_back("bar");
155 networks.push_back("zoo");
156 networks.push_back("bar");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200157 device_->OnNetworksChanged(networks);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200158 EXPECT_EQ(2, device_->networks_.size());
159 EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
160 EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700161}
162
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200163TEST_F(WiMaxTest, OnConnectComplete) {
164 scoped_refptr<MockWiMaxService> service(
165 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
166 device_->pending_service_ = service;
167 EXPECT_CALL(*service, SetState(_)).Times(0);
168 EXPECT_TRUE(device_->pending_service_);
169 EXPECT_CALL(*service, SetState(Service::kStateFailure));
170 device_->OnConnectComplete(Error(Error::kOperationFailed));
171 EXPECT_FALSE(device_->pending_service_);
172}
173
Darin Petkova3f9f772012-05-31 12:11:28 +0200174TEST_F(WiMaxTest, OnStatusChanged) {
175 scoped_refptr<MockWiMaxService> service(
176 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
177
Darin Petkov3a4100c2012-06-14 11:36:59 +0200178 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200179 device_->pending_service_ = service;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200180 EXPECT_CALL(*service, SetState(_)).Times(0);
181 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
182 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
183 EXPECT_TRUE(device_->pending_service_);
184 EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
185
186 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200187 EXPECT_CALL(*service, SetState(Service::kStateFailure));
188 EXPECT_CALL(*service, ClearPassphrase());
189 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
190 EXPECT_FALSE(device_->pending_service_);
191
Darin Petkov3a4100c2012-06-14 11:36:59 +0200192 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200193 device_->SelectService(service);
194 EXPECT_CALL(*service, SetState(Service::kStateFailure));
195 EXPECT_CALL(*service, SetState(Service::kStateIdle));
196 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
197 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
198 EXPECT_FALSE(device_->selected_service());
199
200 device_->pending_service_ = service;
201 device_->SelectService(service);
202 EXPECT_CALL(*service, SetState(_)).Times(0);
203 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
204 device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
205 EXPECT_TRUE(device_->pending_service_);
206 EXPECT_TRUE(device_->selected_service());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200207 EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200208
209 EXPECT_CALL(*service, SetState(Service::kStateIdle));
210 device_->SelectService(NULL);
211}
212
Darin Petkovb96a4512012-06-04 11:02:49 +0200213TEST_F(WiMaxTest, DropService) {
214 scoped_refptr<NiceMock<MockWiMaxService> > service0(
215 new NiceMock<MockWiMaxService>(
216 &control_,
217 reinterpret_cast<EventDispatcher *>(NULL),
218 &metrics_,
219 &manager_));
220 scoped_refptr<MockWiMaxService> service1(
221 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
222 device_->SelectService(service0);
223 device_->pending_service_ = service1;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200224 device_->StartConnectTimeout();
Darin Petkovb96a4512012-06-04 11:02:49 +0200225
226 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
227 EXPECT_CALL(*service1, SetState(Service::kStateIdle));
228 device_->DropService(Service::kStateIdle);
229 EXPECT_FALSE(device_->selected_service());
230 EXPECT_FALSE(device_->pending_service_);
Darin Petkov3a4100c2012-06-14 11:36:59 +0200231 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
Darin Petkovb96a4512012-06-04 11:02:49 +0200232
233 // Expect no crash.
234 device_->DropService(Service::kStateFailure);
235}
236
237TEST_F(WiMaxTest, OnDeviceVanished) {
238 device_->proxy_.reset(proxy_.release());
239 scoped_refptr<MockWiMaxService> service(
240 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
241 device_->pending_service_ = service;
242 EXPECT_CALL(*service, SetState(Service::kStateIdle));
243 device_->OnDeviceVanished();
244 EXPECT_FALSE(device_->proxy_.get());
245 EXPECT_FALSE(device_->pending_service_);
246}
247
Darin Petkov59f2d692012-06-07 15:57:46 +0200248TEST_F(WiMaxTest, OnEnableComplete) {
249 MockWiMaxProvider provider;
250 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
251 RpcIdentifiers networks(1, "path");
252 EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
253 device_->proxy_.reset(proxy_.release());
254 EXPECT_CALL(provider, OnNetworksChanged());
255 Target target;
256 EXPECT_CALL(target, EnabledStateChanged(_));
257 EnabledStateChangedCallback callback(
258 Bind(&Target::EnabledStateChanged, Unretained(&target)));
259 Error error;
260 device_->OnEnableComplete(callback, error);
261 EXPECT_EQ(1, device_->networks_.size());
262 EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
263
264 EXPECT_TRUE(device_->proxy_.get());
265 error.Populate(Error::kOperationFailed);
266 EXPECT_CALL(target, EnabledStateChanged(_));
267 device_->OnEnableComplete(callback, error);
268 EXPECT_FALSE(device_->proxy_.get());
269}
270
Darin Petkov3a4100c2012-06-14 11:36:59 +0200271TEST_F(WiMaxTest, ConnectTimeout) {
272 EXPECT_EQ(&dispatcher_, device_->dispatcher());
273 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
274 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
275 EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
276 device_->connect_timeout_seconds_);
277 device_->connect_timeout_seconds_ = 0;
278 device_->StartConnectTimeout();
279 EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
280 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
281 device_->dispatcher_ = NULL;
282 device_->StartConnectTimeout(); // Expect no crash.
283 scoped_refptr<MockWiMaxService> service(
284 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
285 device_->pending_service_ = service;
286 EXPECT_CALL(*service, SetState(Service::kStateFailure));
287 dispatcher_.DispatchPendingEvents();
288 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
289 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
290 EXPECT_FALSE(device_->pending_service_);
291}
292
293TEST_F(WiMaxTest, ConnectTo) {
294 static const char kPath[] = "/network/path";
295 scoped_refptr<MockWiMaxService> service(
296 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
297 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
298 device_->status_ = wimax_manager::kDeviceStatusScanning;
299 EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
300 EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _));
301 device_->proxy_.reset(proxy_.release());
302 Error error;
303 device_->ConnectTo(service, &error);
304 EXPECT_TRUE(error.IsSuccess());
305 EXPECT_EQ(service.get(), device_->pending_service_.get());
306 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
307 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
308
309 device_->ConnectTo(service, &error);
310 EXPECT_EQ(Error::kInProgress, error.type());
311
312 device_->pending_service_ = NULL;
313}
314
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200315TEST_F(WiMaxTest, IsIdle) {
316 EXPECT_TRUE(device_->IsIdle());
317 scoped_refptr<NiceMock<MockWiMaxService> > service(
318 new NiceMock<MockWiMaxService>(
319 &control_,
320 reinterpret_cast<EventDispatcher *>(NULL),
321 &metrics_,
322 &manager_));
323 device_->pending_service_ = service;
324 EXPECT_FALSE(device_->IsIdle());
325 device_->pending_service_ = NULL;
326 device_->SelectService(service);
327 EXPECT_FALSE(device_->IsIdle());
328}
329
Ben Chanc07362b2012-05-12 10:54:11 -0700330} // namespace shill