blob: 42be15fccb009498dc8e8e3909b47fd1a1dea97a [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"
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070028#include "shill/mock_dhcp_config.h"
29#include "shill/mock_dhcp_provider.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070030#include "shill/mock_glib.h"
Chris Masone34af2182011-08-22 11:59:36 -070031#include "shill/mock_ipconfig.h"
Paul Stewart036dba02012-08-07 12:34:41 -070032#include "shill/mock_link_monitor.h"
Paul Stewart20088d82012-02-16 06:58:55 -080033#include "shill/mock_manager.h"
Thieu Le85e050b2012-03-13 15:04:38 -070034#include "shill/mock_metrics.h"
Paul Stewartc681fa02012-03-02 19:40:04 -080035#include "shill/mock_portal_detector.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070036#include "shill/mock_rtnl_handler.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070037#include "shill/mock_service.h"
Chris Masone5dec5f42011-07-22 14:07:55 -070038#include "shill/mock_store.h"
Paul Stewart20088d82012-02-16 06:58:55 -080039#include "shill/portal_detector.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070040#include "shill/property_store_unittest.h"
mukesh agrawalcc0fded2012-05-09 13:40:58 -070041#include "shill/static_ip_parameters.h"
Gaurav Shah435de2c2011-11-17 19:01:07 -080042#include "shill/technology.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070043
44using std::map;
45using std::string;
46using std::vector;
47using ::testing::_;
mukesh agrawalcc0fded2012-05-09 13:40:58 -070048using ::testing::AnyNumber;
Chris Masone5dec5f42011-07-22 14:07:55 -070049using ::testing::AtLeast;
Paul Stewart6ff27f52012-07-11 06:51:41 -070050using ::testing::Invoke;
Thieu Le85e050b2012-03-13 15:04:38 -070051using ::testing::Mock;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070052using ::testing::NiceMock;
53using ::testing::Return;
Paul Stewart20088d82012-02-16 06:58:55 -080054using ::testing::ReturnRef;
Paul Stewart03dba0b2011-08-22 16:32:45 -070055using ::testing::StrictMock;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070056using ::testing::Test;
Chris Masone34af2182011-08-22 11:59:36 -070057using ::testing::Values;
Darin Petkovafa6fc42011-06-21 16:21:08 -070058
59namespace shill {
60
Eric Shienbrood9a245532012-03-07 14:20:39 -050061class TestDevice : public Device {
62 public:
63 TestDevice(ControlInterface *control_interface,
64 EventDispatcher *dispatcher,
65 Metrics *metrics,
66 Manager *manager,
67 const std::string &link_name,
68 const std::string &address,
69 int interface_index,
70 Technology::Identifier technology)
71 : Device(control_interface, dispatcher, metrics, manager, link_name,
72 address, interface_index, technology) {}
73 ~TestDevice() {}
74 virtual void Start(Error *error,
Jason Glasgow4a490792012-04-10 15:02:05 -040075 const EnabledStateChangedCallback &callback) {
76 DCHECK(error);
77 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050078 virtual void Stop(Error *error,
Jason Glasgow4a490792012-04-10 15:02:05 -040079 const EnabledStateChangedCallback &callback) {
80 DCHECK(error);
81 }
Eric Shienbrood9a245532012-03-07 14:20:39 -050082};
83
Chris Masone3bd3c8c2011-06-13 08:20:26 -070084class DeviceTest : public PropertyStoreTest {
Darin Petkovafa6fc42011-06-21 16:21:08 -070085 public:
86 DeviceTest()
Eric Shienbrood9a245532012-03-07 14:20:39 -050087 : device_(new TestDevice(control_interface(),
88 dispatcher(),
89 NULL,
90 manager(),
91 kDeviceName,
92 kDeviceAddress,
93 kDeviceInterfaceIndex,
94 Technology::kUnknown)),
Paul Stewartc681fa02012-03-02 19:40:04 -080095 device_info_(control_interface(), NULL, NULL, NULL) {
Chris Masone2176a882011-09-14 22:29:15 -070096 DHCPProvider::GetInstance()->glib_ = glib();
97 DHCPProvider::GetInstance()->control_interface_ = control_interface();
mukesh agrawalcc0fded2012-05-09 13:40:58 -070098 DHCPProvider::GetInstance()->dispatcher_ = dispatcher();
Darin Petkovafa6fc42011-06-21 16:21:08 -070099 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700100 virtual ~DeviceTest() {}
Darin Petkovafa6fc42011-06-21 16:21:08 -0700101
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700102 virtual void SetUp() {
Thieu Le85e050b2012-03-13 15:04:38 -0700103 device_->metrics_ = &metrics_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700104 device_->rtnl_handler_ = &rtnl_handler_;
105 }
106
Darin Petkovafa6fc42011-06-21 16:21:08 -0700107 protected:
Chris Masone626719f2011-08-18 16:58:48 -0700108 static const char kDeviceName[];
109 static const char kDeviceAddress[];
Thieu Lefb46caf2012-03-08 11:57:15 -0800110 static const int kDeviceInterfaceIndex;
Chris Masone626719f2011-08-18 16:58:48 -0700111
Darin Petkov79d74c92012-03-07 17:20:32 +0100112 void OnIPConfigUpdated(const IPConfigRefPtr &ipconfig, bool success) {
113 device_->OnIPConfigUpdated(ipconfig, success);
Paul Stewart20088d82012-02-16 06:58:55 -0800114 }
115
116 void SelectService(const ServiceRefPtr service) {
117 device_->SelectService(service);
118 }
119
Paul Stewart20088d82012-02-16 06:58:55 -0800120 void SetConnection(ConnectionRefPtr connection) {
121 device_->connection_ = connection;
122 }
123
Paul Stewart036dba02012-08-07 12:34:41 -0700124 void SetLinkMonitor(LinkMonitor *link_monitor) {
125 device_->set_link_monitor(link_monitor); // Passes ownership.
126 }
127
Paul Stewartc8860612012-09-28 07:36:21 -0700128 bool HasLinkMonitor() {
129 return device_->link_monitor();
130 }
131
Paul Stewart036dba02012-08-07 12:34:41 -0700132 bool StartLinkMonitor() {
133 return device_->StartLinkMonitor();
134 }
135
136 void StopLinkMonitor() {
137 device_->StopLinkMonitor();
138 }
139
140 uint64 GetLinkMonitorResponseTime(Error *error) {
141 return device_->GetLinkMonitorResponseTime(error);
142 }
143
144 void SetManager(Manager *manager) {
145 device_->manager_ = manager;
146 }
147
Darin Petkovafa6fc42011-06-21 16:21:08 -0700148 MockControl control_interface_;
149 DeviceRefPtr device_;
Paul Stewartc681fa02012-03-02 19:40:04 -0800150 MockDeviceInfo device_info_;
Thieu Le85e050b2012-03-13 15:04:38 -0700151 MockMetrics metrics_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700152 StrictMock<MockRTNLHandler> rtnl_handler_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700153};
154
Chris Masone626719f2011-08-18 16:58:48 -0700155const char DeviceTest::kDeviceName[] = "testdevice";
156const char DeviceTest::kDeviceAddress[] = "address";
Thieu Lefb46caf2012-03-08 11:57:15 -0800157const int DeviceTest::kDeviceInterfaceIndex = 0;
Chris Masone626719f2011-08-18 16:58:48 -0700158
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700159TEST_F(DeviceTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700160 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
161 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700162}
163
Chris Masonea8a2c252011-06-27 22:16:30 -0700164TEST_F(DeviceTest, GetProperties) {
165 map<string, ::DBus::Variant> props;
166 Error error(Error::kInvalidProperty, "");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500167 ::DBus::Error dbus_error;
168 DBusAdaptor::GetProperties(device_->store(), &props, &dbus_error);
169 ASSERT_FALSE(props.find(flimflam::kNameProperty) == props.end());
170 EXPECT_EQ(props[flimflam::kNameProperty].reader().get_string(),
171 string(kDeviceName));
Chris Masonea8a2c252011-06-27 22:16:30 -0700172}
173
Eric Shienbrood9a245532012-03-07 14:20:39 -0500174// Note: there are currently no writeable Device properties that
175// aren't registered in a subclass.
176TEST_F(DeviceTest, SetReadOnlyProperty) {
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700177 ::DBus::Error error;
Chris Masoneb925cc82011-06-22 15:39:57 -0700178 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800179 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
180 flimflam::kAddressProperty,
181 PropertyStoreTest::kStringV,
182 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700183 EXPECT_EQ(invalid_args(), error.name());
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700184}
185
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800186TEST_F(DeviceTest, ClearReadOnlyProperty) {
187 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800188 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
189 flimflam::kAddressProperty,
190 PropertyStoreTest::kStringV,
191 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800192}
193
194TEST_F(DeviceTest, ClearReadOnlyDerivedProperty) {
195 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800196 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
197 flimflam::kIPConfigsProperty,
198 PropertyStoreTest::kStringsV,
199 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800200}
201
Darin Petkovafa6fc42011-06-21 16:21:08 -0700202TEST_F(DeviceTest, DestroyIPConfig) {
203 ASSERT_FALSE(device_->ipconfig_.get());
Chris Masone2176a882011-09-14 22:29:15 -0700204 device_->ipconfig_ = new IPConfig(control_interface(), kDeviceName);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700205 device_->DestroyIPConfig();
206 ASSERT_FALSE(device_->ipconfig_.get());
207}
208
209TEST_F(DeviceTest, DestroyIPConfigNULL) {
210 ASSERT_FALSE(device_->ipconfig_.get());
211 device_->DestroyIPConfig();
212 ASSERT_FALSE(device_->ipconfig_.get());
213}
214
Paul Stewart2bf1d352011-12-06 15:02:55 -0800215TEST_F(DeviceTest, AcquireIPConfig) {
Chris Masone2176a882011-09-14 22:29:15 -0700216 device_->ipconfig_ = new IPConfig(control_interface(), "randomname");
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700217 scoped_ptr<MockDHCPProvider> dhcp_provider(new MockDHCPProvider());
218 device_->dhcp_provider_ = dhcp_provider.get();
219 scoped_refptr<MockDHCPConfig> dhcp_config(new MockDHCPConfig(
220 control_interface(),
221 kDeviceName));
222 EXPECT_CALL(*dhcp_provider, CreateConfig(_, _, _, _))
223 .WillOnce(Return(dhcp_config));
224 EXPECT_CALL(*dhcp_config, RequestIP())
Darin Petkovafa6fc42011-06-21 16:21:08 -0700225 .WillOnce(Return(false));
Paul Stewart2bf1d352011-12-06 15:02:55 -0800226 EXPECT_FALSE(device_->AcquireIPConfig());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700227 ASSERT_TRUE(device_->ipconfig_.get());
228 EXPECT_EQ(kDeviceName, device_->ipconfig_->device_name());
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500229 EXPECT_FALSE(device_->ipconfig_->update_callback_.is_null());
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700230 device_->dhcp_provider_ = NULL;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700231}
232
Chris Masone5dec5f42011-07-22 14:07:55 -0700233TEST_F(DeviceTest, Load) {
234 NiceMock<MockStore> storage;
235 const string id = device_->GetStorageIdentifier();
236 EXPECT_CALL(storage, ContainsGroup(id)).WillOnce(Return(true));
Paul Stewart6ff27f52012-07-11 06:51:41 -0700237 EXPECT_CALL(storage, GetBool(id, Device::kStoragePowered, _))
238 .WillOnce(Return(true));
239 EXPECT_CALL(storage, GetUint64(id, Device::kStorageReceiveByteCount, _))
240 .WillOnce(Return(true));
241 EXPECT_CALL(storage, GetUint64(id, Device::kStorageTransmitByteCount, _))
242 .WillOnce(Return(true));
Chris Masone5dec5f42011-07-22 14:07:55 -0700243 EXPECT_TRUE(device_->Load(&storage));
244}
245
246TEST_F(DeviceTest, Save) {
247 NiceMock<MockStore> storage;
248 const string id = device_->GetStorageIdentifier();
Paul Stewart6ff27f52012-07-11 06:51:41 -0700249 EXPECT_CALL(storage, SetString(id, Device::kStorageIPConfigs, _))
250 .WillOnce(Return(true));
251 EXPECT_CALL(storage, SetBool(id, Device::kStoragePowered, _))
252 .WillOnce(Return(true));
Chris Masone2176a882011-09-14 22:29:15 -0700253 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
Chris Masone34af2182011-08-22 11:59:36 -0700254 kDeviceName);
255 EXPECT_CALL(*ipconfig.get(), Save(_, _))
256 .WillOnce(Return(true));
257 device_->ipconfig_ = ipconfig;
Paul Stewart6ff27f52012-07-11 06:51:41 -0700258 EXPECT_CALL(storage, SetUint64(id, Device::kStorageReceiveByteCount, _))
259 .WillOnce(Return(true));
260 EXPECT_CALL(storage, SetUint64(id, Device::kStorageTransmitByteCount, _))
261 .Times(AtLeast(true));
Chris Masone5dec5f42011-07-22 14:07:55 -0700262 EXPECT_TRUE(device_->Save(&storage));
263}
264
Chris Masone34af2182011-08-22 11:59:36 -0700265TEST_F(DeviceTest, StorageIdGeneration) {
266 string to_process("/device/stuff/0");
267 ControlInterface::RpcIdToStorageId(&to_process);
268 EXPECT_TRUE(isalpha(to_process[0]));
269 EXPECT_EQ(string::npos, to_process.find('/'));
270}
271
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800272MATCHER(IsNullRefPtr, "") {
273 return !arg;
274}
275
276MATCHER(NotNullRefPtr, "") {
277 return arg;
278}
279
Paul Stewart03dba0b2011-08-22 16:32:45 -0700280TEST_F(DeviceTest, SelectedService) {
281 EXPECT_FALSE(device_->selected_service_.get());
282 device_->SetServiceState(Service::kStateAssociating);
283 scoped_refptr<MockService> service(
Chris Masone2176a882011-09-14 22:29:15 -0700284 new StrictMock<MockService>(control_interface(),
285 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800286 metrics(),
Chris Masone9d779932011-08-25 16:33:41 -0700287 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800288 SelectService(service);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700289 EXPECT_TRUE(device_->selected_service_.get() == service.get());
290
291 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
292 device_->SetServiceState(Service::kStateConfiguring);
293 EXPECT_CALL(*service.get(), SetFailure(Service::kFailureOutOfRange));
294 device_->SetServiceFailure(Service::kFailureOutOfRange);
295
296 // Service should be returned to "Idle" state
297 EXPECT_CALL(*service.get(), state())
298 .WillOnce(Return(Service::kStateUnknown));
299 EXPECT_CALL(*service.get(), SetState(Service::kStateIdle));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800300 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800301 SelectService(NULL);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700302
303 // A service in the "Failure" state should not be reset to "Idle"
Paul Stewart20088d82012-02-16 06:58:55 -0800304 SelectService(service);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700305 EXPECT_CALL(*service.get(), state())
306 .WillOnce(Return(Service::kStateFailure));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800307 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Paul Stewart20088d82012-02-16 06:58:55 -0800308 SelectService(NULL);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700309}
310
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800311TEST_F(DeviceTest, IPConfigUpdatedFailure) {
312 scoped_refptr<MockService> service(
313 new StrictMock<MockService>(control_interface(),
314 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800315 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800316 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800317 SelectService(service);
Christopher Wileyabd3b502012-09-26 13:08:52 -0700318 EXPECT_CALL(*service.get(), DisconnectWithFailure(Service::kFailureDHCP, _));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800319 EXPECT_CALL(*service.get(), SetConnection(IsNullRefPtr()));
Darin Petkov79d74c92012-03-07 17:20:32 +0100320 OnIPConfigUpdated(NULL, false);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800321}
322
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700323TEST_F(DeviceTest, IPConfigUpdatedFailureWithStatic) {
324 scoped_refptr<MockService> service(
325 new StrictMock<MockService>(control_interface(),
326 dispatcher(),
327 metrics(),
328 manager()));
329 SelectService(service);
330 service->static_ip_parameters_.args_.SetString(
331 flimflam::kAddressProperty, "1.1.1.1");
332 service->static_ip_parameters_.args_.SetInt(flimflam::kPrefixlenProperty, 16);
333 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
334 EXPECT_CALL(*service.get(), SetConnection(_)).Times(0);
335 OnIPConfigUpdated(NULL, false);
336}
337
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800338TEST_F(DeviceTest, IPConfigUpdatedSuccess) {
339 scoped_refptr<MockService> service(
340 new StrictMock<MockService>(control_interface(),
341 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800342 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800343 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800344 SelectService(service);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800345 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
346 kDeviceName);
347 EXPECT_CALL(*service.get(), SetState(Service::kStateConnected));
Paul Stewart20088d82012-02-16 06:58:55 -0800348 EXPECT_CALL(*service.get(), IsConnected())
349 .WillRepeatedly(Return(true));
Paul Stewartd215af62012-04-24 23:25:50 -0700350 EXPECT_CALL(*service.get(), IsPortalDetectionDisabled())
351 .WillRepeatedly(Return(true));
Paul Stewart20088d82012-02-16 06:58:55 -0800352 EXPECT_CALL(*service.get(), SetState(Service::kStateOnline));
Paul Stewartc1dec4d2011-12-08 15:25:28 -0800353 EXPECT_CALL(*service.get(), SetConnection(NotNullRefPtr()));
Darin Petkov79d74c92012-03-07 17:20:32 +0100354 OnIPConfigUpdated(ipconfig.get(), true);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800355}
356
Thieu Led1760922012-09-11 14:15:35 -0700357TEST_F(DeviceTest, IPConfigUpdatedSuccessNoSelectedService) {
358 // Make sure shill doesn't crash if a service is disabled immediately
359 // after receiving its IP config (selected_service_ is NULL in this case).
360 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
361 kDeviceName);
362 SelectService(NULL);
363 OnIPConfigUpdated(ipconfig.get(), true);
364}
365
Darin Petkove7c6ad32012-06-29 10:22:09 +0200366TEST_F(DeviceTest, SetEnabledPersistent) {
367 EXPECT_FALSE(device_->enabled_);
368 EXPECT_FALSE(device_->enabled_pending_);
369 device_->enabled_persistent_ = false;
370 StrictMock<MockManager> manager(control_interface(),
371 dispatcher(),
372 metrics(),
373 glib());
374 EXPECT_CALL(manager, UpdateDevice(_));
Paul Stewart036dba02012-08-07 12:34:41 -0700375 SetManager(&manager);
Darin Petkove7c6ad32012-06-29 10:22:09 +0200376 Error error;
377 device_->SetEnabledPersistent(true, &error, ResultCallback());
378 EXPECT_TRUE(device_->enabled_persistent_);
379 EXPECT_TRUE(device_->enabled_pending_);
380}
381
Thieu Lefb46caf2012-03-08 11:57:15 -0800382TEST_F(DeviceTest, Start) {
Paul Stewart8c116a92012-05-02 18:30:03 -0700383 EXPECT_FALSE(device_->running_);
384 EXPECT_FALSE(device_->enabled_);
385 EXPECT_FALSE(device_->enabled_pending_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500386 device_->SetEnabled(true);
Paul Stewart8c116a92012-05-02 18:30:03 -0700387 EXPECT_TRUE(device_->running_);
388 EXPECT_TRUE(device_->enabled_pending_);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700389 device_->OnEnabledStateChanged(ResultCallback(),
390 Error(Error::kOperationFailed));
391 EXPECT_FALSE(device_->enabled_pending_);
Thieu Lefb46caf2012-03-08 11:57:15 -0800392}
393
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700394TEST_F(DeviceTest, Stop) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500395 device_->enabled_ = true;
396 device_->enabled_pending_ = true;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700397 device_->ipconfig_ = new IPConfig(&control_interface_, kDeviceName);
398 scoped_refptr<MockService> service(
399 new NiceMock<MockService>(&control_interface_,
400 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800401 metrics(),
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700402 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800403 SelectService(service);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700404
405 EXPECT_CALL(*service.get(), state()).
406 WillRepeatedly(Return(Service::kStateConnected));
407 EXPECT_CALL(*dynamic_cast<DeviceMockAdaptor *>(device_->adaptor_.get()),
408 UpdateEnabled());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500409 EXPECT_CALL(*dynamic_cast<DeviceMockAdaptor *>(device_->adaptor_.get()),
410 EmitBoolChanged(flimflam::kPoweredProperty, false));
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700411 EXPECT_CALL(rtnl_handler_, SetInterfaceFlags(_, 0, IFF_UP));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500412 device_->SetEnabled(false);
413 device_->OnEnabledStateChanged(ResultCallback(), Error());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700414
415 EXPECT_FALSE(device_->ipconfig_.get());
416 EXPECT_FALSE(device_->selected_service_.get());
417}
418
Ben Chanad663e12013-01-08 01:58:47 -0800419TEST_F(DeviceTest, Reset) {
420 Error e;
421 device_->Reset(&e, ResultCallback());
422 EXPECT_EQ(Error::kNotSupported, e.type());
423 EXPECT_EQ("Device doesn't support Reset.", e.message());
424}
425
mukesh agrawal784566d2012-08-08 18:32:58 -0700426TEST_F(DeviceTest, ResumeWithIPConfig) {
427 scoped_refptr<MockIPConfig> ipconfig =
428 new MockIPConfig(control_interface(), kDeviceName);
429 device_->set_ipconfig(ipconfig);
430 EXPECT_CALL(*ipconfig, RenewIP());
431 device_->OnAfterResume();
432}
433
434TEST_F(DeviceTest, ResumeWithoutIPConfig) {
435 // Just test that we don't crash in this case.
436 ASSERT_EQ(NULL, device_->ipconfig().get());
437 device_->OnAfterResume();
438}
439
Paul Stewart036dba02012-08-07 12:34:41 -0700440TEST_F(DeviceTest, LinkMonitor) {
441 scoped_refptr<MockConnection> connection(
442 new StrictMock<MockConnection>(&device_info_));
443 MockManager manager(control_interface(),
444 dispatcher(),
445 metrics(),
446 glib());
447 scoped_refptr<MockService> service(
448 new StrictMock<MockService>(control_interface(),
449 dispatcher(),
450 metrics(),
451 &manager));
452 SelectService(service);
453 SetConnection(connection.get());
454 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
455 SetLinkMonitor(link_monitor); // Passes ownership.
456 SetManager(&manager);
457 EXPECT_CALL(*link_monitor, Start()).Times(0);
458 EXPECT_CALL(manager, IsTechnologyLinkMonitorEnabled(Technology::kUnknown))
459 .WillOnce(Return(false))
460 .WillRepeatedly(Return(true));
461 EXPECT_FALSE(StartLinkMonitor());
462
463 EXPECT_CALL(*link_monitor, Start())
464 .WillOnce(Return(false))
465 .WillOnce(Return(true));
466 EXPECT_FALSE(StartLinkMonitor());
467 EXPECT_TRUE(StartLinkMonitor());
468
469 unsigned int kResponseTime = 123;
470 EXPECT_CALL(*link_monitor, GetResponseTimeMilliseconds())
471 .WillOnce(Return(kResponseTime));
472 {
473 Error error;
474 EXPECT_EQ(kResponseTime, GetLinkMonitorResponseTime(&error));
475 EXPECT_TRUE(error.IsSuccess());
476 }
477 StopLinkMonitor();
478 {
479 Error error;
480 EXPECT_EQ(0, GetLinkMonitorResponseTime(&error));
481 EXPECT_FALSE(error.IsSuccess());
482 }
483}
484
Paul Stewartc8860612012-09-28 07:36:21 -0700485TEST_F(DeviceTest, LinkMonitorCancelledOnSelectService) {
486 scoped_refptr<MockConnection> connection(
487 new StrictMock<MockConnection>(&device_info_));
488 MockManager manager(control_interface(),
489 dispatcher(),
490 metrics(),
491 glib());
492 scoped_refptr<MockService> service(
493 new StrictMock<MockService>(control_interface(),
494 dispatcher(),
495 metrics(),
496 &manager));
497 SelectService(service);
498 SetConnection(connection.get());
499 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
500 SetLinkMonitor(link_monitor); // Passes ownership.
501 SetManager(&manager);
502 EXPECT_CALL(*service.get(), state())
503 .WillOnce(Return(Service::kStateIdle));
504 EXPECT_CALL(*service.get(), SetState(_));
505 EXPECT_CALL(*service.get(), SetConnection(_));
506 EXPECT_TRUE(HasLinkMonitor());
507 SelectService(NULL);
508 EXPECT_FALSE(HasLinkMonitor());
509}
510
Paul Stewartc681fa02012-03-02 19:40:04 -0800511class DevicePortalDetectionTest : public DeviceTest {
512 public:
513 DevicePortalDetectionTest()
514 : connection_(new StrictMock<MockConnection>(&device_info_)),
515 manager_(control_interface(),
516 dispatcher(),
517 metrics(),
518 glib()),
519 service_(new StrictMock<MockService>(control_interface(),
520 dispatcher(),
521 metrics(),
522 &manager_)),
523 portal_detector_(new StrictMock<MockPortalDetector>(connection_)) {}
524 virtual ~DevicePortalDetectionTest() {}
525 virtual void SetUp() {
526 DeviceTest::SetUp();
527 SelectService(service_);
528 SetConnection(connection_.get());
529 device_->portal_detector_.reset(portal_detector_); // Passes ownership.
Paul Stewart036dba02012-08-07 12:34:41 -0700530 SetManager(&manager_);
Paul Stewartc681fa02012-03-02 19:40:04 -0800531 }
532
533 protected:
Thieu Le85e050b2012-03-13 15:04:38 -0700534 static const int kPortalAttempts;
535
Paul Stewartc681fa02012-03-02 19:40:04 -0800536 bool StartPortalDetection() { return device_->StartPortalDetection(); }
537 void StopPortalDetection() { device_->StopPortalDetection(); }
538
539 void PortalDetectorCallback(const PortalDetector::Result &result) {
540 device_->PortalDetectorCallback(result);
541 }
542 bool RequestPortalDetection() {
543 return device_->RequestPortalDetection();
544 }
545 void SetServiceConnectedState(Service::ConnectState state) {
546 device_->SetServiceConnectedState(state);
547 }
548 void ExpectPortalDetectorReset() {
549 EXPECT_FALSE(device_->portal_detector_.get());
550 }
551 void ExpectPortalDetectorSet() {
552 EXPECT_TRUE(device_->portal_detector_.get());
553 }
554 void ExpectPortalDetectorIsMock() {
555 EXPECT_EQ(portal_detector_, device_->portal_detector_.get());
556 }
557 scoped_refptr<MockConnection> connection_;
558 StrictMock<MockManager> manager_;
559 scoped_refptr<MockService> service_;
560
561 // Used only for EXPECT_CALL(). Object is owned by device.
562 MockPortalDetector *portal_detector_;
563};
564
Thieu Le85e050b2012-03-13 15:04:38 -0700565const int DevicePortalDetectionTest::kPortalAttempts = 2;
566
Paul Stewartd215af62012-04-24 23:25:50 -0700567TEST_F(DevicePortalDetectionTest, ServicePortalDetectionDisabled) {
568 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
569 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800570 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800571 .WillRepeatedly(Return(true));
Paul Stewartd215af62012-04-24 23:25:50 -0700572 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
573 EXPECT_FALSE(StartPortalDetection());
574}
575
576TEST_F(DevicePortalDetectionTest, TechnologyPortalDetectionDisabled) {
577 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
578 .WillOnce(Return(false));
579 EXPECT_CALL(*service_.get(), IsConnected())
580 .WillRepeatedly(Return(true));
581 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
582 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800583 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -0800584 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800585 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -0800586 EXPECT_FALSE(StartPortalDetection());
587}
588
Paul Stewartc681fa02012-03-02 19:40:04 -0800589TEST_F(DevicePortalDetectionTest, PortalDetectionProxyConfig) {
Paul Stewartd215af62012-04-24 23:25:50 -0700590 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
591 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800592 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800593 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800594 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -0800595 .WillOnce(Return(true));
Paul Stewartd215af62012-04-24 23:25:50 -0700596 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
597 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800598 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -0800599 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800600 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -0800601 EXPECT_FALSE(StartPortalDetection());
602}
603
Paul Stewartc681fa02012-03-02 19:40:04 -0800604TEST_F(DevicePortalDetectionTest, PortalDetectionBadUrl) {
Paul Stewartd215af62012-04-24 23:25:50 -0700605 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
606 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800607 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800608 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800609 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -0800610 .WillOnce(Return(false));
Paul Stewartd215af62012-04-24 23:25:50 -0700611 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
612 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800613 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -0800614 .WillOnce(Return(true));
615 const string portal_url;
Paul Stewartc681fa02012-03-02 19:40:04 -0800616 EXPECT_CALL(manager_, GetPortalCheckURL())
Paul Stewart20088d82012-02-16 06:58:55 -0800617 .WillRepeatedly(ReturnRef(portal_url));
Paul Stewartc681fa02012-03-02 19:40:04 -0800618 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -0800619 EXPECT_FALSE(StartPortalDetection());
620}
621
Paul Stewartc681fa02012-03-02 19:40:04 -0800622TEST_F(DevicePortalDetectionTest, PortalDetectionStart) {
Paul Stewartd215af62012-04-24 23:25:50 -0700623 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
624 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -0800625 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800626 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800627 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -0800628 .WillOnce(Return(false));
Paul Stewartd215af62012-04-24 23:25:50 -0700629 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
630 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800631 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -0800632 .WillOnce(Return(true));
633 const string portal_url(PortalDetector::kDefaultURL);
Paul Stewartc681fa02012-03-02 19:40:04 -0800634 EXPECT_CALL(manager_, GetPortalCheckURL())
Paul Stewart20088d82012-02-16 06:58:55 -0800635 .WillRepeatedly(ReturnRef(portal_url));
Paul Stewartc681fa02012-03-02 19:40:04 -0800636 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline))
Paul Stewart20088d82012-02-16 06:58:55 -0800637 .Times(0);
Paul Stewart20088d82012-02-16 06:58:55 -0800638 const string kInterfaceName("int0");
Paul Stewartc681fa02012-03-02 19:40:04 -0800639 EXPECT_CALL(*connection_.get(), interface_name())
640 .WillRepeatedly(ReturnRef(kInterfaceName));
Paul Stewart20088d82012-02-16 06:58:55 -0800641 const vector<string> kDNSServers;
Paul Stewartc681fa02012-03-02 19:40:04 -0800642 EXPECT_CALL(*connection_.get(), dns_servers())
643 .WillRepeatedly(ReturnRef(kDNSServers));
Paul Stewart20088d82012-02-16 06:58:55 -0800644 EXPECT_TRUE(StartPortalDetection());
645
646 // Drop all references to device_info before it falls out of scope.
647 SetConnection(NULL);
648 StopPortalDetection();
649}
650
Paul Stewartc681fa02012-03-02 19:40:04 -0800651TEST_F(DevicePortalDetectionTest, PortalDetectionNonFinal) {
652 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800653 .Times(0);
Paul Stewartc681fa02012-03-02 19:40:04 -0800654 EXPECT_CALL(*service_.get(), SetState(_))
Paul Stewart20088d82012-02-16 06:58:55 -0800655 .Times(0);
Paul Stewart20088d82012-02-16 06:58:55 -0800656 PortalDetectorCallback(PortalDetector::Result(
657 PortalDetector::kPhaseUnknown,
658 PortalDetector::kStatusFailure,
Thieu Le85e050b2012-03-13 15:04:38 -0700659 kPortalAttempts,
Paul Stewart20088d82012-02-16 06:58:55 -0800660 false));
661}
662
Paul Stewartc681fa02012-03-02 19:40:04 -0800663TEST_F(DevicePortalDetectionTest, PortalDetectionFailure) {
664 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800665 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800666 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
Thieu Le85e050b2012-03-13 15:04:38 -0700667 EXPECT_CALL(metrics_,
668 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
669 Metrics::kPortalResultConnectionFailure,
670 Metrics::kPortalResultMax));
671 EXPECT_CALL(metrics_,
672 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
673 _, _, _, _)).Times(0);
674 EXPECT_CALL(metrics_,
675 SendToUMA("Network.Shill.Unknown.PortalAttempts",
676 kPortalAttempts,
677 Metrics::kMetricPortalAttemptsMin,
678 Metrics::kMetricPortalAttemptsMax,
679 Metrics::kMetricPortalAttemptsNumBuckets));
Paul Stewartc681fa02012-03-02 19:40:04 -0800680 EXPECT_CALL(*connection_.get(), is_default())
681 .WillOnce(Return(false));
Paul Stewart20088d82012-02-16 06:58:55 -0800682 PortalDetectorCallback(PortalDetector::Result(
Thieu Le85e050b2012-03-13 15:04:38 -0700683 PortalDetector::kPhaseConnection,
Paul Stewart20088d82012-02-16 06:58:55 -0800684 PortalDetector::kStatusFailure,
Thieu Le85e050b2012-03-13 15:04:38 -0700685 kPortalAttempts,
Paul Stewart20088d82012-02-16 06:58:55 -0800686 true));
687}
688
Paul Stewartc681fa02012-03-02 19:40:04 -0800689TEST_F(DevicePortalDetectionTest, PortalDetectionSuccess) {
690 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800691 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800692 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Thieu Le85e050b2012-03-13 15:04:38 -0700693 EXPECT_CALL(metrics_,
694 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
695 Metrics::kPortalResultSuccess,
696 Metrics::kPortalResultMax));
697 EXPECT_CALL(metrics_,
698 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
699 kPortalAttempts,
700 Metrics::kMetricPortalAttemptsToOnlineMin,
701 Metrics::kMetricPortalAttemptsToOnlineMax,
702 Metrics::kMetricPortalAttemptsToOnlineNumBuckets));
703 EXPECT_CALL(metrics_,
704 SendToUMA("Network.Shill.Unknown.PortalAttempts",
705 _, _, _, _)).Times(0);
Paul Stewart20088d82012-02-16 06:58:55 -0800706 PortalDetectorCallback(PortalDetector::Result(
Thieu Le85e050b2012-03-13 15:04:38 -0700707 PortalDetector::kPhaseContent,
Paul Stewart20088d82012-02-16 06:58:55 -0800708 PortalDetector::kStatusSuccess,
Thieu Le85e050b2012-03-13 15:04:38 -0700709 kPortalAttempts,
710 true));
711}
712
713TEST_F(DevicePortalDetectionTest, PortalDetectionSuccessAfterFailure) {
714 EXPECT_CALL(*service_.get(), IsConnected())
715 .WillRepeatedly(Return(true));
716 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
717 EXPECT_CALL(metrics_,
718 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
719 Metrics::kPortalResultConnectionFailure,
720 Metrics::kPortalResultMax));
721 EXPECT_CALL(metrics_,
722 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
723 _, _, _, _)).Times(0);
724 EXPECT_CALL(metrics_,
725 SendToUMA("Network.Shill.Unknown.PortalAttempts",
726 kPortalAttempts,
727 Metrics::kMetricPortalAttemptsMin,
728 Metrics::kMetricPortalAttemptsMax,
729 Metrics::kMetricPortalAttemptsNumBuckets));
730 EXPECT_CALL(*connection_.get(), is_default())
731 .WillOnce(Return(false));
732 PortalDetectorCallback(PortalDetector::Result(
733 PortalDetector::kPhaseConnection,
734 PortalDetector::kStatusFailure,
735 kPortalAttempts,
736 true));
737 Mock::VerifyAndClearExpectations(&metrics_);
738
739 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
740 EXPECT_CALL(metrics_,
741 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
742 Metrics::kPortalResultSuccess,
743 Metrics::kPortalResultMax));
744 EXPECT_CALL(metrics_,
745 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
746 kPortalAttempts * 2,
747 Metrics::kMetricPortalAttemptsToOnlineMin,
748 Metrics::kMetricPortalAttemptsToOnlineMax,
749 Metrics::kMetricPortalAttemptsToOnlineNumBuckets));
750 EXPECT_CALL(metrics_,
751 SendToUMA("Network.Shill.Unknown.PortalAttempts",
752 _, _, _, _)).Times(0);
753 PortalDetectorCallback(PortalDetector::Result(
754 PortalDetector::kPhaseContent,
755 PortalDetector::kStatusSuccess,
756 kPortalAttempts,
Paul Stewart20088d82012-02-16 06:58:55 -0800757 true));
758}
759
Paul Stewartc681fa02012-03-02 19:40:04 -0800760TEST_F(DevicePortalDetectionTest, RequestPortalDetection) {
761 EXPECT_CALL(*service_.get(), state())
762 .WillOnce(Return(Service::kStateOnline))
763 .WillRepeatedly(Return(Service::kStatePortal));
764 EXPECT_FALSE(RequestPortalDetection());
765
766 EXPECT_CALL(*connection_.get(), is_default())
767 .WillOnce(Return(false))
768 .WillRepeatedly(Return(true));
769 EXPECT_FALSE(RequestPortalDetection());
770
771 EXPECT_CALL(*portal_detector_, IsInProgress())
772 .WillOnce(Return(true));
773 // Portal detection already running.
774 EXPECT_TRUE(RequestPortalDetection());
775
776 // Make sure our running mock portal detector was not replaced.
777 ExpectPortalDetectorIsMock();
778
779 // Throw away our pre-fabricated portal detector, and have the device create
780 // a new one.
781 StopPortalDetection();
Paul Stewartd215af62012-04-24 23:25:50 -0700782 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
783 .WillRepeatedly(Return(false));
784 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
785 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -0800786 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
787 .WillRepeatedly(Return(true));
788 EXPECT_CALL(*service_.get(), HasProxyConfig())
789 .WillRepeatedly(Return(false));
790 const string kPortalCheckURL("http://portal");
791 EXPECT_CALL(manager_, GetPortalCheckURL())
792 .WillOnce(ReturnRef(kPortalCheckURL));
793 const string kInterfaceName("int0");
794 EXPECT_CALL(*connection_.get(), interface_name())
795 .WillRepeatedly(ReturnRef(kInterfaceName));
796 const vector<string> kDNSServers;
797 EXPECT_CALL(*connection_.get(), dns_servers())
798 .WillRepeatedly(ReturnRef(kDNSServers));
799 EXPECT_TRUE(RequestPortalDetection());
800}
801
802TEST_F(DevicePortalDetectionTest, NotConnected) {
803 EXPECT_CALL(*service_.get(), IsConnected())
804 .WillOnce(Return(false));
805 SetServiceConnectedState(Service::kStatePortal);
806 // We don't check for the portal detector to be reset here, because
807 // it would have been reset as a part of disconnection.
808}
809
810TEST_F(DevicePortalDetectionTest, NotPortal) {
811 EXPECT_CALL(*service_.get(), IsConnected())
812 .WillOnce(Return(true));
813 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
814 SetServiceConnectedState(Service::kStateOnline);
815 ExpectPortalDetectorReset();
816}
817
818TEST_F(DevicePortalDetectionTest, NotDefault) {
819 EXPECT_CALL(*service_.get(), IsConnected())
820 .WillOnce(Return(true));
821 EXPECT_CALL(*connection_.get(), is_default())
822 .WillOnce(Return(false));
823 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
824 SetServiceConnectedState(Service::kStatePortal);
825 ExpectPortalDetectorReset();
826}
827
828TEST_F(DevicePortalDetectionTest, PortalIntervalIsZero) {
829 EXPECT_CALL(*service_.get(), IsConnected())
830 .WillOnce(Return(true));
831 EXPECT_CALL(*connection_.get(), is_default())
832 .WillOnce(Return(true));
833 EXPECT_CALL(manager_, GetPortalCheckInterval())
834 .WillOnce(Return(0));
835 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
836 SetServiceConnectedState(Service::kStatePortal);
837 ExpectPortalDetectorReset();
838}
839
840TEST_F(DevicePortalDetectionTest, RestartPortalDetection) {
841 EXPECT_CALL(*service_.get(), IsConnected())
842 .WillOnce(Return(true));
843 EXPECT_CALL(*connection_.get(), is_default())
844 .WillOnce(Return(true));
845 const int kPortalDetectionInterval = 10;
846 EXPECT_CALL(manager_, GetPortalCheckInterval())
847 .Times(AtLeast(1))
848 .WillRepeatedly(Return(kPortalDetectionInterval));
849 const string kPortalCheckURL("http://portal");
850 EXPECT_CALL(manager_, GetPortalCheckURL())
851 .WillOnce(ReturnRef(kPortalCheckURL));
852 EXPECT_CALL(*portal_detector_, StartAfterDelay(kPortalCheckURL,
853 kPortalDetectionInterval))
854 .WillOnce(Return(true));
855 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
856 SetServiceConnectedState(Service::kStatePortal);
857 ExpectPortalDetectorSet();
858}
859
Paul Stewartc8860612012-09-28 07:36:21 -0700860TEST_F(DevicePortalDetectionTest, CancelledOnSelectService) {
861 ExpectPortalDetectorSet();
862 EXPECT_CALL(*service_.get(), state())
863 .WillOnce(Return(Service::kStateIdle));
864 EXPECT_CALL(*service_.get(), SetState(_));
865 EXPECT_CALL(*service_.get(), SetConnection(_));
866 SelectService(NULL);
867 ExpectPortalDetectorReset();
868}
869
Paul Stewart6ff27f52012-07-11 06:51:41 -0700870class DeviceByteCountTest : public DeviceTest {
871 public:
872 DeviceByteCountTest()
873 : manager_(control_interface(),
874 dispatcher(),
875 metrics(),
876 glib()),
877 rx_byte_count_(0),
878 tx_byte_count_(0),
879 rx_stored_byte_count_(0),
880 tx_stored_byte_count_(0) {}
881 virtual ~DeviceByteCountTest() {}
882
883 virtual void SetUp() {
884 DeviceTest::SetUp();
885 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
886 EXPECT_CALL(device_info_, GetByteCounts(kDeviceInterfaceIndex, _, _))
887 .WillRepeatedly(Invoke(this, &DeviceByteCountTest::ReturnByteCounts));
888 const string id = device_->GetStorageIdentifier();
889 EXPECT_CALL(storage_, ContainsGroup(id)).WillRepeatedly(Return(true));
890 EXPECT_CALL(storage_, GetUint64(id, Device::kStorageReceiveByteCount, _))
891 .WillRepeatedly(
892 Invoke(this, &DeviceByteCountTest::GetStoredReceiveCount));
893 EXPECT_CALL(storage_, GetUint64(id, Device::kStorageTransmitByteCount, _))
894 .WillRepeatedly(
895 Invoke(this, &DeviceByteCountTest::GetStoredTransmitCount));
896 }
897
898 bool ReturnByteCounts(int interface_index, uint64 *rx, uint64 *tx) {
899 *rx = rx_byte_count_;
900 *tx = tx_byte_count_;
901 return true;
902 }
903
904 bool ExpectByteCounts(DeviceRefPtr device,
905 int64 expected_rx, int64 expected_tx) {
906 int64 actual_rx = device->GetReceiveByteCount(NULL);
907 int64 actual_tx = device->GetTransmitByteCount(NULL);
908 EXPECT_EQ(expected_rx, actual_rx);
909 EXPECT_EQ(expected_tx, actual_tx);
910 return expected_rx == actual_rx && expected_tx == actual_tx;
911 }
912
913 void ExpectSavedCounts(DeviceRefPtr device,
914 int64 expected_rx, int64 expected_tx) {
915 EXPECT_CALL(storage_,
916 SetUint64(_, Device::kStorageReceiveByteCount, expected_rx))
917 .WillOnce(Return(true));
918 EXPECT_CALL(storage_,
919 SetUint64(_, Device::kStorageTransmitByteCount, expected_tx))
920 .WillOnce(Return(true));
921 EXPECT_TRUE(device->Save(&storage_));
922 }
923
924
925 bool GetStoredReceiveCount(const string &group, const string &key,
926 uint64 *value) {
927 if (!rx_stored_byte_count_) {
928 return false;
929 }
930 *value = rx_stored_byte_count_;
931 return true;
932 }
933
934 bool GetStoredTransmitCount(const string &group, const string &key,
935 uint64 *value) {
936 if (!tx_stored_byte_count_) {
937 return false;
938 }
939 *value = tx_stored_byte_count_;
940 return true;
941 }
942
943 protected:
944 NiceMock<MockManager> manager_;
945 NiceMock<MockStore> storage_;
946 uint64 rx_byte_count_;
947 uint64 tx_byte_count_;
948 uint64 rx_stored_byte_count_;
949 uint64 tx_stored_byte_count_;
950};
951
952
953TEST_F(DeviceByteCountTest, GetByteCounts) {
954 // On Device initialization, byte counts should be zero, independent of
955 // the byte counts reported by the interface.
956 rx_byte_count_ = 123;
957 tx_byte_count_ = 456;
958 DeviceRefPtr device(new TestDevice(control_interface(),
959 dispatcher(),
960 NULL,
961 &manager_,
962 kDeviceName,
963 kDeviceAddress,
964 kDeviceInterfaceIndex,
965 Technology::kUnknown));
966 EXPECT_TRUE(ExpectByteCounts(device, 0, 0));
967
968 // Device should report any increase in the byte counts reported in the
969 // interface.
970 const int64 delta_rx_count = 789;
971 const int64 delta_tx_count = 12;
972 rx_byte_count_ += delta_rx_count;
973 tx_byte_count_ += delta_tx_count;
974 EXPECT_TRUE(ExpectByteCounts(device, delta_rx_count, delta_tx_count));
975
976 // Expect the correct values to be saved to the profile.
977 ExpectSavedCounts(device, delta_rx_count, delta_tx_count);
978
979 // If Device is loaded from a profile that does not contain stored byte
980 // counts, the byte counts reported should remain unchanged.
981 EXPECT_TRUE(device->Load(&storage_));
982 EXPECT_TRUE(ExpectByteCounts(device, delta_rx_count, delta_tx_count));
983
984 // If Device is loaded from a profile that contains stored byte
985 // counts, the byte counts reported should now reflect the stored values.
986 rx_stored_byte_count_ = 345;
987 tx_stored_byte_count_ = 678;
988 EXPECT_TRUE(device->Load(&storage_));
989 EXPECT_TRUE(ExpectByteCounts(
990 device, rx_stored_byte_count_, tx_stored_byte_count_));
991
992 // Increases to the interface receive count should be reflected as offsets
993 // to the stored byte counts.
994 rx_byte_count_ += delta_rx_count;
995 tx_byte_count_ += delta_tx_count;
996 EXPECT_TRUE(ExpectByteCounts(device,
997 rx_stored_byte_count_ + delta_rx_count,
998 tx_stored_byte_count_ + delta_tx_count));
999
1000 // Expect the correct values to be saved to the profile.
1001 ExpectSavedCounts(device,
1002 rx_stored_byte_count_ + delta_rx_count,
1003 tx_stored_byte_count_ + delta_tx_count);
1004
1005 // Expect that after resetting byte counts, read-back values return to zero,
1006 // and that the device requests this information to be persisted.
1007 EXPECT_CALL(manager_, UpdateDevice(device));
1008 device->ResetByteCounters();
1009 EXPECT_TRUE(ExpectByteCounts(device, 0, 0));
1010}
1011
Darin Petkovafa6fc42011-06-21 16:21:08 -07001012} // namespace shill