blob: 3b0392d138f04c22f84cc88332c83b7ced3d1249 [file] [log] [blame]
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone853b81b2011-06-24 14:11:41 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/wifi.h"
6
mukesh agrawalf2f68a52011-09-01 12:15:48 -07007#include <netinet/ether.h>
8#include <linux/if.h>
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07009#include <sys/socket.h>
10#include <linux/netlink.h> // Needs typedefs from sys/socket.h.
mukesh agrawalf2f68a52011-09-01 12:15:48 -070011
Chris Masone853b81b2011-06-24 14:11:41 -070012#include <map>
13#include <string>
14#include <vector>
15
Darin Petkov60ceaf32012-10-18 10:36:01 +020016#include <base/file_util.h>
mukesh agrawal7ec71312011-11-10 02:08:26 +000017#include <base/memory/ref_counted.h>
mukesh agrawaldc42bb32011-07-28 10:40:26 -070018#include <base/memory/scoped_ptr.h>
Paul Stewarta41e38d2011-11-11 07:47:29 -080019#include <base/stringprintf.h>
mukesh agrawal31950242011-07-14 11:53:38 -070020#include <base/string_number_conversions.h>
Darin Petkov4a66cc52012-06-15 10:08:29 +020021#include <base/string_split.h>
mukesh agrawal31950242011-07-14 11:53:38 -070022#include <base/string_util.h>
Chris Masone853b81b2011-06-24 14:11:41 -070023#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070024#include <dbus-c++/dbus.h>
Chris Masone7156c922011-08-23 20:36:21 -070025#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070026#include <gtest/gtest.h>
Chris Masone853b81b2011-06-24 14:11:41 -070027
28#include "shill/dbus_adaptor.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070029#include "shill/event_dispatcher.h"
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070030#include "shill/geolocation_info.h"
mukesh agrawal8ede0522011-10-03 14:57:44 -070031#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070032#include "shill/key_value_store.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070033#include "shill/logging.h"
Chris Masone853b81b2011-06-24 14:11:41 -070034#include "shill/manager.h"
Wade Guthriebee87c22013-03-06 11:00:46 -080035#include "shill/mock_config80211.h"
Darin Petkov2b8e44e2012-06-25 15:13:26 +020036#include "shill/mock_dbus_manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070037#include "shill/mock_device.h"
mukesh agrawalc01f3982012-01-24 13:48:39 -080038#include "shill/mock_device_info.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070039#include "shill/mock_dhcp_config.h"
40#include "shill/mock_dhcp_provider.h"
Paul Stewarte369ece2012-05-22 09:11:03 -070041#include "shill/mock_event_dispatcher.h"
Paul Stewart3c508e12012-08-09 11:40:06 -070042#include "shill/mock_link_monitor.h"
mukesh agrawalcf24a242012-05-21 16:46:11 -070043#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070044#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080045#include "shill/mock_metrics.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070046#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070047#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080048#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080049#include "shill/mock_supplicant_bss_proxy.h"
Paul Stewart735eab52013-03-29 09:19:23 -070050#include "shill/mock_supplicant_eap_state_handler.h"
mukesh agrawal31950242011-07-14 11:53:38 -070051#include "shill/mock_supplicant_interface_proxy.h"
Paul Stewart835934a2012-12-06 19:27:09 -080052#include "shill/mock_supplicant_network_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070053#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080054#include "shill/mock_time.h"
Paul Stewart3c504012013-01-17 17:49:58 -080055#include "shill/mock_wifi_provider.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000056#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070057#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070058#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070059#include "shill/proxy_factory.h"
Paul Stewart85aea152013-01-22 09:31:56 -080060#include "shill/technology.h"
mukesh agrawal31950242011-07-14 11:53:38 -070061#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070062#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080063#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070064
Gary Morainac1bdb42012-02-16 17:42:29 -080065
Albert Chaulk0e1cdea2013-02-27 15:32:55 -080066using base::FilePath;
Chris Masone853b81b2011-06-24 14:11:41 -070067using std::map;
68using std::string;
69using std::vector;
70using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070071using ::testing::AnyNumber;
Paul Stewart3c504012013-01-17 17:49:58 -080072using ::testing::AtLeast;
mukesh agrawal31950242011-07-14 11:53:38 -070073using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080074using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070075using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070076using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080077using ::testing::Invoke;
Paul Stewart549d44c2012-07-03 12:40:25 -070078using ::testing::InvokeWithoutArgs;
mukesh agrawal7ec71312011-11-10 02:08:26 +000079using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070080using ::testing::NiceMock;
mukesh agrawald4dc0832013-03-25 14:38:26 -070081using ::testing::NotNull;
Chris Masone853b81b2011-06-24 14:11:41 -070082using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080083using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080084using ::testing::SetArgumentPointee;
85using ::testing::StrEq;
86using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070087using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070088using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070089using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070090
91namespace shill {
92
mukesh agrawal31950242011-07-14 11:53:38 -070093class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070094 public:
mukesh agrawal31950242011-07-14 11:53:38 -070095 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080096 : device_(new WiFi(control_interface(),
Paul Stewart3c504012013-01-17 17:49:58 -080097 NULL, NULL, manager(), "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070098 }
mukesh agrawal31950242011-07-14 11:53:38 -070099 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -0700100
101 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800102 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -0700103};
104
mukesh agrawal31950242011-07-14 11:53:38 -0700105TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700106 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
107 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -0700108}
109
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800110TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700111 {
112 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800113 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700114 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 flimflam::kBgscanSignalThresholdProperty,
116 PropertyStoreTest::kInt32V,
117 &error));
118 }
119 {
120 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800121 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
122 flimflam::kScanIntervalProperty,
123 PropertyStoreTest::kUint16V,
124 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700125 }
Chris Masone853b81b2011-06-24 14:11:41 -0700126 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700127 {
128 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800129 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
130 flimflam::kScanningProperty,
131 PropertyStoreTest::kBoolV,
132 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700133 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700134 }
Chris Masone853b81b2011-06-24 14:11:41 -0700135
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800136 {
137 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800138 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800139 device_->mutable_store(),
140 flimflam::kBgscanMethodProperty,
141 DBusAdaptor::StringToVariant(
Paul Stewart0654ece2013-03-26 15:21:26 -0700142 WPASupplicant::kNetworkBgscanMethodSimple),
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800143 &error));
144 }
145
146 {
147 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800148 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800149 device_->mutable_store(),
150 flimflam::kBgscanMethodProperty,
151 DBusAdaptor::StringToVariant("not a real scan method"),
152 &error));
153 }
154}
155
Darin Petkov4a66cc52012-06-15 10:08:29 +0200156TEST_F(WiFiPropertyTest, BgscanMethodProperty) {
Paul Stewart0654ece2013-03-26 15:21:26 -0700157 EXPECT_NE(WPASupplicant::kNetworkBgscanMethodLearn,
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800158 WiFi::kDefaultBgscanMethod);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200159 EXPECT_TRUE(device_->bgscan_method_.empty());
160
161 string method;
Paul Stewarte6e8e492013-01-17 11:00:50 -0800162 Error unused_error;
163 EXPECT_TRUE(device_->store().GetStringProperty(
164 flimflam::kBgscanMethodProperty, &method, &unused_error));
Darin Petkov4a66cc52012-06-15 10:08:29 +0200165 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
Paul Stewart0654ece2013-03-26 15:21:26 -0700166 EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodSimple, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800167
168 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800169 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800170 device_->mutable_store(),
171 flimflam::kBgscanMethodProperty,
172 DBusAdaptor::StringToVariant(
Paul Stewart0654ece2013-03-26 15:21:26 -0700173 WPASupplicant::kNetworkBgscanMethodLearn),
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800174 &error));
Paul Stewart0654ece2013-03-26 15:21:26 -0700175 EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
Paul Stewarte6e8e492013-01-17 11:00:50 -0800176 EXPECT_TRUE(device_->store().GetStringProperty(
177 flimflam::kBgscanMethodProperty, &method, &unused_error));
Paul Stewart0654ece2013-03-26 15:21:26 -0700178 EXPECT_EQ(WPASupplicant::kNetworkBgscanMethodLearn, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800179
180 EXPECT_TRUE(DBusAdaptor::ClearProperty(
181 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
Paul Stewarte6e8e492013-01-17 11:00:50 -0800182 EXPECT_TRUE(device_->store().GetStringProperty(
183 flimflam::kBgscanMethodProperty, &method, &unused_error));
Darin Petkov4a66cc52012-06-15 10:08:29 +0200184 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
185 EXPECT_TRUE(device_->bgscan_method_.empty());
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800186}
187
Paul Stewart3c504012013-01-17 17:49:58 -0800188
189MATCHER_P(EndpointMatch, endpoint, "") {
190 return
191 arg->ssid() == endpoint->ssid() &&
192 arg->network_mode() == endpoint->network_mode() &&
193 arg->security_mode() == endpoint->security_mode();
194}
195
Paul Stewarte369ece2012-05-22 09:11:03 -0700196class WiFiObjectTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700197 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700198 WiFiObjectTest(EventDispatcher *dispatcher)
199 : event_dispatcher_(dispatcher),
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800200 metrics_(NULL),
Paul Stewarte369ece2012-05-22 09:11:03 -0700201 manager_(&control_interface_, NULL, &metrics_, &glib_),
202 device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700203 wifi_(new WiFi(&control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700204 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -0800205 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700206 &manager_,
207 kDeviceName,
208 kDeviceAddress,
209 0)),
Paul Stewart3c504012013-01-17 17:49:58 -0800210 bss_counter_(0),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700211 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800212 supplicant_bss_proxy_(
213 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700214 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700215 kDeviceName)),
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200216 dbus_manager_(new NiceMock<MockDBusManager>()),
Paul Stewart735eab52013-03-29 09:19:23 -0700217 eap_state_handler_(new NiceMock<MockSupplicantEAPStateHandler>()),
Paul Stewart3c504012013-01-17 17:49:58 -0800218 supplicant_interface_proxy_(
219 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700220 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700221 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawalc01f3982012-01-24 13:48:39 -0800222
Paul Stewartd408fdf2012-05-07 17:15:57 -0700223 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800224 WillByDefault(Return(dhcp_config_));
225 ON_CALL(*dhcp_config_.get(), RequestIP()).
226 WillByDefault(Return(true));
Paul Stewart835934a2012-12-06 19:27:09 -0800227 ON_CALL(proxy_factory_, CreateSupplicantNetworkProxy(_, _)).
228 WillByDefault(InvokeWithoutArgs(
229 this, &WiFiObjectTest::CreateSupplicantNetworkProxy));
Gary Morainac1bdb42012-02-16 17:42:29 -0800230
Paul Stewart735eab52013-03-29 09:19:23 -0700231 // Transfers ownership.
232 manager_.dbus_manager_.reset(dbus_manager_);
233 wifi_->eap_state_handler_.reset(eap_state_handler_);
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200234
Paul Stewart3c504012013-01-17 17:49:58 -0800235 wifi_->provider_ = &wifi_provider_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800236 wifi_->time_ = &time_;
Wade Guthriebee87c22013-03-06 11:00:46 -0800237 // TODO(wdg): Flesh out the wifi tests to include config80211.
238 wifi_->config80211_ = &config80211_;
mukesh agrawal31950242011-07-14 11:53:38 -0700239 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700240
241 virtual void SetUp() {
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700242 // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
243 ScopeLogger::GetInstance()->EnableScopesByName("wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700244 ScopeLogger::GetInstance()->set_verbose_level(3);
Darin Petkovab565bb2011-10-06 02:55:51 -0700245 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700246 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
247 wifi_->set_dhcp_provider(&dhcp_provider_);
Paul Stewart3c504012013-01-17 17:49:58 -0800248 ON_CALL(manager_, device_info()).WillByDefault(Return(&device_info_));
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200249 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800250 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700251 }
252
253 virtual void TearDown() {
Paul Stewart3c504012013-01-17 17:49:58 -0800254 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
255 .WillRepeatedly(Return(reinterpret_cast<WiFiService *>(NULL)));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500256 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800257 if (supplicant_bss_proxy_.get()) {
258 EXPECT_CALL(*supplicant_bss_proxy_, Die());
259 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700260 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700261 // must Stop WiFi instance, to clear its list of services.
262 // otherwise, the WiFi instance will not be deleted. (because
263 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500264 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700265 wifi_->set_dhcp_provider(NULL);
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700266 // Reset scope logging, to avoid interfering with other tests.
267 ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700268 ScopeLogger::GetInstance()->set_verbose_level(0);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700269 }
270
Paul Stewart549d44c2012-07-03 12:40:25 -0700271 // Needs to be public since it is called via Invoke().
272 void StopWiFi() {
Paul Stewart549d44c2012-07-03 12:40:25 -0700273 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
274 }
275
Christopher Wileyc6184482012-10-24 15:31:56 -0700276 // Needs to be public since it is called via Invoke().
277 void ThrowDBusError() {
278 throw DBus::Error("SomeDBusType", "A handy message");
279 }
Paul Stewart17d90652013-04-04 15:09:11 -0700280 void ResetPendingService() {
281 SetPendingService(NULL);
282 }
Christopher Wileyc6184482012-10-24 15:31:56 -0700283
mukesh agrawal31950242011-07-14 11:53:38 -0700284 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000285 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
286
mukesh agrawal31950242011-07-14 11:53:38 -0700287 class TestProxyFactory : public ProxyFactory {
288 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700289 explicit TestProxyFactory(WiFiObjectTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700290
291 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700292 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700293 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700294 }
295
296 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
Paul Stewart196f50f2013-03-27 18:02:11 -0700297 SupplicantEventDelegateInterface */*delegate*/,
mukesh agrawal1830fa12011-09-26 14:31:40 -0700298 const DBus::Path &/*object_path*/,
299 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700300 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700301 }
302
mukesh agrawalb20776f2012-02-10 16:00:36 -0800303 MOCK_METHOD3(CreateSupplicantBSSProxy,
304 SupplicantBSSProxyInterface *(
305 WiFiEndpoint *wifi_endpoint,
306 const DBus::Path &object_path,
307 const char *dbus_addr));
308
Paul Stewart835934a2012-12-06 19:27:09 -0800309 MOCK_METHOD2(CreateSupplicantNetworkProxy,
310 SupplicantNetworkProxyInterface *(
311 const DBus::Path &object_path,
312 const char *dbus_addr));
313
mukesh agrawal31950242011-07-14 11:53:38 -0700314 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800315 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
316 WiFiEndpoint */*wifi_endpoint*/,
317 const DBus::Path &/*object_path*/,
318 const char */*dbus_addr*/) {
319 return test_->supplicant_bss_proxy_.release();
320 }
321
Paul Stewarte369ece2012-05-22 09:11:03 -0700322 WiFiObjectTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700323 };
324
Paul Stewart3c504012013-01-17 17:49:58 -0800325 // Simulate the course of events when the last enpoint of a service is
326 // removed.
327 class EndpointRemovalHandler {
328 public:
329 EndpointRemovalHandler(WiFiRefPtr wifi, const WiFiServiceRefPtr &service)
330 : wifi_(wifi), service_(service) {}
331 virtual ~EndpointRemovalHandler() {}
332
333 WiFiServiceRefPtr OnEndpointRemoved(
334 const WiFiEndpointConstRefPtr &endpoint) {
335 wifi_->DisassociateFromService(service_);
336 return service_;
337 }
338
339 private:
340 WiFiRefPtr wifi_;
341 WiFiServiceRefPtr service_;
342 };
343
344 EndpointRemovalHandler *MakeEndpointRemovalHandler(
345 WiFiServiceRefPtr &service) {
346 return new EndpointRemovalHandler(wifi_, service);
347 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700348 void CancelScanTimer() {
349 wifi_->scan_timer_callback_.Cancel();
350 }
Paul Stewart3c504012013-01-17 17:49:58 -0800351 // This function creates a new endpoint with a mode set to |mode|. We
352 // synthesize new |path| and |bssid| values, since we don't really care
353 // what they are for unit tests. If "use_ssid" is true, we used the
354 // passed-in ssid, otherwise we create a synthesized value for it as well.
355 WiFiEndpointRefPtr MakeNewEndpoint(const char *mode,
356 bool use_ssid,
357 string *ssid,
358 string *path,
359 string *bssid) {
360 bss_counter_++;
361 if (!use_ssid) {
362 *ssid = base::StringPrintf("ssid%d", bss_counter_);
363 }
364 *path = base::StringPrintf("/interface/bss%d", bss_counter_);
365 *bssid = base::StringPrintf("00:00:00:00:00:%02x", bss_counter_);
366 WiFiEndpointRefPtr endpoint = MakeEndpointWithMode(*ssid, *bssid, mode);
367 EXPECT_CALL(wifi_provider_,
368 OnEndpointAdded(EndpointMatch(endpoint))).Times(1);
369 return endpoint;
370 }
371 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
372 return MakeEndpointWithMode(ssid, bssid, kNetworkModeInfrastructure);
373 }
374 WiFiEndpointRefPtr MakeEndpointWithMode(
375 const string &ssid, const string &bssid, const string &mode) {
376 return WiFiEndpoint::MakeOpenEndpoint(
377 &proxy_factory_, NULL, ssid, bssid, mode, 0, 0);
378 }
379 MockWiFiServiceRefPtr MakeMockServiceWithSSID(
380 vector<uint8_t> ssid, const std::string &security) {
381 return new NiceMock<MockWiFiService>(
382 &control_interface_,
383 event_dispatcher_,
384 &metrics_,
385 &manager_,
386 &wifi_provider_,
387 ssid,
388 flimflam::kModeManaged,
389 security,
390 false);
391 }
392 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
393 return MakeMockServiceWithSSID(vector<uint8_t>(1, 'a'), security);
394 }
395 ::DBus::Path MakeNewEndpointAndService(int16_t signal_strength,
396 uint16 frequency,
397 const char *mode,
398 WiFiEndpointRefPtr *endpoint_ptr,
399 MockWiFiServiceRefPtr *service_ptr) {
400 string ssid;
401 ::DBus::Path path;
402 string bssid;
403 WiFiEndpointRefPtr endpoint =
404 MakeNewEndpoint(mode, false, &ssid, &path, &bssid);
405 MockWiFiServiceRefPtr service =
406 MakeMockServiceWithSSID(endpoint->ssid(), endpoint->security_mode());
407 EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
408 .WillRepeatedly(Return(service));
409 ON_CALL(*service, GetEndpointCount()).WillByDefault(Return(1));
410 ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
411 if (service_ptr) {
412 *service_ptr = service;
413 }
414 if (endpoint_ptr) {
415 *endpoint_ptr = endpoint;
416 }
417 return path;
418 }
419 ::DBus::Path AddEndpointToService(
420 WiFiServiceRefPtr service,
421 int16_t signal_strength,
422 uint16 frequency,
423 const char *mode,
424 WiFiEndpointRefPtr *endpoint_ptr) {
425 string ssid(service->ssid().begin(), service->ssid().end());
426 ::DBus::Path path;
427 string bssid;
428 WiFiEndpointRefPtr endpoint =
429 MakeNewEndpoint(mode, true, &ssid, &path, &bssid);
430 EXPECT_CALL(wifi_provider_, FindServiceForEndpoint(EndpointMatch(endpoint)))
431 .WillRepeatedly(Return(service));
432 ReportBSS(path, ssid, bssid, signal_strength, frequency, mode);
433 if (endpoint_ptr) {
434 *endpoint_ptr = endpoint;
435 }
436 return path;
437 }
438 void InitiateConnect(WiFiServiceRefPtr service) {
439 map<string, ::DBus::Variant> params;
440 wifi_->ConnectTo(service, params);
441 }
442 void InitiateDisconnect(WiFiServiceRefPtr service) {
443 wifi_->DisconnectFrom(service);
444 }
445 MockWiFiServiceRefPtr SetupConnectingService(
446 const DBus::Path &network_path,
447 WiFiEndpointRefPtr *endpoint_ptr,
448 ::DBus::Path *bss_path_ptr) {
449 if (!network_path.empty()) {
450 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_))
451 .WillOnce(Return(network_path));
452 EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(network_path));
453 }
454
455 MockWiFiServiceRefPtr service;
456 WiFiEndpointRefPtr endpoint;
457 ::DBus::Path bss_path(MakeNewEndpointAndService(
458 0, 0, kNetworkModeAdHoc, &endpoint, &service));
459 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
460 InitiateConnect(service);
461 Mock::VerifyAndClearExpectations(service);
462 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
463 if (endpoint_ptr) {
464 *endpoint_ptr = endpoint;
465 }
466 if (bss_path_ptr) {
467 *bss_path_ptr = bss_path;
468 }
469 return service;
470 }
471
472 MockWiFiServiceRefPtr SetupConnectedService(
473 const DBus::Path &network_path,
474 WiFiEndpointRefPtr *endpoint_ptr,
475 ::DBus::Path *bss_path_ptr) {
476 WiFiEndpointRefPtr endpoint;
477 ::DBus::Path bss_path;
478 MockWiFiServiceRefPtr service =
479 SetupConnectingService(network_path, &endpoint, &bss_path);
480 if (endpoint_ptr) {
481 *endpoint_ptr = endpoint;
482 }
483 if (bss_path_ptr) {
484 *bss_path_ptr = bss_path;
485 }
486 EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
487 ReportCurrentBSSChanged(bss_path);
488 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
489 Mock::VerifyAndClearExpectations(service);
490
491 EXPECT_CALL(*service, SetState(Service::kStateConfiguring));
492 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
493 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
Paul Stewart0654ece2013-03-26 15:21:26 -0700494 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
Paul Stewart3c504012013-01-17 17:49:58 -0800495 Mock::VerifyAndClearExpectations(service);
496
497 EXPECT_EQ(service, GetCurrentService());
498 return service;
mukesh agrawal15908392011-11-16 18:29:25 +0000499 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700500 void FireScanTimer() {
501 wifi_->ScanTimerHandler();
502 }
Christopher Wileyc68c8672012-11-20 16:52:21 -0800503 void TriggerScan() {
Wade Guthrie68d41092013-04-02 12:56:02 -0700504 wifi_->Scan(Device::kFullScan, NULL);
Christopher Wileyc68c8672012-11-20 16:52:21 -0800505 }
mukesh agrawal15908392011-11-16 18:29:25 +0000506 const WiFiServiceRefPtr &GetCurrentService() {
507 return wifi_->current_service_;
508 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700509 void SetCurrentService(const WiFiServiceRefPtr &service) {
510 wifi_->current_service_ = service;
511 }
mukesh agrawal31950242011-07-14 11:53:38 -0700512 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000513 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700514 }
mukesh agrawal15908392011-11-16 18:29:25 +0000515 const WiFiServiceRefPtr &GetPendingService() {
516 return wifi_->pending_service_;
517 }
Paul Stewart2b05e622012-07-13 20:38:44 -0700518 const base::CancelableClosure &GetPendingTimeout() {
519 return wifi_->pending_timeout_callback_;
520 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700521 const base::CancelableClosure &GetReconnectTimeoutCallback() {
Paul Stewart44663922012-07-30 11:03:03 -0700522 return wifi_->reconnect_timeout_callback_;
523 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700524 int GetReconnectTimeoutSeconds() {
525 return WiFi::kReconnectTimeoutSeconds;
526 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700527 const base::CancelableClosure &GetScanTimer() {
528 return wifi_->scan_timer_callback_;
529 }
mukesh agrawal31950242011-07-14 11:53:38 -0700530 // note: the tests need the proxies referenced by WiFi (not the
Paul Stewarte369ece2012-05-22 09:11:03 -0700531 // proxies instantiated by WiFiObjectTest), to ensure that WiFi
mukesh agrawal31950242011-07-14 11:53:38 -0700532 // sets up its proxies correctly.
533 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
534 return wifi_->supplicant_process_proxy_.get();
535 }
Paul Stewart3c504012013-01-17 17:49:58 -0800536 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxyFromWiFi() {
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000537 return dynamic_cast<MockSupplicantInterfaceProxy *>(
538 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700539 }
Paul Stewart3c504012013-01-17 17:49:58 -0800540 // This function returns the supplicant interface proxy whether
541 // or not we have passed the instantiated object to the WiFi instance
542 // from WiFiObjectTest, so tests don't need to worry about when they
543 // set expectations relative to StartWiFi().
544 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
545 MockSupplicantInterfaceProxy *proxy = GetSupplicantInterfaceProxyFromWiFi();
546 return proxy ? proxy : supplicant_interface_proxy_.get();
547 }
Paul Stewart835934a2012-12-06 19:27:09 -0800548 MockSupplicantNetworkProxy *CreateSupplicantNetworkProxy() {
549 return new NiceMock<MockSupplicantNetworkProxy>();
550 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000551 const string &GetSupplicantState() {
552 return wifi_->supplicant_state_;
553 }
Paul Stewart835934a2012-12-06 19:27:09 -0800554 void ClearCachedCredentials(const WiFiService *service) {
555 return wifi_->ClearCachedCredentials(service);
556 }
Paul Stewart0427cc12013-03-25 13:50:39 -0700557 void NotifyEndpointChanged(const WiFiEndpointConstRefPtr &endpoint) {
558 wifi_->NotifyEndpointChanged(endpoint);
559 }
Ben Chan381fdcc2012-10-14 21:10:36 -0700560 bool RemoveNetwork(const ::DBus::Path &network) {
561 return wifi_->RemoveNetwork(network);
562 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000563 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700564 void ReportBSS(const ::DBus::Path &bss_path,
565 const string &ssid,
566 const string &bssid,
567 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000568 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700569 const char *mode);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800570 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100571 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800572 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700573 void ReportLinkUp() {
574 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
575 }
mukesh agrawal31950242011-07-14 11:53:38 -0700576 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700577 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700578 }
mukesh agrawal15908392011-11-16 18:29:25 +0000579 void ReportCurrentBSSChanged(const string &new_bss) {
580 wifi_->CurrentBSSChanged(new_bss);
581 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000582 void ReportStateChanged(const string &new_state) {
583 wifi_->StateChanged(new_state);
584 }
Paul Stewart5581d072012-12-17 17:30:20 -0800585 void ReportWiFiDebugScopeChanged(bool enabled) {
586 wifi_->OnWiFiDebugScopeChanged(enabled);
587 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700588 void SetPendingService(const WiFiServiceRefPtr &service) {
589 wifi_->pending_service_ = service;
590 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700591 void SetScanInterval(uint16_t interval_seconds) {
592 wifi_->SetScanInterval(interval_seconds, NULL);
593 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700594 uint16_t GetScanInterval() {
595 return wifi_->GetScanInterval(NULL);
596 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200597 void StartWiFi(bool supplicant_present) {
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200598 wifi_->supplicant_present_ = supplicant_present;
mukesh agrawalb66c6462012-05-07 11:45:25 -0700599 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700600 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200601 void StartWiFi() {
602 StartWiFi(true);
603 }
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700604 void OnAfterResume() {
605 wifi_->OnAfterResume();
606 }
607 void OnBeforeSuspend() {
608 wifi_->OnBeforeSuspend();
609 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200610 void OnSupplicantAppear() {
611 wifi_->OnSupplicantAppear(":1.7");
612 EXPECT_TRUE(wifi_->supplicant_present_);
613 }
614 void OnSupplicantVanish() {
615 wifi_->OnSupplicantVanish();
616 EXPECT_FALSE(wifi_->supplicant_present_);
617 }
618 bool GetSupplicantPresent() {
619 return wifi_->supplicant_present_;
620 }
Darin Petkov4a66cc52012-06-15 10:08:29 +0200621 bool SetBgscanMethod(const string &method) {
622 ::DBus::Error error;
623 return DBusAdaptor::SetProperty(
624 wifi_->mutable_store(),
625 flimflam::kBgscanMethodProperty,
626 DBusAdaptor::StringToVariant(method),
627 &error);
628 }
629
630 void AppendBgscan(WiFiService *service,
631 std::map<std::string, DBus::Variant> *service_params) {
632 wifi_->AppendBgscan(service, service_params);
633 }
634
Paul Stewartbc6e7392012-05-24 07:07:48 -0700635 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
636 wifi_->CertificationTask(properties);
637 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700638
Paul Stewartdb0f9172012-11-30 16:48:09 -0800639 void ReportEAPEvent(const string &status, const string &parameter) {
640 wifi_->EAPEventTask(status, parameter);
641 }
642
Paul Stewarte369ece2012-05-22 09:11:03 -0700643 void RestartFastScanAttempts() {
644 wifi_->RestartFastScanAttempts();
645 }
646
Paul Stewart1aff7302012-08-04 20:04:47 -0700647 void StartReconnectTimer() {
648 wifi_->StartReconnectTimer();
649 }
650
651 void StopReconnectTimer() {
652 wifi_->StopReconnectTimer();
653 }
654
Paul Stewart3c508e12012-08-09 11:40:06 -0700655 void SetLinkMonitor(LinkMonitor *link_monitor) {
656 wifi_->set_link_monitor(link_monitor);
657 }
658
Paul Stewart1369c2b2013-01-11 05:41:26 -0800659 bool SuspectCredentials(const WiFiService &service,
660 Service::ConnectFailure *failure) {
661 return wifi_->SuspectCredentials(service, failure);
662 }
663
Paul Stewart3c508e12012-08-09 11:40:06 -0700664 void OnLinkMonitorFailure() {
665 wifi_->OnLinkMonitorFailure();
666 }
667
Paul Stewart10ccbb32012-04-26 15:59:30 -0700668 NiceMockControl *control_interface() {
669 return &control_interface_;
670 }
671
Paul Stewart85aea152013-01-22 09:31:56 -0800672 MockMetrics *metrics() {
673 return &metrics_;
674 }
675
mukesh agrawal32399322011-09-01 10:53:43 -0700676 MockManager *manager() {
677 return &manager_;
678 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800679
680 MockDeviceInfo *device_info() {
681 return &device_info_;
682 }
683
684 MockDHCPProvider *dhcp_provider() {
685 return &dhcp_provider_;
686 }
687
mukesh agrawal32399322011-09-01 10:53:43 -0700688 const WiFiConstRefPtr wifi() const {
689 return wifi_;
690 }
691
mukesh agrawalb20776f2012-02-10 16:00:36 -0800692 TestProxyFactory *proxy_factory() {
693 return &proxy_factory_;
694 }
695
Paul Stewart3c504012013-01-17 17:49:58 -0800696 MockWiFiProvider *wifi_provider() {
697 return &wifi_provider_;
698 }
699
Paul Stewarte369ece2012-05-22 09:11:03 -0700700 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700701 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800702 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700703
704 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700705 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800706 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700707 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700708 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800709 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700710 WiFiRefPtr wifi_;
Paul Stewart3c504012013-01-17 17:49:58 -0800711 NiceMock<MockWiFiProvider> wifi_provider_;
712 int bss_counter_;
mukesh agrawal31950242011-07-14 11:53:38 -0700713
714 // protected fields interspersed between private fields, due to
715 // initialization order
716 protected:
717 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700718 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700719 static const char kNetworkModeAdHoc[];
720 static const char kNetworkModeInfrastructure[];
Paul Stewart44663922012-07-30 11:03:03 -0700721 static const char kBSSName[];
722 static const char kSSIDName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700723
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700724 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800725 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700726 MockDHCPProvider dhcp_provider_;
727 scoped_refptr<MockDHCPConfig> dhcp_config_;
Paul Stewart735eab52013-03-29 09:19:23 -0700728
729 // These pointers track mock objects owned by the WiFi device instance
730 // and manager so we can perform expectations against them.
731 MockDBusManager *dbus_manager_;
732 MockSupplicantEAPStateHandler *eap_state_handler_;
Wade Guthriebee87c22013-03-06 11:00:46 -0800733 MockConfig80211 config80211_;
mukesh agrawal31950242011-07-14 11:53:38 -0700734
735 private:
Paul Stewart3c504012013-01-17 17:49:58 -0800736 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
Paul Stewart835934a2012-12-06 19:27:09 -0800737 NiceMock<TestProxyFactory> proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700738};
739
Paul Stewarte369ece2012-05-22 09:11:03 -0700740const char WiFiObjectTest::kDeviceName[] = "wlan0";
741const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
742const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
743const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
Paul Stewart44663922012-07-30 11:03:03 -0700744const char WiFiObjectTest::kBSSName[] = "bss0";
745const char WiFiObjectTest::kSSIDName[] = "ssid0";
mukesh agrawal31950242011-07-14 11:53:38 -0700746
Paul Stewarte369ece2012-05-22 09:11:03 -0700747void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000748 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000749}
750
Paul Stewarte369ece2012-05-22 09:11:03 -0700751void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700752 const string &ssid,
753 const string &bssid,
754 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000755 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700756 const char *mode) {
757 map<string, ::DBus::Variant> bss_properties;
758
759 {
760 DBus::MessageIter writer(bss_properties["SSID"].writer());
761 writer << vector<uint8_t>(ssid.begin(), ssid.end());
762 }
763 {
764 string bssid_nosep;
765 vector<uint8_t> bssid_bytes;
766 RemoveChars(bssid, ":", &bssid_nosep);
767 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
768
769 DBus::MessageIter writer(bss_properties["BSSID"].writer());
770 writer << bssid_bytes;
771 }
Paul Stewart0654ece2013-03-26 15:21:26 -0700772 bss_properties[WPASupplicant::kBSSPropertySignal].writer().
Thieu Lee41a72d2012-02-06 20:46:51 +0000773 append_int16(signal_strength);
Paul Stewart0654ece2013-03-26 15:21:26 -0700774 bss_properties[WPASupplicant::kBSSPropertyFrequency].writer().
Thieu Lee41a72d2012-02-06 20:46:51 +0000775 append_uint16(frequency);
Paul Stewart0654ece2013-03-26 15:21:26 -0700776 bss_properties[WPASupplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000777 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700778}
779
Paul Stewarte369ece2012-05-22 09:11:03 -0700780WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800781 : test_(test) {
782 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
783 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
784 .WillByDefault(
785 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
786}
787
Paul Stewarte369ece2012-05-22 09:11:03 -0700788// Most of our tests involve using a real EventDispatcher object.
789class WiFiMainTest : public WiFiObjectTest {
790 public:
791 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
792
793 protected:
794 EventDispatcher dispatcher_;
795};
796
mukesh agrawal31950242011-07-14 11:53:38 -0700797TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
798 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Paul Stewart3c504012013-01-17 17:49:58 -0800799 EXPECT_TRUE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
mukesh agrawal31950242011-07-14 11:53:38 -0700800
801 StartWiFi();
802 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Paul Stewart3c504012013-01-17 17:49:58 -0800803 EXPECT_FALSE(GetSupplicantInterfaceProxyFromWiFi() == NULL);
mukesh agrawal31950242011-07-14 11:53:38 -0700804}
805
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200806TEST_F(WiFiMainTest, SupplicantPresent) {
807 EXPECT_FALSE(GetSupplicantPresent());
808}
809
810TEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
811 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
812
Paul Stewart0654ece2013-03-26 15:21:26 -0700813 EXPECT_CALL(*dbus_manager_, WatchName(WPASupplicant::kDBusAddr, _, _));
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200814 StartWiFi(false); // No supplicant present.
815 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
816
817 OnSupplicantAppear();
818 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200819
820 // If supplicant reappears while the device is started, the device should be
821 // restarted.
822 EXPECT_CALL(*manager(), DeregisterDevice(_));
823 EXPECT_CALL(*manager(), RegisterDevice(_));
824 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200825}
826
827TEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
828 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
829
830 OnSupplicantAppear();
831 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200832
833 // If supplicant reappears while the device is stopped, the device should not
834 // be restarted.
835 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
836 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200837}
838
839TEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
840 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
841
842 StartWiFi();
843 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
844 EXPECT_TRUE(GetSupplicantPresent());
845
846 EXPECT_CALL(*manager(), DeregisterDevice(_));
847 EXPECT_CALL(*manager(), RegisterDevice(_));
848 OnSupplicantVanish();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200849}
850
851TEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
852 OnSupplicantAppear();
853 EXPECT_TRUE(GetSupplicantPresent());
854 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
855 OnSupplicantVanish();
856}
857
Paul Stewart549d44c2012-07-03 12:40:25 -0700858TEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
Paul Stewart3c504012013-01-17 17:49:58 -0800859 StartWiFi();
860 WiFiEndpointRefPtr endpoint;
861 WiFiServiceRefPtr service(
862 SetupConnectedService(DBus::Path(), &endpoint, NULL));
Paul Stewart549d44c2012-07-03 12:40:25 -0700863 ScopedMockLog log;
864 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
Christopher Wileyc6184482012-10-24 15:31:56 -0700865 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
Paul Stewart549d44c2012-07-03 12:40:25 -0700866 EndsWith("silently resetting current_service_.")));
867 EXPECT_CALL(*manager(), DeregisterDevice(_))
868 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
Paul Stewart3c504012013-01-17 17:49:58 -0800869 scoped_ptr<EndpointRemovalHandler> handler(
870 MakeEndpointRemovalHandler(service));
871 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
872 .WillOnce(Invoke(handler.get(),
873 &EndpointRemovalHandler::OnEndpointRemoved));
874 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
Paul Stewart549d44c2012-07-03 12:40:25 -0700875 EXPECT_CALL(*manager(), RegisterDevice(_));
876 OnSupplicantVanish();
877 EXPECT_TRUE(GetCurrentService() == NULL);
878}
879
mukesh agrawal31950242011-07-14 11:53:38 -0700880TEST_F(WiFiMainTest, CleanStart) {
881 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
882 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
883 .Times(AnyNumber())
884 .WillRepeatedly(Throw(
885 DBus::Error(
886 "fi.w1.wpa_supplicant1.InterfaceUnknown",
887 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700888 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700889 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -0800890 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal32399322011-09-01 10:53:43 -0700891 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700892 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700893}
894
Paul Stewart835934a2012-12-06 19:27:09 -0800895TEST_F(WiFiMainTest, ClearCachedCredentials) {
Paul Stewart3c504012013-01-17 17:49:58 -0800896 StartWiFi();
Paul Stewart835934a2012-12-06 19:27:09 -0800897 DBus::Path network = "/test/path";
Paul Stewart3c504012013-01-17 17:49:58 -0800898 WiFiServiceRefPtr service(SetupConnectedService(network, NULL, NULL));
899 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
Paul Stewart835934a2012-12-06 19:27:09 -0800900 ClearCachedCredentials(service);
901}
902
Paul Stewart0427cc12013-03-25 13:50:39 -0700903TEST_F(WiFiMainTest, NotifyEndpointChanged) {
904 WiFiEndpointRefPtr endpoint =
905 MakeEndpointWithMode("ssid", "00:00:00:00:00:00", kNetworkModeAdHoc);
906 EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
907 NotifyEndpointChanged(endpoint);
908}
909
Ben Chan381fdcc2012-10-14 21:10:36 -0700910TEST_F(WiFiMainTest, RemoveNetwork) {
911 DBus::Path network = "/test/path";
Ben Chan381fdcc2012-10-14 21:10:36 -0700912 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -0800913 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network));
Ben Chan381fdcc2012-10-14 21:10:36 -0700914 EXPECT_TRUE(RemoveNetwork(network));
915}
916
917TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
918 DBus::Path network = "/test/path";
Paul Stewart3c504012013-01-17 17:49:58 -0800919 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
Ben Chan381fdcc2012-10-14 21:10:36 -0700920 .WillRepeatedly(Throw(
921 DBus::Error(
922 "fi.w1.wpa_supplicant1.NetworkUnknown",
923 "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
924 StartWiFi();
925 EXPECT_TRUE(RemoveNetwork(network));
926}
927
Arman Ugurayed8e6102012-11-29 14:47:20 -0800928TEST_F(WiFiMainTest, UseArpGateway) {
929 EXPECT_CALL(dhcp_provider_, CreateConfig(kDeviceName, _, _, true))
930 .WillOnce(Return(dhcp_config_));
931 const_cast<WiFi *>(wifi().get())->AcquireIPConfig();
932}
933
Ben Chan381fdcc2012-10-14 21:10:36 -0700934TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
935 DBus::Path network = "/test/path";
Paul Stewart3c504012013-01-17 17:49:58 -0800936 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
Ben Chan381fdcc2012-10-14 21:10:36 -0700937 .WillRepeatedly(Throw(
938 DBus::Error(
939 "fi.w1.wpa_supplicant1.InvalidArgs",
940 "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
941 StartWiFi();
942 EXPECT_FALSE(RemoveNetwork(network));
943}
944
945TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
946 DBus::Path network = "/test/path";
Paul Stewart3c504012013-01-17 17:49:58 -0800947 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(network))
Ben Chan381fdcc2012-10-14 21:10:36 -0700948 .WillRepeatedly(Throw(
949 DBus::Error(
950 "fi.w1.wpa_supplicant1.UnknownError",
951 "test threw fi.w1.wpa_supplicant1.UnknownError")));
952 StartWiFi();
953 EXPECT_FALSE(RemoveNetwork(network));
954}
955
mukesh agrawal31950242011-07-14 11:53:38 -0700956TEST_F(WiFiMainTest, Restart) {
957 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
958 .Times(AnyNumber())
959 .WillRepeatedly(Throw(
960 DBus::Error(
961 "fi.w1.wpa_supplicant1.InterfaceExists",
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200962 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
mukesh agrawal31950242011-07-14 11:53:38 -0700963 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
Paul Stewart3c504012013-01-17 17:49:58 -0800964 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal31950242011-07-14 11:53:38 -0700965 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700966 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700967}
968
969TEST_F(WiFiMainTest, StartClearsState) {
Paul Stewart3c504012013-01-17 17:49:58 -0800970 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveAllNetworks());
971 EXPECT_CALL(*GetSupplicantInterfaceProxy(), FlushBSS(_));
mukesh agrawal31950242011-07-14 11:53:38 -0700972 StartWiFi();
973}
974
Christopher Wileyc68c8672012-11-20 16:52:21 -0800975TEST_F(WiFiMainTest, NoScansWhileConnecting) {
Christopher Wileyc68c8672012-11-20 16:52:21 -0800976 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -0800977 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
978 dispatcher_.DispatchPendingEvents();
979 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
980 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Christopher Wileyc68c8672012-11-20 16:52:21 -0800981 SetPendingService(service);
982 // If we're connecting, we ignore scan requests to stay on channel.
Paul Stewart3c504012013-01-17 17:49:58 -0800983 EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
Christopher Wileyc68c8672012-11-20 16:52:21 -0800984 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
985 TriggerScan();
986 dispatcher_.DispatchPendingEvents();
987 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Paul Stewart3c504012013-01-17 17:49:58 -0800988 Mock::VerifyAndClearExpectations(service);
989 EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
Christopher Wileyc68c8672012-11-20 16:52:21 -0800990 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
991 TriggerScan();
992 dispatcher_.DispatchPendingEvents();
993 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Paul Stewart3c504012013-01-17 17:49:58 -0800994 Mock::VerifyAndClearExpectations(service);
Christopher Wileyc68c8672012-11-20 16:52:21 -0800995 // Similarly, ignore scans when our connected service is reconnecting.
996 SetPendingService(NULL);
997 SetCurrentService(service);
Paul Stewart3c504012013-01-17 17:49:58 -0800998 EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(true));
Christopher Wileyc68c8672012-11-20 16:52:21 -0800999 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1000 TriggerScan();
1001 dispatcher_.DispatchPendingEvents();
1002 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Paul Stewart3c504012013-01-17 17:49:58 -08001003 Mock::VerifyAndClearExpectations(service);
Christopher Wileyc68c8672012-11-20 16:52:21 -08001004 // But otherwise we'll honor the request.
Paul Stewart3c504012013-01-17 17:49:58 -08001005 EXPECT_CALL(*service, IsConnecting()).WillOnce(Return(false));
Christopher Wileyc68c8672012-11-20 16:52:21 -08001006 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(1);
1007 TriggerScan();
1008 dispatcher_.DispatchPendingEvents();
1009 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Paul Stewart3c504012013-01-17 17:49:58 -08001010 Mock::VerifyAndClearExpectations(service);
Christopher Wileyc68c8672012-11-20 16:52:21 -08001011}
1012
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001013TEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
Paul Stewart3c504012013-01-17 17:49:58 -08001014 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Gary Morainac1bdb42012-02-16 17:42:29 -08001015 StartWiFi();
1016 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001017 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
mukesh agrawal5c05b292012-03-07 10:12:52 -08001018 ReportScanDone();
Gary Morainac1bdb42012-02-16 17:42:29 -08001019 ASSERT_TRUE(wifi()->IsIdle());
1020 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001021 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -08001022 dispatcher_.DispatchPendingEvents();
1023}
1024
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001025TEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
Paul Stewart3c504012013-01-17 17:49:58 -08001026 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Gary Morainac1bdb42012-02-16 17:42:29 -08001027 StartWiFi();
1028 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001029 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Gary Morainac1bdb42012-02-16 17:42:29 -08001030 ASSERT_TRUE(wifi()->IsIdle());
1031 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001032 OnBeforeSuspend();
Gary Morainac1bdb42012-02-16 17:42:29 -08001033 dispatcher_.DispatchPendingEvents();
1034}
1035
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001036TEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
Paul Stewart3c504012013-01-17 17:49:58 -08001037 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Gary Morainac1bdb42012-02-16 17:42:29 -08001038 StartWiFi();
Gary Morainac1bdb42012-02-16 17:42:29 -08001039 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001040 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1041 WiFiServiceRefPtr service(SetupConnectedService(DBus::Path(), NULL, NULL));
1042 EXPECT_FALSE(wifi()->IsIdle());
1043 ScopedMockLog log;
mukesh agrawal3ab56ac2012-05-31 14:41:43 -07001044 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1045 EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
Gary Morainac1bdb42012-02-16 17:42:29 -08001046 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001047 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -08001048 dispatcher_.DispatchPendingEvents();
1049}
1050
mukesh agrawal31950242011-07-14 11:53:38 -07001051TEST_F(WiFiMainTest, ScanResults) {
Paul Stewart3c504012013-01-17 17:49:58 -08001052 EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(5);
mukesh agrawal31950242011-07-14 11:53:38 -07001053 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001054 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -07001055 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +00001056 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -07001057 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +00001058 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -07001059 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +00001060 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
1061 const uint16 frequency = 2412;
1062 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
1063 kNetworkModeAdHoc);
1064
1065 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
1066 EXPECT_EQ(5, endpoints_by_rpcid.size());
1067
1068 WiFi::EndpointMap::const_iterator i;
1069 WiFiEndpointRefPtr endpoint;
1070 for (i = endpoints_by_rpcid.begin();
1071 i != endpoints_by_rpcid.end();
1072 ++i) {
1073 if (i->second->bssid_string() == "00:00:00:00:00:04")
1074 break;
1075 }
1076 ASSERT_TRUE(i != endpoints_by_rpcid.end());
1077 EXPECT_EQ(4, i->second->signal_strength());
1078 EXPECT_EQ(frequency, i->second->frequency());
1079 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -07001080}
1081
mukesh agrawal31950242011-07-14 11:53:38 -07001082TEST_F(WiFiMainTest, ScanCompleted) {
1083 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001084 WiFiEndpointRefPtr ap0 = MakeEndpointWithMode("ssid0", "00:00:00:00:00:00",
1085 kNetworkModeAdHoc);
1086 WiFiEndpointRefPtr ap1 = MakeEndpoint("ssid1", "00:00:00:00:00:01");
1087 WiFiEndpointRefPtr ap2 = MakeEndpoint("ssid2", "00:00:00:00:00:02");
1088 EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap0))).Times(1);
1089 EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap1))).Times(1);
1090 EXPECT_CALL(*wifi_provider(), OnEndpointAdded(EndpointMatch(ap2))).Times(1);
1091 ReportBSS("bss0", ap0->ssid_string(), ap0->bssid_string(), 0, 0,
1092 kNetworkModeAdHoc);
1093 ReportBSS("bss1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
1094 kNetworkModeInfrastructure);
1095 ReportBSS("bss2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
1096 kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -07001097 ReportScanDone();
Paul Stewart3c504012013-01-17 17:49:58 -08001098 Mock::VerifyAndClearExpectations(wifi_provider());
1099
1100 EXPECT_CALL(*wifi_provider(), OnEndpointAdded(_)).Times(0);
mukesh agrawalb3857612012-01-18 16:23:29 -08001101
mukesh agrawale9adda12012-02-09 18:33:48 -08001102 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +00001103 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawalb3857612012-01-18 16:23:29 -08001104
mukesh agrawale9adda12012-02-09 18:33:48 -08001105 // BSSes with empty SSIDs should be filtered.
1106 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001107}
1108
1109TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
1110 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001111 WiFiEndpointRefPtr endpoint;
1112 DBus::Path bss_path;
1113 WiFiServiceRefPtr service(
1114 SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
1115 scoped_ptr<EndpointRemovalHandler> handler(
1116 MakeEndpointRemovalHandler(service));
1117 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
1118 .WillOnce(Invoke(handler.get(),
1119 &EndpointRemovalHandler::OnEndpointRemoved));
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001120 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
Paul Stewart3c504012013-01-17 17:49:58 -08001121 RemoveBSS(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +00001122}
1123
1124TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
1125 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001126 WiFiEndpointRefPtr endpoint;
1127 DBus::Path bss_path;
1128 WiFiServiceRefPtr service(
1129 SetupConnectedService(DBus::Path(), &endpoint, &bss_path));
1130 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
1131 .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
1132 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1133 RemoveBSS(bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -07001134}
1135
Paul Stewart835934a2012-12-06 19:27:09 -08001136TEST_F(WiFiMainTest, ReconnectPreservesDBusPath) {
Paul Stewart835934a2012-12-06 19:27:09 -08001137 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001138 DBus::Path kPath = "/test/path";
1139 WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
Paul Stewart835934a2012-12-06 19:27:09 -08001140
1141 // Return the service to a connectable state.
Paul Stewart3c504012013-01-17 17:49:58 -08001142 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
Paul Stewart835934a2012-12-06 19:27:09 -08001143 InitiateDisconnect(service);
Paul Stewart3c504012013-01-17 17:49:58 -08001144 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1145
1146 // Complete the disconnection by reporting a BSS change.
Paul Stewart0654ece2013-03-26 15:21:26 -07001147 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
Paul Stewart835934a2012-12-06 19:27:09 -08001148
1149 // A second connection attempt should remember the DBus path associated
1150 // with this service.
Paul Stewart3c504012013-01-17 17:49:58 -08001151 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_)).Times(0);
1152 EXPECT_CALL(*GetSupplicantInterfaceProxy(), SelectNetwork(kPath));
Paul Stewart835934a2012-12-06 19:27:09 -08001153 InitiateConnect(service);
1154}
1155
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001156TEST_F(WiFiMainTest, DisconnectPendingService) {
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001157 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001158 MockWiFiServiceRefPtr service(
1159 SetupConnectingService(DBus::Path(), NULL, NULL));
1160 EXPECT_TRUE(GetPendingService() == service.get());
1161 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1162 EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001163 InitiateDisconnect(service);
Paul Stewart3c504012013-01-17 17:49:58 -08001164 Mock::VerifyAndClearExpectations(service.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001165 EXPECT_TRUE(GetPendingService() == NULL);
1166}
1167
1168TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001169 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001170 MockWiFiServiceRefPtr service0(
1171 SetupConnectedService(DBus::Path(), NULL, NULL));
1172 EXPECT_EQ(service0, GetCurrentService());
1173 EXPECT_EQ(NULL, GetPendingService().get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001174
Paul Stewart3c504012013-01-17 17:49:58 -08001175 // We don't explicitly call Disconnect() while transitioning to a new
1176 // service. Instead, we use the side-effect of SelectNetwork (verified in
1177 // SetupConnectingService).
1178 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
1179 MockWiFiServiceRefPtr service1(
1180 SetupConnectingService("/new/path", NULL, NULL));
1181 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001182
1183 EXPECT_EQ(service0, GetCurrentService());
1184 EXPECT_EQ(service1, GetPendingService());
Paul Stewart3c504012013-01-17 17:49:58 -08001185 EXPECT_CALL(*service1, SetState(Service::kStateIdle)).Times(AtLeast(1));
1186 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001187 InitiateDisconnect(service1);
Paul Stewart3c504012013-01-17 17:49:58 -08001188 Mock::VerifyAndClearExpectations(service1.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001189
1190 // |current_service_| will be unchanged until supplicant signals
1191 // that CurrentBSS has changed.
1192 EXPECT_EQ(service0, GetCurrentService());
1193 // |pending_service_| is updated immediately.
Paul Stewart3c504012013-01-17 17:49:58 -08001194 EXPECT_EQ(NULL, GetPendingService().get());
Paul Stewart2b05e622012-07-13 20:38:44 -07001195 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001196}
1197
1198TEST_F(WiFiMainTest, DisconnectCurrentService) {
Paul Stewart3c504012013-01-17 17:49:58 -08001199 StartWiFi();
1200 ::DBus::Path kPath("/fake/path");
1201 MockWiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1202 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001203 InitiateDisconnect(service);
1204
1205 // |current_service_| should not change until supplicant reports
1206 // a BSS change.
1207 EXPECT_EQ(service, GetCurrentService());
Paul Stewart835934a2012-12-06 19:27:09 -08001208
1209 // Expect that the entry associated with this network will be disabled.
1210 MockSupplicantNetworkProxy *network_proxy = CreateSupplicantNetworkProxy();
1211 EXPECT_CALL(*proxy_factory(), CreateSupplicantNetworkProxy(
Paul Stewart0654ece2013-03-26 15:21:26 -07001212 kPath, WPASupplicant::kDBusAddr))
Paul Stewart835934a2012-12-06 19:27:09 -08001213 .WillOnce(Return(network_proxy));
1214 EXPECT_CALL(*network_proxy, SetEnabled(false));
Paul Stewart735eab52013-03-29 09:19:23 -07001215 EXPECT_CALL(*eap_state_handler_, Reset());
Paul Stewart3c504012013-01-17 17:49:58 -08001216 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(0);
Paul Stewart0654ece2013-03-26 15:21:26 -07001217 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
Paul Stewart3c504012013-01-17 17:49:58 -08001218 EXPECT_EQ(NULL, GetCurrentService().get());
1219 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001220}
1221
Christopher Wileyc6184482012-10-24 15:31:56 -07001222TEST_F(WiFiMainTest, DisconnectCurrentServiceWithErrors) {
Paul Stewart3c504012013-01-17 17:49:58 -08001223 StartWiFi();
1224 DBus::Path kPath("/fake/path");
1225 WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1226 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
Christopher Wileyc6184482012-10-24 15:31:56 -07001227 .WillOnce(InvokeWithoutArgs(this, (&WiFiMainTest::ThrowDBusError)));
Paul Stewart3c504012013-01-17 17:49:58 -08001228 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
Christopher Wileyc6184482012-10-24 15:31:56 -07001229 InitiateDisconnect(service);
1230
1231 // We may sometimes fail to disconnect via supplicant, and we patch up some
1232 // state when this happens.
1233 EXPECT_EQ(NULL, GetCurrentService().get());
1234 EXPECT_EQ(NULL, wifi()->selected_service().get());
1235}
1236
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001237TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001238 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001239 WiFiServiceRefPtr service0(SetupConnectedService(DBus::Path(), NULL, NULL));
1240 WiFiServiceRefPtr service1(SetupConnectingService(DBus::Path(), NULL, NULL));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001241 EXPECT_EQ(service0, GetCurrentService());
1242 EXPECT_EQ(service1, GetPendingService());
Paul Stewart3c504012013-01-17 17:49:58 -08001243 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001244 InitiateDisconnect(service0);
1245
1246 EXPECT_EQ(service0, GetCurrentService());
1247 EXPECT_EQ(service1, GetPendingService());
Paul Stewart2b05e622012-07-13 20:38:44 -07001248 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
1249}
1250
Paul Stewart17d90652013-04-04 15:09:11 -07001251TEST_F(WiFiMainTest, TimeoutPendingServiceWithEndpoints) {
Paul Stewart2b05e622012-07-13 20:38:44 -07001252 StartWiFi();
Paul Stewart2b05e622012-07-13 20:38:44 -07001253 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1254 EXPECT_TRUE(pending_timeout.IsCancelled());
Paul Stewart3c504012013-01-17 17:49:58 -08001255 MockWiFiServiceRefPtr service(
1256 SetupConnectingService(DBus::Path(), NULL, NULL));
Paul Stewart2b05e622012-07-13 20:38:44 -07001257 EXPECT_FALSE(pending_timeout.IsCancelled());
1258 EXPECT_EQ(service, GetPendingService());
Paul Stewart17d90652013-04-04 15:09:11 -07001259 // Simulate a service with a wifi_ reference calling DisconnectFrom().
1260 EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _))
1261 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::ResetPendingService));
1262 EXPECT_CALL(*service, HasEndpoints()).Times(0);
1263 // DisconnectFrom() should not be called directly from WiFi.
1264 EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(0);
1265 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
Paul Stewart3c504012013-01-17 17:49:58 -08001266 pending_timeout.callback().Run();
Paul Stewart17d90652013-04-04 15:09:11 -07001267 Mock::VerifyAndClearExpectations(service);
1268}
1269
1270TEST_F(WiFiMainTest, TimeoutPendingServiceWithoutEndpoints) {
1271 StartWiFi();
1272 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1273 EXPECT_TRUE(pending_timeout.IsCancelled());
1274 MockWiFiServiceRefPtr service(
1275 SetupConnectingService(DBus::Path(), NULL, NULL));
1276 EXPECT_FALSE(pending_timeout.IsCancelled());
1277 EXPECT_EQ(service, GetPendingService());
1278 // We expect the service to get a disconnect call, but in this scenario
1279 // the service does nothing.
1280 EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
1281 EXPECT_CALL(*service, HasEndpoints()).WillOnce(Return(false));
1282 // DisconnectFrom() should be called directly from WiFi.
1283 EXPECT_CALL(*service, SetState(Service::kStateIdle)).Times(AtLeast(1));
1284 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1285 pending_timeout.callback().Run();
1286 EXPECT_EQ(NULL, GetPendingService().get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001287}
1288
1289TEST_F(WiFiMainTest, DisconnectInvalidService) {
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001290 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001291 MockWiFiServiceRefPtr service;
1292 MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
1293 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect()).Times(0);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001294 InitiateDisconnect(service);
1295}
1296
1297TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
Paul Stewart3c504012013-01-17 17:49:58 -08001298 StartWiFi();
1299 DBus::Path kPath("/fake/path");
1300 WiFiServiceRefPtr service(SetupConnectedService(kPath, NULL, NULL));
1301 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect())
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001302 .WillRepeatedly(Throw(
1303 DBus::Error(
1304 "fi.w1.wpa_supplicant1.NotConnected",
1305 "test threw fi.w1.wpa_supplicant1.NotConnected")));
Paul Stewart3c504012013-01-17 17:49:58 -08001306 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001307 InitiateDisconnect(service);
Paul Stewart3c504012013-01-17 17:49:58 -08001308 EXPECT_EQ(NULL, GetCurrentService().get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001309}
1310
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001311TEST_F(WiFiMainTest, Stop) {
mukesh agrawalc01f3982012-01-24 13:48:39 -08001312 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001313 WiFiEndpointRefPtr endpoint0;
1314 ::DBus::Path kPath("/fake/path");
1315 WiFiServiceRefPtr service0(SetupConnectedService(kPath, &endpoint0, NULL));
1316 WiFiEndpointRefPtr endpoint1;
1317 MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, &endpoint1, NULL);
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001318
Paul Stewart3c504012013-01-17 17:49:58 -08001319 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint0)))
1320 .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
1321 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint1)))
1322 .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
1323 EXPECT_CALL(*GetSupplicantInterfaceProxy(), RemoveNetwork(kPath)).Times(1);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001324 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001325 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawalc4f368f2012-06-04 19:45:52 -07001326 EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001327}
1328
Paul Stewart549d44c2012-07-03 12:40:25 -07001329TEST_F(WiFiMainTest, StopWhileConnected) {
Paul Stewart3c504012013-01-17 17:49:58 -08001330 StartWiFi();
1331 WiFiEndpointRefPtr endpoint;
1332 WiFiServiceRefPtr service(
1333 SetupConnectedService(DBus::Path(), &endpoint, NULL));
1334 scoped_ptr<EndpointRemovalHandler> handler(
1335 MakeEndpointRemovalHandler(service));
1336 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(EndpointMatch(endpoint)))
1337 .WillOnce(Invoke(handler.get(),
1338 &EndpointRemovalHandler::OnEndpointRemoved));
1339 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
Paul Stewart549d44c2012-07-03 12:40:25 -07001340 StopWiFi();
1341 EXPECT_TRUE(GetCurrentService() == NULL);
1342}
1343
Paul Stewart44663922012-07-30 11:03:03 -07001344TEST_F(WiFiMainTest, ReconnectTimer) {
Paul Stewart3c504012013-01-17 17:49:58 -08001345 StartWiFi();
1346 MockWiFiServiceRefPtr service(
1347 SetupConnectedService(DBus::Path(), NULL, NULL));
1348 EXPECT_CALL(*service, IsConnected()).WillRepeatedly(Return(true));
Paul Stewart1aff7302012-08-04 20:04:47 -07001349 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart0654ece2013-03-26 15:21:26 -07001350 ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001351 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart0654ece2013-03-26 15:21:26 -07001352 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
Paul Stewart1aff7302012-08-04 20:04:47 -07001353 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart0654ece2013-03-26 15:21:26 -07001354 ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001355 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001356 ReportCurrentBSSChanged(kBSSName);
Paul Stewart1aff7302012-08-04 20:04:47 -07001357 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart0654ece2013-03-26 15:21:26 -07001358 ReportStateChanged(WPASupplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001359 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart3c504012013-01-17 17:49:58 -08001360 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
Paul Stewart1aff7302012-08-04 20:04:47 -07001361 GetReconnectTimeoutCallback().callback().Run();
Paul Stewart3c504012013-01-17 17:49:58 -08001362 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
Paul Stewart1aff7302012-08-04 20:04:47 -07001363 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001364}
1365
Paul Stewartcb59fed2012-03-21 21:14:46 -07001366
Paul Stewartced6a0b2011-11-08 15:32:04 -08001367MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001368 map<string, DBus::Variant>::const_iterator it =
Paul Stewart0654ece2013-03-26 15:21:26 -07001369 arg.find(WPASupplicant::kPropertyScanSSIDs);
Paul Stewartced6a0b2011-11-08 15:32:04 -08001370 if (it == arg.end()) {
1371 return false;
1372 }
1373
1374 const DBus::Variant &ssids_variant = it->second;
1375 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1376 const ByteArrays &ssids = it->second.operator ByteArrays();
1377 // A valid Scan containing a single hidden SSID should contain
1378 // two SSID entries: one containing the SSID we are looking for,
1379 // and an empty entry, signifying that we also want to do a
1380 // broadcast probe request for all non-hidden APs as well.
Paul Stewart3c504012013-01-17 17:49:58 -08001381 return ssids.size() == 2 && ssids[0] == ssid && ssids[1].empty();
1382}
1383
1384MATCHER(HasNoHiddenSSID, "") {
1385 map<string, DBus::Variant>::const_iterator it =
Paul Stewart0654ece2013-03-26 15:21:26 -07001386 arg.find(WPASupplicant::kPropertyScanSSIDs);
Paul Stewart3c504012013-01-17 17:49:58 -08001387 return it == arg.end();
Paul Stewartced6a0b2011-11-08 15:32:04 -08001388}
1389
1390TEST_F(WiFiMainTest, ScanHidden) {
Paul Stewart3c504012013-01-17 17:49:58 -08001391 vector<uint8_t>kSSID(1, 'a');
1392 ByteArrays ssids;
1393 ssids.push_back(kSSID);
1394
Paul Stewartced6a0b2011-11-08 15:32:04 -08001395 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001396 EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList()).WillOnce(Return(ssids));
1397 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
1398 dispatcher_.DispatchPendingEvents();
1399}
1400
1401TEST_F(WiFiMainTest, ScanNoHidden) {
1402 StartWiFi();
1403 EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
1404 .WillOnce(Return(ByteArrays()));
1405 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasNoHiddenSSID()));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001406 dispatcher_.DispatchPendingEvents();
1407}
1408
Paul Stewartfae4dae2012-09-13 07:43:32 -07001409TEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1410 ScopedMockLog log;
1411 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1412 EXPECT_CALL(log, Log(_, _, EndsWith(
1413 "Ignoring scan request while device is not enabled."))).Times(1);
Paul Stewart3c504012013-01-17 17:49:58 -08001414 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Paul Stewartfae4dae2012-09-13 07:43:32 -07001415 StartWiFi();
1416 StopWiFi();
1417 // A scan is queued when WiFi resumes.
1418 OnAfterResume();
1419 dispatcher_.DispatchPendingEvents();
1420}
1421
mukesh agrawal7ec71312011-11-10 02:08:26 +00001422TEST_F(WiFiMainTest, InitialSupplicantState) {
1423 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1424}
1425
1426TEST_F(WiFiMainTest, StateChangeNoService) {
1427 // State change should succeed even if there is no pending Service.
Paul Stewart0654ece2013-03-26 15:21:26 -07001428 ReportStateChanged(WPASupplicant::kInterfaceStateScanning);
1429 EXPECT_EQ(WPASupplicant::kInterfaceStateScanning, GetSupplicantState());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001430}
1431
1432TEST_F(WiFiMainTest, StateChangeWithService) {
1433 // Forward transition should trigger a Service state change.
1434 StartWiFi();
1435 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001436 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001437 InitiateConnect(service);
1438 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Paul Stewart0654ece2013-03-26 15:21:26 -07001439 ReportStateChanged(WPASupplicant::kInterfaceStateAssociated);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001440 // Verify expectations now, because WiFi may report other state changes
1441 // when WiFi is Stop()-ed (during TearDown()).
1442 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001443 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001444}
1445
1446TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1447 // Some backwards transitions should not trigger a Service state change.
1448 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001449 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001450 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001451 StartWiFi();
1452 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001453 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart2b05e622012-07-13 20:38:44 -07001454 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Gary Moraind9f893f2012-02-06 10:03:40 -08001455 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001456 InitiateConnect(service);
Paul Stewart0654ece2013-03-26 15:21:26 -07001457 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
1458 ReportStateChanged(WPASupplicant::kInterfaceStateAuthenticating);
1459 EXPECT_EQ(WPASupplicant::kInterfaceStateAuthenticating,
mukesh agrawal7ec71312011-11-10 02:08:26 +00001460 GetSupplicantState());
1461 // Verify expectations now, because WiFi may report other state changes
1462 // when WiFi is Stop()-ed (during TearDown()).
Paul Stewart3c504012013-01-17 17:49:58 -08001463 Mock::VerifyAndClearExpectations(service);
1464 EXPECT_CALL(*service, SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001465}
1466
Paul Stewarta47c3c62012-12-18 12:14:29 -08001467TEST_F(WiFiMainTest, ConnectToServiceWithoutRecentIssues) {
1468 MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1469 StartWiFi();
1470 dispatcher_.DispatchPendingEvents();
1471 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1472 EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
1473 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
1474 EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1475 .WillOnce(Return(false));
1476 InitiateConnect(service);
1477}
1478
1479TEST_F(WiFiMainTest, ConnectToServiceWithRecentIssues) {
1480 // Turn of WiFi debugging, so the only reason we will turn on supplicant
1481 // debugging will be to debug a problematic connection.
1482 ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
1483
1484 MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
1485 StartWiFi();
1486 dispatcher_.DispatchPendingEvents();
1487 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1488 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07001489 .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
1490 EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
Paul Stewarta47c3c62012-12-18 12:14:29 -08001491 .Times(1);
1492 EXPECT_CALL(*service.get(), HasRecentConnectionIssues())
1493 .WillOnce(Return(true));
1494 InitiateConnect(service);
1495 Mock::VerifyAndClearExpectations(process_proxy);
1496
1497 SetPendingService(NULL);
1498 SetCurrentService(service);
1499
1500 // When we disconnect from the troubled service, we should reduce the
1501 // level of supplciant debugging.
1502 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07001503 .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
1504 EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
Paul Stewarta47c3c62012-12-18 12:14:29 -08001505 .Times(1);
Paul Stewart0654ece2013-03-26 15:21:26 -07001506 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
Paul Stewarta47c3c62012-12-18 12:14:29 -08001507}
1508
mukesh agrawal15908392011-11-16 18:29:25 +00001509TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
mukesh agrawal15908392011-11-16 18:29:25 +00001510 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001511 WiFiEndpointRefPtr endpoint;
1512 MockWiFiServiceRefPtr service =
1513 SetupConnectedService(DBus::Path(), &endpoint, NULL);
mukesh agrawal15908392011-11-16 18:29:25 +00001514
Paul Stewart3c504012013-01-17 17:49:58 -08001515 EXPECT_CALL(*service, SetState(Service::kStateIdle));
1516 EXPECT_CALL(*service, SetFailureSilent(Service::kFailureUnknown));
Paul Stewart0654ece2013-03-26 15:21:26 -07001517 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
mukesh agrawal15908392011-11-16 18:29:25 +00001518 EXPECT_EQ(NULL, GetCurrentService().get());
1519 EXPECT_EQ(NULL, GetPendingService().get());
1520}
1521
1522TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
mukesh agrawal15908392011-11-16 18:29:25 +00001523 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001524 MockWiFiServiceRefPtr service0 =
1525 SetupConnectedService(DBus::Path(), NULL, NULL);
1526 MockWiFiServiceRefPtr service1;
1527 ::DBus::Path bss_path1(MakeNewEndpointAndService(
1528 0, 0, kNetworkModeAdHoc, NULL, &service1));
1529 EXPECT_EQ(service0.get(), GetCurrentService().get());
mukesh agrawal15908392011-11-16 18:29:25 +00001530
mukesh agrawalc01f3982012-01-24 13:48:39 -08001531 // Note that we deliberately omit intermediate supplicant states
1532 // (e.g. kInterfaceStateAssociating), on the theory that they are
1533 // unreliable. Specifically, they may be quashed if the association
1534 // completes before supplicant flushes its changed properties.
Paul Stewart3c504012013-01-17 17:49:58 -08001535 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(AtLeast(1));
1536 ReportCurrentBSSChanged(bss_path1);
1537 EXPECT_CALL(*service1, SetState(Service::kStateConfiguring));
Paul Stewart0654ece2013-03-26 15:21:26 -07001538 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
Paul Stewart3c504012013-01-17 17:49:58 -08001539 EXPECT_EQ(service1.get(), GetCurrentService().get());
1540 Mock::VerifyAndClearExpectations(service0);
1541 Mock::VerifyAndClearExpectations(service1);
mukesh agrawal15908392011-11-16 18:29:25 +00001542}
1543
Thieu Lee41a72d2012-02-06 20:46:51 +00001544TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
Thieu Lee41a72d2012-02-06 20:46:51 +00001545 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001546 MockWiFiServiceRefPtr service =
1547 SetupConnectedService(DBus::Path(), NULL, NULL);
1548 WiFiEndpointRefPtr endpoint;
1549 ::DBus::Path bss_path =
1550 AddEndpointToService(service, 0, 0, kNetworkModeAdHoc, &endpoint);
1551 EXPECT_CALL(*service, NotifyCurrentEndpoint(EndpointMatch(endpoint)));
1552 ReportCurrentBSSChanged(bss_path);
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001553}
1554
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001555TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001556 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001557 MockWiFiServiceRefPtr service0(
1558 SetupConnectingService(DBus::Path(), NULL, NULL));
1559 EXPECT_EQ(service0.get(), GetPendingService().get());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001560 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
Paul Stewart3c504012013-01-17 17:49:58 -08001561 MockWiFiServiceRefPtr service1(
1562 SetupConnectingService(DBus::Path(), NULL, NULL));
1563 EXPECT_EQ(service1.get(), GetPendingService().get());
1564 EXPECT_EQ(NULL, GetCurrentService().get());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001565}
1566
1567TEST_F(WiFiMainTest, IsIdle) {
1568 StartWiFi();
1569 EXPECT_TRUE(wifi()->IsIdle());
Paul Stewart3c504012013-01-17 17:49:58 -08001570 MockWiFiServiceRefPtr service(
1571 SetupConnectingService(DBus::Path(), NULL, NULL));
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001572 EXPECT_FALSE(wifi()->IsIdle());
1573}
1574
Darin Petkov4a66cc52012-06-15 10:08:29 +02001575MATCHER_P(WiFiAddedArgs, bgscan, "") {
Paul Stewart0654ece2013-03-26 15:21:26 -07001576 return ContainsKey(arg, WPASupplicant::kNetworkPropertyScanSSID) &&
1577 ContainsKey(arg, WPASupplicant::kNetworkPropertyBgscan) == bgscan;
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001578}
1579
1580TEST_F(WiFiMainTest, AddNetworkArgs) {
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001581 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001582 MockWiFiServiceRefPtr service;
1583 MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
1584 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(true)));
Paul Stewart0654ece2013-03-26 15:21:26 -07001585 EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001586 InitiateConnect(service);
1587}
1588
Darin Petkov4a66cc52012-06-15 10:08:29 +02001589TEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
Darin Petkov4a66cc52012-06-15 10:08:29 +02001590 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001591 MockWiFiServiceRefPtr service;
1592 MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, &service);
1593 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(WiFiAddedArgs(false)));
Darin Petkov4a66cc52012-06-15 10:08:29 +02001594 InitiateConnect(service);
1595}
1596
1597TEST_F(WiFiMainTest, AppendBgscan) {
1598 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001599 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Darin Petkov4a66cc52012-06-15 10:08:29 +02001600 {
1601 // 1 endpoint, default bgscan method -- background scan disabled.
1602 std::map<std::string, DBus::Variant> params;
Paul Stewart3c504012013-01-17 17:49:58 -08001603 EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(1));
1604 AppendBgscan(service, &params);
1605 Mock::VerifyAndClearExpectations(service);
Paul Stewart0654ece2013-03-26 15:21:26 -07001606 EXPECT_FALSE(ContainsKey(params, WPASupplicant::kNetworkPropertyBgscan));
Darin Petkov4a66cc52012-06-15 10:08:29 +02001607 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02001608 {
1609 // 2 endpoints, default bgscan method -- background scan frequency reduced.
1610 map<string, DBus::Variant> params;
Paul Stewart3c504012013-01-17 17:49:58 -08001611 EXPECT_CALL(*service, GetEndpointCount()).WillOnce(Return(2));
1612 AppendBgscan(service, &params);
1613 Mock::VerifyAndClearExpectations(service);
Darin Petkov4a66cc52012-06-15 10:08:29 +02001614 string config_string;
1615 EXPECT_TRUE(
1616 DBusProperties::GetString(params,
Paul Stewart0654ece2013-03-26 15:21:26 -07001617 WPASupplicant::kNetworkPropertyBgscan,
Darin Petkov4a66cc52012-06-15 10:08:29 +02001618 &config_string));
1619 vector<string> elements;
1620 base::SplitString(config_string, ':', &elements);
1621 ASSERT_EQ(4, elements.size());
1622 EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
1623 EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
1624 elements[3]);
1625 }
1626 {
1627 // Explicit bgscan method -- regular background scan frequency.
Paul Stewart0654ece2013-03-26 15:21:26 -07001628 EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodSimple));
Darin Petkov4a66cc52012-06-15 10:08:29 +02001629 std::map<std::string, DBus::Variant> params;
Paul Stewart3c504012013-01-17 17:49:58 -08001630 EXPECT_CALL(*service, GetEndpointCount()).Times(0);
1631 AppendBgscan(service, &params);
1632 Mock::VerifyAndClearExpectations(service);
Darin Petkov4a66cc52012-06-15 10:08:29 +02001633 string config_string;
1634 EXPECT_TRUE(
1635 DBusProperties::GetString(params,
Paul Stewart0654ece2013-03-26 15:21:26 -07001636 WPASupplicant::kNetworkPropertyBgscan,
Darin Petkov4a66cc52012-06-15 10:08:29 +02001637 &config_string));
1638 vector<string> elements;
1639 base::SplitString(config_string, ':', &elements);
1640 ASSERT_EQ(4, elements.size());
1641 EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
1642 elements[3]);
1643 }
Christopher Wiley5c929e22012-07-16 14:06:04 -07001644 {
1645 // No scan method, simply returns without appending properties
Paul Stewart0654ece2013-03-26 15:21:26 -07001646 EXPECT_TRUE(SetBgscanMethod(WPASupplicant::kNetworkBgscanMethodNone));
Christopher Wiley5c929e22012-07-16 14:06:04 -07001647 std::map<std::string, DBus::Variant> params;
Paul Stewart3c504012013-01-17 17:49:58 -08001648 EXPECT_CALL(*service, GetEndpointCount()).Times(0);
Christopher Wiley5c929e22012-07-16 14:06:04 -07001649 AppendBgscan(service.get(), &params);
Paul Stewart3c504012013-01-17 17:49:58 -08001650 Mock::VerifyAndClearExpectations(service);
Christopher Wiley5c929e22012-07-16 14:06:04 -07001651 string config_string;
1652 EXPECT_FALSE(
1653 DBusProperties::GetString(params,
Paul Stewart0654ece2013-03-26 15:21:26 -07001654 WPASupplicant::kNetworkPropertyBgscan,
Christopher Wiley5c929e22012-07-16 14:06:04 -07001655 &config_string));
1656 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02001657}
1658
mukesh agrawalc01f3982012-01-24 13:48:39 -08001659TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1660 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001661 MockWiFiServiceRefPtr service(
1662 SetupConnectingService(DBus::Path(), NULL, NULL));
mukesh agrawalc01f3982012-01-24 13:48:39 -08001663 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1664 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1665 ReportLinkUp();
1666
1667 // Verify expectations now, because WiFi may cause |service| state
1668 // changes during TearDown().
1669 Mock::VerifyAndClearExpectations(service);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001670}
1671
1672TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
mukesh agrawalc01f3982012-01-24 13:48:39 -08001673 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001674 MockWiFiServiceRefPtr service(
1675 SetupConnectedService(DBus::Path(), NULL, NULL));
Christopher Wiley8f81e2a2012-10-17 16:51:32 -07001676 Mock::VerifyAndClearExpectations(dhcp_config_.get());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001677 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
Christopher Wiley8f81e2a2012-10-17 16:51:32 -07001678 // Simulate a rekeying event from the AP. These show as transitions from
1679 // completed->completed from wpa_supplicant.
Paul Stewart0654ece2013-03-26 15:21:26 -07001680 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
Christopher Wiley5519e9e2013-01-08 16:55:56 -08001681 // When we get an IP, WiFi should enable high bitrates on the interface again.
Paul Stewart3c504012013-01-17 17:49:58 -08001682 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1683 EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
1684 EXPECT_CALL(*manager(), device_info()).WillOnce(Return(device_info()));
Christopher Wiley8f81e2a2012-10-17 16:51:32 -07001685 ReportIPConfigComplete();
1686 // Similarly, rekeying events after we have an IP don't trigger L3
Christopher Wiley5519e9e2013-01-08 16:55:56 -08001687 // configuration. However, we treat all transitions to completed as potential
1688 // reassociations, so we will reenable high rates again here.
Paul Stewart3c504012013-01-17 17:49:58 -08001689 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1690 EXPECT_CALL(*service, IsConnected()).WillOnce(Return(true));
1691 EXPECT_CALL(*GetSupplicantInterfaceProxy(), EnableHighBitrates()).Times(1);
Paul Stewart0654ece2013-03-26 15:21:26 -07001692 ReportStateChanged(WPASupplicant::kInterfaceStateCompleted);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001693}
1694
mukesh agrawalb20776f2012-02-10 16:00:36 -08001695TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001696 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1697 // we can test the interaction between WiFi and WiFiEndpoint. (Right
1698 // now, we're testing across multiple layers.)
1699 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1700 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1701 StartWiFi();
1702 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1703}
1704
1705TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1706 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1707 // factory for WiFiEndpoints.
mukesh agrawalb20776f2012-02-10 16:00:36 -08001708 // Get the pointer before we transfer ownership.
1709 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1710 EXPECT_CALL(*proxy, Die());
1711 StartWiFi();
Paul Stewart3c504012013-01-17 17:49:58 -08001712 DBus::Path bss_path(
1713 MakeNewEndpointAndService(0, 0, kNetworkModeAdHoc, NULL, NULL));
1714 EXPECT_CALL(*wifi_provider(), OnEndpointRemoved(_))
1715 .WillOnce(Return(reinterpret_cast<WiFiService *>(NULL)));
1716 RemoveBSS(bss_path);
mukesh agrawalb20776f2012-02-10 16:00:36 -08001717 // Check this now, to make sure RemoveBSS killed the proxy (rather
1718 // than TearDown).
1719 Mock::VerifyAndClearExpectations(proxy);
1720}
1721
mukesh agrawal5c05b292012-03-07 10:12:52 -08001722TEST_F(WiFiMainTest, FlushBSSOnResume) {
1723 const struct timeval resume_time = {1, 0};
1724 const struct timeval scan_done_time = {6, 0};
mukesh agrawal5c05b292012-03-07 10:12:52 -08001725
1726 StartWiFi();
1727
1728 EXPECT_CALL(time_, GetTimeMonotonic(_))
1729 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
1730 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
Paul Stewart3c504012013-01-17 17:49:58 -08001731 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
mukesh agrawal5c05b292012-03-07 10:12:52 -08001732 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07001733 OnAfterResume();
mukesh agrawal5c05b292012-03-07 10:12:52 -08001734 ReportScanDone();
1735}
1736
mukesh agrawalb66c6462012-05-07 11:45:25 -07001737TEST_F(WiFiMainTest, ScanTimerIdle) {
1738 StartWiFi();
1739 dispatcher_.DispatchPendingEvents();
1740 ReportScanDone();
1741 CancelScanTimer();
1742 EXPECT_TRUE(GetScanTimer().IsCancelled());
1743
1744 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1745 FireScanTimer();
1746 dispatcher_.DispatchPendingEvents();
1747 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1748}
1749
1750TEST_F(WiFiMainTest, ScanTimerScanning) {
1751 StartWiFi();
1752 dispatcher_.DispatchPendingEvents();
1753 CancelScanTimer();
1754 EXPECT_TRUE(GetScanTimer().IsCancelled());
1755
1756 // Should not call Scan, since we're already scanning.
1757 // (Scanning is triggered by StartWiFi.)
1758 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1759 FireScanTimer();
1760 dispatcher_.DispatchPendingEvents();
1761 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1762}
1763
1764TEST_F(WiFiMainTest, ScanTimerConnecting) {
1765 StartWiFi();
1766 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001767 MockWiFiServiceRefPtr service =
1768 SetupConnectingService(DBus::Path(), NULL, NULL);
mukesh agrawalb66c6462012-05-07 11:45:25 -07001769 CancelScanTimer();
1770 EXPECT_TRUE(GetScanTimer().IsCancelled());
1771
1772 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1773 FireScanTimer();
1774 dispatcher_.DispatchPendingEvents();
1775 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1776}
1777
1778TEST_F(WiFiMainTest, ScanTimerReconfigured) {
1779 StartWiFi();
1780 CancelScanTimer();
1781 EXPECT_TRUE(GetScanTimer().IsCancelled());
1782
1783 SetScanInterval(1);
1784 EXPECT_FALSE(GetScanTimer().IsCancelled());
1785}
1786
1787TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1788 StartWiFi();
1789 CancelScanTimer();
1790 EXPECT_TRUE(GetScanTimer().IsCancelled());
1791
1792 ReportScanDone();
1793 EXPECT_FALSE(GetScanTimer().IsCancelled());
1794}
1795
1796TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1797 StartWiFi();
1798 EXPECT_FALSE(GetScanTimer().IsCancelled());
1799
1800 SetScanInterval(0);
1801 EXPECT_TRUE(GetScanTimer().IsCancelled());
1802}
1803
1804TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
mukesh agrawalb66c6462012-05-07 11:45:25 -07001805 StartWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001806 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001807 SetupConnectedService(DBus::Path(), NULL, NULL);
1808 vector<uint8_t>kSSID(1, 'a');
1809 ByteArrays ssids;
1810 ssids.push_back(kSSID);
1811 EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
1812 .WillRepeatedly(Return(ssids));
1813 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(HasHiddenSSID(kSSID)));
Paul Stewart0654ece2013-03-26 15:21:26 -07001814 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
mukesh agrawalb66c6462012-05-07 11:45:25 -07001815 dispatcher_.DispatchPendingEvents();
1816}
1817
1818TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1819 StartWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001820 dispatcher_.DispatchPendingEvents();
Paul Stewart3c504012013-01-17 17:49:58 -08001821 SetupConnectedService(DBus::Path(), NULL, NULL);
mukesh agrawalb66c6462012-05-07 11:45:25 -07001822 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Paul Stewart3c504012013-01-17 17:49:58 -08001823 EXPECT_CALL(*wifi_provider(), GetHiddenSSIDList())
1824 .WillRepeatedly(Return(ByteArrays()));
Paul Stewart0654ece2013-03-26 15:21:26 -07001825 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
mukesh agrawalb66c6462012-05-07 11:45:25 -07001826 dispatcher_.DispatchPendingEvents();
1827}
1828
Paul Stewart3c508e12012-08-09 11:40:06 -07001829TEST_F(WiFiMainTest, LinkMonitorFailure) {
1830 StartWiFi();
1831 ScopedMockLog log;
1832 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1833 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
1834 SetLinkMonitor(link_monitor);
1835 EXPECT_CALL(*link_monitor, IsGatewayFound())
1836 .WillOnce(Return(false))
1837 .WillRepeatedly(Return(true));
1838 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
1839 EndsWith("gateway was never found."))).Times(1);
1840 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
1841 OnLinkMonitorFailure();
1842 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
1843 EndsWith("Called Reassociate()."))).Times(1);
1844 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
1845 OnLinkMonitorFailure();
1846 OnSupplicantVanish();
Paul Stewart3c504012013-01-17 17:49:58 -08001847 Mock::VerifyAndClearExpectations(GetSupplicantInterfaceProxy());
1848 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
Paul Stewart3c508e12012-08-09 11:40:06 -07001849 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1850 EndsWith("Cannot reassociate."))).Times(1);
1851 OnLinkMonitorFailure();
1852}
1853
mukesh agrawalcf24a242012-05-21 16:46:11 -07001854TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
Paul Stewart3c504012013-01-17 17:49:58 -08001855 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart0654ece2013-03-26 15:21:26 -07001856 ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001857 EXPECT_FALSE(service->has_ever_connected());
Paul Stewart1369c2b2013-01-11 05:41:26 -08001858 EXPECT_FALSE(SuspectCredentials(*service, NULL));
mukesh agrawalcf24a242012-05-21 16:46:11 -07001859}
1860
1861TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
Paul Stewart3c504012013-01-17 17:49:58 -08001862 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
Paul Stewart0654ece2013-03-26 15:21:26 -07001863 ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001864 EXPECT_FALSE(service->has_ever_connected());
Paul Stewart1369c2b2013-01-11 05:41:26 -08001865 Service::ConnectFailure failure;
1866 EXPECT_TRUE(SuspectCredentials(*service, &failure));
1867 EXPECT_EQ(Service::kFailureBadPassphrase, failure);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001868}
1869
1870TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
Paul Stewart3c504012013-01-17 17:49:58 -08001871 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
Paul Stewart0654ece2013-03-26 15:21:26 -07001872 ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001873 service->has_ever_connected_ = true;
Paul Stewart1369c2b2013-01-11 05:41:26 -08001874 EXPECT_FALSE(SuspectCredentials(*service, NULL));
mukesh agrawalcf24a242012-05-21 16:46:11 -07001875}
1876
Paul Stewart1369c2b2013-01-11 05:41:26 -08001877TEST_F(WiFiMainTest, SuspectCredentialsEAPInProgress) {
Paul Stewart3c504012013-01-17 17:49:58 -08001878 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
Paul Stewart735eab52013-03-29 09:19:23 -07001879 EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
1880 .WillOnce(Return(false))
1881 .WillOnce(Return(true))
1882 .WillOnce(Return(false))
1883 .WillOnce(Return(true));
Paul Stewart1369c2b2013-01-11 05:41:26 -08001884 service->has_ever_connected_ = false;
1885 EXPECT_FALSE(SuspectCredentials(*service, NULL));
Paul Stewart1369c2b2013-01-11 05:41:26 -08001886 Service::ConnectFailure failure;
1887 EXPECT_TRUE(SuspectCredentials(*service, &failure));
1888 EXPECT_EQ(Service::kFailureEAPAuthentication, failure);
Paul Stewart735eab52013-03-29 09:19:23 -07001889 service->has_ever_connected_ = true;
1890 EXPECT_FALSE(SuspectCredentials(*service, NULL));
Paul Stewart1369c2b2013-01-11 05:41:26 -08001891 EXPECT_FALSE(SuspectCredentials(*service, NULL));
1892}
1893
1894TEST_F(WiFiMainTest, SuspectCredentialsYieldFailureWPA) {
mukesh agrawalcf24a242012-05-21 16:46:11 -07001895 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1896 SetPendingService(service);
Paul Stewart0654ece2013-03-26 15:21:26 -07001897 ReportStateChanged(WPASupplicant::kInterfaceState4WayHandshake);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001898 EXPECT_FALSE(service->has_ever_connected());
1899
Paul Stewartf2d60912012-07-15 08:37:30 -07001900 EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
mukesh agrawal56e32202012-07-26 16:32:11 -07001901 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
1902 EXPECT_CALL(*service, SetState(_)).Times(0);
Paul Stewart735eab52013-03-29 09:19:23 -07001903 ScopedMockLog log;
mukesh agrawalcf24a242012-05-21 16:46:11 -07001904 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
Paul Stewart1369c2b2013-01-11 05:41:26 -08001905 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1906 EndsWith(flimflam::kErrorBadPassphrase)));
Paul Stewart0654ece2013-03-26 15:21:26 -07001907 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
Paul Stewart1369c2b2013-01-11 05:41:26 -08001908}
1909
1910TEST_F(WiFiMainTest, SuspectCredentialsYieldFailureEAP) {
Paul Stewart1369c2b2013-01-11 05:41:26 -08001911 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
1912 SetCurrentService(service);
Paul Stewart1369c2b2013-01-11 05:41:26 -08001913 EXPECT_FALSE(service->has_ever_connected());
1914
Paul Stewart735eab52013-03-29 09:19:23 -07001915 ScopedMockLog log;
1916 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
Paul Stewart1369c2b2013-01-11 05:41:26 -08001917 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
1918 EXPECT_CALL(*service, SetState(_)).Times(0);
Paul Stewart735eab52013-03-29 09:19:23 -07001919 // Ensure that we retrieve is_eap_in_progress() before resetting the
1920 // EAP handler's state.
1921 InSequence seq;
1922 EXPECT_CALL(*eap_state_handler_, is_eap_in_progress())
1923 .WillOnce(Return(true));
1924 EXPECT_CALL(*service, SetFailure(Service::kFailureEAPAuthentication));
Paul Stewart1369c2b2013-01-11 05:41:26 -08001925 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
1926 EndsWith(shill::kErrorEapAuthenticationFailed)));
Paul Stewart735eab52013-03-29 09:19:23 -07001927 EXPECT_CALL(*eap_state_handler_, Reset());
Paul Stewart0654ece2013-03-26 15:21:26 -07001928 ReportCurrentBSSChanged(WPASupplicant::kCurrentBSSNull);
mukesh agrawalcf24a242012-05-21 16:46:11 -07001929}
1930
Paul Stewarte369ece2012-05-22 09:11:03 -07001931// Scanning tests will use a mock of the event dispatcher instead of a real
1932// one.
Paul Stewart1aff7302012-08-04 20:04:47 -07001933class WiFiTimerTest : public WiFiObjectTest {
Paul Stewarte369ece2012-05-22 09:11:03 -07001934 public:
Paul Stewart1aff7302012-08-04 20:04:47 -07001935 WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
Paul Stewarte369ece2012-05-22 09:11:03 -07001936
1937 protected:
1938 void ExpectInitialScanSequence();
1939
1940 StrictMock<MockEventDispatcher> mock_dispatcher_;
1941};
1942
Paul Stewart1aff7302012-08-04 20:04:47 -07001943void WiFiTimerTest::ExpectInitialScanSequence() {
Paul Stewarte369ece2012-05-22 09:11:03 -07001944 // Choose a number of iterations some multiple higher than the fast scan
1945 // count.
1946 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
1947
1948 // Each time we call FireScanTimer() below, WiFi will post a task to actually
1949 // run Scan() on the wpa_supplicant proxy.
1950 EXPECT_CALL(mock_dispatcher_, PostTask(_))
1951 .Times(kScanTimes);
1952 {
1953 InSequence seq;
1954 // The scans immediately after the initial scan should happen at the short
1955 // interval. If we add the initial scan (not invoked in this function) to
1956 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
1957 // the fast scan interval.
1958 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1959 _, WiFi::kFastScanIntervalSeconds * 1000))
1960 .Times(WiFi::kNumFastScanAttempts - 1)
1961 .WillRepeatedly(Return(true));
1962
1963 // After this, the WiFi device should use the normal scan interval.
1964 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1965 _, GetScanInterval() * 1000))
1966 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
1967 .WillRepeatedly(Return(true));
1968
1969 for (int i = 0; i < kScanTimes; i++) {
1970 FireScanTimer();
1971 }
1972 }
1973}
1974
Paul Stewart1aff7302012-08-04 20:04:47 -07001975TEST_F(WiFiTimerTest, FastRescan) {
Paul Stewarte369ece2012-05-22 09:11:03 -07001976 // This PostTask is a result of the call to Scan(NULL), and is meant to
1977 // post a task to call Scan() on the wpa_supplicant proxy immediately.
1978 EXPECT_CALL(mock_dispatcher_, PostTask(_));
1979 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1980 _, WiFi::kFastScanIntervalSeconds * 1000))
1981 .WillOnce(Return(true));
1982 StartWiFi();
1983
1984 ExpectInitialScanSequence();
1985
1986 // If we end up disconnecting, the sequence should repeat.
1987 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1988 _, WiFi::kFastScanIntervalSeconds * 1000))
1989 .WillOnce(Return(true));
1990 RestartFastScanAttempts();
1991
1992 ExpectInitialScanSequence();
1993}
1994
Paul Stewart1aff7302012-08-04 20:04:47 -07001995TEST_F(WiFiTimerTest, ReconnectTimer) {
1996 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
1997 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
Paul Stewart3c504012013-01-17 17:49:58 -08001998 StartWiFi();
1999 SetupConnectedService(DBus::Path(), NULL, NULL);
Paul Stewart1aff7302012-08-04 20:04:47 -07002000 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2001
2002 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2003 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2004 StartReconnectTimer();
2005 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2006 StopReconnectTimer();
2007
2008 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2009 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2010 StartReconnectTimer();
2011 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2012 GetReconnectTimeoutCallback().callback().Run();
2013
2014 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2015 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2016 StartReconnectTimer();
2017 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2018
2019 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2020 _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
2021 StartReconnectTimer();
2022}
2023
Paul Stewartbc6e7392012-05-24 07:07:48 -07002024TEST_F(WiFiMainTest, EAPCertification) {
2025 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2026 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2027
2028 ScopedMockLog log;
2029 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2030 map<string, ::DBus::Variant> args;
2031 ReportCertification(args);
2032 Mock::VerifyAndClearExpectations(&log);
2033
2034 SetCurrentService(service);
2035 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2036 ReportCertification(args);
2037 Mock::VerifyAndClearExpectations(&log);
2038
2039 const uint32 kDepth = 123;
Paul Stewart0654ece2013-03-26 15:21:26 -07002040 args[WPASupplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
Paul Stewartbc6e7392012-05-24 07:07:48 -07002041
2042 EXPECT_CALL(log,
2043 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2044 ReportCertification(args);
2045 Mock::VerifyAndClearExpectations(&log);
2046
2047 const string kSubject("subject");
Paul Stewart0654ece2013-03-26 15:21:26 -07002048 args[WPASupplicant::kInterfacePropertySubject].writer()
Paul Stewartbc6e7392012-05-24 07:07:48 -07002049 .append_string(kSubject.c_str());
2050 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2051 ReportCertification(args);
2052}
2053
Paul Stewartdb0f9172012-11-30 16:48:09 -08002054TEST_F(WiFiMainTest, EAPEvent) {
Paul Stewartdb0f9172012-11-30 16:48:09 -08002055 ScopedMockLog log;
2056 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
Paul Stewart735eab52013-03-29 09:19:23 -07002057 EXPECT_CALL(*eap_state_handler_, ParseStatus(_, _, _)).Times(0);
2058 const string kEAPStatus("eap-status");
2059 const string kEAPParameter("eap-parameter");
2060 ReportEAPEvent(kEAPStatus, kEAPParameter);
Paul Stewartdb0f9172012-11-30 16:48:09 -08002061 Mock::VerifyAndClearExpectations(&log);
2062 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2063
Paul Stewart735eab52013-03-29 09:19:23 -07002064 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
Paul Stewartdb0f9172012-11-30 16:48:09 -08002065 EXPECT_CALL(*service, SetFailure(_)).Times(0);
Paul Stewart735eab52013-03-29 09:19:23 -07002066 EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _));
Paul Stewartdb0f9172012-11-30 16:48:09 -08002067 SetCurrentService(service);
Paul Stewart735eab52013-03-29 09:19:23 -07002068 ReportEAPEvent(kEAPStatus, kEAPParameter);
2069 Mock::VerifyAndClearExpectations(service);
2070 Mock::VerifyAndClearExpectations(eap_state_handler_);
Paul Stewartdb0f9172012-11-30 16:48:09 -08002071
Paul Stewart735eab52013-03-29 09:19:23 -07002072 EXPECT_CALL(*eap_state_handler_, ParseStatus(kEAPStatus, kEAPParameter, _))
2073 .WillOnce(DoAll(SetArgumentPointee<2>(Service::kFailureOutOfRange),
2074 Return(false)));
2075 EXPECT_CALL(*service, DisconnectWithFailure(Service::kFailureOutOfRange, _));
2076 ReportEAPEvent(kEAPStatus, kEAPParameter);
Paul Stewartdb0f9172012-11-30 16:48:09 -08002077}
2078
mukesh agrawalc4f368f2012-06-04 19:45:52 -07002079TEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2080 // Scan is one task that should be skipped after Stop. Others are
2081 // skipped by the same mechanism (invalidating weak pointers), so we
2082 // don't test them individually.
2083 //
2084 // Note that we can't test behavior by setting expectations on the
2085 // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2086 StartWiFi();
2087 StopWiFi();
2088 dispatcher_.DispatchPendingEvents();
2089}
2090
Darin Petkov60ceaf32012-10-18 10:36:01 +02002091TEST_F(WiFiMainTest, VerifyPaths) {
Paul Stewart196f50f2013-03-27 18:02:11 -07002092 string path(WPASupplicant::kSupplicantConfPath);
Darin Petkov60ceaf32012-10-18 10:36:01 +02002093 TrimString(path, FilePath::kSeparators, &path);
2094 EXPECT_TRUE(file_util::PathExists(FilePath(SYSROOT).Append(path)));
2095}
2096
Gaurav Shah6d2c72d2012-10-16 16:30:44 -07002097struct BSS {
2098 string bsspath;
2099 string ssid;
2100 string bssid;
2101 int16_t signal_strength;
2102 uint16 frequency;
2103 const char* mode;
2104};
2105
2106TEST_F(WiFiMainTest, GetGeolocationObjects) {
2107 BSS bsses[] = {
2108 {"bssid1", "ssid1", "00:00:00:00:00:00", 5, Metrics::kWiFiFrequency2412,
2109 kNetworkModeInfrastructure},
2110 {"bssid2", "ssid2", "01:00:00:00:00:00", 30, Metrics::kWiFiFrequency5170,
2111 kNetworkModeInfrastructure},
2112 // Same SSID but different BSSID is an additional geolocation object.
2113 {"bssid3", "ssid1", "02:00:00:00:00:00", 100, 0,
2114 kNetworkModeInfrastructure}
2115 };
2116 StartWiFi();
2117 vector<GeolocationInfo> objects;
2118 EXPECT_EQ(objects.size(), 0);
2119
2120 for (size_t i = 0; i < arraysize(bsses); ++i) {
2121 ReportBSS(bsses[i].bsspath, bsses[i].ssid, bsses[i].bssid,
2122 bsses[i].signal_strength, bsses[i].frequency, bsses[i].mode);
2123 objects = wifi()->GetGeolocationObjects();
2124 EXPECT_EQ(objects.size(), i + 1);
2125
2126 GeolocationInfo expected_info;
2127 expected_info.AddField(kGeoMacAddressProperty, bsses[i].bssid);
2128 expected_info.AddField(kGeoSignalStrengthProperty,
2129 StringPrintf("%d", bsses[i].signal_strength));
2130 expected_info.AddField(kGeoChannelProperty, StringPrintf(
2131 "%d", Metrics::WiFiFrequencyToChannel(bsses[i].frequency)));
2132 EXPECT_TRUE(objects[i].Equals(expected_info));
2133 };
2134};
2135
Paul Stewart5581d072012-12-17 17:30:20 -08002136TEST_F(WiFiMainTest, SetSupplicantDebugLevel) {
2137 MockSupplicantProcessProxy *process_proxy = supplicant_process_proxy_.get();
2138
2139 // With WiFi not yet started, nothing interesting (including a crash) should
2140 // happen.
2141 EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2142 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2143 ReportWiFiDebugScopeChanged(true);
2144
2145 // This unit test turns on WiFi debugging, so when we start WiFi, we should
2146 // check but not set the debug level if we return the "debug" level.
2147 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07002148 .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
Paul Stewart5581d072012-12-17 17:30:20 -08002149 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2150 StartWiFi();
2151 Mock::VerifyAndClearExpectations(process_proxy);
2152
2153 // If WiFi debugging is toggled and wpa_supplicant reports debugging
2154 // is set to some unmanaged level, WiFi should leave it alone.
2155 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07002156 .WillOnce(Return(WPASupplicant::kDebugLevelError))
2157 .WillOnce(Return(WPASupplicant::kDebugLevelError))
2158 .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
2159 .WillOnce(Return(WPASupplicant::kDebugLevelExcessive))
2160 .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
2161 .WillOnce(Return(WPASupplicant::kDebugLevelMsgDump))
2162 .WillOnce(Return(WPASupplicant::kDebugLevelWarning))
2163 .WillOnce(Return(WPASupplicant::kDebugLevelWarning));
Paul Stewart5581d072012-12-17 17:30:20 -08002164 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2165 ReportWiFiDebugScopeChanged(true);
2166 ReportWiFiDebugScopeChanged(false);
2167 ReportWiFiDebugScopeChanged(true);
2168 ReportWiFiDebugScopeChanged(false);
2169 ReportWiFiDebugScopeChanged(true);
2170 ReportWiFiDebugScopeChanged(false);
2171 ReportWiFiDebugScopeChanged(true);
2172 ReportWiFiDebugScopeChanged(false);
2173 Mock::VerifyAndClearExpectations(process_proxy);
2174
2175 // If WiFi debugging is turned off and wpa_supplicant reports debugging
2176 // is turned on, WiFi should turn supplicant debugging off.
2177 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07002178 .WillOnce(Return(WPASupplicant::kDebugLevelDebug));
2179 EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelInfo))
Paul Stewart5581d072012-12-17 17:30:20 -08002180 .Times(1);
2181 ReportWiFiDebugScopeChanged(false);
2182 Mock::VerifyAndClearExpectations(process_proxy);
2183
2184 // If WiFi debugging is turned on and wpa_supplicant reports debugging
2185 // is turned off, WiFi should turn supplicant debugging on.
2186 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07002187 .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
2188 EXPECT_CALL(*process_proxy, SetDebugLevel(WPASupplicant::kDebugLevelDebug))
Paul Stewart5581d072012-12-17 17:30:20 -08002189 .Times(1);
2190 ReportWiFiDebugScopeChanged(true);
2191 Mock::VerifyAndClearExpectations(process_proxy);
2192
2193 // If WiFi debugging is already in the correct state, it should not be
2194 // changed.
2195 EXPECT_CALL(*process_proxy, GetDebugLevel())
Paul Stewart0654ece2013-03-26 15:21:26 -07002196 .WillOnce(Return(WPASupplicant::kDebugLevelDebug))
2197 .WillOnce(Return(WPASupplicant::kDebugLevelInfo));
Paul Stewart5581d072012-12-17 17:30:20 -08002198 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2199 ReportWiFiDebugScopeChanged(true);
2200 ReportWiFiDebugScopeChanged(false);
2201
2202 // After WiFi is stopped, we shouldn't be calling the proxy.
2203 EXPECT_CALL(*process_proxy, GetDebugLevel()).Times(0);
2204 EXPECT_CALL(*process_proxy, SetDebugLevel(_)).Times(0);
2205 StopWiFi();
2206 ReportWiFiDebugScopeChanged(true);
2207 ReportWiFiDebugScopeChanged(false);
2208}
2209
Darin Petkov50cb78a2013-02-06 16:17:49 +01002210TEST_F(WiFiMainTest, LogSSID) {
2211 EXPECT_EQ("[SSID=]", WiFi::LogSSID(""));
2212 EXPECT_EQ("[SSID=foo\\x5b\\x09\\x5dbar]", WiFi::LogSSID("foo[\t]bar"));
2213}
2214
Chris Masone853b81b2011-06-24 14:11:41 -07002215} // namespace shill