blob: e447e6e8d08535b5225b3e2073568f9743c5e33e [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
Ben Chanc07362b2012-05-12 10:54:11 -07009#include "shill/event_dispatcher.h"
Arman Ugurayed8e6102012-11-29 14:47:20 -080010#include "shill/mock_dhcp_config.h"
11#include "shill/mock_dhcp_provider.h"
Ben Chanc07362b2012-05-12 10:54:11 -070012#include "shill/mock_manager.h"
13#include "shill/mock_metrics.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080014#include "shill/mock_proxy_factory.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020015#include "shill/mock_wimax_device_proxy.h"
Darin Petkovc63dcf02012-05-24 11:51:43 +020016#include "shill/mock_wimax_provider.h"
Darin Petkov9893d9c2012-05-17 15:27:31 -070017#include "shill/mock_wimax_service.h"
Ben Chanc07362b2012-05-12 10:54:11 -070018#include "shill/nice_mock_control.h"
Ben Chan0bc1aca2014-01-27 16:35:37 -080019#include "shill/testing.h"
Darin Petkovb72b62e2012-05-15 16:55:36 +020020
Darin Petkov59f2d692012-06-07 15:57:46 +020021using base::Bind;
22using base::Unretained;
Darin Petkovb72b62e2012-05-15 16:55:36 +020023using std::string;
Darin Petkov912f0de2012-05-16 14:12:14 +020024using testing::_;
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020025using testing::NiceMock;
Darin Petkov9893d9c2012-05-17 15:27:31 -070026using testing::Return;
Ben Chanc07362b2012-05-12 10:54:11 -070027
28namespace shill {
29
30namespace {
31
32const char kTestLinkName[] = "wm0";
Ben Chan4e64d2d2012-05-16 00:02:25 -070033const char kTestAddress[] = "01:23:45:67:89:ab";
Ben Chanc07362b2012-05-12 10:54:11 -070034const int kTestInterfaceIndex = 5;
Darin Petkovb72b62e2012-05-15 16:55:36 +020035const char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
Ben Chanc07362b2012-05-12 10:54:11 -070036
37} // namespace
38
39class WiMaxTest : public testing::Test {
40 public:
41 WiMaxTest()
Darin Petkovb72b62e2012-05-15 16:55:36 +020042 : proxy_(new MockWiMaxDeviceProxy()),
Thieu Le6c1e3bb2013-02-06 15:20:35 -080043 metrics_(&dispatcher_),
Darin Petkovc63dcf02012-05-24 11:51:43 +020044 manager_(&control_, &dispatcher_, &metrics_, NULL),
Arman Ugurayed8e6102012-11-29 14:47:20 -080045 dhcp_config_(new MockDHCPConfig(&control_,
46 kTestLinkName)),
Darin Petkovd1cd7972012-05-22 15:26:15 +020047 device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
48 kTestLinkName, kTestAddress, kTestInterfaceIndex,
49 kTestPath)) {}
Ben Chanc07362b2012-05-12 10:54:11 -070050
51 virtual ~WiMaxTest() {}
52
53 protected:
Darin Petkov59f2d692012-06-07 15:57:46 +020054 class Target {
55 public:
56 virtual ~Target() {}
57
58 MOCK_METHOD1(EnabledStateChanged, void(const Error &error));
59 };
60
Darin Petkovb72b62e2012-05-15 16:55:36 +020061 virtual void SetUp() {
Darin Petkovd1cd7972012-05-22 15:26:15 +020062 device_->proxy_factory_ = &proxy_factory_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080063 device_->set_dhcp_provider(&dhcp_provider_);
Darin Petkovb72b62e2012-05-15 16:55:36 +020064 }
65
66 virtual void TearDown() {
Darin Petkovc63dcf02012-05-24 11:51:43 +020067 device_->SelectService(NULL);
68 device_->pending_service_ = NULL;
Darin Petkovd1cd7972012-05-22 15:26:15 +020069 device_->proxy_factory_ = NULL;
Darin Petkovb72b62e2012-05-15 16:55:36 +020070 }
71
72 scoped_ptr<MockWiMaxDeviceProxy> proxy_;
Ben Chan0bc1aca2014-01-27 16:35:37 -080073 MockProxyFactory proxy_factory_;
Ben Chanc07362b2012-05-12 10:54:11 -070074 NiceMockControl control_;
75 EventDispatcher dispatcher_;
Darin Petkov3a4100c2012-06-14 11:36:59 +020076 NiceMock<MockMetrics> metrics_;
Ben Chanc07362b2012-05-12 10:54:11 -070077 MockManager manager_;
Arman Ugurayed8e6102012-11-29 14:47:20 -080078 MockDHCPProvider dhcp_provider_;
79 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkovd1cd7972012-05-22 15:26:15 +020080 WiMaxRefPtr device_;
Ben Chanc07362b2012-05-12 10:54:11 -070081};
82
Darin Petkovb72b62e2012-05-15 16:55:36 +020083TEST_F(WiMaxTest, Constructor) {
Darin Petkovd1cd7972012-05-22 15:26:15 +020084 EXPECT_EQ(kTestPath, device_->path());
85 EXPECT_FALSE(device_->scanning());
Darin Petkovb72b62e2012-05-15 16:55:36 +020086}
87
Darin Petkovb72b62e2012-05-15 16:55:36 +020088TEST_F(WiMaxTest, StartStop) {
Darin Petkovd1cd7972012-05-22 15:26:15 +020089 EXPECT_FALSE(device_->proxy_.get());
Ben Chan0bc1aca2014-01-27 16:35:37 -080090 EXPECT_CALL(proxy_factory_, CreateWiMaxDeviceProxy(_))
91 .WillOnce(ReturnAndReleasePointee(&proxy_));
Darin Petkov912f0de2012-05-16 14:12:14 +020092 EXPECT_CALL(*proxy_, Enable(_, _, _));
Darin Petkov9893d9c2012-05-17 15:27:31 -070093 EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
Darin Petkov8ea0eaf2012-05-29 11:21:33 +020094 EXPECT_CALL(*proxy_, set_status_changed_callback(_));
Darin Petkov912f0de2012-05-16 14:12:14 +020095 EXPECT_CALL(*proxy_, Disable(_, _, _));
Darin Petkovd1cd7972012-05-22 15:26:15 +020096 device_->Start(NULL, EnabledStateChangedCallback());
Darin Petkovc63dcf02012-05-24 11:51:43 +020097 ASSERT_TRUE(device_->proxy_.get());
Darin Petkovd1cd7972012-05-22 15:26:15 +020098
Darin Petkov3a4100c2012-06-14 11:36:59 +020099 scoped_refptr<MockWiMaxService> service(
100 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
101 device_->pending_service_ = service;
102 EXPECT_CALL(*service, SetState(Service::kStateIdle));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200103 device_->networks_.insert("path");
104 MockWiMaxProvider provider;
105 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
106 EXPECT_CALL(provider, OnNetworksChanged());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200107 device_->StartConnectTimeout();
Darin Petkovd1cd7972012-05-22 15:26:15 +0200108 device_->Stop(NULL, EnabledStateChangedCallback());
109 EXPECT_TRUE(device_->networks_.empty());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200110 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
111 EXPECT_FALSE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200112}
113
Darin Petkovc63dcf02012-05-24 11:51:43 +0200114TEST_F(WiMaxTest, OnServiceStopped) {
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200115 scoped_refptr<NiceMock<MockWiMaxService> > service0(
116 new NiceMock<MockWiMaxService>(
117 &control_,
118 reinterpret_cast<EventDispatcher *>(NULL),
119 &metrics_,
120 &manager_));
Darin Petkovc63dcf02012-05-24 11:51:43 +0200121 scoped_refptr<MockWiMaxService> service1(
122 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
123 device_->SelectService(service0);
124 device_->pending_service_ = service1;
Darin Petkovd1cd7972012-05-22 15:26:15 +0200125
Darin Petkovc63dcf02012-05-24 11:51:43 +0200126 device_->OnServiceStopped(NULL);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200127 EXPECT_TRUE(device_->selected_service());
128 EXPECT_TRUE(device_->pending_service_);
129
Darin Petkovc63dcf02012-05-24 11:51:43 +0200130 device_->OnServiceStopped(service0);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200131 EXPECT_FALSE(device_->selected_service());
Darin Petkovc63dcf02012-05-24 11:51:43 +0200132 EXPECT_TRUE(device_->pending_service_);
Darin Petkovd1cd7972012-05-22 15:26:15 +0200133
Darin Petkovc63dcf02012-05-24 11:51:43 +0200134 device_->OnServiceStopped(service1);
135 EXPECT_FALSE(device_->selected_service());
136 EXPECT_FALSE(device_->pending_service_);
Darin Petkovb72b62e2012-05-15 16:55:36 +0200137}
138
Darin Petkov9893d9c2012-05-17 15:27:31 -0700139TEST_F(WiMaxTest, OnNetworksChanged) {
Darin Petkovc63dcf02012-05-24 11:51:43 +0200140 MockWiMaxProvider provider;
141 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
142 EXPECT_CALL(provider, OnNetworksChanged());
143 device_->networks_.insert("foo");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200144 RpcIdentifiers networks;
Darin Petkovc63dcf02012-05-24 11:51:43 +0200145 networks.push_back("bar");
146 networks.push_back("zoo");
147 networks.push_back("bar");
Darin Petkovd1cd7972012-05-22 15:26:15 +0200148 device_->OnNetworksChanged(networks);
Darin Petkovc63dcf02012-05-24 11:51:43 +0200149 EXPECT_EQ(2, device_->networks_.size());
150 EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
151 EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
Darin Petkov9893d9c2012-05-17 15:27:31 -0700152}
153
Darin Petkov8ea0eaf2012-05-29 11:21:33 +0200154TEST_F(WiMaxTest, OnConnectComplete) {
155 scoped_refptr<MockWiMaxService> service(
156 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
157 device_->pending_service_ = service;
158 EXPECT_CALL(*service, SetState(_)).Times(0);
159 EXPECT_TRUE(device_->pending_service_);
160 EXPECT_CALL(*service, SetState(Service::kStateFailure));
161 device_->OnConnectComplete(Error(Error::kOperationFailed));
162 EXPECT_FALSE(device_->pending_service_);
163}
164
Darin Petkova3f9f772012-05-31 12:11:28 +0200165TEST_F(WiMaxTest, OnStatusChanged) {
166 scoped_refptr<MockWiMaxService> service(
167 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
168
Darin Petkov3a4100c2012-06-14 11:36:59 +0200169 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200170 device_->pending_service_ = service;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200171 EXPECT_CALL(*service, SetState(_)).Times(0);
172 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
173 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
174 EXPECT_TRUE(device_->pending_service_);
175 EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
176
177 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200178 EXPECT_CALL(*service, SetState(Service::kStateFailure));
Ben Chane494e312013-08-23 12:56:05 -0700179 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
Darin Petkova3f9f772012-05-31 12:11:28 +0200180 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
181 EXPECT_FALSE(device_->pending_service_);
182
Darin Petkov3a4100c2012-06-14 11:36:59 +0200183 device_->status_ = wimax_manager::kDeviceStatusConnecting;
Darin Petkova3f9f772012-05-31 12:11:28 +0200184 device_->SelectService(service);
185 EXPECT_CALL(*service, SetState(Service::kStateFailure));
186 EXPECT_CALL(*service, SetState(Service::kStateIdle));
187 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
188 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
189 EXPECT_FALSE(device_->selected_service());
190
191 device_->pending_service_ = service;
192 device_->SelectService(service);
193 EXPECT_CALL(*service, SetState(_)).Times(0);
194 EXPECT_CALL(*service, ClearPassphrase()).Times(0);
195 device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
196 EXPECT_TRUE(device_->pending_service_);
197 EXPECT_TRUE(device_->selected_service());
Darin Petkov3a4100c2012-06-14 11:36:59 +0200198 EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
Darin Petkova3f9f772012-05-31 12:11:28 +0200199
200 EXPECT_CALL(*service, SetState(Service::kStateIdle));
201 device_->SelectService(NULL);
202}
203
Arman Ugurayed8e6102012-11-29 14:47:20 -0800204TEST_F(WiMaxTest, UseNoArpGateway) {
Paul Stewart75a68b92013-10-24 10:50:27 -0700205 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestLinkName, _, _, false, false))
Arman Ugurayed8e6102012-11-29 14:47:20 -0800206 .WillOnce(Return(dhcp_config_));
207 device_->AcquireIPConfig();
208}
209
Darin Petkovb96a4512012-06-04 11:02:49 +0200210TEST_F(WiMaxTest, DropService) {
211 scoped_refptr<NiceMock<MockWiMaxService> > service0(
212 new NiceMock<MockWiMaxService>(
213 &control_,
214 reinterpret_cast<EventDispatcher *>(NULL),
215 &metrics_,
216 &manager_));
217 scoped_refptr<MockWiMaxService> service1(
218 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
219 device_->SelectService(service0);
220 device_->pending_service_ = service1;
Darin Petkov3a4100c2012-06-14 11:36:59 +0200221 device_->StartConnectTimeout();
Darin Petkovb96a4512012-06-04 11:02:49 +0200222
223 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
224 EXPECT_CALL(*service1, SetState(Service::kStateIdle));
225 device_->DropService(Service::kStateIdle);
226 EXPECT_FALSE(device_->selected_service());
227 EXPECT_FALSE(device_->pending_service_);
Darin Petkov3a4100c2012-06-14 11:36:59 +0200228 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
Darin Petkovb96a4512012-06-04 11:02:49 +0200229
230 // Expect no crash.
231 device_->DropService(Service::kStateFailure);
232}
233
234TEST_F(WiMaxTest, OnDeviceVanished) {
235 device_->proxy_.reset(proxy_.release());
236 scoped_refptr<MockWiMaxService> service(
237 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
238 device_->pending_service_ = service;
239 EXPECT_CALL(*service, SetState(Service::kStateIdle));
240 device_->OnDeviceVanished();
241 EXPECT_FALSE(device_->proxy_.get());
242 EXPECT_FALSE(device_->pending_service_);
243}
244
Darin Petkov59f2d692012-06-07 15:57:46 +0200245TEST_F(WiMaxTest, OnEnableComplete) {
246 MockWiMaxProvider provider;
247 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
248 RpcIdentifiers networks(1, "path");
249 EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
250 device_->proxy_.reset(proxy_.release());
251 EXPECT_CALL(provider, OnNetworksChanged());
252 Target target;
253 EXPECT_CALL(target, EnabledStateChanged(_));
254 EnabledStateChangedCallback callback(
255 Bind(&Target::EnabledStateChanged, Unretained(&target)));
256 Error error;
257 device_->OnEnableComplete(callback, error);
258 EXPECT_EQ(1, device_->networks_.size());
259 EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
260
261 EXPECT_TRUE(device_->proxy_.get());
262 error.Populate(Error::kOperationFailed);
263 EXPECT_CALL(target, EnabledStateChanged(_));
264 device_->OnEnableComplete(callback, error);
265 EXPECT_FALSE(device_->proxy_.get());
266}
267
Darin Petkov3a4100c2012-06-14 11:36:59 +0200268TEST_F(WiMaxTest, ConnectTimeout) {
269 EXPECT_EQ(&dispatcher_, device_->dispatcher());
270 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
271 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
272 EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
273 device_->connect_timeout_seconds_);
274 device_->connect_timeout_seconds_ = 0;
275 device_->StartConnectTimeout();
276 EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
277 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
278 device_->dispatcher_ = NULL;
279 device_->StartConnectTimeout(); // Expect no crash.
280 scoped_refptr<MockWiMaxService> service(
281 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
282 device_->pending_service_ = service;
283 EXPECT_CALL(*service, SetState(Service::kStateFailure));
284 dispatcher_.DispatchPendingEvents();
285 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
286 EXPECT_FALSE(device_->IsConnectTimeoutStarted());
287 EXPECT_FALSE(device_->pending_service_);
288}
289
290TEST_F(WiMaxTest, ConnectTo) {
291 static const char kPath[] = "/network/path";
292 scoped_refptr<MockWiMaxService> service(
293 new MockWiMaxService(&control_, NULL, &metrics_, &manager_));
294 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
295 device_->status_ = wimax_manager::kDeviceStatusScanning;
296 EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
297 EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _));
298 device_->proxy_.reset(proxy_.release());
299 Error error;
300 device_->ConnectTo(service, &error);
301 EXPECT_TRUE(error.IsSuccess());
302 EXPECT_EQ(service.get(), device_->pending_service_.get());
303 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
304 EXPECT_TRUE(device_->IsConnectTimeoutStarted());
305
306 device_->ConnectTo(service, &error);
307 EXPECT_EQ(Error::kInProgress, error.type());
308
309 device_->pending_service_ = NULL;
310}
311
Darin Petkov6b9b2e12012-07-10 15:51:42 +0200312TEST_F(WiMaxTest, IsIdle) {
313 EXPECT_TRUE(device_->IsIdle());
314 scoped_refptr<NiceMock<MockWiMaxService> > service(
315 new NiceMock<MockWiMaxService>(
316 &control_,
317 reinterpret_cast<EventDispatcher *>(NULL),
318 &metrics_,
319 &manager_));
320 device_->pending_service_ = service;
321 EXPECT_FALSE(device_->IsIdle());
322 device_->pending_service_ = NULL;
323 device_->SelectService(service);
324 EXPECT_FALSE(device_->IsIdle());
325}
326
Ben Chanc07362b2012-05-12 10:54:11 -0700327} // namespace shill