blob: 626ecf07a01eb50882ca44efddce2af97e2655df [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>
Alex Vakulenkoa41ab512014-07-23 14:24:23 -07009#include <linux/if.h> // NOLINT - Needs typedefs from sys/socket.h.
Chris Masone34af2182011-08-22 11:59:36 -070010
Chris Masone3bd3c8c2011-06-13 08:20:26 -070011#include <map>
Ben Chancd477322014-10-17 14:19:30 -070012#include <memory>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070013#include <string>
14#include <vector>
15
Arman Ugurayf84a4242013-04-09 20:01:07 -070016#include <base/bind.h>
17#include <base/callback.h>
Ben Chancc67c522014-09-03 07:19:18 -070018#include <base/macros.h>
Arman Ugurayf84a4242013-04-09 20:01:07 -070019#include <base/memory/weak_ptr.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070020#include <chromeos/dbus/service_constants.h>
Chris Masone34af2182011-08-22 11:59:36 -070021#include <dbus-c++/dbus.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070022#include <gmock/gmock.h>
Chris Masone34af2182011-08-22 11:59:36 -070023#include <gtest/gtest.h>
Chris Masone3bd3c8c2011-06-13 08:20:26 -070024
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -070025#include "shill/connectivity_trial.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070026#include "shill/dbus_adaptor.h"
27#include "shill/dhcp_provider.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070028#include "shill/event_dispatcher.h"
Chris Masone95207da2011-06-29 16:50:49 -070029#include "shill/mock_adaptors.h"
Paul Stewart20088d82012-02-16 06:58:55 -080030#include "shill/mock_connection.h"
Arman Ugurayf84a4242013-04-09 20:01:07 -070031#include "shill/mock_connection_health_checker.h"
Ben Chanb061f892013-02-27 17:46:55 -080032#include "shill/mock_control.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070033#include "shill/mock_device.h"
Paul Stewart20088d82012-02-16 06:58:55 -080034#include "shill/mock_device_info.h"
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070035#include "shill/mock_dhcp_config.h"
36#include "shill/mock_dhcp_provider.h"
Peter Qiud670d032014-06-03 15:04:43 -070037#include "shill/mock_dns_server_tester.h"
Peter Qiu25f1be62014-08-12 10:42:27 -070038#include "shill/mock_event_dispatcher.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070039#include "shill/mock_glib.h"
Prathmesh Prabhuba99b592013-04-17 15:13:14 -070040#include "shill/mock_ip_address_store.h"
Chris Masone34af2182011-08-22 11:59:36 -070041#include "shill/mock_ipconfig.h"
Paul Stewart036dba02012-08-07 12:34:41 -070042#include "shill/mock_link_monitor.h"
Paul Stewart20088d82012-02-16 06:58:55 -080043#include "shill/mock_manager.h"
Thieu Le85e050b2012-03-13 15:04:38 -070044#include "shill/mock_metrics.h"
Paul Stewartc681fa02012-03-02 19:40:04 -080045#include "shill/mock_portal_detector.h"
Paul Stewart03dba0b2011-08-22 16:32:45 -070046#include "shill/mock_service.h"
Chris Masone5dec5f42011-07-22 14:07:55 -070047#include "shill/mock_store.h"
Ben Chanb061f892013-02-27 17:46:55 -080048#include "shill/mock_traffic_monitor.h"
Peter Qiu8d6b5972014-10-28 15:33:34 -070049#include "shill/net/mock_rtnl_handler.h"
50#include "shill/net/mock_time.h"
51#include "shill/net/ndisc.h"
Paul Stewart20088d82012-02-16 06:58:55 -080052#include "shill/portal_detector.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070053#include "shill/property_store_unittest.h"
mukesh agrawalcc0fded2012-05-09 13:40:58 -070054#include "shill/static_ip_parameters.h"
Gaurav Shah435de2c2011-11-17 19:01:07 -080055#include "shill/technology.h"
Paul Stewartd4f26482014-04-25 19:12:03 -070056#include "shill/testing.h"
Paul Stewartfa11e282013-12-02 22:04:25 -080057#include "shill/tethering.h"
Ben Chanb061f892013-02-27 17:46:55 -080058#include "shill/traffic_monitor.h"
Chris Masone3bd3c8c2011-06-13 08:20:26 -070059
Arman Ugurayf84a4242013-04-09 20:01:07 -070060using base::Bind;
61using base::Callback;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070062using std::map;
63using std::string;
64using std::vector;
65using ::testing::_;
mukesh agrawalcc0fded2012-05-09 13:40:58 -070066using ::testing::AnyNumber;
Chris Masone5dec5f42011-07-22 14:07:55 -070067using ::testing::AtLeast;
Arman Ugurayf84a4242013-04-09 20:01:07 -070068using ::testing::DefaultValue;
Paul Stewartd4f26482014-04-25 19:12:03 -070069using ::testing::DoAll;
Paul Stewart6ff27f52012-07-11 06:51:41 -070070using ::testing::Invoke;
Thieu Le85e050b2012-03-13 15:04:38 -070071using ::testing::Mock;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070072using ::testing::NiceMock;
73using ::testing::Return;
Paul Stewart20088d82012-02-16 06:58:55 -080074using ::testing::ReturnRef;
Paul Stewartd4f26482014-04-25 19:12:03 -070075using ::testing::SetArgPointee;
Ben Chanbcc6e012013-11-04 14:28:37 -080076using ::testing::StrEq;
Paul Stewart03dba0b2011-08-22 16:32:45 -070077using ::testing::StrictMock;
Chris Masone3bd3c8c2011-06-13 08:20:26 -070078using ::testing::Test;
Chris Masone34af2182011-08-22 11:59:36 -070079using ::testing::Values;
Darin Petkovafa6fc42011-06-21 16:21:08 -070080
81namespace shill {
82
Eric Shienbrood9a245532012-03-07 14:20:39 -050083class TestDevice : public Device {
84 public:
85 TestDevice(ControlInterface *control_interface,
86 EventDispatcher *dispatcher,
87 Metrics *metrics,
88 Manager *manager,
89 const std::string &link_name,
90 const std::string &address,
91 int interface_index,
92 Technology::Identifier technology)
93 : Device(control_interface, dispatcher, metrics, manager, link_name,
Ben Chanbcc6e012013-11-04 14:28:37 -080094 address, interface_index, technology) {
95 ON_CALL(*this, IsIPv6Allowed())
96 .WillByDefault(Invoke(this, &TestDevice::DeviceIsIPv6Allowed));
97 ON_CALL(*this, SetIPFlag(_, _, _))
98 .WillByDefault(Invoke(this, &TestDevice::DeviceSetIPFlag));
Peter Qiudc335f82014-05-15 10:33:17 -070099 ON_CALL(*this, IsTrafficMonitorEnabled())
100 .WillByDefault(Invoke(this,
101 &TestDevice::DeviceIsTrafficMonitorEnabled));
Peter Qiu6f5618b2014-06-05 15:19:01 -0700102 ON_CALL(*this, StartDNSTest(_, _, _))
103 .WillByDefault(Invoke(
104 this,
105 &TestDevice::DeviceStartDNSTest));
Ben Chanbcc6e012013-11-04 14:28:37 -0800106 }
107
Eric Shienbrood9a245532012-03-07 14:20:39 -0500108 ~TestDevice() {}
Ben Chanbcc6e012013-11-04 14:28:37 -0800109
Eric Shienbrood9a245532012-03-07 14:20:39 -0500110 virtual void Start(Error *error,
Jason Glasgow4a490792012-04-10 15:02:05 -0400111 const EnabledStateChangedCallback &callback) {
112 DCHECK(error);
113 }
Ben Chanbcc6e012013-11-04 14:28:37 -0800114
Eric Shienbrood9a245532012-03-07 14:20:39 -0500115 virtual void Stop(Error *error,
Jason Glasgow4a490792012-04-10 15:02:05 -0400116 const EnabledStateChangedCallback &callback) {
117 DCHECK(error);
118 }
Ben Chanbcc6e012013-11-04 14:28:37 -0800119
120 MOCK_CONST_METHOD0(IsIPv6Allowed, bool());
Peter Qiudc335f82014-05-15 10:33:17 -0700121 MOCK_CONST_METHOD0(IsTrafficMonitorEnabled, bool());
Ben Chanbcc6e012013-11-04 14:28:37 -0800122
123 MOCK_METHOD3(SetIPFlag, bool(IPAddress::Family family,
124 const std::string &flag,
125 const std::string &value));
126
Peter Qiu6f5618b2014-06-05 15:19:01 -0700127 MOCK_METHOD3(StartDNSTest, bool(
128 const std::vector<std::string> &dns_servers,
129 const bool retry_until_success,
130 const base::Callback<void(const DNSServerTester::Status)> &callback));
131
Ben Chanbcc6e012013-11-04 14:28:37 -0800132 virtual bool DeviceIsIPv6Allowed() const {
133 return Device::IsIPv6Allowed();
134 }
135
Peter Qiudc335f82014-05-15 10:33:17 -0700136 virtual bool DeviceIsTrafficMonitorEnabled() const {
137 return Device::IsTrafficMonitorEnabled();
138 }
139
Ben Chanbcc6e012013-11-04 14:28:37 -0800140 virtual bool DeviceSetIPFlag(IPAddress::Family family,
141 const std::string &flag,
142 const std::string &value) {
143 return Device::SetIPFlag(family, flag, value);
144 }
Peter Qiu6f5618b2014-06-05 15:19:01 -0700145
146 virtual bool DeviceStartDNSTest(
147 const std::vector<std::string> &dns_servers,
148 const bool retry_until_success,
149 const base::Callback<void(const DNSServerTester::Status)> &callback) {
150 return Device::StartDNSTest(dns_servers, retry_until_success, callback);
151 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500152};
153
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700154class DeviceTest : public PropertyStoreTest {
Darin Petkovafa6fc42011-06-21 16:21:08 -0700155 public:
156 DeviceTest()
Eric Shienbrood9a245532012-03-07 14:20:39 -0500157 : device_(new TestDevice(control_interface(),
158 dispatcher(),
Ben Chancc225ef2014-09-30 13:26:51 -0700159 nullptr,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500160 manager(),
161 kDeviceName,
162 kDeviceAddress,
163 kDeviceInterfaceIndex,
164 Technology::kUnknown)),
Ben Chancc225ef2014-09-30 13:26:51 -0700165 device_info_(control_interface(), nullptr, nullptr, nullptr),
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800166 metrics_(dispatcher()) {
Chris Masone2176a882011-09-14 22:29:15 -0700167 DHCPProvider::GetInstance()->glib_ = glib();
168 DHCPProvider::GetInstance()->control_interface_ = control_interface();
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700169 DHCPProvider::GetInstance()->dispatcher_ = dispatcher();
Peter Qiua0572032014-09-26 10:07:37 -0700170 device_->time_ = &time_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700171 }
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700172 virtual ~DeviceTest() {}
Darin Petkovafa6fc42011-06-21 16:21:08 -0700173
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700174 virtual void SetUp() {
Thieu Le85e050b2012-03-13 15:04:38 -0700175 device_->metrics_ = &metrics_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700176 device_->rtnl_handler_ = &rtnl_handler_;
177 }
178
Darin Petkovafa6fc42011-06-21 16:21:08 -0700179 protected:
Chris Masone626719f2011-08-18 16:58:48 -0700180 static const char kDeviceName[];
181 static const char kDeviceAddress[];
Thieu Lefb46caf2012-03-08 11:57:15 -0800182 static const int kDeviceInterfaceIndex;
Chris Masone626719f2011-08-18 16:58:48 -0700183
Paul Stewartc5099532013-12-12 07:53:15 -0800184 void OnIPConfigUpdated(const IPConfigRefPtr &ipconfig) {
185 device_->OnIPConfigUpdated(ipconfig);
186 }
187
188 void OnIPConfigFailed(const IPConfigRefPtr &ipconfig) {
189 device_->OnIPConfigFailed(ipconfig);
Paul Stewart20088d82012-02-16 06:58:55 -0800190 }
191
Paul Stewart1f916e42013-12-23 09:52:54 -0800192 void OnIPConfigExpired(const IPConfigRefPtr &ipconfig) {
193 device_->OnIPConfigExpired(ipconfig);
194 }
195
Paul Stewart20088d82012-02-16 06:58:55 -0800196 void SelectService(const ServiceRefPtr service) {
197 device_->SelectService(service);
198 }
199
Paul Stewart20088d82012-02-16 06:58:55 -0800200 void SetConnection(ConnectionRefPtr connection) {
201 device_->connection_ = connection;
202 }
203
Paul Stewart036dba02012-08-07 12:34:41 -0700204 void SetLinkMonitor(LinkMonitor *link_monitor) {
205 device_->set_link_monitor(link_monitor); // Passes ownership.
206 }
207
Paul Stewartc8860612012-09-28 07:36:21 -0700208 bool HasLinkMonitor() {
209 return device_->link_monitor();
210 }
211
Paul Stewart036dba02012-08-07 12:34:41 -0700212 bool StartLinkMonitor() {
213 return device_->StartLinkMonitor();
214 }
215
216 void StopLinkMonitor() {
217 device_->StopLinkMonitor();
218 }
219
Ben Chan7fab8972014-08-10 17:14:46 -0700220 uint64_t GetLinkMonitorResponseTime(Error *error) {
Paul Stewart036dba02012-08-07 12:34:41 -0700221 return device_->GetLinkMonitorResponseTime(error);
222 }
223
Peter Qiudc335f82014-05-15 10:33:17 -0700224 void SetTrafficMonitor(TrafficMonitor *traffic_monitor) {
225 device_->set_traffic_monitor(traffic_monitor); // Passes ownership.
226 }
227
228 void StartTrafficMonitor() {
229 device_->StartTrafficMonitor();
230 }
231
232 void StopTrafficMonitor() {
233 device_->StopTrafficMonitor();
234 }
235
236 void NetworkProblemDetected(int reason) {
237 device_->OnEncounterNetworkProblem(reason);
238 }
239
Paul Stewartd4f26482014-04-25 19:12:03 -0700240 DeviceMockAdaptor *GetDeviceMockAdaptor() {
241 return dynamic_cast<DeviceMockAdaptor *>(device_->adaptor_.get());
242 }
243
Paul Stewart036dba02012-08-07 12:34:41 -0700244 void SetManager(Manager *manager) {
245 device_->manager_ = manager;
246 }
247
Peter Qiub25083f2014-08-25 13:22:31 -0700248 void SetupIPv6Config() {
249 const char kAddress[] = "2001:db8::1";
250 const char kDnsServer1[] = "2001:db8::2";
251 const char kDnsServer2[] = "2001:db8::3";
252 IPConfig::Properties properties;
253 properties.address = kAddress;
254 properties.dns_servers.push_back(kDnsServer1);
255 properties.dns_servers.push_back(kDnsServer2);
256
257 device_->ip6config_ = new MockIPConfig(control_interface(), kDeviceName);
258 device_->ip6config_->set_properties(properties);
259 }
260
Darin Petkovafa6fc42011-06-21 16:21:08 -0700261 MockControl control_interface_;
Ben Chanbcc6e012013-11-04 14:28:37 -0800262 scoped_refptr<TestDevice> device_;
Paul Stewartc681fa02012-03-02 19:40:04 -0800263 MockDeviceInfo device_info_;
Thieu Le85e050b2012-03-13 15:04:38 -0700264 MockMetrics metrics_;
Peter Qiua0572032014-09-26 10:07:37 -0700265 MockTime time_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700266 StrictMock<MockRTNLHandler> rtnl_handler_;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700267};
268
Chris Masone626719f2011-08-18 16:58:48 -0700269const char DeviceTest::kDeviceName[] = "testdevice";
270const char DeviceTest::kDeviceAddress[] = "address";
Thieu Lefb46caf2012-03-08 11:57:15 -0800271const int DeviceTest::kDeviceInterfaceIndex = 0;
Chris Masone626719f2011-08-18 16:58:48 -0700272
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700273TEST_F(DeviceTest, Contains) {
Ben Chan923a5022013-09-20 11:23:23 -0700274 EXPECT_TRUE(device_->store().Contains(kNameProperty));
mukesh agrawalde29fa82011-09-16 16:16:36 -0700275 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700276}
277
Chris Masonea8a2c252011-06-27 22:16:30 -0700278TEST_F(DeviceTest, GetProperties) {
279 map<string, ::DBus::Variant> props;
280 Error error(Error::kInvalidProperty, "");
Eric Shienbrood9a245532012-03-07 14:20:39 -0500281 ::DBus::Error dbus_error;
282 DBusAdaptor::GetProperties(device_->store(), &props, &dbus_error);
Ben Chan923a5022013-09-20 11:23:23 -0700283 ASSERT_FALSE(props.find(kNameProperty) == props.end());
284 EXPECT_EQ(props[kNameProperty].reader().get_string(), string(kDeviceName));
Chris Masonea8a2c252011-06-27 22:16:30 -0700285}
286
Eric Shienbrood9a245532012-03-07 14:20:39 -0500287// Note: there are currently no writeable Device properties that
288// aren't registered in a subclass.
289TEST_F(DeviceTest, SetReadOnlyProperty) {
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700290 ::DBus::Error error;
Chris Masoneb925cc82011-06-22 15:39:57 -0700291 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800292 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
Ben Chan923a5022013-09-20 11:23:23 -0700293 kAddressProperty,
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800294 PropertyStoreTest::kStringV,
295 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700296 EXPECT_EQ(invalid_args(), error.name());
Chris Masone3bd3c8c2011-06-13 08:20:26 -0700297}
298
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800299TEST_F(DeviceTest, ClearReadOnlyProperty) {
300 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800301 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
Ben Chan923a5022013-09-20 11:23:23 -0700302 kAddressProperty,
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800303 PropertyStoreTest::kStringV,
304 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800305}
306
307TEST_F(DeviceTest, ClearReadOnlyDerivedProperty) {
308 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800309 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
Ben Chan923a5022013-09-20 11:23:23 -0700310 kIPConfigsProperty,
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800311 PropertyStoreTest::kStringsV,
312 &error));
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800313}
314
Darin Petkovafa6fc42011-06-21 16:21:08 -0700315TEST_F(DeviceTest, DestroyIPConfig) {
316 ASSERT_FALSE(device_->ipconfig_.get());
Chris Masone2176a882011-09-14 22:29:15 -0700317 device_->ipconfig_ = new IPConfig(control_interface(), kDeviceName);
Peter Qiu25f1be62014-08-12 10:42:27 -0700318 device_->ip6config_ = new IPConfig(control_interface(), kDeviceName);
Darin Petkovafa6fc42011-06-21 16:21:08 -0700319 device_->DestroyIPConfig();
320 ASSERT_FALSE(device_->ipconfig_.get());
Peter Qiu25f1be62014-08-12 10:42:27 -0700321 ASSERT_FALSE(device_->ip6config_.get());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700322}
323
324TEST_F(DeviceTest, DestroyIPConfigNULL) {
325 ASSERT_FALSE(device_->ipconfig_.get());
Peter Qiu25f1be62014-08-12 10:42:27 -0700326 ASSERT_FALSE(device_->ip6config_.get());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700327 device_->DestroyIPConfig();
328 ASSERT_FALSE(device_->ipconfig_.get());
Peter Qiu25f1be62014-08-12 10:42:27 -0700329 ASSERT_FALSE(device_->ip6config_.get());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700330}
331
Paul Stewart2bf1d352011-12-06 15:02:55 -0800332TEST_F(DeviceTest, AcquireIPConfig) {
Chris Masone2176a882011-09-14 22:29:15 -0700333 device_->ipconfig_ = new IPConfig(control_interface(), "randomname");
Ben Chancd477322014-10-17 14:19:30 -0700334 std::unique_ptr<MockDHCPProvider> dhcp_provider(new MockDHCPProvider());
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700335 device_->dhcp_provider_ = dhcp_provider.get();
336 scoped_refptr<MockDHCPConfig> dhcp_config(new MockDHCPConfig(
337 control_interface(),
338 kDeviceName));
Paul Stewartb1083182014-06-25 03:04:53 -0700339 EXPECT_CALL(*dhcp_provider, CreateConfig(_, _, _, _))
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -0700340 .WillOnce(Return(dhcp_config));
341 EXPECT_CALL(*dhcp_config, RequestIP())
Darin Petkovafa6fc42011-06-21 16:21:08 -0700342 .WillOnce(Return(false));
Paul Stewart2bf1d352011-12-06 15:02:55 -0800343 EXPECT_FALSE(device_->AcquireIPConfig());
Darin Petkovafa6fc42011-06-21 16:21:08 -0700344 ASSERT_TRUE(device_->ipconfig_.get());
345 EXPECT_EQ(kDeviceName, device_->ipconfig_->device_name());
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500346 EXPECT_FALSE(device_->ipconfig_->update_callback_.is_null());
Ben Chancc225ef2014-09-30 13:26:51 -0700347 device_->dhcp_provider_ = nullptr;
Darin Petkovafa6fc42011-06-21 16:21:08 -0700348}
349
Ben Chanbcc6e012013-11-04 14:28:37 -0800350TEST_F(DeviceTest, EnableIPv6) {
351 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv6,
352 StrEq(Device::kIPFlagDisableIPv6),
353 StrEq("0")))
354 .WillOnce(Return(true));
355 device_->EnableIPv6();
356}
357
358TEST_F(DeviceTest, EnableIPv6NotAllowed) {
359 EXPECT_CALL(*device_, IsIPv6Allowed()).WillOnce(Return(false));
360 EXPECT_CALL(*device_, SetIPFlag(_, _, _)).Times(0);
361 device_->EnableIPv6();
362}
363
Paul Stewart2cb3fa72014-11-13 01:43:12 -0800364TEST_F(DeviceTest, MultiHomed) {
365 // Device should have multi-homing disabled by default.
366 EXPECT_CALL(*device_, SetIPFlag(_, _, _)).Times(0);
367 device_->SetIsMultiHomed(false);
368 Mock::VerifyAndClearExpectations(device_);
369
370 // Disabled -> enabled should change flags on the device.
371 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("arp_announce"),
372 StrEq("2"))).WillOnce(Return(true));
373 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("arp_ignore"),
374 StrEq("1"))).WillOnce(Return(true));
375 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("rp_filter"),
376 StrEq("2"))).WillOnce(Return(true));
377 device_->SetIsMultiHomed(true);
378 Mock::VerifyAndClearExpectations(device_);
379
380 // Enabled -> enabled should be a no-op.
381 EXPECT_CALL(*device_, SetIPFlag(_, _, _)).Times(0);
382 device_->SetIsMultiHomed(true);
383
384 // Disabling or enabling reverse-path filtering should also be a no-op
385 // (since it is disabled due to multi-homing).
386 device_->SetLooseRouting(false);
387 device_->SetLooseRouting(true);
388 Mock::VerifyAndClearExpectations(device_);
389
390 // Enabled -> disabled should reset the flags back to the default, but
391 // because non-default routing is enabled, rp_filter will be left
392 // in loose mode.
393 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("arp_announce"),
394 StrEq("0"))).WillOnce(Return(true));
395 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("arp_ignore"),
396 StrEq("0"))).WillOnce(Return(true));
397 device_->SetIsMultiHomed(false);
398 Mock::VerifyAndClearExpectations(device_);
399
400 // Re-enable reverse-path filtering.
401 EXPECT_CALL(*device_, SetIPFlag(IPAddress::kFamilyIPv4, StrEq("rp_filter"),
402 StrEq("1"))).WillOnce(Return(true));
403 device_->SetLooseRouting(false);
404 Mock::VerifyAndClearExpectations(device_);
405}
406
Chris Masone5dec5f42011-07-22 14:07:55 -0700407TEST_F(DeviceTest, Load) {
408 NiceMock<MockStore> storage;
409 const string id = device_->GetStorageIdentifier();
410 EXPECT_CALL(storage, ContainsGroup(id)).WillOnce(Return(true));
Paul Stewart6ff27f52012-07-11 06:51:41 -0700411 EXPECT_CALL(storage, GetBool(id, Device::kStoragePowered, _))
412 .WillOnce(Return(true));
413 EXPECT_CALL(storage, GetUint64(id, Device::kStorageReceiveByteCount, _))
414 .WillOnce(Return(true));
415 EXPECT_CALL(storage, GetUint64(id, Device::kStorageTransmitByteCount, _))
416 .WillOnce(Return(true));
Chris Masone5dec5f42011-07-22 14:07:55 -0700417 EXPECT_TRUE(device_->Load(&storage));
418}
419
420TEST_F(DeviceTest, Save) {
421 NiceMock<MockStore> storage;
422 const string id = device_->GetStorageIdentifier();
Paul Stewart6ff27f52012-07-11 06:51:41 -0700423 EXPECT_CALL(storage, SetBool(id, Device::kStoragePowered, _))
424 .WillOnce(Return(true));
Paul Stewart6ff27f52012-07-11 06:51:41 -0700425 EXPECT_CALL(storage, SetUint64(id, Device::kStorageReceiveByteCount, _))
426 .WillOnce(Return(true));
427 EXPECT_CALL(storage, SetUint64(id, Device::kStorageTransmitByteCount, _))
428 .Times(AtLeast(true));
Chris Masone5dec5f42011-07-22 14:07:55 -0700429 EXPECT_TRUE(device_->Save(&storage));
430}
431
Chris Masone34af2182011-08-22 11:59:36 -0700432TEST_F(DeviceTest, StorageIdGeneration) {
433 string to_process("/device/stuff/0");
434 ControlInterface::RpcIdToStorageId(&to_process);
435 EXPECT_TRUE(isalpha(to_process[0]));
436 EXPECT_EQ(string::npos, to_process.find('/'));
437}
438
Paul Stewart03dba0b2011-08-22 16:32:45 -0700439TEST_F(DeviceTest, SelectedService) {
440 EXPECT_FALSE(device_->selected_service_.get());
441 device_->SetServiceState(Service::kStateAssociating);
442 scoped_refptr<MockService> service(
Chris Masone2176a882011-09-14 22:29:15 -0700443 new StrictMock<MockService>(control_interface(),
444 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800445 metrics(),
Chris Masone9d779932011-08-25 16:33:41 -0700446 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800447 SelectService(service);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700448 EXPECT_TRUE(device_->selected_service_.get() == service.get());
449
Paul Stewartdded0072013-10-24 12:38:54 -0700450 EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
Paul Stewart03dba0b2011-08-22 16:32:45 -0700451 device_->SetServiceState(Service::kStateConfiguring);
Paul Stewartdded0072013-10-24 12:38:54 -0700452 EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
Paul Stewart03dba0b2011-08-22 16:32:45 -0700453 device_->SetServiceFailure(Service::kFailureOutOfRange);
454
455 // Service should be returned to "Idle" state
Paul Stewartdded0072013-10-24 12:38:54 -0700456 EXPECT_CALL(*service, state())
Paul Stewart03dba0b2011-08-22 16:32:45 -0700457 .WillOnce(Return(Service::kStateUnknown));
Paul Stewartdded0072013-10-24 12:38:54 -0700458 EXPECT_CALL(*service, SetState(Service::kStateIdle));
459 EXPECT_CALL(*service, SetConnection(IsNullRefPtr()));
Ben Chancc225ef2014-09-30 13:26:51 -0700460 SelectService(nullptr);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700461
462 // A service in the "Failure" state should not be reset to "Idle"
Paul Stewart20088d82012-02-16 06:58:55 -0800463 SelectService(service);
Paul Stewartdded0072013-10-24 12:38:54 -0700464 EXPECT_CALL(*service, state())
Paul Stewart03dba0b2011-08-22 16:32:45 -0700465 .WillOnce(Return(Service::kStateFailure));
Paul Stewartdded0072013-10-24 12:38:54 -0700466 EXPECT_CALL(*service, SetConnection(IsNullRefPtr()));
Ben Chancc225ef2014-09-30 13:26:51 -0700467 SelectService(nullptr);
Paul Stewart03dba0b2011-08-22 16:32:45 -0700468}
469
Peter Qiua0572032014-09-26 10:07:37 -0700470TEST_F(DeviceTest, LinkMonitorFailure) {
471 scoped_refptr<MockService> service(
472 new StrictMock<MockService>(control_interface(),
473 dispatcher(),
474 metrics(),
475 manager()));
476 SelectService(service);
477 EXPECT_TRUE(device_->selected_service().get() == service.get());
478
479 const time_t kNow = 1000;
480
481 // Initial link monitor failure.
482 EXPECT_CALL(time_, GetSecondsBoottime(_)).WillOnce(
483 DoAll(SetArgPointee<0>(kNow), Return(true)));
484 EXPECT_CALL(metrics_, NotifyUnreliableLinkSignalStrength(_, _)).Times(0);
485 device_->OnLinkMonitorFailure();
486
487 // Another link monitor failure after 3 minutes, report signal strength.
488 EXPECT_CALL(time_, GetSecondsBoottime(_)).WillOnce(
489 DoAll(SetArgPointee<0>(kNow + 180), Return(true)));
490 EXPECT_CALL(metrics_, NotifyUnreliableLinkSignalStrength(_, _)).Times(1);
491 device_->OnLinkMonitorFailure();
492
493 // Another link monitor failure after 5 minutes, don't report signal strength.
494 EXPECT_CALL(time_, GetSecondsBoottime(_)).WillOnce(
495 DoAll(SetArgPointee<0>(kNow + 180 + 360), Return(true)));
496 EXPECT_CALL(metrics_, NotifyUnreliableLinkSignalStrength(_, _)).Times(0);
497 device_->OnLinkMonitorFailure();
498}
499
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800500TEST_F(DeviceTest, IPConfigUpdatedFailure) {
Paul Stewartc5099532013-12-12 07:53:15 -0800501 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
502 kDeviceName);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800503 scoped_refptr<MockService> service(
504 new StrictMock<MockService>(control_interface(),
505 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800506 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800507 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800508 SelectService(service);
Samuel Tan0d061192014-07-07 15:45:15 -0700509 EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureDHCP,
510 _,
511 StrEq("OnIPConfigFailure")));
Paul Stewartdded0072013-10-24 12:38:54 -0700512 EXPECT_CALL(*service, SetConnection(IsNullRefPtr()));
Paul Stewartc5099532013-12-12 07:53:15 -0800513 EXPECT_CALL(*ipconfig, ResetProperties());
514 OnIPConfigFailed(ipconfig.get());
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800515}
516
Peter Qiub25083f2014-08-25 13:22:31 -0700517TEST_F(DeviceTest, IPConfigUpdatedFailureWithIPv6Config) {
518 // Setup IPv6 configuration.
519 SetupIPv6Config();
520 EXPECT_THAT(device_->ip6config_, NotNullRefPtr());
521
522 // IPv4 configuration failed, fallback to use IPv6 configuration.
523 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
524 kDeviceName);
525 scoped_refptr<MockService> service(
526 new StrictMock<MockService>(control_interface(),
527 dispatcher(),
528 metrics(),
529 manager()));
530 SelectService(service);
531 scoped_refptr<MockConnection> connection(
532 new StrictMock<MockConnection>(&device_info_));
533 SetConnection(connection.get());
534
535 EXPECT_CALL(*ipconfig, ResetProperties());
536 EXPECT_CALL(*connection, IsIPv6())
Peter Qiu300769e2014-08-27 11:48:45 -0700537 .WillRepeatedly(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -0700538 EXPECT_CALL(*connection, UpdateFromIPConfig(device_->ip6config_));
539 EXPECT_CALL(*service, SetState(Service::kStateConnected));
540 EXPECT_CALL(*service, IsConnected())
541 .WillRepeatedly(Return(true));
542 EXPECT_CALL(*service, IsPortalDetectionDisabled())
543 .WillRepeatedly(Return(true));
544 EXPECT_CALL(*service, SetState(Service::kStateOnline));
545 EXPECT_CALL(*service, SetConnection(NotNullRefPtr()));
546 OnIPConfigFailed(ipconfig.get());
547}
548
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700549TEST_F(DeviceTest, IPConfigUpdatedFailureWithStatic) {
Paul Stewartc5099532013-12-12 07:53:15 -0800550 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
551 kDeviceName);
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700552 scoped_refptr<MockService> service(
553 new StrictMock<MockService>(control_interface(),
554 dispatcher(),
555 metrics(),
556 manager()));
557 SelectService(service);
Ben Chan923a5022013-09-20 11:23:23 -0700558 service->static_ip_parameters_.args_.SetString(kAddressProperty, "1.1.1.1");
559 service->static_ip_parameters_.args_.SetInt(kPrefixlenProperty, 16);
Paul Stewartdded0072013-10-24 12:38:54 -0700560 // Even though we won't call DisconnectWithFailure, we should still have
561 // the service learn from the failed DHCP attempt.
Samuel Tan0d061192014-07-07 15:45:15 -0700562 EXPECT_CALL(*service, DisconnectWithFailure(_, _, _)).Times(0);
Paul Stewartdded0072013-10-24 12:38:54 -0700563 EXPECT_CALL(*service, SetConnection(_)).Times(0);
Paul Stewartc5099532013-12-12 07:53:15 -0800564 // The IPConfig should retain the previous values.
565 EXPECT_CALL(*ipconfig, ResetProperties()).Times(0);
566 OnIPConfigFailed(ipconfig.get());
mukesh agrawalcc0fded2012-05-09 13:40:58 -0700567}
568
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800569TEST_F(DeviceTest, IPConfigUpdatedSuccess) {
570 scoped_refptr<MockService> service(
571 new StrictMock<MockService>(control_interface(),
572 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800573 metrics(),
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800574 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800575 SelectService(service);
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800576 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
577 kDeviceName);
Paul Stewartd4f26482014-04-25 19:12:03 -0700578 device_->set_ipconfig(ipconfig);
Paul Stewartdded0072013-10-24 12:38:54 -0700579 EXPECT_CALL(*service, SetState(Service::kStateConnected));
Peter Qiu300769e2014-08-27 11:48:45 -0700580 EXPECT_CALL(metrics_,
581 NotifyNetworkConnectionIPType(
582 device_->technology(),
583 Metrics::kNetworkConnectionIPTypeIPv4));
584 EXPECT_CALL(metrics_,
585 NotifyIPv6ConnectivityStatus(device_->technology(), false));
Paul Stewartdded0072013-10-24 12:38:54 -0700586 EXPECT_CALL(*service, IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -0800587 .WillRepeatedly(Return(true));
Paul Stewartdded0072013-10-24 12:38:54 -0700588 EXPECT_CALL(*service, IsPortalDetectionDisabled())
Paul Stewartd215af62012-04-24 23:25:50 -0700589 .WillRepeatedly(Return(true));
Paul Stewartdded0072013-10-24 12:38:54 -0700590 EXPECT_CALL(*service, SetState(Service::kStateOnline));
Paul Stewartdded0072013-10-24 12:38:54 -0700591 EXPECT_CALL(*service, SetConnection(NotNullRefPtr()));
Paul Stewartd4f26482014-04-25 19:12:03 -0700592 EXPECT_CALL(*GetDeviceMockAdaptor(),
593 EmitRpcIdentifierArrayChanged(
594 kIPConfigsProperty,
595 vector<string>{ IPConfigMockAdaptor::kRpcId }));
596
Paul Stewartc5099532013-12-12 07:53:15 -0800597 OnIPConfigUpdated(ipconfig.get());
Paul Stewartbe5f5b32011-12-07 17:11:11 -0800598}
599
Thieu Led1760922012-09-11 14:15:35 -0700600TEST_F(DeviceTest, IPConfigUpdatedSuccessNoSelectedService) {
601 // Make sure shill doesn't crash if a service is disabled immediately
Ben Chancc225ef2014-09-30 13:26:51 -0700602 // after receiving its IP config (selected_service_ is nullptr in this case).
Thieu Led1760922012-09-11 14:15:35 -0700603 scoped_refptr<MockIPConfig> ipconfig = new MockIPConfig(control_interface(),
604 kDeviceName);
Ben Chancc225ef2014-09-30 13:26:51 -0700605 SelectService(nullptr);
Paul Stewartc5099532013-12-12 07:53:15 -0800606 OnIPConfigUpdated(ipconfig.get());
Thieu Led1760922012-09-11 14:15:35 -0700607}
608
Paul Stewart1f916e42013-12-23 09:52:54 -0800609TEST_F(DeviceTest, OnIPConfigExpired) {
610 scoped_refptr<MockIPConfig> ipconfig =
611 new MockIPConfig(control_interface(), kDeviceName);
612 const int kLeaseLength = 1234;
613 ipconfig->properties_.lease_duration_seconds = kLeaseLength;
614
615 EXPECT_CALL(metrics_,
616 SendToUMA("Network.Shill.Unknown.ExpiredLeaseLengthSeconds",
617 kLeaseLength,
618 Metrics::kMetricExpiredLeaseLengthSecondsMin,
619 Metrics::kMetricExpiredLeaseLengthSecondsMax,
620 Metrics::kMetricExpiredLeaseLengthSecondsNumBuckets));
621
622 OnIPConfigExpired(ipconfig.get());
623}
624
Ben Chan9f3dcf82013-09-25 18:04:58 -0700625TEST_F(DeviceTest, SetEnabledNonPersistent) {
626 EXPECT_FALSE(device_->enabled_);
627 EXPECT_FALSE(device_->enabled_pending_);
628 device_->enabled_persistent_ = false;
629 StrictMock<MockManager> manager(control_interface(),
630 dispatcher(),
631 metrics(),
632 glib());
633 SetManager(&manager);
634 Error error;
635 device_->SetEnabledNonPersistent(true, &error, ResultCallback());
636 EXPECT_FALSE(device_->enabled_persistent_);
637 EXPECT_TRUE(device_->enabled_pending_);
638
639 // Enable while already enabled.
640 error.Populate(Error::kOperationInitiated);
641 device_->enabled_persistent_ = false;
642 device_->enabled_pending_ = true;
643 device_->enabled_ = true;
644 device_->SetEnabledNonPersistent(true, &error, ResultCallback());
645 EXPECT_FALSE(device_->enabled_persistent_);
646 EXPECT_TRUE(device_->enabled_pending_);
647 EXPECT_TRUE(device_->enabled_);
648 EXPECT_TRUE(error.IsSuccess());
649
650 // Enable while enabled but disabling.
651 error.Populate(Error::kOperationInitiated);
652 device_->enabled_pending_ = false;
653 device_->SetEnabledNonPersistent(true, &error, ResultCallback());
654 EXPECT_FALSE(device_->enabled_persistent_);
655 EXPECT_FALSE(device_->enabled_pending_);
656 EXPECT_TRUE(device_->enabled_);
657 EXPECT_TRUE(error.IsSuccess());
658
659 // Disable while already disabled.
660 error.Populate(Error::kOperationInitiated);
661 device_->enabled_ = false;
662 device_->SetEnabledNonPersistent(false, &error, ResultCallback());
663 EXPECT_FALSE(device_->enabled_persistent_);
664 EXPECT_FALSE(device_->enabled_pending_);
665 EXPECT_FALSE(device_->enabled_);
666 EXPECT_TRUE(error.IsSuccess());
667
668 // Disable while already enabling.
669 error.Populate(Error::kOperationInitiated);
670 device_->enabled_pending_ = true;
671 device_->SetEnabledNonPersistent(false, &error, ResultCallback());
672 EXPECT_FALSE(device_->enabled_persistent_);
673 EXPECT_TRUE(device_->enabled_pending_);
674 EXPECT_FALSE(device_->enabled_);
675 EXPECT_TRUE(error.IsSuccess());
676}
677
Darin Petkove7c6ad32012-06-29 10:22:09 +0200678TEST_F(DeviceTest, SetEnabledPersistent) {
679 EXPECT_FALSE(device_->enabled_);
680 EXPECT_FALSE(device_->enabled_pending_);
681 device_->enabled_persistent_ = false;
682 StrictMock<MockManager> manager(control_interface(),
683 dispatcher(),
684 metrics(),
685 glib());
686 EXPECT_CALL(manager, UpdateDevice(_));
Paul Stewart036dba02012-08-07 12:34:41 -0700687 SetManager(&manager);
Darin Petkove7c6ad32012-06-29 10:22:09 +0200688 Error error;
689 device_->SetEnabledPersistent(true, &error, ResultCallback());
690 EXPECT_TRUE(device_->enabled_persistent_);
691 EXPECT_TRUE(device_->enabled_pending_);
Arman Uguray2f352e62013-08-28 19:12:53 -0700692
693 // Enable while already enabled.
694 error.Populate(Error::kOperationInitiated);
695 device_->enabled_persistent_ = false;
696 device_->enabled_pending_ = true;
697 device_->enabled_ = true;
698 device_->SetEnabledPersistent(true, &error, ResultCallback());
699 EXPECT_FALSE(device_->enabled_persistent_);
700 EXPECT_TRUE(device_->enabled_pending_);
701 EXPECT_TRUE(device_->enabled_);
702 EXPECT_TRUE(error.IsSuccess());
703
704 // Enable while enabled but disabling.
705 error.Populate(Error::kOperationInitiated);
706 device_->enabled_pending_ = false;
707 device_->SetEnabledPersistent(true, &error, ResultCallback());
708 EXPECT_FALSE(device_->enabled_persistent_);
709 EXPECT_FALSE(device_->enabled_pending_);
710 EXPECT_TRUE(device_->enabled_);
711 EXPECT_EQ(Error::kOperationFailed, error.type());
712
713 // Disable while already disabled.
714 error.Populate(Error::kOperationInitiated);
715 device_->enabled_ = false;
716 device_->SetEnabledPersistent(false, &error, ResultCallback());
717 EXPECT_FALSE(device_->enabled_persistent_);
718 EXPECT_FALSE(device_->enabled_pending_);
719 EXPECT_FALSE(device_->enabled_);
720 EXPECT_TRUE(error.IsSuccess());
721
722 // Disable while already enabling.
723 error.Populate(Error::kOperationInitiated);
724 device_->enabled_pending_ = true;
725 device_->SetEnabledPersistent(false, &error, ResultCallback());
726 EXPECT_FALSE(device_->enabled_persistent_);
727 EXPECT_TRUE(device_->enabled_pending_);
728 EXPECT_FALSE(device_->enabled_);
729 EXPECT_EQ(Error::kOperationFailed, error.type());
Darin Petkove7c6ad32012-06-29 10:22:09 +0200730}
731
Thieu Lefb46caf2012-03-08 11:57:15 -0800732TEST_F(DeviceTest, Start) {
Paul Stewart8c116a92012-05-02 18:30:03 -0700733 EXPECT_FALSE(device_->running_);
734 EXPECT_FALSE(device_->enabled_);
735 EXPECT_FALSE(device_->enabled_pending_);
Eric Shienbrood9a245532012-03-07 14:20:39 -0500736 device_->SetEnabled(true);
Paul Stewart8c116a92012-05-02 18:30:03 -0700737 EXPECT_TRUE(device_->running_);
738 EXPECT_TRUE(device_->enabled_pending_);
Gary Morainbaeefdf2012-04-30 14:53:35 -0700739 device_->OnEnabledStateChanged(ResultCallback(),
740 Error(Error::kOperationFailed));
741 EXPECT_FALSE(device_->enabled_pending_);
Thieu Lefb46caf2012-03-08 11:57:15 -0800742}
743
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700744TEST_F(DeviceTest, Stop) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500745 device_->enabled_ = true;
746 device_->enabled_pending_ = true;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700747 device_->ipconfig_ = new IPConfig(&control_interface_, kDeviceName);
748 scoped_refptr<MockService> service(
749 new NiceMock<MockService>(&control_interface_,
750 dispatcher(),
Thieu Le3426c8f2012-01-11 17:35:11 -0800751 metrics(),
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700752 manager()));
Paul Stewart20088d82012-02-16 06:58:55 -0800753 SelectService(service);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700754
Paul Stewartdded0072013-10-24 12:38:54 -0700755 EXPECT_CALL(*service, state()).
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700756 WillRepeatedly(Return(Service::kStateConnected));
Paul Stewartd4f26482014-04-25 19:12:03 -0700757 EXPECT_CALL(*GetDeviceMockAdaptor(),
Ben Chan923a5022013-09-20 11:23:23 -0700758 EmitBoolChanged(kPoweredProperty, false));
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700759 EXPECT_CALL(rtnl_handler_, SetInterfaceFlags(_, 0, IFF_UP));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500760 device_->SetEnabled(false);
761 device_->OnEnabledStateChanged(ResultCallback(), Error());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700762
763 EXPECT_FALSE(device_->ipconfig_.get());
764 EXPECT_FALSE(device_->selected_service_.get());
765}
766
Paul Stewartff6be292014-11-24 17:05:03 -0800767TEST_F(DeviceTest, StartProhibited) {
768 DeviceRefPtr device(new TestDevice(control_interface(),
769 dispatcher(),
770 nullptr,
771 manager(),
772 kDeviceName,
773 kDeviceAddress,
774 kDeviceInterfaceIndex,
775 Technology::kWifi));
776 {
777 Error error;
778 manager()->SetProhibitedTechnologies("wifi", &error);
779 EXPECT_TRUE(error.IsSuccess());
780 }
781
782 device->SetEnabled(true);
783 EXPECT_FALSE(device->running());
784
785 {
786 Error error;
787 manager()->SetProhibitedTechnologies("", &error);
788 EXPECT_TRUE(error.IsSuccess());
789 }
790 device->SetEnabled(true);
791 EXPECT_TRUE(device->running());
792}
793
Ben Chanad663e12013-01-08 01:58:47 -0800794TEST_F(DeviceTest, Reset) {
795 Error e;
796 device_->Reset(&e, ResultCallback());
797 EXPECT_EQ(Error::kNotSupported, e.type());
798 EXPECT_EQ("Device doesn't support Reset.", e.message());
799}
800
mukesh agrawal784566d2012-08-08 18:32:58 -0700801TEST_F(DeviceTest, ResumeWithIPConfig) {
802 scoped_refptr<MockIPConfig> ipconfig =
803 new MockIPConfig(control_interface(), kDeviceName);
804 device_->set_ipconfig(ipconfig);
805 EXPECT_CALL(*ipconfig, RenewIP());
806 device_->OnAfterResume();
807}
808
809TEST_F(DeviceTest, ResumeWithoutIPConfig) {
810 // Just test that we don't crash in this case.
Ben Chancc225ef2014-09-30 13:26:51 -0700811 ASSERT_EQ(nullptr, device_->ipconfig().get());
mukesh agrawal784566d2012-08-08 18:32:58 -0700812 device_->OnAfterResume();
813}
814
mukesh agrawalbb2231c2013-07-17 16:32:24 -0700815TEST_F(DeviceTest, ResumeWithLinkMonitor) {
816 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
817 SetLinkMonitor(link_monitor); // Passes ownership.
818 EXPECT_CALL(*link_monitor, OnAfterResume());
819 device_->OnAfterResume();
820}
821
822TEST_F(DeviceTest, ResumeWithoutLinkMonitor) {
823 // Just test that we don't crash in this case.
824 EXPECT_FALSE(HasLinkMonitor());
825 device_->OnAfterResume();
826}
827
Paul Stewart036dba02012-08-07 12:34:41 -0700828TEST_F(DeviceTest, LinkMonitor) {
829 scoped_refptr<MockConnection> connection(
830 new StrictMock<MockConnection>(&device_info_));
831 MockManager manager(control_interface(),
832 dispatcher(),
833 metrics(),
834 glib());
835 scoped_refptr<MockService> service(
836 new StrictMock<MockService>(control_interface(),
837 dispatcher(),
838 metrics(),
839 &manager));
840 SelectService(service);
841 SetConnection(connection.get());
842 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
843 SetLinkMonitor(link_monitor); // Passes ownership.
844 SetManager(&manager);
845 EXPECT_CALL(*link_monitor, Start()).Times(0);
846 EXPECT_CALL(manager, IsTechnologyLinkMonitorEnabled(Technology::kUnknown))
847 .WillOnce(Return(false))
848 .WillRepeatedly(Return(true));
849 EXPECT_FALSE(StartLinkMonitor());
850
Peter Qiud49760e2014-09-19 16:13:42 -0700851 EXPECT_CALL(*link_monitor, Start()).Times(0);
852 EXPECT_CALL(*service, link_monitor_disabled())
853 .WillOnce(Return(true))
854 .WillRepeatedly(Return(false));
855 EXPECT_FALSE(StartLinkMonitor());
856
Paul Stewart036dba02012-08-07 12:34:41 -0700857 EXPECT_CALL(*link_monitor, Start())
858 .WillOnce(Return(false))
859 .WillOnce(Return(true));
860 EXPECT_FALSE(StartLinkMonitor());
861 EXPECT_TRUE(StartLinkMonitor());
862
863 unsigned int kResponseTime = 123;
864 EXPECT_CALL(*link_monitor, GetResponseTimeMilliseconds())
865 .WillOnce(Return(kResponseTime));
866 {
867 Error error;
868 EXPECT_EQ(kResponseTime, GetLinkMonitorResponseTime(&error));
869 EXPECT_TRUE(error.IsSuccess());
870 }
871 StopLinkMonitor();
872 {
873 Error error;
874 EXPECT_EQ(0, GetLinkMonitorResponseTime(&error));
875 EXPECT_FALSE(error.IsSuccess());
876 }
877}
878
Paul Stewartc8860612012-09-28 07:36:21 -0700879TEST_F(DeviceTest, LinkMonitorCancelledOnSelectService) {
880 scoped_refptr<MockConnection> connection(
881 new StrictMock<MockConnection>(&device_info_));
882 MockManager manager(control_interface(),
883 dispatcher(),
884 metrics(),
885 glib());
886 scoped_refptr<MockService> service(
887 new StrictMock<MockService>(control_interface(),
888 dispatcher(),
889 metrics(),
890 &manager));
891 SelectService(service);
892 SetConnection(connection.get());
893 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
894 SetLinkMonitor(link_monitor); // Passes ownership.
895 SetManager(&manager);
Paul Stewartdded0072013-10-24 12:38:54 -0700896 EXPECT_CALL(*service, state())
Paul Stewartc8860612012-09-28 07:36:21 -0700897 .WillOnce(Return(Service::kStateIdle));
Paul Stewartdded0072013-10-24 12:38:54 -0700898 EXPECT_CALL(*service, SetState(_));
899 EXPECT_CALL(*service, SetConnection(_));
Paul Stewartc8860612012-09-28 07:36:21 -0700900 EXPECT_TRUE(HasLinkMonitor());
Ben Chancc225ef2014-09-30 13:26:51 -0700901 SelectService(nullptr);
Paul Stewartc8860612012-09-28 07:36:21 -0700902 EXPECT_FALSE(HasLinkMonitor());
903}
904
Peter Qiudc335f82014-05-15 10:33:17 -0700905TEST_F(DeviceTest, TrafficMonitor) {
906 scoped_refptr<MockConnection> connection(
907 new StrictMock<MockConnection>(&device_info_));
908 MockManager manager(control_interface(),
909 dispatcher(),
910 metrics(),
911 glib());
912 scoped_refptr<MockService> service(
913 new StrictMock<MockService>(control_interface(),
914 dispatcher(),
915 metrics(),
916 &manager));
917 SelectService(service);
918 SetConnection(connection.get());
919 MockTrafficMonitor *traffic_monitor = new StrictMock<MockTrafficMonitor>();
920 SetTrafficMonitor(traffic_monitor); // Passes ownership.
921 SetManager(&manager);
922
923 EXPECT_CALL(*device_, IsTrafficMonitorEnabled()).WillRepeatedly(Return(true));
924 EXPECT_CALL(*traffic_monitor, Start());
925 StartTrafficMonitor();
926 EXPECT_CALL(*traffic_monitor, Stop());
927 StopTrafficMonitor();
928 Mock::VerifyAndClearExpectations(traffic_monitor);
929
930 EXPECT_CALL(metrics_, NotifyNetworkProblemDetected(_,
931 Metrics::kNetworkProblemDNSFailure)).Times(1);
932 NetworkProblemDetected(TrafficMonitor::kNetworkProblemDNSFailure);
933
934 // Verify traffic monitor not running when it is disabled.
935 traffic_monitor = new StrictMock<MockTrafficMonitor>();
936 SetTrafficMonitor(traffic_monitor);
937 EXPECT_CALL(*device_, IsTrafficMonitorEnabled())
938 .WillRepeatedly(Return(false));
939 EXPECT_CALL(*traffic_monitor, Start()).Times(0);
940 StartTrafficMonitor();
941 EXPECT_CALL(*traffic_monitor, Stop()).Times(0);
942 StopTrafficMonitor();
Peter Qiudc335f82014-05-15 10:33:17 -0700943}
944
945TEST_F(DeviceTest, TrafficMonitorCancelledOnSelectService) {
946 scoped_refptr<MockConnection> connection(
947 new StrictMock<MockConnection>(&device_info_));
948 MockManager manager(control_interface(),
949 dispatcher(),
950 metrics(),
951 glib());
952 scoped_refptr<MockService> service(
953 new StrictMock<MockService>(control_interface(),
954 dispatcher(),
955 metrics(),
956 &manager));
957 SelectService(service);
958 SetConnection(connection.get());
959 MockTrafficMonitor *traffic_monitor = new StrictMock<MockTrafficMonitor>();
960 SetTrafficMonitor(traffic_monitor); // Passes ownership.
961 EXPECT_CALL(*device_, IsTrafficMonitorEnabled()).WillRepeatedly(Return(true));
962 SetManager(&manager);
963 EXPECT_CALL(*service, state())
964 .WillOnce(Return(Service::kStateIdle));
965 EXPECT_CALL(*service, SetState(_));
966 EXPECT_CALL(*service, SetConnection(_));
967 EXPECT_CALL(*traffic_monitor, Stop());
Ben Chancc225ef2014-09-30 13:26:51 -0700968 SelectService(nullptr);
Peter Qiudc335f82014-05-15 10:33:17 -0700969}
970
Paul Stewart75a68b92013-10-24 10:50:27 -0700971TEST_F(DeviceTest, ShouldUseArpGateway) {
972 EXPECT_FALSE(device_->ShouldUseArpGateway());
973}
974
Paul Stewartc6fbad92013-11-13 14:50:52 -0800975TEST_F(DeviceTest, PerformTDLSOperation) {
Ben Chancc225ef2014-09-30 13:26:51 -0700976 EXPECT_EQ(
977 "", device_->PerformTDLSOperation("do something", "to someone", nullptr));
Paul Stewartc6fbad92013-11-13 14:50:52 -0800978}
979
Paul Stewartfa11e282013-12-02 22:04:25 -0800980TEST_F(DeviceTest, IsConnectedViaTether) {
981 EXPECT_FALSE(device_->IsConnectedViaTether());
982
983 // An empty ipconfig doesn't mean we're tethered.
984 device_->ipconfig_ = new IPConfig(control_interface(), kDeviceName);
985 EXPECT_FALSE(device_->IsConnectedViaTether());
986
987 // Add an ipconfig property that indicates this is an Android tether.
988 IPConfig::Properties properties;
989 properties.vendor_encapsulated_options =
990 Tethering::kAndroidVendorEncapsulatedOptions;
Paul Stewartc5099532013-12-12 07:53:15 -0800991 device_->ipconfig_->UpdateProperties(properties);
Paul Stewartfa11e282013-12-02 22:04:25 -0800992 EXPECT_TRUE(device_->IsConnectedViaTether());
993
994 properties.vendor_encapsulated_options = "Some other non-empty value";
Paul Stewartc5099532013-12-12 07:53:15 -0800995 device_->ipconfig_->UpdateProperties(properties);
Paul Stewartfa11e282013-12-02 22:04:25 -0800996 EXPECT_FALSE(device_->IsConnectedViaTether());
997}
998
Paul Stewartd4f26482014-04-25 19:12:03 -0700999TEST_F(DeviceTest, AvailableIPConfigs) {
Ben Chancc225ef2014-09-30 13:26:51 -07001000 EXPECT_EQ(vector<string>(), device_->AvailableIPConfigs(nullptr));
Paul Stewartd4f26482014-04-25 19:12:03 -07001001 device_->ipconfig_ = new IPConfig(control_interface(), kDeviceName);
1002 EXPECT_EQ(vector<string> { IPConfigMockAdaptor::kRpcId },
Ben Chancc225ef2014-09-30 13:26:51 -07001003 device_->AvailableIPConfigs(nullptr));
Paul Stewartd4f26482014-04-25 19:12:03 -07001004 device_->ip6config_ = new IPConfig(control_interface(), kDeviceName);
1005
1006 // We don't really care that the RPC IDs for all IPConfig mock adaptors
1007 // are the same, or their ordering. We just need to see that there are two
1008 // of them when both IPv6 and IPv4 IPConfigs are available.
Ben Chancc225ef2014-09-30 13:26:51 -07001009 EXPECT_EQ(2, device_->AvailableIPConfigs(nullptr).size());
Paul Stewartd4f26482014-04-25 19:12:03 -07001010
Ben Chancc225ef2014-09-30 13:26:51 -07001011 device_->ipconfig_ = nullptr;
Paul Stewartd4f26482014-04-25 19:12:03 -07001012 EXPECT_EQ(vector<string> { IPConfigMockAdaptor::kRpcId },
Ben Chancc225ef2014-09-30 13:26:51 -07001013 device_->AvailableIPConfigs(nullptr));
Paul Stewartd4f26482014-04-25 19:12:03 -07001014
Ben Chancc225ef2014-09-30 13:26:51 -07001015 device_->ip6config_ = nullptr;
1016 EXPECT_EQ(vector<string>(), device_->AvailableIPConfigs(nullptr));
Paul Stewartd4f26482014-04-25 19:12:03 -07001017}
1018
1019TEST_F(DeviceTest, OnIPv6AddressChanged) {
1020 StrictMock<MockManager> manager(control_interface(),
1021 dispatcher(),
1022 metrics(),
1023 glib());
1024 manager.set_mock_device_info(&device_info_);
1025 SetManager(&manager);
1026
Ben Chancc225ef2014-09-30 13:26:51 -07001027 // An IPv6 clear while ip6config_ is nullptr will not emit a change.
Paul Stewartd4f26482014-04-25 19:12:03 -07001028 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1029 .WillOnce(Return(false));
1030 EXPECT_CALL(*GetDeviceMockAdaptor(),
1031 EmitRpcIdentifierArrayChanged(kIPConfigsProperty, _)).Times(0);
1032 device_->OnIPv6AddressChanged();
1033 EXPECT_THAT(device_->ip6config_, IsNullRefPtr());
1034 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1035 Mock::VerifyAndClearExpectations(&device_info_);
1036
1037 IPAddress address0(IPAddress::kFamilyIPv6);
1038 const char kAddress0[] = "fe80::1aa9:5ff:abcd:1234";
1039 ASSERT_TRUE(address0.SetAddressFromString(kAddress0));
1040
Ben Chancc225ef2014-09-30 13:26:51 -07001041 // Add an IPv6 address while ip6config_ is nullptr.
Paul Stewartd4f26482014-04-25 19:12:03 -07001042 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1043 .WillOnce(DoAll(SetArgPointee<1>(address0), Return(true)));
1044 EXPECT_CALL(*GetDeviceMockAdaptor(),
1045 EmitRpcIdentifierArrayChanged(
1046 kIPConfigsProperty,
1047 vector<string> { IPConfigMockAdaptor::kRpcId }));
1048 device_->OnIPv6AddressChanged();
1049 EXPECT_THAT(device_->ip6config_, NotNullRefPtr());
1050 EXPECT_EQ(kAddress0, device_->ip6config_->properties().address);
1051 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1052 Mock::VerifyAndClearExpectations(&device_info_);
1053
1054 // If the IPv6 address does not change, no signal is emitted.
1055 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1056 .WillOnce(DoAll(SetArgPointee<1>(address0), Return(true)));
1057 EXPECT_CALL(*GetDeviceMockAdaptor(),
1058 EmitRpcIdentifierArrayChanged(kIPConfigsProperty, _)).Times(0);
1059 device_->OnIPv6AddressChanged();
1060 EXPECT_EQ(kAddress0, device_->ip6config_->properties().address);
1061 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1062 Mock::VerifyAndClearExpectations(&device_info_);
1063
1064 IPAddress address1(IPAddress::kFamilyIPv6);
1065 const char kAddress1[] = "fe80::1aa9:5ff:abcd:5678";
1066 ASSERT_TRUE(address1.SetAddressFromString(kAddress1));
1067
1068 // If the IPv6 address changes, a signal is emitted.
1069 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1070 .WillOnce(DoAll(SetArgPointee<1>(address1), Return(true)));
1071 EXPECT_CALL(*GetDeviceMockAdaptor(),
1072 EmitRpcIdentifierArrayChanged(
1073 kIPConfigsProperty,
1074 vector<string> { IPConfigMockAdaptor::kRpcId }));
1075 device_->OnIPv6AddressChanged();
1076 EXPECT_EQ(kAddress1, device_->ip6config_->properties().address);
1077 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1078 Mock::VerifyAndClearExpectations(&device_info_);
1079
1080 // If the IPv6 prefix changes, a signal is emitted.
1081 address1.set_prefix(64);
1082 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1083 .WillOnce(DoAll(SetArgPointee<1>(address1), Return(true)));
1084 EXPECT_CALL(*GetDeviceMockAdaptor(),
1085 EmitRpcIdentifierArrayChanged(
1086 kIPConfigsProperty,
1087 vector<string> { IPConfigMockAdaptor::kRpcId }));
1088 device_->OnIPv6AddressChanged();
1089 EXPECT_EQ(kAddress1, device_->ip6config_->properties().address);
1090
Ben Chancc225ef2014-09-30 13:26:51 -07001091 // Return the IPv6 address to nullptr.
Paul Stewartd4f26482014-04-25 19:12:03 -07001092 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1093 .WillOnce(Return(false));
1094 EXPECT_CALL(*GetDeviceMockAdaptor(),
1095 EmitRpcIdentifierArrayChanged(kIPConfigsProperty,
1096 vector<string>()));
1097 device_->OnIPv6AddressChanged();
1098 EXPECT_THAT(device_->ip6config_, IsNullRefPtr());
1099 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1100 Mock::VerifyAndClearExpectations(&device_info_);
1101}
1102
Samuel Tan815a6fb2014-10-23 16:53:59 -07001103TEST_F(DeviceTest, OnIPv6DnsServerAddressesChanged_LeaseExpirationUpdated) {
1104 MockManager manager(control_interface(),
1105 dispatcher(),
1106 metrics(),
1107 glib());
1108 manager.set_mock_device_info(&device_info_);
1109 SetManager(&manager);
1110
1111 scoped_refptr<MockIPConfig> ip6config =
1112 new MockIPConfig(control_interface(), kDeviceName);
1113 device_->ip6config_ = ip6config;
1114
1115 // Non-infinite lifetime should trigger an update of the current lease
1116 // expiration time.
1117 const uint32 kExpiredLifetime = 1;
1118 EXPECT_CALL(device_info_,
1119 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1120 .WillOnce(DoAll(SetArgPointee<2>(kExpiredLifetime),
1121 Return(true)));
1122 EXPECT_CALL(*ip6config, UpdateLeaseExpirationTime(_)).Times(1);
1123 EXPECT_CALL(*ip6config, ResetLeaseExpirationTime()).Times(0);
1124 device_->OnIPv6DnsServerAddressesChanged();
1125
1126 // Infinite lifetime should cause a reset of the current lease expiration
1127 // time to its default value.
1128 const uint32 kExpiredLifetimeInfinity = ND_OPT_LIFETIME_INFINITY;
1129 EXPECT_CALL(device_info_,
1130 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1131 .WillOnce(DoAll(SetArgPointee<2>(kExpiredLifetimeInfinity),
1132 Return(true)));
1133 EXPECT_CALL(*ip6config, UpdateLeaseExpirationTime(_)).Times(0);
1134 EXPECT_CALL(*ip6config, ResetLeaseExpirationTime()).Times(1);
1135 device_->OnIPv6DnsServerAddressesChanged();
1136}
1137
Peter Qiu25f1be62014-08-12 10:42:27 -07001138TEST_F(DeviceTest, OnIPv6DnsServerAddressesChanged) {
1139 StrictMock<MockManager> manager(control_interface(),
1140 dispatcher(),
1141 metrics(),
1142 glib());
1143 manager.set_mock_device_info(&device_info_);
1144 SetManager(&manager);
1145
Peter Qiub25083f2014-08-25 13:22:31 -07001146 // With existing IPv4 connection, so no attempt to setup IPv6 connection.
1147 // IPv6 connection is being tested in OnIPv6ConfigurationCompleted test.
1148 scoped_refptr<MockConnection> connection(
1149 new StrictMock<MockConnection>(&device_info_));
1150 SetConnection(connection.get());
1151 EXPECT_CALL(*connection, IsIPv6())
1152 .WillRepeatedly(Return(false));
1153
Peter Qiu25f1be62014-08-12 10:42:27 -07001154 // IPv6 DNS server addresses are not provided will not emit a change.
1155 EXPECT_CALL(device_info_,
1156 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1157 .WillOnce(Return(false));
1158 EXPECT_CALL(*GetDeviceMockAdaptor(),
1159 EmitRpcIdentifierArrayChanged(kIPConfigsProperty, _)).Times(0);
1160 device_->OnIPv6DnsServerAddressesChanged();
1161 EXPECT_THAT(device_->ip6config_, IsNullRefPtr());
1162 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1163 Mock::VerifyAndClearExpectations(&device_info_);
1164
1165 const char kAddress1[] = "fe80::1aa9:5ff:abcd:1234";
1166 const char kAddress2[] = "fe80::1aa9:5ff:abcd:1235";
1167 const uint32 kInfiniteLifetime = 0xffffffff;
1168 IPAddress ipv6_address1(IPAddress::kFamilyIPv6);
1169 IPAddress ipv6_address2(IPAddress::kFamilyIPv6);
1170 ASSERT_TRUE(ipv6_address1.SetAddressFromString(kAddress1));
1171 ASSERT_TRUE(ipv6_address2.SetAddressFromString(kAddress2));
1172 vector<IPAddress> dns_server_addresses;
1173 dns_server_addresses.push_back(ipv6_address1);
1174 dns_server_addresses.push_back(ipv6_address2);
1175 vector<string> dns_server_addresses_str;
1176 dns_server_addresses_str.push_back(kAddress1);
1177 dns_server_addresses_str.push_back(kAddress2);
1178
Ben Chancc225ef2014-09-30 13:26:51 -07001179 // Add IPv6 DNS server addresses while ip6config_ is nullptr.
Peter Qiu25f1be62014-08-12 10:42:27 -07001180 EXPECT_CALL(device_info_,
1181 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1182 .WillOnce(DoAll(SetArgPointee<1>(dns_server_addresses),
1183 SetArgPointee<2>(kInfiniteLifetime),
1184 Return(true)));
1185 EXPECT_CALL(*GetDeviceMockAdaptor(),
1186 EmitRpcIdentifierArrayChanged(
1187 kIPConfigsProperty,
1188 vector<string> { IPConfigMockAdaptor::kRpcId }));
1189 device_->OnIPv6DnsServerAddressesChanged();
1190 EXPECT_THAT(device_->ip6config_, NotNullRefPtr());
1191 EXPECT_EQ(dns_server_addresses_str,
1192 device_->ip6config_->properties().dns_servers);
1193 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1194 Mock::VerifyAndClearExpectations(&device_info_);
1195
1196 // Add an IPv6 address while IPv6 DNS server addresses already existed.
1197 IPAddress address3(IPAddress::kFamilyIPv6);
1198 const char kAddress3[] = "fe80::1aa9:5ff:abcd:1236";
1199 ASSERT_TRUE(address3.SetAddressFromString(kAddress3));
1200 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1201 .WillOnce(DoAll(SetArgPointee<1>(address3), Return(true)));
1202 EXPECT_CALL(*GetDeviceMockAdaptor(),
1203 EmitRpcIdentifierArrayChanged(
1204 kIPConfigsProperty,
1205 vector<string> { IPConfigMockAdaptor::kRpcId }));
1206 device_->OnIPv6AddressChanged();
1207 EXPECT_THAT(device_->ip6config_, NotNullRefPtr());
1208 EXPECT_EQ(kAddress3, device_->ip6config_->properties().address);
1209 EXPECT_EQ(dns_server_addresses_str,
1210 device_->ip6config_->properties().dns_servers);
1211 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1212 Mock::VerifyAndClearExpectations(&device_info_);
1213
1214 // If the IPv6 DNS server addresses does not change, no signal is emitted.
1215 EXPECT_CALL(device_info_,
1216 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1217 .WillOnce(DoAll(SetArgPointee<1>(dns_server_addresses),
1218 SetArgPointee<2>(kInfiniteLifetime),
1219 Return(true)));
1220 EXPECT_CALL(*GetDeviceMockAdaptor(),
1221 EmitRpcIdentifierArrayChanged(kIPConfigsProperty, _)).Times(0);
1222 device_->OnIPv6DnsServerAddressesChanged();
1223 EXPECT_EQ(dns_server_addresses_str,
1224 device_->ip6config_->properties().dns_servers);
1225 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1226 Mock::VerifyAndClearExpectations(&device_info_);
1227
1228 // Setting lifetime to 0 should expire and clear out the DNS server.
1229 const uint32 kExpiredLifetime = 0;
1230 vector<string> empty_dns_server;
1231 EXPECT_CALL(device_info_,
1232 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1233 .WillOnce(DoAll(SetArgPointee<1>(dns_server_addresses),
1234 SetArgPointee<2>(kExpiredLifetime),
1235 Return(true)));
1236 EXPECT_CALL(*GetDeviceMockAdaptor(),
1237 EmitRpcIdentifierArrayChanged(
1238 kIPConfigsProperty,
1239 vector<string> { IPConfigMockAdaptor::kRpcId }));
1240 device_->OnIPv6DnsServerAddressesChanged();
1241 EXPECT_EQ(empty_dns_server, device_->ip6config_->properties().dns_servers);
1242 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1243 Mock::VerifyAndClearExpectations(&device_info_);
1244
1245 // Set DNS server with lifetime of 1 hour.
1246 const uint32 kLifetimeOneHr = 3600;
1247 EXPECT_CALL(device_info_,
1248 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1249 .WillOnce(DoAll(SetArgPointee<1>(dns_server_addresses),
1250 SetArgPointee<2>(kLifetimeOneHr),
1251 Return(true)));
1252 EXPECT_CALL(*GetDeviceMockAdaptor(),
1253 EmitRpcIdentifierArrayChanged(
1254 kIPConfigsProperty,
1255 vector<string> { IPConfigMockAdaptor::kRpcId }));
1256 device_->OnIPv6DnsServerAddressesChanged();
1257 EXPECT_EQ(dns_server_addresses_str,
1258 device_->ip6config_->properties().dns_servers);
1259 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1260 Mock::VerifyAndClearExpectations(&device_info_);
1261
Ben Chancc225ef2014-09-30 13:26:51 -07001262 // Return the DNS server addresses to nullptr.
Peter Qiu25f1be62014-08-12 10:42:27 -07001263 EXPECT_CALL(device_info_,
1264 GetIPv6DnsServerAddresses(kDeviceInterfaceIndex, _, _))
1265 .WillOnce(Return(false));
1266 EXPECT_CALL(*GetDeviceMockAdaptor(),
1267 EmitRpcIdentifierArrayChanged(
1268 kIPConfigsProperty,
1269 vector<string> { IPConfigMockAdaptor::kRpcId }));
1270 device_->OnIPv6DnsServerAddressesChanged();
1271 EXPECT_EQ(empty_dns_server, device_->ip6config_->properties().dns_servers);
1272 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1273 Mock::VerifyAndClearExpectations(&device_info_);
1274}
1275
Peter Qiub25083f2014-08-25 13:22:31 -07001276TEST_F(DeviceTest, OnIPv6ConfigurationCompleted) {
1277 StrictMock<MockManager> manager(control_interface(),
1278 dispatcher(),
1279 metrics(),
1280 glib());
1281 manager.set_mock_device_info(&device_info_);
1282 SetManager(&manager);
1283 scoped_refptr<MockService> service(
1284 new StrictMock<MockService>(control_interface(),
1285 dispatcher(),
1286 metrics(),
1287 &manager));
1288 SelectService(service);
1289 scoped_refptr<MockConnection> connection(
1290 new StrictMock<MockConnection>(&device_info_));
1291 SetConnection(connection.get());
1292
1293 // Setup initial IPv6 configuration.
1294 SetupIPv6Config();
1295 EXPECT_THAT(device_->ip6config_, NotNullRefPtr());
1296
1297 // IPv6 configuration update with non-IPv6 connection, no connection update.
1298 EXPECT_THAT(device_->connection(), NotNullRefPtr());
1299 IPAddress address1(IPAddress::kFamilyIPv6);
1300 const char kAddress1[] = "fe80::1aa9:5ff:abcd:1231";
1301 ASSERT_TRUE(address1.SetAddressFromString(kAddress1));
1302 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1303 .WillOnce(DoAll(SetArgPointee<1>(address1), Return(true)));
1304 EXPECT_CALL(*GetDeviceMockAdaptor(),
1305 EmitRpcIdentifierArrayChanged(
1306 kIPConfigsProperty,
1307 vector<string> { IPConfigMockAdaptor::kRpcId }));
1308 EXPECT_CALL(*connection, IsIPv6())
1309 .WillRepeatedly(Return(false));
1310 EXPECT_CALL(*service, SetConnection(_)).Times(0);
1311 device_->OnIPv6AddressChanged();
1312 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1313 Mock::VerifyAndClearExpectations(&device_info_);
1314 Mock::VerifyAndClearExpectations(service);
1315 Mock::VerifyAndClearExpectations(connection);
1316
1317 // IPv6 configuration update with IPv6 connection, connection update.
1318 IPAddress address2(IPAddress::kFamilyIPv6);
1319 const char kAddress2[] = "fe80::1aa9:5ff:abcd:1232";
1320 ASSERT_TRUE(address2.SetAddressFromString(kAddress2));
1321 EXPECT_CALL(device_info_, GetPrimaryIPv6Address(kDeviceInterfaceIndex, _))
1322 .WillOnce(DoAll(SetArgPointee<1>(address2), Return(true)));
1323 EXPECT_CALL(*GetDeviceMockAdaptor(),
1324 EmitRpcIdentifierArrayChanged(
1325 kIPConfigsProperty,
1326 vector<string> { IPConfigMockAdaptor::kRpcId }));
1327 EXPECT_CALL(*connection, IsIPv6())
1328 .WillRepeatedly(Return(true));
1329 EXPECT_CALL(*connection, UpdateFromIPConfig(device_->ip6config_));
Peter Qiu300769e2014-08-27 11:48:45 -07001330 EXPECT_CALL(metrics_,
1331 NotifyNetworkConnectionIPType(
1332 device_->technology(),
1333 Metrics::kNetworkConnectionIPTypeIPv6));
1334 EXPECT_CALL(metrics_,
1335 NotifyIPv6ConnectivityStatus(device_->technology(), true));
Peter Qiub25083f2014-08-25 13:22:31 -07001336 EXPECT_CALL(*service, SetState(Service::kStateConnected));
1337 EXPECT_CALL(*service, IsConnected())
1338 .WillRepeatedly(Return(true));
1339 EXPECT_CALL(*service, IsPortalDetectionDisabled())
1340 .WillRepeatedly(Return(true));
1341 EXPECT_CALL(*service, SetState(Service::kStateOnline));
1342 EXPECT_CALL(*service, SetConnection(NotNullRefPtr()));
1343 EXPECT_CALL(manager, IsTechnologyLinkMonitorEnabled(_))
1344 .WillRepeatedly(Return(false));
1345 device_->OnIPv6AddressChanged();
1346 Mock::VerifyAndClearExpectations(GetDeviceMockAdaptor());
1347 Mock::VerifyAndClearExpectations(&device_info_);
1348 Mock::VerifyAndClearExpectations(service);
1349 Mock::VerifyAndClearExpectations(connection);
1350}
1351
Paul Stewartc681fa02012-03-02 19:40:04 -08001352class DevicePortalDetectionTest : public DeviceTest {
1353 public:
1354 DevicePortalDetectionTest()
1355 : connection_(new StrictMock<MockConnection>(&device_info_)),
1356 manager_(control_interface(),
1357 dispatcher(),
1358 metrics(),
1359 glib()),
1360 service_(new StrictMock<MockService>(control_interface(),
1361 dispatcher(),
1362 metrics(),
1363 &manager_)),
1364 portal_detector_(new StrictMock<MockPortalDetector>(connection_)) {}
1365 virtual ~DevicePortalDetectionTest() {}
1366 virtual void SetUp() {
1367 DeviceTest::SetUp();
1368 SelectService(service_);
1369 SetConnection(connection_.get());
1370 device_->portal_detector_.reset(portal_detector_); // Passes ownership.
Paul Stewart036dba02012-08-07 12:34:41 -07001371 SetManager(&manager_);
Paul Stewartc681fa02012-03-02 19:40:04 -08001372 }
1373
1374 protected:
Thieu Le85e050b2012-03-13 15:04:38 -07001375 static const int kPortalAttempts;
1376
Paul Stewartc681fa02012-03-02 19:40:04 -08001377 bool StartPortalDetection() { return device_->StartPortalDetection(); }
1378 void StopPortalDetection() { device_->StopPortalDetection(); }
1379
1380 void PortalDetectorCallback(const PortalDetector::Result &result) {
1381 device_->PortalDetectorCallback(result);
1382 }
1383 bool RequestPortalDetection() {
1384 return device_->RequestPortalDetection();
1385 }
1386 void SetServiceConnectedState(Service::ConnectState state) {
1387 device_->SetServiceConnectedState(state);
1388 }
1389 void ExpectPortalDetectorReset() {
1390 EXPECT_FALSE(device_->portal_detector_.get());
1391 }
1392 void ExpectPortalDetectorSet() {
1393 EXPECT_TRUE(device_->portal_detector_.get());
1394 }
1395 void ExpectPortalDetectorIsMock() {
1396 EXPECT_EQ(portal_detector_, device_->portal_detector_.get());
1397 }
Peter Qiud670d032014-06-03 15:04:43 -07001398 void InvokeFallbackDNSResultCallback(DNSServerTester::Status status) {
1399 device_->FallbackDNSResultCallback(status);
Peter Qiub9256f32014-05-09 15:27:29 -07001400 }
Peter Qiu6f5618b2014-06-05 15:19:01 -07001401 void InvokeConfigDNSResultCallback(DNSServerTester::Status status) {
1402 device_->ConfigDNSResultCallback(status);
1403 }
Paul Stewarte8303eb2014-10-08 22:51:14 -07001404 void DestroyConnection() { device_->DestroyConnection(); }
Paul Stewartc681fa02012-03-02 19:40:04 -08001405 scoped_refptr<MockConnection> connection_;
1406 StrictMock<MockManager> manager_;
1407 scoped_refptr<MockService> service_;
1408
1409 // Used only for EXPECT_CALL(). Object is owned by device.
1410 MockPortalDetector *portal_detector_;
1411};
1412
Thieu Le85e050b2012-03-13 15:04:38 -07001413const int DevicePortalDetectionTest::kPortalAttempts = 2;
1414
Paul Stewartd215af62012-04-24 23:25:50 -07001415TEST_F(DevicePortalDetectionTest, ServicePortalDetectionDisabled) {
1416 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1417 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001418 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001419 .WillRepeatedly(Return(true));
Paul Stewartd215af62012-04-24 23:25:50 -07001420 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
1421 EXPECT_FALSE(StartPortalDetection());
1422}
1423
1424TEST_F(DevicePortalDetectionTest, TechnologyPortalDetectionDisabled) {
1425 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1426 .WillOnce(Return(false));
1427 EXPECT_CALL(*service_.get(), IsConnected())
1428 .WillRepeatedly(Return(true));
1429 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1430 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001431 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -08001432 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -08001433 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -08001434 EXPECT_FALSE(StartPortalDetection());
1435}
1436
Paul Stewartc681fa02012-03-02 19:40:04 -08001437TEST_F(DevicePortalDetectionTest, PortalDetectionProxyConfig) {
Paul Stewartd215af62012-04-24 23:25:50 -07001438 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1439 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -08001440 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001441 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001442 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -08001443 .WillOnce(Return(true));
Paul Stewartd215af62012-04-24 23:25:50 -07001444 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1445 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001446 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -08001447 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001448 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -08001449 EXPECT_FALSE(StartPortalDetection());
1450}
1451
Paul Stewartc681fa02012-03-02 19:40:04 -08001452TEST_F(DevicePortalDetectionTest, PortalDetectionBadUrl) {
Paul Stewartd215af62012-04-24 23:25:50 -07001453 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1454 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -08001455 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001456 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001457 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -08001458 .WillOnce(Return(false));
Paul Stewartd215af62012-04-24 23:25:50 -07001459 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1460 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001461 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -08001462 .WillOnce(Return(true));
1463 const string portal_url;
Paul Stewartc681fa02012-03-02 19:40:04 -08001464 EXPECT_CALL(manager_, GetPortalCheckURL())
Paul Stewart20088d82012-02-16 06:58:55 -08001465 .WillRepeatedly(ReturnRef(portal_url));
Paul Stewartc681fa02012-03-02 19:40:04 -08001466 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Paul Stewart20088d82012-02-16 06:58:55 -08001467 EXPECT_FALSE(StartPortalDetection());
1468}
1469
Paul Stewartc681fa02012-03-02 19:40:04 -08001470TEST_F(DevicePortalDetectionTest, PortalDetectionStart) {
Paul Stewartd215af62012-04-24 23:25:50 -07001471 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1472 .WillOnce(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -08001473 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001474 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001475 EXPECT_CALL(*service_.get(), HasProxyConfig())
Paul Stewart20088d82012-02-16 06:58:55 -08001476 .WillOnce(Return(false));
Paul Stewartd215af62012-04-24 23:25:50 -07001477 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1478 .WillOnce(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001479 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
Paul Stewart20088d82012-02-16 06:58:55 -08001480 .WillOnce(Return(true));
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001481 const string portal_url(ConnectivityTrial::kDefaultURL);
Paul Stewartc681fa02012-03-02 19:40:04 -08001482 EXPECT_CALL(manager_, GetPortalCheckURL())
Paul Stewart20088d82012-02-16 06:58:55 -08001483 .WillRepeatedly(ReturnRef(portal_url));
Paul Stewartc681fa02012-03-02 19:40:04 -08001484 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline))
Paul Stewart20088d82012-02-16 06:58:55 -08001485 .Times(0);
Paul Stewart20088d82012-02-16 06:58:55 -08001486 const string kInterfaceName("int0");
Paul Stewartc681fa02012-03-02 19:40:04 -08001487 EXPECT_CALL(*connection_.get(), interface_name())
1488 .WillRepeatedly(ReturnRef(kInterfaceName));
Peter Qiuf3a8f902014-08-20 10:05:42 -07001489 EXPECT_CALL(*connection_.get(), IsIPv6())
1490 .WillRepeatedly(Return(false));
1491 const vector<string> kDNSServers;
1492 EXPECT_CALL(*connection_.get(), dns_servers())
1493 .WillRepeatedly(ReturnRef(kDNSServers));
1494 EXPECT_TRUE(StartPortalDetection());
1495
1496 // Drop all references to device_info before it falls out of scope.
Ben Chancc225ef2014-09-30 13:26:51 -07001497 SetConnection(nullptr);
Peter Qiuf3a8f902014-08-20 10:05:42 -07001498 StopPortalDetection();
1499}
1500
1501TEST_F(DevicePortalDetectionTest, PortalDetectionStartIPv6) {
1502 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1503 .WillOnce(Return(false));
1504 EXPECT_CALL(*service_.get(), IsConnected())
1505 .WillRepeatedly(Return(true));
1506 EXPECT_CALL(*service_.get(), HasProxyConfig())
1507 .WillOnce(Return(false));
1508 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1509 .WillOnce(Return(true));
1510 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
1511 .WillOnce(Return(true));
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001512 const string portal_url(ConnectivityTrial::kDefaultURL);
Peter Qiuf3a8f902014-08-20 10:05:42 -07001513 EXPECT_CALL(manager_, GetPortalCheckURL())
1514 .WillRepeatedly(ReturnRef(portal_url));
1515 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline))
1516 .Times(0);
1517 const string kInterfaceName("int0");
1518 EXPECT_CALL(*connection_.get(), interface_name())
1519 .WillRepeatedly(ReturnRef(kInterfaceName));
1520 EXPECT_CALL(*connection_.get(), IsIPv6())
1521 .WillRepeatedly(Return(true));
Paul Stewart20088d82012-02-16 06:58:55 -08001522 const vector<string> kDNSServers;
Paul Stewartc681fa02012-03-02 19:40:04 -08001523 EXPECT_CALL(*connection_.get(), dns_servers())
1524 .WillRepeatedly(ReturnRef(kDNSServers));
Paul Stewart20088d82012-02-16 06:58:55 -08001525 EXPECT_TRUE(StartPortalDetection());
1526
1527 // Drop all references to device_info before it falls out of scope.
Ben Chancc225ef2014-09-30 13:26:51 -07001528 SetConnection(nullptr);
Paul Stewart20088d82012-02-16 06:58:55 -08001529 StopPortalDetection();
1530}
1531
Paul Stewartc681fa02012-03-02 19:40:04 -08001532TEST_F(DevicePortalDetectionTest, PortalDetectionNonFinal) {
1533 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001534 .Times(0);
Paul Stewartc681fa02012-03-02 19:40:04 -08001535 EXPECT_CALL(*service_.get(), SetState(_))
Paul Stewart20088d82012-02-16 06:58:55 -08001536 .Times(0);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001537 PortalDetectorCallback(
1538 PortalDetector::Result(
1539 ConnectivityTrial::Result(
1540 ConnectivityTrial::kPhaseUnknown,
1541 ConnectivityTrial::kStatusFailure),
1542 kPortalAttempts,
1543 false));
Paul Stewart20088d82012-02-16 06:58:55 -08001544}
1545
Paul Stewartc681fa02012-03-02 19:40:04 -08001546TEST_F(DevicePortalDetectionTest, PortalDetectionFailure) {
1547 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001548 .WillOnce(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001549 EXPECT_CALL(*service_.get(),
1550 SetPortalDetectionFailure(kPortalDetectionPhaseConnection,
1551 kPortalDetectionStatusFailure));
Paul Stewartc681fa02012-03-02 19:40:04 -08001552 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
Thieu Le85e050b2012-03-13 15:04:38 -07001553 EXPECT_CALL(metrics_,
1554 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
1555 Metrics::kPortalResultConnectionFailure,
1556 Metrics::kPortalResultMax));
1557 EXPECT_CALL(metrics_,
1558 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
1559 _, _, _, _)).Times(0);
1560 EXPECT_CALL(metrics_,
1561 SendToUMA("Network.Shill.Unknown.PortalAttempts",
1562 kPortalAttempts,
1563 Metrics::kMetricPortalAttemptsMin,
1564 Metrics::kMetricPortalAttemptsMax,
1565 Metrics::kMetricPortalAttemptsNumBuckets));
Paul Stewartc681fa02012-03-02 19:40:04 -08001566 EXPECT_CALL(*connection_.get(), is_default())
1567 .WillOnce(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -07001568 EXPECT_CALL(*connection_.get(), IsIPv6())
1569 .WillOnce(Return(false));
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001570 PortalDetectorCallback(
1571 PortalDetector::Result(
1572 ConnectivityTrial::Result(
1573 ConnectivityTrial::kPhaseConnection,
1574 ConnectivityTrial::kStatusFailure),
1575 kPortalAttempts,
1576 true));
Paul Stewart20088d82012-02-16 06:58:55 -08001577}
1578
Paul Stewartc681fa02012-03-02 19:40:04 -08001579TEST_F(DevicePortalDetectionTest, PortalDetectionSuccess) {
1580 EXPECT_CALL(*service_.get(), IsConnected())
Paul Stewart20088d82012-02-16 06:58:55 -08001581 .WillOnce(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001582 EXPECT_CALL(*service_.get(), SetPortalDetectionFailure(_, _)).Times(0);
Paul Stewartc681fa02012-03-02 19:40:04 -08001583 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
Thieu Le85e050b2012-03-13 15:04:38 -07001584 EXPECT_CALL(metrics_,
1585 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
1586 Metrics::kPortalResultSuccess,
1587 Metrics::kPortalResultMax));
1588 EXPECT_CALL(metrics_,
1589 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
1590 kPortalAttempts,
1591 Metrics::kMetricPortalAttemptsToOnlineMin,
1592 Metrics::kMetricPortalAttemptsToOnlineMax,
1593 Metrics::kMetricPortalAttemptsToOnlineNumBuckets));
1594 EXPECT_CALL(metrics_,
1595 SendToUMA("Network.Shill.Unknown.PortalAttempts",
1596 _, _, _, _)).Times(0);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001597 PortalDetectorCallback(
1598 PortalDetector::Result(
1599 ConnectivityTrial::Result(
1600 ConnectivityTrial::kPhaseContent,
1601 ConnectivityTrial::kStatusSuccess),
1602 kPortalAttempts,
1603 true));
Thieu Le85e050b2012-03-13 15:04:38 -07001604}
1605
1606TEST_F(DevicePortalDetectionTest, PortalDetectionSuccessAfterFailure) {
1607 EXPECT_CALL(*service_.get(), IsConnected())
1608 .WillRepeatedly(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001609 EXPECT_CALL(*service_.get(),
1610 SetPortalDetectionFailure(kPortalDetectionPhaseConnection,
1611 kPortalDetectionStatusFailure));
Thieu Le85e050b2012-03-13 15:04:38 -07001612 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1613 EXPECT_CALL(metrics_,
1614 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
1615 Metrics::kPortalResultConnectionFailure,
1616 Metrics::kPortalResultMax));
1617 EXPECT_CALL(metrics_,
1618 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
1619 _, _, _, _)).Times(0);
1620 EXPECT_CALL(metrics_,
1621 SendToUMA("Network.Shill.Unknown.PortalAttempts",
1622 kPortalAttempts,
1623 Metrics::kMetricPortalAttemptsMin,
1624 Metrics::kMetricPortalAttemptsMax,
1625 Metrics::kMetricPortalAttemptsNumBuckets));
1626 EXPECT_CALL(*connection_.get(), is_default())
1627 .WillOnce(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -07001628 EXPECT_CALL(*connection_.get(), IsIPv6())
1629 .WillOnce(Return(false));
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001630 PortalDetectorCallback(
1631 PortalDetector::Result(
1632 ConnectivityTrial::Result(
1633 ConnectivityTrial::kPhaseConnection,
1634 ConnectivityTrial::kStatusFailure),
1635 kPortalAttempts,
1636 true));
Thieu Le85e050b2012-03-13 15:04:38 -07001637 Mock::VerifyAndClearExpectations(&metrics_);
Peter Qiu9b83c892014-08-09 23:06:02 -07001638 EXPECT_CALL(*service_.get(), SetPortalDetectionFailure(_, _)).Times(0);
Thieu Le85e050b2012-03-13 15:04:38 -07001639 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
1640 EXPECT_CALL(metrics_,
1641 SendEnumToUMA("Network.Shill.Unknown.PortalResult",
1642 Metrics::kPortalResultSuccess,
1643 Metrics::kPortalResultMax));
1644 EXPECT_CALL(metrics_,
1645 SendToUMA("Network.Shill.Unknown.PortalAttemptsToOnline",
1646 kPortalAttempts * 2,
1647 Metrics::kMetricPortalAttemptsToOnlineMin,
1648 Metrics::kMetricPortalAttemptsToOnlineMax,
1649 Metrics::kMetricPortalAttemptsToOnlineNumBuckets));
1650 EXPECT_CALL(metrics_,
1651 SendToUMA("Network.Shill.Unknown.PortalAttempts",
1652 _, _, _, _)).Times(0);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001653 PortalDetectorCallback(
1654 PortalDetector::Result(
1655 ConnectivityTrial::Result(
1656 ConnectivityTrial::kPhaseContent,
1657 ConnectivityTrial::kStatusSuccess),
1658 kPortalAttempts,
1659 true));
Paul Stewart20088d82012-02-16 06:58:55 -08001660}
1661
Paul Stewartc681fa02012-03-02 19:40:04 -08001662TEST_F(DevicePortalDetectionTest, RequestPortalDetection) {
1663 EXPECT_CALL(*service_.get(), state())
1664 .WillOnce(Return(Service::kStateOnline))
1665 .WillRepeatedly(Return(Service::kStatePortal));
1666 EXPECT_FALSE(RequestPortalDetection());
1667
1668 EXPECT_CALL(*connection_.get(), is_default())
1669 .WillOnce(Return(false))
1670 .WillRepeatedly(Return(true));
1671 EXPECT_FALSE(RequestPortalDetection());
1672
1673 EXPECT_CALL(*portal_detector_, IsInProgress())
1674 .WillOnce(Return(true));
1675 // Portal detection already running.
1676 EXPECT_TRUE(RequestPortalDetection());
1677
1678 // Make sure our running mock portal detector was not replaced.
1679 ExpectPortalDetectorIsMock();
1680
1681 // Throw away our pre-fabricated portal detector, and have the device create
1682 // a new one.
1683 StopPortalDetection();
Paul Stewartd215af62012-04-24 23:25:50 -07001684 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1685 .WillRepeatedly(Return(false));
1686 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1687 .WillRepeatedly(Return(true));
Paul Stewartc681fa02012-03-02 19:40:04 -08001688 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
1689 .WillRepeatedly(Return(true));
1690 EXPECT_CALL(*service_.get(), HasProxyConfig())
1691 .WillRepeatedly(Return(false));
1692 const string kPortalCheckURL("http://portal");
1693 EXPECT_CALL(manager_, GetPortalCheckURL())
1694 .WillOnce(ReturnRef(kPortalCheckURL));
1695 const string kInterfaceName("int0");
Peter Qiuf3a8f902014-08-20 10:05:42 -07001696 EXPECT_CALL(*connection_.get(), IsIPv6())
1697 .WillRepeatedly(Return(false));
Paul Stewartc681fa02012-03-02 19:40:04 -08001698 EXPECT_CALL(*connection_.get(), interface_name())
1699 .WillRepeatedly(ReturnRef(kInterfaceName));
1700 const vector<string> kDNSServers;
1701 EXPECT_CALL(*connection_.get(), dns_servers())
1702 .WillRepeatedly(ReturnRef(kDNSServers));
1703 EXPECT_TRUE(RequestPortalDetection());
1704}
1705
Rebecca Silberstein6862b382014-09-11 08:24:51 -07001706TEST_F(DevicePortalDetectionTest, RequestStartConnectivityTest) {
Rebecca Silbersteinf4365a62014-09-16 11:40:32 -07001707 const string kInterfaceName("int0");
1708 EXPECT_CALL(*connection_.get(), interface_name())
1709 .WillRepeatedly(ReturnRef(kInterfaceName));
1710 EXPECT_CALL(*connection_.get(), IsIPv6())
1711 .WillRepeatedly(Return(false));
1712 const vector<string> kDNSServers;
1713 EXPECT_CALL(*connection_.get(), dns_servers())
1714 .WillRepeatedly(ReturnRef(kDNSServers));
1715
1716 EXPECT_EQ(nullptr, device_->connection_tester_);
1717 EXPECT_TRUE(device_->StartConnectivityTest());
1718 EXPECT_NE(nullptr, device_->connection_tester_);
Rebecca Silberstein6862b382014-09-11 08:24:51 -07001719}
1720
Paul Stewartc681fa02012-03-02 19:40:04 -08001721TEST_F(DevicePortalDetectionTest, NotConnected) {
1722 EXPECT_CALL(*service_.get(), IsConnected())
1723 .WillOnce(Return(false));
1724 SetServiceConnectedState(Service::kStatePortal);
1725 // We don't check for the portal detector to be reset here, because
1726 // it would have been reset as a part of disconnection.
1727}
1728
1729TEST_F(DevicePortalDetectionTest, NotPortal) {
1730 EXPECT_CALL(*service_.get(), IsConnected())
1731 .WillOnce(Return(true));
1732 EXPECT_CALL(*service_.get(), SetState(Service::kStateOnline));
1733 SetServiceConnectedState(Service::kStateOnline);
1734 ExpectPortalDetectorReset();
1735}
1736
1737TEST_F(DevicePortalDetectionTest, NotDefault) {
1738 EXPECT_CALL(*service_.get(), IsConnected())
1739 .WillOnce(Return(true));
1740 EXPECT_CALL(*connection_.get(), is_default())
1741 .WillOnce(Return(false));
1742 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1743 SetServiceConnectedState(Service::kStatePortal);
1744 ExpectPortalDetectorReset();
1745}
1746
1747TEST_F(DevicePortalDetectionTest, PortalIntervalIsZero) {
1748 EXPECT_CALL(*service_.get(), IsConnected())
1749 .WillOnce(Return(true));
1750 EXPECT_CALL(*connection_.get(), is_default())
1751 .WillOnce(Return(true));
1752 EXPECT_CALL(manager_, GetPortalCheckInterval())
1753 .WillOnce(Return(0));
1754 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1755 SetServiceConnectedState(Service::kStatePortal);
1756 ExpectPortalDetectorReset();
1757}
1758
1759TEST_F(DevicePortalDetectionTest, RestartPortalDetection) {
1760 EXPECT_CALL(*service_.get(), IsConnected())
1761 .WillOnce(Return(true));
1762 EXPECT_CALL(*connection_.get(), is_default())
1763 .WillOnce(Return(true));
1764 const int kPortalDetectionInterval = 10;
1765 EXPECT_CALL(manager_, GetPortalCheckInterval())
1766 .Times(AtLeast(1))
1767 .WillRepeatedly(Return(kPortalDetectionInterval));
1768 const string kPortalCheckURL("http://portal");
1769 EXPECT_CALL(manager_, GetPortalCheckURL())
1770 .WillOnce(ReturnRef(kPortalCheckURL));
1771 EXPECT_CALL(*portal_detector_, StartAfterDelay(kPortalCheckURL,
1772 kPortalDetectionInterval))
1773 .WillOnce(Return(true));
1774 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1775 SetServiceConnectedState(Service::kStatePortal);
1776 ExpectPortalDetectorSet();
1777}
1778
Paul Stewartc8860612012-09-28 07:36:21 -07001779TEST_F(DevicePortalDetectionTest, CancelledOnSelectService) {
1780 ExpectPortalDetectorSet();
1781 EXPECT_CALL(*service_.get(), state())
1782 .WillOnce(Return(Service::kStateIdle));
1783 EXPECT_CALL(*service_.get(), SetState(_));
1784 EXPECT_CALL(*service_.get(), SetConnection(_));
Ben Chancc225ef2014-09-30 13:26:51 -07001785 SelectService(nullptr);
Paul Stewartc8860612012-09-28 07:36:21 -07001786 ExpectPortalDetectorReset();
1787}
1788
Peter Qiub9256f32014-05-09 15:27:29 -07001789TEST_F(DevicePortalDetectionTest, PortalDetectionDNSFailure) {
Peter Qiu6f5618b2014-06-05 15:19:01 -07001790 const char *kGoogleDNSServers[] = { "8.8.8.8", "8.8.4.4" };
1791 vector<string> fallback_dns_servers(kGoogleDNSServers, kGoogleDNSServers + 2);
Peter Qiub9256f32014-05-09 15:27:29 -07001792 const string kInterfaceName("int0");
1793 EXPECT_CALL(*connection_.get(), interface_name())
1794 .WillRepeatedly(ReturnRef(kInterfaceName));
Peter Qiub9256f32014-05-09 15:27:29 -07001795
Peter Qiu6f5618b2014-06-05 15:19:01 -07001796 // DNS Failure, start DNS test for fallback DNS servers.
Peter Qiub9256f32014-05-09 15:27:29 -07001797 EXPECT_CALL(*service_.get(), IsConnected())
1798 .WillOnce(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001799 EXPECT_CALL(*service_.get(),
1800 SetPortalDetectionFailure(kPortalDetectionPhaseDns,
1801 kPortalDetectionStatusFailure));
Peter Qiub9256f32014-05-09 15:27:29 -07001802 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1803 EXPECT_CALL(*connection_.get(), is_default())
1804 .WillOnce(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -07001805 EXPECT_CALL(*connection_.get(), IsIPv6())
1806 .WillOnce(Return(false));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001807 EXPECT_CALL(*device_, StartDNSTest(fallback_dns_servers, false, _)).Times(1);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001808 PortalDetectorCallback(
1809 PortalDetector::Result(
1810 ConnectivityTrial::Result(
1811 ConnectivityTrial::kPhaseDNS,
1812 ConnectivityTrial::kStatusFailure),
1813 kPortalAttempts, true));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001814 Mock::VerifyAndClearExpectations(device_);
Peter Qiub9256f32014-05-09 15:27:29 -07001815
Peter Qiu6f5618b2014-06-05 15:19:01 -07001816 // DNS Timeout, start DNS test for fallback DNS servers.
Peter Qiub9256f32014-05-09 15:27:29 -07001817 EXPECT_CALL(*service_.get(), IsConnected())
1818 .WillOnce(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001819 EXPECT_CALL(*service_.get(),
1820 SetPortalDetectionFailure(kPortalDetectionPhaseDns,
1821 kPortalDetectionStatusTimeout));
Peter Qiub9256f32014-05-09 15:27:29 -07001822 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1823 EXPECT_CALL(*connection_.get(), is_default())
1824 .WillOnce(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -07001825 EXPECT_CALL(*connection_.get(), IsIPv6())
1826 .WillOnce(Return(false));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001827 EXPECT_CALL(*device_, StartDNSTest(fallback_dns_servers, false, _)).Times(1);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001828 PortalDetectorCallback(
1829 PortalDetector::Result(
1830 ConnectivityTrial::Result(
1831 ConnectivityTrial::kPhaseDNS,
1832 ConnectivityTrial::kStatusTimeout),
Peter Qiub9256f32014-05-09 15:27:29 -07001833 kPortalAttempts,
1834 true));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001835 Mock::VerifyAndClearExpectations(device_);
Peter Qiub9256f32014-05-09 15:27:29 -07001836
Peter Qiud670d032014-06-03 15:04:43 -07001837 // Other Failure, DNS server tester not started.
Peter Qiub9256f32014-05-09 15:27:29 -07001838 EXPECT_CALL(*service_.get(), IsConnected())
1839 .WillOnce(Return(true));
Peter Qiu9b83c892014-08-09 23:06:02 -07001840 EXPECT_CALL(*service_.get(),
1841 SetPortalDetectionFailure(kPortalDetectionPhaseConnection,
1842 kPortalDetectionStatusFailure));
Peter Qiub9256f32014-05-09 15:27:29 -07001843 EXPECT_CALL(*service_.get(), SetState(Service::kStatePortal));
1844 EXPECT_CALL(*connection_.get(), is_default())
1845 .WillOnce(Return(false));
Peter Qiub25083f2014-08-25 13:22:31 -07001846 EXPECT_CALL(*connection_.get(), IsIPv6())
1847 .WillOnce(Return(false));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001848 EXPECT_CALL(*device_, StartDNSTest(_, _, _)).Times(0);
Rebecca Silberstein3d49ea42014-08-21 11:20:50 -07001849 PortalDetectorCallback(
1850 PortalDetector::Result(
1851 ConnectivityTrial::Result(
1852 ConnectivityTrial::kPhaseConnection,
1853 ConnectivityTrial::kStatusFailure),
Peter Qiub9256f32014-05-09 15:27:29 -07001854 kPortalAttempts,
1855 true));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001856 Mock::VerifyAndClearExpectations(device_);
Peter Qiub9256f32014-05-09 15:27:29 -07001857}
1858
Peter Qiud670d032014-06-03 15:04:43 -07001859TEST_F(DevicePortalDetectionTest, FallbackDNSResultCallback) {
Peter Qiua89154b2014-05-23 15:45:42 -07001860 scoped_refptr<MockIPConfig> ipconfig =
1861 new MockIPConfig(control_interface(), kDeviceName);
1862 device_->set_ipconfig(ipconfig);
1863
1864 // Fallback DNS test failed.
1865 EXPECT_CALL(*connection_.get(), UpdateDNSServers(_)).Times(0);
1866 EXPECT_CALL(*ipconfig, UpdateDNSServers(_)).Times(0);
Peter Qiu6f5618b2014-06-05 15:19:01 -07001867 EXPECT_CALL(*device_, StartDNSTest(_, _, _)).Times(0);
Peter Qiub9256f32014-05-09 15:27:29 -07001868 EXPECT_CALL(metrics_,
Peter Qiuf18e7712014-05-20 09:59:46 -07001869 NotifyFallbackDNSTestResult(_, Metrics::kFallbackDNSTestResultFailure))
1870 .Times(1);
Peter Qiud670d032014-06-03 15:04:43 -07001871 InvokeFallbackDNSResultCallback(DNSServerTester::kStatusFailure);
Peter Qiua89154b2014-05-23 15:45:42 -07001872 Mock::VerifyAndClearExpectations(connection_.get());
1873 Mock::VerifyAndClearExpectations(ipconfig);
Peter Qiub9256f32014-05-09 15:27:29 -07001874 Mock::VerifyAndClearExpectations(&metrics_);
1875
Peter Qiua89154b2014-05-23 15:45:42 -07001876 // Fallback DNS test succeed with auto fallback disabled.
1877 EXPECT_CALL(*service_.get(), is_dns_auto_fallback_allowed())
1878 .WillOnce(Return(false));
1879 EXPECT_CALL(*connection_.get(), UpdateDNSServers(_)).Times(0);
1880 EXPECT_CALL(*ipconfig, UpdateDNSServers(_)).Times(0);
1881 EXPECT_CALL(*service_.get(), NotifyIPConfigChanges()).Times(0);
Peter Qiu6f5618b2014-06-05 15:19:01 -07001882 EXPECT_CALL(*device_, StartDNSTest(_, _, _)).Times(0);
Peter Qiub9256f32014-05-09 15:27:29 -07001883 EXPECT_CALL(metrics_,
Peter Qiuf18e7712014-05-20 09:59:46 -07001884 NotifyFallbackDNSTestResult(_, Metrics::kFallbackDNSTestResultSuccess))
1885 .Times(1);
Peter Qiud670d032014-06-03 15:04:43 -07001886 InvokeFallbackDNSResultCallback(DNSServerTester::kStatusSuccess);
Peter Qiua89154b2014-05-23 15:45:42 -07001887 Mock::VerifyAndClearExpectations(service_.get());
1888 Mock::VerifyAndClearExpectations(connection_.get());
1889 Mock::VerifyAndClearExpectations(ipconfig);
1890 Mock::VerifyAndClearExpectations(&metrics_);
1891
1892 // Fallback DNS test succeed with auto fallback enabled.
1893 EXPECT_CALL(*service_.get(), is_dns_auto_fallback_allowed())
1894 .WillOnce(Return(true));
1895 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1896 .WillRepeatedly(Return(false));
1897 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1898 .WillRepeatedly(Return(true));
1899 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
1900 .WillRepeatedly(Return(true));
1901 EXPECT_CALL(*service_.get(), HasProxyConfig())
1902 .WillRepeatedly(Return(false));
1903 const string kPortalCheckURL("http://portal");
1904 EXPECT_CALL(manager_, GetPortalCheckURL())
1905 .WillOnce(ReturnRef(kPortalCheckURL));
1906 const string kInterfaceName("int0");
Peter Qiuf3a8f902014-08-20 10:05:42 -07001907 EXPECT_CALL(*connection_.get(), IsIPv6())
1908 .WillRepeatedly(Return(false));
Peter Qiua89154b2014-05-23 15:45:42 -07001909 EXPECT_CALL(*connection_.get(), interface_name())
1910 .WillRepeatedly(ReturnRef(kInterfaceName));
1911 const vector<string> kDNSServers;
1912 EXPECT_CALL(*connection_.get(), dns_servers())
1913 .WillRepeatedly(ReturnRef(kDNSServers));
1914
1915 EXPECT_CALL(*ipconfig, UpdateDNSServers(_)).Times(1);
1916 EXPECT_CALL(*connection_.get(), UpdateDNSServers(_)).Times(1);
1917 EXPECT_CALL(*service_.get(), NotifyIPConfigChanges()).Times(1);
Peter Qiu6f5618b2014-06-05 15:19:01 -07001918 EXPECT_CALL(*device_, StartDNSTest(_, true, _)).Times(1);
Peter Qiua89154b2014-05-23 15:45:42 -07001919 EXPECT_CALL(metrics_,
1920 NotifyFallbackDNSTestResult(_, Metrics::kFallbackDNSTestResultSuccess))
1921 .Times(1);
Peter Qiud670d032014-06-03 15:04:43 -07001922 InvokeFallbackDNSResultCallback(DNSServerTester::kStatusSuccess);
Peter Qiua89154b2014-05-23 15:45:42 -07001923 Mock::VerifyAndClearExpectations(service_.get());
1924 Mock::VerifyAndClearExpectations(connection_.get());
1925 Mock::VerifyAndClearExpectations(ipconfig);
1926 Mock::VerifyAndClearExpectations(&metrics_);
Peter Qiub9256f32014-05-09 15:27:29 -07001927}
1928
Peter Qiu6f5618b2014-06-05 15:19:01 -07001929TEST_F(DevicePortalDetectionTest, ConfigDNSResultCallback) {
1930 scoped_refptr<MockIPConfig> ipconfig =
1931 new MockIPConfig(control_interface(), kDeviceName);
1932 device_->set_ipconfig(ipconfig);
1933
1934 // DNS test failed for configured DNS servers.
1935 EXPECT_CALL(*connection_.get(), UpdateDNSServers(_)).Times(0);
1936 EXPECT_CALL(*ipconfig, UpdateDNSServers(_)).Times(0);
1937 InvokeConfigDNSResultCallback(DNSServerTester::kStatusFailure);
1938 Mock::VerifyAndClearExpectations(connection_.get());
1939 Mock::VerifyAndClearExpectations(ipconfig);
1940
1941 // DNS test succeed for configured DNS servers.
1942 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1943 .WillRepeatedly(Return(false));
1944 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1945 .WillRepeatedly(Return(true));
1946 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
1947 .WillRepeatedly(Return(true));
1948 EXPECT_CALL(*service_.get(), HasProxyConfig())
1949 .WillRepeatedly(Return(false));
1950 const string kPortalCheckURL("http://portal");
1951 EXPECT_CALL(manager_, GetPortalCheckURL())
1952 .WillOnce(ReturnRef(kPortalCheckURL));
1953 const string kInterfaceName("int0");
Peter Qiuf3a8f902014-08-20 10:05:42 -07001954 EXPECT_CALL(*connection_.get(), IsIPv6())
1955 .WillRepeatedly(Return(false));
Peter Qiu6f5618b2014-06-05 15:19:01 -07001956 EXPECT_CALL(*connection_.get(), interface_name())
1957 .WillRepeatedly(ReturnRef(kInterfaceName));
1958 const vector<string> kDNSServers;
1959 EXPECT_CALL(*connection_.get(), dns_servers())
1960 .WillRepeatedly(ReturnRef(kDNSServers));
1961 EXPECT_CALL(*connection_.get(), UpdateDNSServers(_)).Times(1);
1962 EXPECT_CALL(*ipconfig, UpdateDNSServers(_)).Times(1);
1963 EXPECT_CALL(*service_.get(), NotifyIPConfigChanges()).Times(1);
1964 InvokeConfigDNSResultCallback(DNSServerTester::kStatusSuccess);
1965 Mock::VerifyAndClearExpectations(service_.get());
1966 Mock::VerifyAndClearExpectations(connection_.get());
1967 Mock::VerifyAndClearExpectations(ipconfig);
1968}
1969
Paul Stewarte8303eb2014-10-08 22:51:14 -07001970TEST_F(DevicePortalDetectionTest, DestroyConnection) {
1971 scoped_refptr<MockConnection> connection =
1972 new NiceMock<MockConnection>(&device_info_);
1973 // This test holds a single reference to the mock connection.
1974 EXPECT_TRUE(connection->HasOneRef());
1975
1976 SetConnection(connection);
1977
1978 EXPECT_CALL(*service_.get(), IsPortalDetectionDisabled())
1979 .WillOnce(Return(false));
1980 EXPECT_CALL(*service_.get(), IsConnected())
1981 .WillRepeatedly(Return(true));
1982 EXPECT_CALL(*service_.get(), HasProxyConfig())
1983 .WillOnce(Return(false));
1984 EXPECT_CALL(*service_.get(), IsPortalDetectionAuto())
1985 .WillOnce(Return(true));
1986 EXPECT_CALL(manager_, IsPortalDetectionEnabled(device_->technology()))
1987 .WillOnce(Return(true));
1988 const string portal_url(ConnectivityTrial::kDefaultURL);
1989 EXPECT_CALL(manager_, GetPortalCheckURL())
1990 .WillRepeatedly(ReturnRef(portal_url));
1991 const string kInterfaceName("int0");
1992 EXPECT_CALL(*connection.get(), interface_name())
1993 .WillRepeatedly(ReturnRef(kInterfaceName));
1994 EXPECT_CALL(*connection.get(), IsIPv6())
1995 .WillRepeatedly(Return(false));
1996 const vector<string> kDNSServers;
1997 EXPECT_CALL(*connection.get(), dns_servers())
1998 .WillRepeatedly(ReturnRef(kDNSServers));
1999
2000 EXPECT_TRUE(device_->StartConnectivityTest());
2001 EXPECT_TRUE(StartPortalDetection());
2002
2003 // Ensure that the DestroyConnection method removes all connection references
2004 // except the one left in this scope.
2005 EXPECT_CALL(*service_.get(), SetConnection(IsNullRefPtr()));
2006 DestroyConnection();
2007 EXPECT_TRUE(connection->HasOneRef());
2008}
2009
Paul Stewart6ff27f52012-07-11 06:51:41 -07002010class DeviceByteCountTest : public DeviceTest {
2011 public:
2012 DeviceByteCountTest()
2013 : manager_(control_interface(),
2014 dispatcher(),
2015 metrics(),
2016 glib()),
2017 rx_byte_count_(0),
2018 tx_byte_count_(0),
2019 rx_stored_byte_count_(0),
2020 tx_stored_byte_count_(0) {}
2021 virtual ~DeviceByteCountTest() {}
2022
2023 virtual void SetUp() {
2024 DeviceTest::SetUp();
2025 EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
2026 EXPECT_CALL(device_info_, GetByteCounts(kDeviceInterfaceIndex, _, _))
2027 .WillRepeatedly(Invoke(this, &DeviceByteCountTest::ReturnByteCounts));
2028 const string id = device_->GetStorageIdentifier();
2029 EXPECT_CALL(storage_, ContainsGroup(id)).WillRepeatedly(Return(true));
2030 EXPECT_CALL(storage_, GetUint64(id, Device::kStorageReceiveByteCount, _))
2031 .WillRepeatedly(
2032 Invoke(this, &DeviceByteCountTest::GetStoredReceiveCount));
2033 EXPECT_CALL(storage_, GetUint64(id, Device::kStorageTransmitByteCount, _))
2034 .WillRepeatedly(
2035 Invoke(this, &DeviceByteCountTest::GetStoredTransmitCount));
2036 }
2037
Ben Chan7fab8972014-08-10 17:14:46 -07002038 bool ReturnByteCounts(int interface_index, uint64_t *rx, uint64_t *tx) {
Paul Stewart6ff27f52012-07-11 06:51:41 -07002039 *rx = rx_byte_count_;
2040 *tx = tx_byte_count_;
2041 return true;
2042 }
2043
2044 bool ExpectByteCounts(DeviceRefPtr device,
Ben Chan7fab8972014-08-10 17:14:46 -07002045 int64_t expected_rx, int64_t expected_tx) {
2046 int64_t actual_rx = device->GetReceiveByteCount();
2047 int64_t actual_tx = device->GetTransmitByteCount();
Paul Stewart6ff27f52012-07-11 06:51:41 -07002048 EXPECT_EQ(expected_rx, actual_rx);
2049 EXPECT_EQ(expected_tx, actual_tx);
2050 return expected_rx == actual_rx && expected_tx == actual_tx;
2051 }
2052
2053 void ExpectSavedCounts(DeviceRefPtr device,
Ben Chan7fab8972014-08-10 17:14:46 -07002054 int64_t expected_rx, int64_t expected_tx) {
Paul Stewart6ff27f52012-07-11 06:51:41 -07002055 EXPECT_CALL(storage_,
2056 SetUint64(_, Device::kStorageReceiveByteCount, expected_rx))
2057 .WillOnce(Return(true));
2058 EXPECT_CALL(storage_,
2059 SetUint64(_, Device::kStorageTransmitByteCount, expected_tx))
2060 .WillOnce(Return(true));
2061 EXPECT_TRUE(device->Save(&storage_));
2062 }
2063
2064
2065 bool GetStoredReceiveCount(const string &group, const string &key,
Ben Chan7fab8972014-08-10 17:14:46 -07002066 uint64_t *value) {
Paul Stewart6ff27f52012-07-11 06:51:41 -07002067 if (!rx_stored_byte_count_) {
2068 return false;
2069 }
2070 *value = rx_stored_byte_count_;
2071 return true;
2072 }
2073
2074 bool GetStoredTransmitCount(const string &group, const string &key,
Ben Chan7fab8972014-08-10 17:14:46 -07002075 uint64_t *value) {
Paul Stewart6ff27f52012-07-11 06:51:41 -07002076 if (!tx_stored_byte_count_) {
2077 return false;
2078 }
2079 *value = tx_stored_byte_count_;
2080 return true;
2081 }
2082
2083 protected:
2084 NiceMock<MockManager> manager_;
2085 NiceMock<MockStore> storage_;
Ben Chan7fab8972014-08-10 17:14:46 -07002086 uint64_t rx_byte_count_;
2087 uint64_t tx_byte_count_;
2088 uint64_t rx_stored_byte_count_;
2089 uint64_t tx_stored_byte_count_;
Paul Stewart6ff27f52012-07-11 06:51:41 -07002090};
2091
2092
2093TEST_F(DeviceByteCountTest, GetByteCounts) {
2094 // On Device initialization, byte counts should be zero, independent of
2095 // the byte counts reported by the interface.
2096 rx_byte_count_ = 123;
2097 tx_byte_count_ = 456;
2098 DeviceRefPtr device(new TestDevice(control_interface(),
2099 dispatcher(),
Ben Chancc225ef2014-09-30 13:26:51 -07002100 nullptr,
Paul Stewart6ff27f52012-07-11 06:51:41 -07002101 &manager_,
2102 kDeviceName,
2103 kDeviceAddress,
2104 kDeviceInterfaceIndex,
2105 Technology::kUnknown));
2106 EXPECT_TRUE(ExpectByteCounts(device, 0, 0));
2107
2108 // Device should report any increase in the byte counts reported in the
2109 // interface.
Ben Chan7fab8972014-08-10 17:14:46 -07002110 const int64_t delta_rx_count = 789;
2111 const int64_t delta_tx_count = 12;
Paul Stewart6ff27f52012-07-11 06:51:41 -07002112 rx_byte_count_ += delta_rx_count;
2113 tx_byte_count_ += delta_tx_count;
2114 EXPECT_TRUE(ExpectByteCounts(device, delta_rx_count, delta_tx_count));
2115
2116 // Expect the correct values to be saved to the profile.
2117 ExpectSavedCounts(device, delta_rx_count, delta_tx_count);
2118
2119 // If Device is loaded from a profile that does not contain stored byte
2120 // counts, the byte counts reported should remain unchanged.
2121 EXPECT_TRUE(device->Load(&storage_));
2122 EXPECT_TRUE(ExpectByteCounts(device, delta_rx_count, delta_tx_count));
2123
2124 // If Device is loaded from a profile that contains stored byte
2125 // counts, the byte counts reported should now reflect the stored values.
2126 rx_stored_byte_count_ = 345;
2127 tx_stored_byte_count_ = 678;
2128 EXPECT_TRUE(device->Load(&storage_));
2129 EXPECT_TRUE(ExpectByteCounts(
2130 device, rx_stored_byte_count_, tx_stored_byte_count_));
2131
2132 // Increases to the interface receive count should be reflected as offsets
2133 // to the stored byte counts.
2134 rx_byte_count_ += delta_rx_count;
2135 tx_byte_count_ += delta_tx_count;
2136 EXPECT_TRUE(ExpectByteCounts(device,
2137 rx_stored_byte_count_ + delta_rx_count,
2138 tx_stored_byte_count_ + delta_tx_count));
2139
2140 // Expect the correct values to be saved to the profile.
2141 ExpectSavedCounts(device,
2142 rx_stored_byte_count_ + delta_rx_count,
2143 tx_stored_byte_count_ + delta_tx_count);
2144
2145 // Expect that after resetting byte counts, read-back values return to zero,
2146 // and that the device requests this information to be persisted.
2147 EXPECT_CALL(manager_, UpdateDevice(device));
2148 device->ResetByteCounters();
2149 EXPECT_TRUE(ExpectByteCounts(device, 0, 0));
2150}
2151
Darin Petkovafa6fc42011-06-21 16:21:08 -07002152} // namespace shill