blob: f47895d413bd90b0dbfc83ebf596fe84a368d829 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovafa6fc42011-06-21 16:21:08 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkovafa6fc42011-06-21 16:21:08 -07005#include "shill/device.h"
Darin Petkovafa6fc42011-06-21 16:21:08 -07006
Chris Masone34af2182011-08-22 11:59:36 -07007#include <ctype.h>
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07008#include <sys/socket.h>
9#include <linux/if.h> // Needs typedefs from sys/socket.h.
Chris Masone34af2182011-08-22 11:59:36 -070010
Chris Masone3bd3c8c2011-06-13 08:20:26 -070011#include <map>
12#include <string>
13#include <vector>
14
Chris Masone3bd3c8c2011-06-13 08:20:26 -070015#include <chromeos/dbus/service_constants.h>
Chris Masone34af2182011-08-22 11:59:36 -070016#include <dbus-c++/dbus.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070017#include <gmock/gmock.h>
Chris Masone34af2182011-08-22 11:59:36 -070018#include <gtest/gtest.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070019
20#include "shill/dbus_adaptor.h"
21#include "shill/dhcp_provider.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070022#include "shill/event_dispatcher.h"
Chris Masone95207da2011-06-29 16:50:49 -070023#include "shill/mock_adaptors.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070024#include "shill/mock_control.h"
Paul Stewart20088d82012-02-16 06:58:55 -080025#include "shill/mock_connection.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070026#include "shill/mock_device.h"
Paul Stewart20088d82012-02-16 06:58:55 -080027#include "shill/mock_device_info.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070028#include "shill/mock_glib.h"
Chris Masone34af2182011-08-22 11:59:36 -070029#include "shill/mock_ipconfig.h"
Paul Stewart20088d82012-02-16 06:58:55 -080030#include "shill/mock_manager.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070031#include "shill/mock_rtnl_handler.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070032#include "shill/mock_service.h"
Chris Masone5dec5f42011-07-22 14:07:55 -070033#include "shill/mock_store.h"
Paul Stewart20088d82012-02-16 06:58:55 -080034#include "shill/portal_detector.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070035#include "shill/property_store_unittest.h"
Gaurav Shah435de2c2011-11-17 19:01:07 -080036#include "shill/technology.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070037
38using std::map;
39using std::string;
40using std::vector;
41using ::testing::_;
Chris Masone5dec5f42011-07-22 14:07:55 -070042using ::testing::AtLeast;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070043using ::testing::NiceMock;
44using ::testing::Return;
Paul Stewart20088d82012-02-16 06:58:55 -080045using ::testing::ReturnRef;
Paul Stewart03dba0b2011-08-22 16:32:45 -070046using ::testing::StrictMock;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070047using ::testing::Test;
Chris Masone34af2182011-08-22 11:59:36 -070048using ::testing::Values;
Darin Petkovafa6fc42011-06-21 16:21:08 -070049
50namespace shill {
51
Chris Masone3bd3c8c2011-06-13 08:20:26 -070052class DeviceTest : public PropertyStoreTest {
Darin Petkovafa6fc42011-06-21 16:21:08 -070053 public:
54 DeviceTest()
Chris Masone2176a882011-09-14 22:29:15 -070055 : device_(new Device(control_interface(),
Paul Stewart20088d82012-02-16 06:58:55 -080056 dispatcher(),
Chris Masone626719f2011-08-18 16:58:48 -070057 NULL,
Paul Stewart20088d82012-02-16 06:58:55 -080058 manager(),
Chris Masone626719f2011-08-18 16:58:48 -070059 kDeviceName,
60 kDeviceAddress,
Gaurav Shah435de2c2011-11-17 19:01:07 -080061 0,
62 Technology::kUnknown)) {
Chris Masone2176a882011-09-14 22:29:15 -070063 DHCPProvider::GetInstance()->glib_ = glib();
64 DHCPProvider::GetInstance()->control_interface_ = control_interface();
Darin Petkovafa6fc42011-06-21 16:21:08 -070065 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -070066 virtual ~DeviceTest() {}
Darin Petkovafa6fc42011-06-21 16:21:08 -070067
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070068 virtual void SetUp() {
69 device_->rtnl_handler_ = &rtnl_handler_;
70 }
71
Darin Petkovafa6fc42011-06-21 16:21:08 -070072 protected:
Chris Masone626719f2011-08-18 16:58:48 -070073 static const char kDeviceName[];
74 static const char kDeviceAddress[];
75
Paul Stewart20088d82012-02-16 06:58:55 -080076 void IPConfigUpdatedCallback(const IPConfigRefPtr &ipconfig, bool success) {
77 device_->IPConfigUpdatedCallback(ipconfig, success);
78 }
79
80 void SelectService(const ServiceRefPtr service) {
81 device_->SelectService(service);
82 }
83
84 bool StartPortalDetection() { return device_->StartPortalDetection(); }
85 void StopPortalDetection() { device_->StopPortalDetection(); }
86
87 void PortalDetectorCallback(const PortalDetector::Result &result) {
88 device_->PortalDetectorCallback(result);
89 }
90
91 void SetManager(Manager *manager) {
92 device_->manager_ = manager;
93 }
94
95 void SetConnection(ConnectionRefPtr connection) {
96 device_->connection_ = connection;
97 }
98
Darin Petkovafa6fc42011-06-21 16:21:08 -070099 MockControl control_interface_;
100 DeviceRefPtr device_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700101 StrictMock<MockRTNLHandler> rtnl_handler_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700102};
103
Chris Masone626719f2011-08-18 16:58:48 -0700104const char DeviceTest::kDeviceName[] = "testdevice";
105const char DeviceTest::kDeviceAddress[] = "address";
106
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700107TEST_F(DeviceTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700108 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
109 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700110}
111
Chris Masonea8a2c252011-06-27 22:16:30 -0700112TEST_F(DeviceTest, GetProperties) {
113 map<string, ::DBus::Variant> props;
114 Error error(Error::kInvalidProperty, "");
115 {
116 ::DBus::Error dbus_error;
117 bool expected = true;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700118 device_->mutable_store()->SetBoolProperty(flimflam::kPoweredProperty,
119 expected,
120 &error);
Chris Masone27c4aa52011-07-02 13:10:14 -0700121 DBusAdaptor::GetProperties(device_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700122 ASSERT_FALSE(props.find(flimflam::kPoweredProperty) == props.end());
123 EXPECT_EQ(props[flimflam::kPoweredProperty].reader().get_bool(),
124 expected);
125 }
126 {
127 ::DBus::Error dbus_error;
Chris Masone27c4aa52011-07-02 13:10:14 -0700128 DBusAdaptor::GetProperties(device_->store(), &props, &dbus_error);
Chris Masonea8a2c252011-06-27 22:16:30 -0700129 ASSERT_FALSE(props.find(flimflam::kNameProperty) == props.end());
130 EXPECT_EQ(props[flimflam::kNameProperty].reader().get_string(),
131 string(kDeviceName));
132 }
133}
134
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800135TEST_F(DeviceTest, SetProperty) {
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700136 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800137 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
138 flimflam::kPoweredProperty,
139 PropertyStoreTest::kBoolV,
140 &error));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700141
Chris Masoneb925cc82011-06-22 15:39:57 -0700142 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800143 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
144 flimflam::kAddressProperty,
145 PropertyStoreTest::kStringV,
146 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700147 EXPECT_EQ(invalid_args(), error.name());
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700148}
149
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800150TEST_F(DeviceTest, ClearProperty) {
151 ::DBus::Error error;
152 EXPECT_TRUE(device_->powered());
153
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800154 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
155 flimflam::kPoweredProperty,
156 PropertyStoreTest::kBoolV,
157 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800158 EXPECT_FALSE(device_->powered());
159
160 EXPECT_TRUE(DBusAdaptor::ClearProperty(device_->mutable_store(),
161 flimflam::kPoweredProperty,
162 &error));
163 EXPECT_TRUE(device_->powered());
164}
165
166TEST_F(DeviceTest, ClearReadOnlyProperty) {
167 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800168 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
169 flimflam::kAddressProperty,
170 PropertyStoreTest::kStringV,
171 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800172}
173
174TEST_F(DeviceTest, ClearReadOnlyDerivedProperty) {
175 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800176 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
177 flimflam::kIPConfigsProperty,
178 PropertyStoreTest::kStringsV,
179 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800180}
181
Darin Petkovafa6fc42011-06-21 16:21:08 -0700182TEST_F(DeviceTest, TechnologyIs) {
Paul Stewartfdd16072011-09-16 12:41:35 -0700183 EXPECT_FALSE(device_->TechnologyIs(Technology::kEthernet));
Darin Petkovafa6fc42011-06-21 16:21:08 -0700184}
185
186TEST_F(DeviceTest, DestroyIPConfig) {
187 ASSERT_FALSE(device_->ipconfig_.get());
Chris Masone2176a882011-09-14 22:29:15 -0700188 device_->ipconfig_ = new IPConfig(control_interface(), kDeviceName);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700189 device_->DestroyIPConfig();
190 ASSERT_FALSE(device_->ipconfig_.get());
191}
192
193TEST_F(DeviceTest, DestroyIPConfigNULL) {
194 ASSERT_FALSE(device_->ipconfig_.get());
195 device_->DestroyIPConfig();
196 ASSERT_FALSE(device_->ipconfig_.get());
197}
198
Paul Stewart2bf1d352011-12-06 15:02:55 -0800199TEST_F(DeviceTest, AcquireIPConfig) {
Chris Masone2176a882011-09-14 22:29:15 -0700200 device_->ipconfig_ = new IPConfig(control_interface(), "randomname");
201 EXPECT_CALL(*glib(), SpawnAsync(_, _, _, _, _, _, _, _))
Darin Petkovafa6fc42011-06-21 16:21:08 -0700202 .WillOnce(Return(false));
Paul Stewart2bf1d352011-12-06 15:02:55 -0800203 EXPECT_FALSE(device_->AcquireIPConfig());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700204 ASSERT_TRUE(device_->ipconfig_.get());
205 EXPECT_EQ(kDeviceName, device_->ipconfig_->device_name());
206 EXPECT_TRUE(device_->ipconfig_->update_callback_.get());
207}
208
Chris Masone5dec5f42011-07-22 14:07:55 -0700209TEST_F(DeviceTest, Load) {
210 NiceMock<MockStore> storage;
211 const string id = device_->GetStorageIdentifier();
212 EXPECT_CALL(storage, ContainsGroup(id)).WillOnce(Return(true));
213 EXPECT_CALL(storage, GetBool(id, _, _))
214 .Times(AtLeast(1))
215 .WillRepeatedly(Return(true));
216 EXPECT_TRUE(device_->Load(&storage));
217}
218
219TEST_F(DeviceTest, Save) {
220 NiceMock<MockStore> storage;
221 const string id = device_->GetStorageIdentifier();
Chris Masone5dec5f42011-07-22 14:07:55 -0700222 EXPECT_CALL(storage, SetString(id, _, _))
223 .Times(AtLeast(1))
224 .WillRepeatedly(Return(true));
225 EXPECT_CALL(storage, SetBool(id, _, _))
226 .Times(AtLeast(1))
227 .WillRepeatedly(Return(true));
Chris Masone2176a882011-09-14 22:29:15 -0700228 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
Chris Masone34af2182011-08-22 11:59:36 -0700229 kDeviceName);
230 EXPECT_CALL(*ipconfig.get(), Save(_, _))
231 .WillOnce(Return(true));
232 device_->ipconfig_ = ipconfig;
Chris Masone5dec5f42011-07-22 14:07:55 -0700233 EXPECT_TRUE(device_->Save(&storage));
234}
235
Chris Masone34af2182011-08-22 11:59:36 -0700236TEST_F(DeviceTest, StorageIdGeneration) {
237 string to_process("/device/stuff/0");
238 ControlInterface::RpcIdToStorageId(&to_process);
239 EXPECT_TRUE(isalpha(to_process[0]));
240 EXPECT_EQ(string::npos, to_process.find('/'));
241}
242
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800243MATCHER(IsNullRefPtr, "") {
244 return !arg;
245}
246
247MATCHER(NotNullRefPtr, "") {
248 return arg;
249}
250
Paul Stewart03dba0b2011-08-22 16:32:45 -0700251TEST_F(DeviceTest, SelectedService) {
252 EXPECT_FALSE(device_->selected_service_.get());
253 device_->SetServiceState(Service::kStateAssociating);
254 scoped_refptr<MockService> service(
Chris Masone2176a882011-09-14 22:29:15 -0700255 new StrictMock<MockService>(control_interface(),
256 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800257 metrics(),
Chris Masone9d779932011-08-25 16:33:41 -0700258 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800259 SelectService(service);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700260 EXPECT_TRUE(device_->selected_service_.get() == service.get());
261
262 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
263 device_->SetServiceState(Service::kStateConfiguring);
264 EXPECT_CALL(*service.get(), SetFailure(Service::kFailureOutOfRange));
265 device_->SetServiceFailure(Service::kFailureOutOfRange);
266
267 // Service should be returned to "Idle" state
268 EXPECT_CALL(*service.get(), state())
269 .WillOnce(Return(Service::kStateUnknown));
270 EXPECT_CALL(*service.get(), SetState(Service::kStateIdle));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800271 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800272 SelectService(NULL);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700273
274 // A service in the "Failure" state should not be reset to "Idle"
Paul Stewart20088d82012-02-16 06:58:55 -0800275 SelectService(service);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700276 EXPECT_CALL(*service.get(), state())
277 .WillOnce(Return(Service::kStateFailure));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800278 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800279 SelectService(NULL);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700280}
281
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800282TEST_F(DeviceTest, IPConfigUpdatedFailure) {
283 scoped_refptr<MockService> service(
284 new StrictMock<MockService>(control_interface(),
285 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800286 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800287 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800288 SelectService(service);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800289 EXPECT_CALL(*service.get(), SetState(Service::kStateDisconnected));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800290 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800291 IPConfigUpdatedCallback(NULL, false);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800292}
293
294TEST_F(DeviceTest, IPConfigUpdatedSuccess) {
295 scoped_refptr<MockService> service(
296 new StrictMock<MockService>(control_interface(),
297 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800298 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800299 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800300 SelectService(service);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800301 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
302 kDeviceName);
303 EXPECT_CALL(*service.get(), SetState(Service::kStateConnected));
Paul Stewart20088d82012-02-16 06:58:55 -0800304 EXPECT_CALL(*service.get(), IsConnected())
305 .WillRepeatedly(Return(true));
306 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800307 EXPECT_CALL(*service.get(), SetConnection(NotNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800308 IPConfigUpdatedCallback(ipconfig.get(), true);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800309}
310
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700311TEST_F(DeviceTest, Stop) {
312 device_->ipconfig_ = new IPConfig(&control_interface_, kDeviceName);
313 scoped_refptr<MockService> service(
314 new NiceMock<MockService>(&control_interface_,
315 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800316 metrics(),
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700317 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800318 SelectService(service);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700319
320 EXPECT_CALL(*service.get(), state()).
321 WillRepeatedly(Return(Service::kStateConnected));
322 EXPECT_CALL(*dynamic_cast<DeviceMockAdaptor *>(device_->adaptor_.get()),
323 UpdateEnabled());
324 EXPECT_CALL(rtnl_handler_, SetInterfaceFlags(_, 0, IFF_UP));
325 device_->Stop();
326
327 EXPECT_FALSE(device_->ipconfig_.get());
328 EXPECT_FALSE(device_->selected_service_.get());
329}
330
Paul Stewart20088d82012-02-16 06:58:55 -0800331TEST_F(DeviceTest, PortalDetectionDisabled) {
332 scoped_refptr<MockService> service(
333 new StrictMock<MockService>(control_interface(),
334 dispatcher(),
335 metrics(),
336 manager()));
337 EXPECT_CALL(*service.get(), IsConnected())
338 .WillRepeatedly(Return(true));
339 StrictMock<MockManager> manager(control_interface(),
340 dispatcher(),
341 metrics(),
342 glib());
343 SetManager(&manager);
344 EXPECT_CALL(manager, IsPortalDetectionEnabled(device_->technology()))
345 .WillOnce(Return(false));
346 SelectService(service);
347 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
348 EXPECT_FALSE(StartPortalDetection());
349}
350
351TEST_F(DeviceTest, PortalDetectionProxyConfig) {
352 scoped_refptr<MockService> service(
353 new StrictMock<MockService>(control_interface(),
354 dispatcher(),
355 metrics(),
356 manager()));
357 EXPECT_CALL(*service.get(), IsConnected())
358 .WillRepeatedly(Return(true));
359 EXPECT_CALL(*service.get(), HasProxyConfig())
360 .WillOnce(Return(true));
361 SelectService(service);
362 StrictMock<MockManager> manager(control_interface(),
363 dispatcher(),
364 metrics(),
365 glib());
366 EXPECT_CALL(manager, IsPortalDetectionEnabled(device_->technology()))
367 .WillOnce(Return(true));
368 SetManager(&manager);
369 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
370 EXPECT_FALSE(StartPortalDetection());
371}
372
373TEST_F(DeviceTest, PortalDetectionBadUrl) {
374 scoped_refptr<MockService> service(
375 new StrictMock<MockService>(control_interface(),
376 dispatcher(),
377 metrics(),
378 manager()));
379 EXPECT_CALL(*service.get(), IsConnected())
380 .WillRepeatedly(Return(true));
381 EXPECT_CALL(*service.get(), HasProxyConfig())
382 .WillOnce(Return(false));
383 SelectService(service);
384 StrictMock<MockManager> manager(control_interface(),
385 dispatcher(),
386 metrics(),
387 glib());
388 EXPECT_CALL(manager, IsPortalDetectionEnabled(device_->technology()))
389 .WillOnce(Return(true));
390 const string portal_url;
391 EXPECT_CALL(manager, GetPortalCheckURL())
392 .WillRepeatedly(ReturnRef(portal_url));
393 SetManager(&manager);
394 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
395 EXPECT_FALSE(StartPortalDetection());
396}
397
398TEST_F(DeviceTest, PortalDetectionStart) {
399 scoped_refptr<MockService> service(
400 new StrictMock<MockService>(control_interface(),
401 dispatcher(),
402 metrics(),
403 manager()));
404 EXPECT_CALL(*service.get(), IsConnected())
405 .WillRepeatedly(Return(true));
406 EXPECT_CALL(*service.get(), HasProxyConfig())
407 .WillOnce(Return(false));
408 SelectService(service);
409 StrictMock<MockManager> manager(control_interface(),
410 dispatcher(),
411 metrics(),
412 glib());
413 EXPECT_CALL(manager, IsPortalDetectionEnabled(device_->technology()))
414 .WillOnce(Return(true));
415 const string portal_url(PortalDetector::kDefaultURL);
416 EXPECT_CALL(manager, GetPortalCheckURL())
417 .WillRepeatedly(ReturnRef(portal_url));
418 SetManager(&manager);
419 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline))
420 .Times(0);
421 scoped_ptr<MockDeviceInfo> device_info(
422 new NiceMock<MockDeviceInfo>(
423 control_interface(),
424 reinterpret_cast<EventDispatcher *>(NULL),
425 reinterpret_cast<Metrics *>(NULL),
426 reinterpret_cast<Manager *>(NULL)));
427 scoped_refptr<MockConnection> connection(
428 new NiceMock<MockConnection>(device_info.get()));
429 const string kInterfaceName("int0");
430 EXPECT_CALL(*connection.get(), interface_name())
431 .WillRepeatedly(ReturnRef(kInterfaceName));
432 const vector<string> kDNSServers;
433 EXPECT_CALL(*connection.get(), dns_servers())
434 .WillRepeatedly(ReturnRef(kDNSServers));
435 SetConnection(connection.get());
436 EXPECT_TRUE(StartPortalDetection());
437
438 // Drop all references to device_info before it falls out of scope.
439 SetConnection(NULL);
440 StopPortalDetection();
441}
442
443TEST_F(DeviceTest, PortalDetectionNonFinal) {
444 scoped_refptr<MockService> service(
445 new StrictMock<MockService>(control_interface(),
446 dispatcher(),
447 metrics(),
448 manager()));
449 EXPECT_CALL(*service.get(), IsConnected())
450 .Times(0);
451 EXPECT_CALL(*service.get(), SetState(_))
452 .Times(0);
453 SelectService(service);
454 PortalDetectorCallback(PortalDetector::Result(
455 PortalDetector::kPhaseUnknown,
456 PortalDetector::kStatusFailure,
457 false));
458}
459
460TEST_F(DeviceTest, PortalDetectionFailure) {
461 scoped_refptr<MockService> service(
462 new StrictMock<MockService>(control_interface(),
463 dispatcher(),
464 metrics(),
465 manager()));
466 EXPECT_CALL(*service.get(), IsConnected())
467 .WillOnce(Return(true));
468 SelectService(service);
469 EXPECT_CALL(*service.get(), SetState(Service::kStatePortal));
470 PortalDetectorCallback(PortalDetector::Result(
471 PortalDetector::kPhaseUnknown,
472 PortalDetector::kStatusFailure,
473 true));
474}
475
476TEST_F(DeviceTest, PortalDetectionSuccess) {
477 scoped_refptr<MockService> service(
478 new StrictMock<MockService>(control_interface(),
479 dispatcher(),
480 metrics(),
481 manager()));
482 EXPECT_CALL(*service.get(), IsConnected())
483 .WillOnce(Return(true));
484 SelectService(service);
485 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
486 PortalDetectorCallback(PortalDetector::Result(
487 PortalDetector::kPhaseUnknown,
488 PortalDetector::kStatusSuccess,
489 true));
490}
491
Darin Petkovafa6fc42011-06-21 16:21:08 -0700492} // namespace shill