blob: 865e11914d3312becfe79e8b589ae261a2e7dbd9 [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>
Paul Stewarta41e38d2011-11-11 07:47:29 -080013#include <set>
Chris Masone853b81b2011-06-24 14:11:41 -070014#include <string>
15#include <vector>
16
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"
mukesh agrawal8ede0522011-10-03 14:57:44 -070030#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070031#include "shill/key_value_store.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070032#include "shill/logging.h"
Chris Masone853b81b2011-06-24 14:11:41 -070033#include "shill/manager.h"
Darin Petkov2b8e44e2012-06-25 15:13:26 +020034#include "shill/mock_dbus_manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070035#include "shill/mock_device.h"
mukesh agrawalc01f3982012-01-24 13:48:39 -080036#include "shill/mock_device_info.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070037#include "shill/mock_dhcp_config.h"
38#include "shill/mock_dhcp_provider.h"
Paul Stewarte369ece2012-05-22 09:11:03 -070039#include "shill/mock_event_dispatcher.h"
mukesh agrawalcf24a242012-05-21 16:46:11 -070040#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070041#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080042#include "shill/mock_metrics.h"
Gary Morainac1bdb42012-02-16 17:42:29 -080043#include "shill/mock_power_manager.h"
44#include "shill/mock_power_manager_proxy.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070045#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070046#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080047#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080048#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070049#include "shill/mock_supplicant_interface_proxy.h"
50#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080051#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000052#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070053#include "shill/nice_mock_control.h"
Darin Petkov4a66cc52012-06-15 10:08:29 +020054#include "shill/property_store_inspector.h"
Chris Masone853b81b2011-06-24 14:11:41 -070055#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070056#include "shill/proxy_factory.h"
57#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070058#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080059#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070060
Gary Morainac1bdb42012-02-16 17:42:29 -080061
Chris Masone853b81b2011-06-24 14:11:41 -070062using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080063using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070064using std::string;
65using std::vector;
66using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070067using ::testing::AnyNumber;
68using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080069using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070070using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070071using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080072using ::testing::Invoke;
Paul Stewart549d44c2012-07-03 12:40:25 -070073using ::testing::InvokeWithoutArgs;
mukesh agrawal7ec71312011-11-10 02:08:26 +000074using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070075using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070076using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080077using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080078using ::testing::SetArgumentPointee;
79using ::testing::StrEq;
80using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070081using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070082using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070083using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070084
85namespace shill {
86
mukesh agrawal31950242011-07-14 11:53:38 -070087class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070088 public:
mukesh agrawal31950242011-07-14 11:53:38 -070089 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080090 : device_(new WiFi(control_interface(),
91 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070092 }
mukesh agrawal31950242011-07-14 11:53:38 -070093 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070094
95 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080096 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070097};
98
mukesh agrawal31950242011-07-14 11:53:38 -070099TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -0700100 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
101 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -0700102}
103
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800104TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 {
106 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800107 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700108 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700109 flimflam::kBgscanSignalThresholdProperty,
110 PropertyStoreTest::kInt32V,
111 &error));
112 }
113 {
114 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800115 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
116 flimflam::kScanIntervalProperty,
117 PropertyStoreTest::kUint16V,
118 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700119 }
Chris Masone853b81b2011-06-24 14:11:41 -0700120 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700121 {
122 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800123 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
124 flimflam::kScanningProperty,
125 PropertyStoreTest::kBoolV,
126 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700127 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700128 }
Chris Masone853b81b2011-06-24 14:11:41 -0700129
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800130 {
131 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800132 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800133 device_->mutable_store(),
134 flimflam::kBgscanMethodProperty,
135 DBusAdaptor::StringToVariant(
136 wpa_supplicant::kNetworkBgscanMethodSimple),
137 &error));
138 }
139
140 {
141 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800142 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800143 device_->mutable_store(),
144 flimflam::kBgscanMethodProperty,
145 DBusAdaptor::StringToVariant("not a real scan method"),
146 &error));
147 }
148}
149
Darin Petkov4a66cc52012-06-15 10:08:29 +0200150TEST_F(WiFiPropertyTest, BgscanMethodProperty) {
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800151 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
152 WiFi::kDefaultBgscanMethod);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200153 EXPECT_TRUE(device_->bgscan_method_.empty());
154
155 string method;
156 PropertyStoreInspector inspector(&device_->store());
157 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
158 &method));
159 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
160 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodSimple, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800161
162 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800163 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800164 device_->mutable_store(),
165 flimflam::kBgscanMethodProperty,
166 DBusAdaptor::StringToVariant(
167 wpa_supplicant::kNetworkBgscanMethodLearn),
168 &error));
169 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200170 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
171 &method));
172 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800173
174 EXPECT_TRUE(DBusAdaptor::ClearProperty(
175 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
Darin Petkov4a66cc52012-06-15 10:08:29 +0200176 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
177 &method));
178 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
179 EXPECT_TRUE(device_->bgscan_method_.empty());
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800180}
181
Paul Stewarte369ece2012-05-22 09:11:03 -0700182class WiFiObjectTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700183 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700184 WiFiObjectTest(EventDispatcher *dispatcher)
185 : event_dispatcher_(dispatcher),
186 manager_(&control_interface_, NULL, &metrics_, &glib_),
187 device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700188 wifi_(new WiFi(&control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700189 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -0800190 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700191 &manager_,
192 kDeviceName,
193 kDeviceAddress,
194 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700195 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
196 supplicant_interface_proxy_(
197 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800198 supplicant_bss_proxy_(
199 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700200 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700201 kDeviceName)),
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200202 dbus_manager_(new NiceMock<MockDBusManager>()),
Gary Morainac1bdb42012-02-16 17:42:29 -0800203 proxy_factory_(this),
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500204 power_manager_(new MockPowerManager(&proxy_factory_)) {
mukesh agrawal31950242011-07-14 11:53:38 -0700205 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000206 // Except for WiFiServices created via WiFi::GetService, we expect
207 // that any WiFiService has been registered with the Manager. So
208 // default Manager.HasService to true, to make the common case
209 // easy.
210 ON_CALL(manager_, HasService(_)).
211 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800212
Paul Stewartd408fdf2012-05-07 17:15:57 -0700213 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800214 WillByDefault(Return(dhcp_config_));
215 ON_CALL(*dhcp_config_.get(), RequestIP()).
216 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800217
218 // |manager_| takes ownership of |power_manager_|.
219 manager_.set_power_manager(power_manager_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800220
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200221 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
222
mukesh agrawal5c05b292012-03-07 10:12:52 -0800223 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700224 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700225
226 virtual void SetUp() {
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700227 // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
228 ScopeLogger::GetInstance()->EnableScopesByName("wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700229 ScopeLogger::GetInstance()->set_verbose_level(3);
Darin Petkovab565bb2011-10-06 02:55:51 -0700230 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700231 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
232 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800233 ON_CALL(manager_, device_info()).
234 WillByDefault(Return(&device_info_));
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200235 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
Chris Masoneb9c00592011-10-06 13:10:39 -0700236 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800237 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700238 }
239
240 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800241 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Gary Morain91001122012-02-29 16:22:26 -0800242 EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
243 .Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500244 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800245 if (supplicant_bss_proxy_.get()) {
246 EXPECT_CALL(*supplicant_bss_proxy_, Die());
247 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700248 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700249 // must Stop WiFi instance, to clear its list of services.
250 // otherwise, the WiFi instance will not be deleted. (because
251 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500252 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700253 wifi_->set_dhcp_provider(NULL);
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700254 // Reset scope logging, to avoid interfering with other tests.
255 ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700256 ScopeLogger::GetInstance()->set_verbose_level(0);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700257 }
258
Paul Stewart549d44c2012-07-03 12:40:25 -0700259 // Needs to be public since it is called via Invoke().
260 void StopWiFi() {
261 EXPECT_CALL(*power_manager_,
262 RemoveStateChangeCallback(wifi_->UniqueName()));
263 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
264 }
265
266 void UnloadService(const ServiceRefPtr &service) {
267 service->Unload();
268 }
269
mukesh agrawal31950242011-07-14 11:53:38 -0700270 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000271 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
272
mukesh agrawal31950242011-07-14 11:53:38 -0700273 class TestProxyFactory : public ProxyFactory {
274 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700275 explicit TestProxyFactory(WiFiObjectTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700276
277 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700278 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700279 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700280 }
281
282 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700283 const WiFiRefPtr &/*wifi*/,
284 const DBus::Path &/*object_path*/,
285 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700286 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700287 }
288
mukesh agrawalb20776f2012-02-10 16:00:36 -0800289 MOCK_METHOD3(CreateSupplicantBSSProxy,
290 SupplicantBSSProxyInterface *(
291 WiFiEndpoint *wifi_endpoint,
292 const DBus::Path &object_path,
293 const char *dbus_addr));
294
Gary Morainac1bdb42012-02-16 17:42:29 -0800295 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
296 PowerManagerProxyDelegate */*delegate*/) {
297 return new MockPowerManagerProxy();
298 }
299
mukesh agrawal31950242011-07-14 11:53:38 -0700300 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800301 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
302 WiFiEndpoint */*wifi_endpoint*/,
303 const DBus::Path &/*object_path*/,
304 const char */*dbus_addr*/) {
305 return test_->supplicant_bss_proxy_.release();
306 }
307
Paul Stewarte369ece2012-05-22 09:11:03 -0700308 WiFiObjectTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700309 };
310
mukesh agrawalb66c6462012-05-07 11:45:25 -0700311 void CancelScanTimer() {
312 wifi_->scan_timer_callback_.Cancel();
313 }
mukesh agrawal15908392011-11-16 18:29:25 +0000314 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
315 bool hidden_ssid = false;
316 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
317 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700318 void FireScanTimer() {
319 wifi_->ScanTimerHandler();
320 }
mukesh agrawal15908392011-11-16 18:29:25 +0000321 const WiFiServiceRefPtr &GetCurrentService() {
322 return wifi_->current_service_;
323 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700324 void SetCurrentService(const WiFiServiceRefPtr &service) {
325 wifi_->current_service_ = service;
326 }
mukesh agrawal31950242011-07-14 11:53:38 -0700327 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000328 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700329 }
mukesh agrawal15908392011-11-16 18:29:25 +0000330 const WiFiServiceRefPtr &GetPendingService() {
331 return wifi_->pending_service_;
332 }
Paul Stewart2b05e622012-07-13 20:38:44 -0700333 const base::CancelableClosure &GetPendingTimeout() {
334 return wifi_->pending_timeout_callback_;
335 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700336 const base::CancelableClosure &GetReconnectTimeoutCallback() {
Paul Stewart44663922012-07-30 11:03:03 -0700337 return wifi_->reconnect_timeout_callback_;
338 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700339 int GetReconnectTimeoutSeconds() {
340 return WiFi::kReconnectTimeoutSeconds;
341 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700342 const base::CancelableClosure &GetScanTimer() {
343 return wifi_->scan_timer_callback_;
344 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000345 const vector<WiFiServiceRefPtr> &GetServices() {
346 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700347 }
348 // note: the tests need the proxies referenced by WiFi (not the
Paul Stewarte369ece2012-05-22 09:11:03 -0700349 // proxies instantiated by WiFiObjectTest), to ensure that WiFi
mukesh agrawal31950242011-07-14 11:53:38 -0700350 // sets up its proxies correctly.
351 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
352 return wifi_->supplicant_process_proxy_.get();
353 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000354 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
355 return dynamic_cast<MockSupplicantInterfaceProxy *>(
356 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700357 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000358 const string &GetSupplicantState() {
359 return wifi_->supplicant_state_;
360 }
361 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700362 map<string, ::DBus::Variant> params;
363 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700364 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000365 void InitiateDisconnect(WiFiServiceRefPtr service) {
366 wifi_->DisconnectFrom(service);
367 }
mukesh agrawal15908392011-11-16 18:29:25 +0000368 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800369 return WiFiEndpoint::MakeOpenEndpoint(
370 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000371 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700372 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
mukesh agrawal7ec71312011-11-10 02:08:26 +0000373 vector<uint8_t> ssid(1, 'a');
374 return new MockWiFiService(
375 &control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700376 event_dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800377 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000378 &manager_,
379 wifi_,
380 ssid,
381 flimflam::kModeManaged,
mukesh agrawalcf24a242012-05-21 16:46:11 -0700382 security,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000383 false);
384 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000385 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700386 void ReportBSS(const ::DBus::Path &bss_path,
387 const string &ssid,
388 const string &bssid,
389 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000390 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700391 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800392 void ClearCachedCredentials() {
393 wifi_->ClearCachedCredentials();
394 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800395 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100396 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800397 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700398 void ReportLinkUp() {
399 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
400 }
mukesh agrawal31950242011-07-14 11:53:38 -0700401 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700402 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700403 }
mukesh agrawal15908392011-11-16 18:29:25 +0000404 void ReportCurrentBSSChanged(const string &new_bss) {
405 wifi_->CurrentBSSChanged(new_bss);
406 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000407 void ReportStateChanged(const string &new_state) {
408 wifi_->StateChanged(new_state);
409 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700410 void SetPendingService(const WiFiServiceRefPtr &service) {
411 wifi_->pending_service_ = service;
412 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700413 void SetScanInterval(uint16_t interval_seconds) {
414 wifi_->SetScanInterval(interval_seconds, NULL);
415 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700416 uint16_t GetScanInterval() {
417 return wifi_->GetScanInterval(NULL);
418 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200419 void StartWiFi(bool supplicant_present) {
420 if (supplicant_present) {
421 EXPECT_CALL(*power_manager_,
422 AddStateChangeCallback(wifi_->UniqueName(), _))
423 .WillOnce(SaveArg<1>(&power_state_callback_));
424 }
425 wifi_->supplicant_present_ = supplicant_present;
mukesh agrawalb66c6462012-05-07 11:45:25 -0700426 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700427 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200428 void StartWiFi() {
429 StartWiFi(true);
430 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200431 void OnSupplicantAppear() {
432 wifi_->OnSupplicantAppear(":1.7");
433 EXPECT_TRUE(wifi_->supplicant_present_);
434 }
435 void OnSupplicantVanish() {
436 wifi_->OnSupplicantVanish();
437 EXPECT_FALSE(wifi_->supplicant_present_);
438 }
439 bool GetSupplicantPresent() {
440 return wifi_->supplicant_present_;
441 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700442 WiFiServiceRefPtr GetOpenService(const char *service_type,
443 const char *ssid,
444 const char *mode,
445 Error *result) {
446 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700447 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700448 WiFiServiceRefPtr GetService(const char *service_type,
449 const char *ssid,
450 const char *mode,
451 const char *security,
452 const char *passphrase,
453 Error *result) {
454 return GetServiceInner(service_type, ssid, mode, security, passphrase,
455 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800456 }
457 WiFiServiceRefPtr GetServiceInner(const char *service_type,
458 const char *ssid,
459 const char *mode,
460 const char *security,
461 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800462 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800463 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700464 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700465 // in general, we want to avoid D-Bus specific code for any RPCs
466 // that come in via adaptors. we make an exception here, because
467 // calls to GetWifiService are rerouted from the Manager object to
468 // the Wifi class.
469 if (service_type != NULL)
470 args[flimflam::kTypeProperty].writer().append_string(service_type);
471 if (ssid != NULL)
472 args[flimflam::kSSIDProperty].writer().append_string(ssid);
473 if (mode != NULL)
474 args[flimflam::kModeProperty].writer().append_string(mode);
475 if (security != NULL)
476 args[flimflam::kSecurityProperty].writer().append_string(security);
477 if (passphrase != NULL)
478 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800479 if (!allow_hidden)
480 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700481
Paul Stewartced6a0b2011-11-08 15:32:04 -0800482 Error e;
483 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700484 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800485 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700486 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700487
488 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
489 Error *result) {
490 return wifi_->GetService(args, result);
491 }
492
Paul Stewarta41e38d2011-11-11 07:47:29 -0800493 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
494 const string &mode,
495 const string &security) {
496 return wifi_->FindService(ssid, mode, security);
497 }
498 bool LoadHiddenServices(StoreInterface *storage) {
499 return wifi_->LoadHiddenServices(storage);
500 }
501 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
502 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
503 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
504 flimflam::kTypeWifi,
505 kDeviceAddress,
506 hex_ssid.c_str(),
507 flimflam::kModeManaged,
508 flimflam::kSecurityNone));
509 const char *groups[] = { id->c_str() };
510 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
511 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
512 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
513 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
514 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
515 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
516 }
Darin Petkov4a66cc52012-06-15 10:08:29 +0200517
Paul Stewart549d44c2012-07-03 12:40:25 -0700518 WiFiService *SetupConnectedService(const DBus::Path &network_path) {
519 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
520 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
521 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
522 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
523 if (!network_path.empty()) {
524 EXPECT_CALL(*supplicant_interface_proxy_, AddNetwork(_))
525 .WillOnce(Return(network_path));
526 }
527
528 StartWiFi();
Paul Stewart44663922012-07-30 11:03:03 -0700529 ReportBSS(kBSSName, kSSIDName, "00:00:00:00:00:00", 0, 0,
530 kNetworkModeAdHoc);
Paul Stewart549d44c2012-07-03 12:40:25 -0700531 WiFiService *service(GetServices().begin()->get());
Paul Stewart2b05e622012-07-13 20:38:44 -0700532 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700533 InitiateConnect(service);
Paul Stewart2b05e622012-07-13 20:38:44 -0700534 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -0700535 ReportCurrentBSSChanged(kBSSName);
Paul Stewart2b05e622012-07-13 20:38:44 -0700536 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700537 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
538
539 EXPECT_EQ(service, GetCurrentService());
540
541 return service;
542 }
543
Darin Petkov4a66cc52012-06-15 10:08:29 +0200544 bool SetBgscanMethod(const string &method) {
545 ::DBus::Error error;
546 return DBusAdaptor::SetProperty(
547 wifi_->mutable_store(),
548 flimflam::kBgscanMethodProperty,
549 DBusAdaptor::StringToVariant(method),
550 &error);
551 }
552
553 void AppendBgscan(WiFiService *service,
554 std::map<std::string, DBus::Variant> *service_params) {
555 wifi_->AppendBgscan(service, service_params);
556 }
557
Paul Stewartbc6e7392012-05-24 07:07:48 -0700558 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
559 wifi_->CertificationTask(properties);
560 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700561
Paul Stewarte369ece2012-05-22 09:11:03 -0700562 void RestartFastScanAttempts() {
563 wifi_->RestartFastScanAttempts();
564 }
565
Paul Stewart1aff7302012-08-04 20:04:47 -0700566 void StartReconnectTimer() {
567 wifi_->StartReconnectTimer();
568 }
569
570 void StopReconnectTimer() {
571 wifi_->StopReconnectTimer();
572 }
573
Paul Stewart10ccbb32012-04-26 15:59:30 -0700574 NiceMockControl *control_interface() {
575 return &control_interface_;
576 }
577
mukesh agrawal32399322011-09-01 10:53:43 -0700578 MockManager *manager() {
579 return &manager_;
580 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800581
582 MockDeviceInfo *device_info() {
583 return &device_info_;
584 }
585
586 MockDHCPProvider *dhcp_provider() {
587 return &dhcp_provider_;
588 }
589
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500590 const PowerManager::PowerStateCallback &power_state_callback() const {
Gary Morainac1bdb42012-02-16 17:42:29 -0800591 return power_state_callback_;
592 }
593
mukesh agrawal32399322011-09-01 10:53:43 -0700594 const WiFiConstRefPtr wifi() const {
595 return wifi_;
596 }
597
mukesh agrawalb20776f2012-02-10 16:00:36 -0800598 TestProxyFactory *proxy_factory() {
599 return &proxy_factory_;
600 }
601
Paul Stewarte369ece2012-05-22 09:11:03 -0700602 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700603 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800604 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700605
606 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700607 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800608 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700609 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700610 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800611 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700612 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700613
614 // protected fields interspersed between private fields, due to
615 // initialization order
616 protected:
617 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700618 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700619 static const char kNetworkModeAdHoc[];
620 static const char kNetworkModeInfrastructure[];
Paul Stewart44663922012-07-30 11:03:03 -0700621 static const char kBSSName[];
622 static const char kSSIDName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700623
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700624 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
625 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800626 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700627 MockDHCPProvider dhcp_provider_;
628 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200629 NiceMock<MockDBusManager> *dbus_manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700630
631 private:
632 TestProxyFactory proxy_factory_;
Gary Morainac1bdb42012-02-16 17:42:29 -0800633 MockPowerManager *power_manager_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500634 PowerManager::PowerStateCallback power_state_callback_;
mukesh agrawal31950242011-07-14 11:53:38 -0700635};
636
Paul Stewarte369ece2012-05-22 09:11:03 -0700637const char WiFiObjectTest::kDeviceName[] = "wlan0";
638const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
639const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
640const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
Paul Stewart44663922012-07-30 11:03:03 -0700641const char WiFiObjectTest::kBSSName[] = "bss0";
642const char WiFiObjectTest::kSSIDName[] = "ssid0";
mukesh agrawal31950242011-07-14 11:53:38 -0700643
Paul Stewarte369ece2012-05-22 09:11:03 -0700644void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000645 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000646}
647
Paul Stewarte369ece2012-05-22 09:11:03 -0700648void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700649 const string &ssid,
650 const string &bssid,
651 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000652 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700653 const char *mode) {
654 map<string, ::DBus::Variant> bss_properties;
655
656 {
657 DBus::MessageIter writer(bss_properties["SSID"].writer());
658 writer << vector<uint8_t>(ssid.begin(), ssid.end());
659 }
660 {
661 string bssid_nosep;
662 vector<uint8_t> bssid_bytes;
663 RemoveChars(bssid, ":", &bssid_nosep);
664 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
665
666 DBus::MessageIter writer(bss_properties["BSSID"].writer());
667 writer << bssid_bytes;
668 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000669 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
670 append_int16(signal_strength);
671 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
672 append_uint16(frequency);
673 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000674 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700675}
676
Paul Stewarte369ece2012-05-22 09:11:03 -0700677WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800678 : test_(test) {
679 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
680 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
681 .WillByDefault(
682 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
683}
684
Paul Stewarte369ece2012-05-22 09:11:03 -0700685// Most of our tests involve using a real EventDispatcher object.
686class WiFiMainTest : public WiFiObjectTest {
687 public:
688 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
689
690 protected:
691 EventDispatcher dispatcher_;
692};
693
mukesh agrawal31950242011-07-14 11:53:38 -0700694TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
695 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
696 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
697
698 StartWiFi();
699 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
700 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
701}
702
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200703TEST_F(WiFiMainTest, SupplicantPresent) {
704 EXPECT_FALSE(GetSupplicantPresent());
705}
706
707TEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
708 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
709
710 EXPECT_CALL(*dbus_manager_, WatchName(wpa_supplicant::kDBusAddr, _, _));
711 StartWiFi(false); // No supplicant present.
712 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
713
714 OnSupplicantAppear();
715 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200716
717 // If supplicant reappears while the device is started, the device should be
718 // restarted.
719 EXPECT_CALL(*manager(), DeregisterDevice(_));
720 EXPECT_CALL(*manager(), RegisterDevice(_));
721 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200722}
723
724TEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
725 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
726
727 OnSupplicantAppear();
728 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200729
730 // If supplicant reappears while the device is stopped, the device should not
731 // be restarted.
732 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
733 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200734}
735
736TEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
737 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
738
739 StartWiFi();
740 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
741 EXPECT_TRUE(GetSupplicantPresent());
742
743 EXPECT_CALL(*manager(), DeregisterDevice(_));
744 EXPECT_CALL(*manager(), RegisterDevice(_));
745 OnSupplicantVanish();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200746}
747
748TEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
749 OnSupplicantAppear();
750 EXPECT_TRUE(GetSupplicantPresent());
751 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
752 OnSupplicantVanish();
753}
754
Paul Stewart549d44c2012-07-03 12:40:25 -0700755TEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
756 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
757 *supplicant_interface_proxy_;
758 WiFiService *service(SetupConnectedService(DBus::Path()));
759 ScopedMockLog log;
760 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
761 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
762 EndsWith("silently resetting current_service_.")));
763 EXPECT_CALL(*manager(), DeregisterDevice(_))
764 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
765 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
766 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
767 EXPECT_CALL(supplicant_interface_proxy, Disconnect()).Times(0);
768 EXPECT_CALL(*manager(), RegisterDevice(_));
769 OnSupplicantVanish();
770 EXPECT_TRUE(GetCurrentService() == NULL);
771}
772
mukesh agrawal31950242011-07-14 11:53:38 -0700773TEST_F(WiFiMainTest, CleanStart) {
774 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
775 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
776 .Times(AnyNumber())
777 .WillRepeatedly(Throw(
778 DBus::Error(
779 "fi.w1.wpa_supplicant1.InterfaceUnknown",
780 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
781 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700782 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700783 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700784 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700785 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700786}
787
788TEST_F(WiFiMainTest, Restart) {
789 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
790 .Times(AnyNumber())
791 .WillRepeatedly(Throw(
792 DBus::Error(
793 "fi.w1.wpa_supplicant1.InterfaceExists",
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200794 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
mukesh agrawal31950242011-07-14 11:53:38 -0700795 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
796 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
797 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700798 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700799}
800
801TEST_F(WiFiMainTest, StartClearsState) {
802 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
803 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
804 StartWiFi();
805}
806
Gary Morainac1bdb42012-02-16 17:42:29 -0800807TEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
808 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
809 StartWiFi();
810 dispatcher_.DispatchPendingEvents();
811 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800812 ReportScanDone();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500813 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800814 ASSERT_TRUE(wifi()->IsIdle());
815 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500816 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800817 dispatcher_.DispatchPendingEvents();
818}
819
820TEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
821 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
822 StartWiFi();
823 dispatcher_.DispatchPendingEvents();
824 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500825 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800826 ASSERT_TRUE(wifi()->IsIdle());
827 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500828 power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
Gary Morainac1bdb42012-02-16 17:42:29 -0800829 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500830 power_state_callback().Run(PowerManagerProxyDelegate::kMem);
Gary Morainac1bdb42012-02-16 17:42:29 -0800831 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500832 power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
Gary Morainac1bdb42012-02-16 17:42:29 -0800833 dispatcher_.DispatchPendingEvents();
834}
835
836TEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
837 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
838 StartWiFi();
839
840 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
841 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
842 Error error;
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700843 ScopedMockLog log;
Gary Morainac1bdb42012-02-16 17:42:29 -0800844 service->AddEndpoint(ap);
845 service->AutoConnect();
846 EXPECT_FALSE(wifi()->IsIdle());
847 dispatcher_.DispatchPendingEvents();
848 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500849 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800850 ASSERT_FALSE(wifi()->IsIdle());
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700851 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
852 EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
Gary Morainac1bdb42012-02-16 17:42:29 -0800853 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500854 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800855 dispatcher_.DispatchPendingEvents();
856}
857
mukesh agrawal31950242011-07-14 11:53:38 -0700858TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800859 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700860 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000861 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700862 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000863 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700864 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000865 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700866 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000867 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
868 const uint16 frequency = 2412;
869 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
870 kNetworkModeAdHoc);
871
872 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
873 EXPECT_EQ(5, endpoints_by_rpcid.size());
874
875 WiFi::EndpointMap::const_iterator i;
876 WiFiEndpointRefPtr endpoint;
877 for (i = endpoints_by_rpcid.begin();
878 i != endpoints_by_rpcid.end();
879 ++i) {
880 if (i->second->bssid_string() == "00:00:00:00:00:04")
881 break;
882 }
883 ASSERT_TRUE(i != endpoints_by_rpcid.end());
884 EXPECT_EQ(4, i->second->signal_strength());
885 EXPECT_EQ(frequency, i->second->frequency());
886 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700887}
888
889TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800890 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
891 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
892 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700893 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000894 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700895 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000896 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700897 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000898 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700899 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000900 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
901 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000902
903 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
904 EXPECT_EQ(3, endpoints_by_rpcid.size());
905
906 WiFi::EndpointMap::const_iterator i;
907 WiFiEndpointRefPtr endpoint;
908 for (i = endpoints_by_rpcid.begin();
909 i != endpoints_by_rpcid.end();
910 ++i) {
911 if (i->second->bssid_string() == "00:00:00:00:00:00")
912 break;
913 }
914 ASSERT_TRUE(i != endpoints_by_rpcid.end());
915 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700916}
917
918TEST_F(WiFiMainTest, ScanCompleted) {
919 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000920 EXPECT_CALL(*manager(), RegisterService(_))
921 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000922 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700923 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000924 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700925 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000926 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700927 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000928 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800929
mukesh agrawale9adda12012-02-09 18:33:48 -0800930 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000931 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800932 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800933 EXPECT_EQ(3, GetServices().size());
934
mukesh agrawale9adda12012-02-09 18:33:48 -0800935 // BSSes with empty SSIDs should be filtered.
936 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
937 EXPECT_EQ(3, GetEndpointMap().size());
938 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000939}
940
941TEST_F(WiFiMainTest, EndpointGroupingTogether) {
942 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000943
944 InSequence s;
945 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800946 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000947 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000948 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
949 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000950 ReportScanDone();
951 EXPECT_EQ(1, GetServices().size());
952}
953
954TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
955 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000956 EXPECT_CALL(*manager(), RegisterService(_))
957 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000958 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
959 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000960 ReportScanDone();
961 EXPECT_EQ(2, GetServices().size());
962}
963
964TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
965 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000966 EXPECT_CALL(*manager(), RegisterService(_))
967 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000968 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
969 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
970 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000971 ReportScanDone();
972 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700973}
974
mukesh agrawal261daca2011-12-02 18:56:56 +0000975TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
976 // Removal of non-existent BSS should not cause a crash.
977 StartWiFi();
978 RemoveBSS("bss0");
979 EXPECT_EQ(0, GetServices().size());
980}
981
mukesh agrawale9adda12012-02-09 18:33:48 -0800982TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
983 // Removal of BSS with an empty SSID should not cause a crash.
984 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
985 StartWiFi();
986 RemoveBSS("bss");
987 EXPECT_EQ(0, GetServices().size());
988}
989
990TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
991 // Removal of BSS with a NULL SSID should not cause a crash.
992 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
993 StartWiFi();
994 RemoveBSS("bss");
995 EXPECT_EQ(0, GetServices().size());
996}
997
mukesh agrawal261daca2011-12-02 18:56:56 +0000998TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800999 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001000 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001001 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001002 ReportScanDone();
1003 EXPECT_EQ(1, GetServices().size());
1004 EXPECT_TRUE(GetServices().front()->IsVisible());
1005
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001006 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001007 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001008 EXPECT_TRUE(GetServices().empty());
1009}
1010
1011TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001012 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001013 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001014 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001015 ReportScanDone();
1016 ReportCurrentBSSChanged("bss0");
1017
1018 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1019 EXPECT_CALL(*manager(), DeregisterService(_));
1020 RemoveBSS("bss0");
1021 EXPECT_TRUE(GetServices().empty());
1022}
1023
1024TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001025 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1026 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001027 StartWiFi();
1028
1029 Error e;
1030 WiFiServiceRefPtr service =
1031 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
1032 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +00001033 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001034
Thieu Lee41a72d2012-02-06 20:46:51 +00001035 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
1036 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001037 ReportScanDone();
1038 ReportCurrentBSSChanged("bss");
1039 EXPECT_EQ(1, GetServices().size());
1040
1041 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001042 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001043 EXPECT_EQ(1, GetServices().size());
1044 // Verify expectations now, because WiFi may call UpdateService when
1045 // WiFi is Stop()-ed (during TearDown()).
1046 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -08001047 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001048}
1049
1050TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001051 EXPECT_CALL(*manager(), RegisterService(_));
1052 EXPECT_CALL(*manager(), HasService(_));
1053 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001054 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001055 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1056 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001057 ReportScanDone();
1058 EXPECT_EQ(1, GetServices().size());
1059 EXPECT_TRUE(GetServices().front()->IsVisible());
1060
1061 EXPECT_CALL(*manager(), UpdateService(_));
1062 RemoveBSS("bss0");
1063 EXPECT_TRUE(GetServices().front()->IsVisible());
1064 EXPECT_EQ(1, GetServices().size());
1065}
1066
mukesh agrawal31950242011-07-14 11:53:38 -07001067TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001068 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001069 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1070 *supplicant_interface_proxy_;
1071
mukesh agrawal31950242011-07-14 11:53:38 -07001072 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001073 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -07001074 ReportScanDone();
1075
1076 {
1077 InSequence s;
1078 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +00001079 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -07001080
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001081 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -07001082 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001083 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -07001084 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -07001085 EXPECT_EQ(static_cast<Service *>(service),
1086 wifi()->selected_service_.get());
Paul Stewart2b05e622012-07-13 20:38:44 -07001087 EXPECT_EQ(Service::kStateAssociating, service->state());
1088 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -07001089 }
1090}
1091
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001092TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001093 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001094 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1095 *supplicant_interface_proxy_;
1096
1097 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001098 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001099 WiFiService *service(GetServices().begin()->get());
1100 InitiateConnect(service);
1101
1102 EXPECT_FALSE(GetPendingService() == NULL);
1103 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1104 InitiateDisconnect(service);
1105
1106 EXPECT_TRUE(GetPendingService() == NULL);
1107}
1108
1109TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001110 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001111 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001112 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1113 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001114 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1115 *supplicant_interface_proxy_;
1116
1117 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001118 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1119 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001120 WiFiService *service0(GetServices()[0].get());
1121 WiFiService *service1(GetServices()[1].get());
1122
1123 InitiateConnect(service0);
1124 ReportCurrentBSSChanged("bss0");
1125 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1126 InitiateConnect(service1);
1127
1128 EXPECT_EQ(service0, GetCurrentService());
1129 EXPECT_EQ(service1, GetPendingService());
1130 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1131 InitiateDisconnect(service1);
1132
1133 // |current_service_| will be unchanged until supplicant signals
1134 // that CurrentBSS has changed.
1135 EXPECT_EQ(service0, GetCurrentService());
1136 // |pending_service_| is updated immediately.
1137 EXPECT_TRUE(GetPendingService() == NULL);
Paul Stewart2b05e622012-07-13 20:38:44 -07001138 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001139}
1140
1141TEST_F(WiFiMainTest, DisconnectCurrentService) {
1142 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1143 *supplicant_interface_proxy_;
Paul Stewart549d44c2012-07-03 12:40:25 -07001144 WiFiService *service(SetupConnectedService(DBus::Path()));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001145 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1146 InitiateDisconnect(service);
1147
1148 // |current_service_| should not change until supplicant reports
1149 // a BSS change.
1150 EXPECT_EQ(service, GetCurrentService());
1151}
1152
1153TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001154 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001155 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001156 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1157 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001158 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1159 *supplicant_interface_proxy_;
1160
1161 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001162 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1163 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001164 WiFiService *service0(GetServices()[0].get());
1165 WiFiService *service1(GetServices()[1].get());
1166
1167 InitiateConnect(service0);
1168 ReportCurrentBSSChanged("bss0");
1169 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1170 InitiateConnect(service1);
1171
1172 EXPECT_EQ(service0, GetCurrentService());
1173 EXPECT_EQ(service1, GetPendingService());
1174 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1175 .Times(0);
1176 InitiateDisconnect(service0);
1177
1178 EXPECT_EQ(service0, GetCurrentService());
1179 EXPECT_EQ(service1, GetPendingService());
Paul Stewart2b05e622012-07-13 20:38:44 -07001180 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
1181}
1182
1183TEST_F(WiFiMainTest, TimeoutPendingService) {
1184 StartWiFi();
1185 dispatcher_.DispatchPendingEvents();
1186 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1187 EXPECT_TRUE(pending_timeout.IsCancelled());
1188
1189 InSequence seq;
1190 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1191 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
1192 InitiateConnect(service);
1193 EXPECT_FALSE(pending_timeout.IsCancelled());
1194 EXPECT_EQ(service, GetPendingService());
1195
1196 EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
1197 pending_timeout.callback().Run();
1198 EXPECT_EQ(NULL, GetPendingService().get());
1199
1200 // Verify expectations now, because WiFi may report other state changes
1201 // when WiFi is Stop()-ed (during TearDown()).
1202 Mock::VerifyAndClearExpectations(service.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001203}
1204
1205TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001206 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001207 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1208 *supplicant_interface_proxy_;
1209
1210 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001211 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001212 WiFiService *service(GetServices().begin()->get());
1213 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1214 .Times(0);
1215 InitiateDisconnect(service);
1216}
1217
1218TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
1219 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1220 *supplicant_interface_proxy_;
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001221 DBus::Path fake_path("/fake/path");
Paul Stewart549d44c2012-07-03 12:40:25 -07001222 WiFiService *service(SetupConnectedService(fake_path));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001223 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1224 .WillRepeatedly(Throw(
1225 DBus::Error(
1226 "fi.w1.wpa_supplicant1.NotConnected",
1227 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1228 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1229 InitiateDisconnect(service);
1230
1231 EXPECT_TRUE(GetCurrentService() == NULL);
1232}
1233
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001234TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001235 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001236 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001237 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001238 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001239
mukesh agrawalc01f3982012-01-24 13:48:39 -08001240 EXPECT_CALL(*manager(), DeregisterService(_));
1241 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001242 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawalc4f368f2012-06-04 19:45:52 -07001243 EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001244}
1245
Paul Stewart549d44c2012-07-03 12:40:25 -07001246TEST_F(WiFiMainTest, StopWhileConnected) {
1247 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1248 *supplicant_interface_proxy_;
1249 WiFiService *service(SetupConnectedService(DBus::Path()));
1250 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
1251 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
1252 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1253 StopWiFi();
1254 EXPECT_TRUE(GetCurrentService() == NULL);
1255}
1256
Paul Stewart44663922012-07-30 11:03:03 -07001257TEST_F(WiFiMainTest, ReconnectTimer) {
1258 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1259 *supplicant_interface_proxy_;
1260 WiFiService *service(SetupConnectedService(DBus::Path()));
1261 service->SetState(Service::kStateConnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001262 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001263 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001264 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001265 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
Paul Stewart1aff7302012-08-04 20:04:47 -07001266 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001267 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001268 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001269 ReportCurrentBSSChanged(kBSSName);
Paul Stewart1aff7302012-08-04 20:04:47 -07001270 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001271 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001272 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001273 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
Paul Stewart1aff7302012-08-04 20:04:47 -07001274 GetReconnectTimeoutCallback().callback().Run();
Paul Stewart44663922012-07-30 11:03:03 -07001275 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Paul Stewart1aff7302012-08-04 20:04:47 -07001276 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001277}
1278
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001279TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1280 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001281 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001282 EXPECT_TRUE(e.IsSuccess());
1283}
1284
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001285TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1286 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001287 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001288 EXPECT_EQ(Error::kInvalidArguments, e.type());
1289 EXPECT_EQ("must specify SSID", e.message());
1290}
1291
1292TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1293 Error e;
1294 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001295 flimflam::kTypeWifi, "123456789012345678901234567890123",
1296 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001297 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1298 EXPECT_EQ("SSID is too long", e.message());
1299}
1300
1301TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1302 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001303 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001304 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1305 EXPECT_EQ("SSID is too short", e.message());
1306}
1307
1308TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1309 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001310 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001311 EXPECT_EQ(Error::kNotSupported, e.type());
1312 EXPECT_EQ("service mode is unsupported", e.message());
1313}
1314
1315TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1316 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001317 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001318 EXPECT_TRUE(e.IsSuccess());
1319}
1320
1321TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1322 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001323 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1324 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001325 EXPECT_TRUE(e.IsSuccess());
1326}
1327
1328TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001329 // When configuring hidden networks, Chrome expects to be able to
1330 // GetService w/o a password, and supply the password with
1331 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001332 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001333 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1334 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001335 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001336}
1337
1338TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1339 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001340 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1341 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001342 EXPECT_EQ(Error::kNotSupported, e.type());
1343 EXPECT_EQ("security mode is unsupported", e.message());
1344}
1345
1346TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001347 // When configuring hidden networks, Chrome expects to be able to
1348 // GetService w/o a password, and supply the password with
1349 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001350 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001351 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1352 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001353 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001354}
1355
1356TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1357 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001358 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1359 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001360 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1361}
1362
1363TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1364 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001365 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1366 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001367 EXPECT_TRUE(e.IsSuccess());
1368}
1369
1370TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1371 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001372 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1373 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001374 EXPECT_TRUE(e.IsSuccess());
1375}
1376
1377TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1378 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001379 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1380 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001381 EXPECT_TRUE(e.IsSuccess());
1382}
1383
1384TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1385 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001386 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1387 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001388 EXPECT_TRUE(e.IsSuccess());
1389}
1390
1391TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1392 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001393 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1394 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001395 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1396}
1397
1398TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1399 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001400 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1401 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001402 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1403}
1404
1405TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1406 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001407 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1408 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001409 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1410}
1411
1412TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1413 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001414 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1415 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001416 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1417}
1418
1419TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1420 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001421 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1422 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001423 EXPECT_TRUE(e.IsSuccess());
1424}
1425
1426TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1427 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001428 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1429 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001430 EXPECT_TRUE(e.IsSuccess());
1431}
1432
1433TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1434 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001435 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1436 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001437 EXPECT_TRUE(e.IsSuccess());
1438}
1439
1440TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1441 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001442 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1443 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001444 EXPECT_TRUE(e.IsSuccess());
1445}
1446
mukesh agrawal8ede0522011-10-03 14:57:44 -07001447class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1448class WiFiGetServiceFailureTest : public WiFiMainTest {};
1449
1450TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1451 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001452 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1453 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001454 EXPECT_TRUE(e.IsSuccess());
1455}
1456
1457TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1458 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001459 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1460 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001461 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1462}
1463
1464INSTANTIATE_TEST_CASE_P(
1465 WiFiGetServiceSuccessTestInstance,
1466 WiFiGetServiceSuccessTest,
1467 Values(
1468 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1469 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1470 // subtle: invalid length for hex key, but valid as ascii passphrase
1471 string(IEEE_80211::kWPAHexLen-1, '1'),
1472 string(IEEE_80211::kWPAHexLen, '1')));
1473
1474INSTANTIATE_TEST_CASE_P(
1475 WiFiGetServiceFailureTestInstance,
1476 WiFiGetServiceFailureTest,
1477 Values(
1478 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1479 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1480 string(IEEE_80211::kWPAHexLen+1, '1')));
1481
Paul Stewart6ab23a92011-11-09 17:17:47 -08001482TEST_F(WiFiMainTest, FindServiceWEP) {
1483 const string ssid("an_ssid");
1484 {
1485 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001486 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001487 flimflam::kSecurityWep, "abcde", &e);
1488 EXPECT_TRUE(e.IsSuccess());
1489 }
1490 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1491
Paul Stewarta41e38d2011-11-11 07:47:29 -08001492 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1493 flimflam::kSecurityWep).get());
1494 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1495 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001496}
1497
1498TEST_F(WiFiMainTest, FindServiceWPA) {
1499 const string ssid("an_ssid");
1500 {
1501 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001502 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001503 flimflam::kSecurityRsn, "abcdefgh", &e);
1504 EXPECT_TRUE(e.IsSuccess());
1505 }
1506 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001507 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1508 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001509 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001510 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1511 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001512 EXPECT_TRUE(rsn_service.get());
1513 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001514 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1515 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001516 EXPECT_EQ(wpa_service.get(), psk_service.get());
1517 // Indirectly test FindService by doing a GetService on something that
1518 // already exists.
1519 {
1520 Error e;
1521 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001522 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1523 flimflam::kModeManaged, flimflam::kSecurityWpa,
1524 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001525 EXPECT_TRUE(e.IsSuccess());
1526 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1527 }
1528}
1529
Paul Stewartcb59fed2012-03-21 21:14:46 -07001530TEST_F(WiFiMainTest, GetServiceWithGUID) {
1531 // Perform a GetService that also configures properties in the base Service
1532 // class using Service::Configure().
1533 KeyValueStore args;
1534 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1535 args.SetString(flimflam::kSSIDProperty, "ssid");
1536 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1537 const string kGUID = "aguid"; // Stored as a registered Service property.
1538 args.SetString(flimflam::kGuidProperty, kGUID);
1539 Error e;
1540 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1541 EXPECT_TRUE(e.IsSuccess());
1542 EXPECT_EQ(kGUID, service->guid());
1543}
1544
Paul Stewartced6a0b2011-11-08 15:32:04 -08001545MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001546 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001547 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1548 if (it == arg.end()) {
1549 return false;
1550 }
1551
1552 const DBus::Variant &ssids_variant = it->second;
1553 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1554 const ByteArrays &ssids = it->second.operator ByteArrays();
1555 // A valid Scan containing a single hidden SSID should contain
1556 // two SSID entries: one containing the SSID we are looking for,
1557 // and an empty entry, signifying that we also want to do a
1558 // broadcast probe request for all non-hidden APs as well.
1559 return ssids.size() == 2 &&
1560 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1561 ssids[1].empty();
1562}
1563
1564TEST_F(WiFiMainTest, ScanHidden) {
1565 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1566 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1567 .Times(AnyNumber())
1568 .WillRepeatedly(Throw(
1569 DBus::Error(
1570 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1571 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001572 scoped_refptr<MockProfile> profile(
1573 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001574 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001575 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001576 Error e;
1577 WiFiServiceRefPtr service =
1578 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1579 NULL, NULL, true, &e);
1580 EXPECT_TRUE(e.IsSuccess());
1581 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001582 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001583 }
1584 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001585 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001586 Error e;
1587 WiFiServiceRefPtr service =
1588 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1589 NULL, NULL, true, &e);
1590 EXPECT_TRUE(e.IsSuccess());
1591 EXPECT_TRUE(service->hidden_ssid());
1592 }
1593 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001594 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001595 Error e;
1596 WiFiServiceRefPtr service =
1597 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1598 NULL, NULL, false, &e);
1599 EXPECT_TRUE(e.IsSuccess());
1600 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001601 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001602 }
1603 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001604 StartWiFi();
1605 dispatcher_.DispatchPendingEvents();
1606}
1607
mukesh agrawal7ec71312011-11-10 02:08:26 +00001608TEST_F(WiFiMainTest, InitialSupplicantState) {
1609 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1610}
1611
1612TEST_F(WiFiMainTest, StateChangeNoService) {
1613 // State change should succeed even if there is no pending Service.
1614 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1615 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1616}
1617
1618TEST_F(WiFiMainTest, StateChangeWithService) {
1619 // Forward transition should trigger a Service state change.
1620 StartWiFi();
1621 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001622 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001623 InitiateConnect(service);
1624 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1625 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1626 // Verify expectations now, because WiFi may report other state changes
1627 // when WiFi is Stop()-ed (during TearDown()).
1628 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001629 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001630}
1631
1632TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1633 // Some backwards transitions should not trigger a Service state change.
1634 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001635 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001636 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001637 StartWiFi();
1638 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001639 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart2b05e622012-07-13 20:38:44 -07001640 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Gary Moraind9f893f2012-02-06 10:03:40 -08001641 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001642 InitiateConnect(service);
1643 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001644 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1645 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1646 GetSupplicantState());
1647 // Verify expectations now, because WiFi may report other state changes
1648 // when WiFi is Stop()-ed (during TearDown()).
1649 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001650 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001651}
1652
Paul Stewarta41e38d2011-11-11 07:47:29 -08001653TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1654 StrictMock<MockStore> storage;
1655 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1656 .WillOnce(Return(set<string>()));
1657 EXPECT_FALSE(LoadHiddenServices(&storage));
1658}
1659
1660TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1661 string id;
1662 StrictMock<MockStore> storage;
1663 SetupHiddenStorage(&storage, "an_ssid", &id);
1664 // Missing "Hidden" property.
1665 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1666 .WillOnce(Return(false));
1667 EXPECT_FALSE(LoadHiddenServices(&storage));
1668}
1669
1670TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1671 string id;
1672 StrictMock<MockStore> storage;
1673 SetupHiddenStorage(&storage, "an_ssid", &id);
1674 // "Hidden" property set to "false".
1675 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1676 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1677 EXPECT_FALSE(LoadHiddenServices(&storage));
1678}
1679
1680TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1681 string id;
1682 StrictMock<MockStore> storage;
1683 SetupHiddenStorage(&storage, "an_ssid", &id);
1684 // Missing "SSID" property.
1685 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1686 .WillOnce(Return(false));
1687 EXPECT_FALSE(LoadHiddenServices(&storage));
1688}
1689
1690
1691TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1692 StrictMock<MockStore> storage;
1693 string id;
1694 SetupHiddenStorage(&storage, "an_ssid", &id);
1695 Error e;
1696 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1697 ASSERT_TRUE(e.IsSuccess());
1698 EXPECT_FALSE(LoadHiddenServices(&storage));
1699}
1700
1701TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001702 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001703 StrictMock<MockStore> storage;
1704 string ssid("an_ssid");
1705 string id;
1706 SetupHiddenStorage(&storage, ssid, &id);
1707 EXPECT_TRUE(LoadHiddenServices(&storage));
1708 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1709 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1710 flimflam::kSecurityNone).get());
1711}
1712
mukesh agrawal15908392011-11-16 18:29:25 +00001713TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001714 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001715 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001716 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1717 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001718 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1719 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1720
1721 // Note that the BSS handle used in this test ("an_ap") is not
1722 // intended to reflect the format used by supplicant. It's just
1723 // convenient for testing.
1724
1725 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001726 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001727 kNetworkModeInfrastructure);
1728 InitiateConnect(service);
1729 EXPECT_EQ(service, GetPendingService().get());
1730
1731 ReportCurrentBSSChanged("an_ap");
1732 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1733 EXPECT_EQ(Service::kStateConfiguring, service->state());
1734 EXPECT_EQ(service, GetCurrentService().get());
1735 EXPECT_EQ(NULL, GetPendingService().get());
1736
1737 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001738 EXPECT_EQ(Service::kStateIdle, service->state());
1739 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001740 EXPECT_EQ(NULL, GetCurrentService().get());
1741 EXPECT_EQ(NULL, GetPendingService().get());
1742}
1743
1744TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001745 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001746 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001747 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1748 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001749 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1750 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1751 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1752 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1753
1754 // Note that the BSS handles used in this test ("ap1", "ap2") are
1755 // not intended to reflect the format used by supplicant. They're
1756 // just convenient for testing.
1757
1758 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001759 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001760 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001761 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001762 kNetworkModeInfrastructure);
1763 InitiateConnect(service1);
1764 ReportCurrentBSSChanged("ap1");
1765 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1766 EXPECT_EQ(service1.get(), GetCurrentService().get());
1767
mukesh agrawalc01f3982012-01-24 13:48:39 -08001768 // Note that we deliberately omit intermediate supplicant states
1769 // (e.g. kInterfaceStateAssociating), on the theory that they are
1770 // unreliable. Specifically, they may be quashed if the association
1771 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001772 ReportCurrentBSSChanged("ap2");
1773 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1774 EXPECT_EQ(service2.get(), GetCurrentService().get());
1775 EXPECT_EQ(Service::kStateIdle, service1->state());
1776 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1777}
1778
1779TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001780 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1781 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001782 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001783 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001784 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1785 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1786
1787 // Note that the BSS handle used in this test ("an_ap") is not
1788 // intended to reflect the format used by supplicant. It's just
1789 // convenient for testing.
1790
1791 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001792 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001793 kNetworkModeInfrastructure);
1794 InitiateConnect(service);
1795 ReportCurrentBSSChanged("an_ap");
1796 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1797 EXPECT_EQ(service.get(), GetCurrentService().get());
1798 EXPECT_EQ(Service::kStateConfiguring, service->state());
1799}
1800
Thieu Lee41a72d2012-02-06 20:46:51 +00001801TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001802 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1803 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1804 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1805
Thieu Lee41a72d2012-02-06 20:46:51 +00001806 const uint16 frequency1 = 2412;
1807 const uint16 frequency2 = 2442;
1808 StartWiFi();
1809 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1810 kNetworkModeInfrastructure);
1811 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1812 kNetworkModeInfrastructure);
1813 EXPECT_EQ(1, GetServices().size());
1814 WiFiService *service(GetServices()[0].get());
1815 InitiateConnect(service);
1816 ReportCurrentBSSChanged("bss1");
1817 EXPECT_EQ(frequency1, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001818 EXPECT_EQ("00:00:00:00:00:01", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001819 ReportCurrentBSSChanged("bss2");
1820 EXPECT_EQ(frequency2, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001821 EXPECT_EQ("00:00:00:00:00:02", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001822}
1823
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001824TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1825 Error e;
1826 EXPECT_CALL(*manager(), RegisterService(_))
1827 .Times(0);
1828 EXPECT_CALL(*manager(), HasService(_))
1829 .WillOnce(Return(false));
1830 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1831 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001832 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001833 kNetworkModeInfrastructure);
1834}
1835
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001836TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001837 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1838 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001839 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1840 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1841 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1842 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1843
1844 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001845 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001846 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001847 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001848 kNetworkModeInfrastructure);
1849 InitiateConnect(service1);
1850 EXPECT_EQ(service1.get(), GetPendingService().get());
1851
1852 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1853 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1854 InitiateConnect(service2);
1855 EXPECT_EQ(service2.get(), GetPendingService().get());
1856}
1857
1858TEST_F(WiFiMainTest, IsIdle) {
1859 StartWiFi();
1860 EXPECT_TRUE(wifi()->IsIdle());
1861
1862 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1863 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1864 Error error;
1865 service->AddEndpoint(ap);
1866 service->AutoConnect();
1867 EXPECT_FALSE(wifi()->IsIdle());
1868}
1869
Darin Petkov4a66cc52012-06-15 10:08:29 +02001870MATCHER_P(WiFiAddedArgs, bgscan, "") {
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001871 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
Darin Petkov4a66cc52012-06-15 10:08:29 +02001872 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan) == bgscan;
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001873}
1874
1875TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001876 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001877 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1878 *supplicant_interface_proxy_;
1879
1880 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001881 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001882 WiFiService *service(GetServices().begin()->get());
Darin Petkov4a66cc52012-06-15 10:08:29 +02001883 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(true)));
1884 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001885 InitiateConnect(service);
1886}
1887
Darin Petkov4a66cc52012-06-15 10:08:29 +02001888TEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
1889 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1890 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1891 *supplicant_interface_proxy_;
1892
1893 StartWiFi();
1894 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1895 WiFiService *service(GetServices().begin()->get());
1896 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(false)));
1897 InitiateConnect(service);
1898}
1899
1900TEST_F(WiFiMainTest, AppendBgscan) {
1901 StartWiFi();
1902 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1903 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap1);
1904 service->AddEndpoint(ap1);
1905 EXPECT_EQ(1, service->GetEndpointCount());
1906 {
1907 // 1 endpoint, default bgscan method -- background scan disabled.
1908 std::map<std::string, DBus::Variant> params;
1909 AppendBgscan(service.get(), &params);
1910 EXPECT_FALSE(ContainsKey(params, wpa_supplicant::kNetworkPropertyBgscan));
1911 }
1912 WiFiEndpointRefPtr ap2 = MakeEndpoint("an_ssid", "01:02:03:04:05:06");
1913 service->AddEndpoint(ap2);
1914 EXPECT_EQ(2, service->GetEndpointCount());
1915 {
1916 // 2 endpoints, default bgscan method -- background scan frequency reduced.
1917 map<string, DBus::Variant> params;
1918 AppendBgscan(service.get(), &params);
1919 string config_string;
1920 EXPECT_TRUE(
1921 DBusProperties::GetString(params,
1922 wpa_supplicant::kNetworkPropertyBgscan,
1923 &config_string));
1924 vector<string> elements;
1925 base::SplitString(config_string, ':', &elements);
1926 ASSERT_EQ(4, elements.size());
1927 EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
1928 EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
1929 elements[3]);
1930 }
1931 {
1932 // Explicit bgscan method -- regular background scan frequency.
1933 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
1934 std::map<std::string, DBus::Variant> params;
1935 AppendBgscan(service.get(), &params);
1936 string config_string;
1937 EXPECT_TRUE(
1938 DBusProperties::GetString(params,
1939 wpa_supplicant::kNetworkPropertyBgscan,
1940 &config_string));
1941 vector<string> elements;
1942 base::SplitString(config_string, ':', &elements);
1943 ASSERT_EQ(4, elements.size());
1944 EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
1945 elements[3]);
1946 }
Christopher Wiley5c929e22012-07-16 14:06:04 -07001947 {
1948 // No scan method, simply returns without appending properties
1949 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodNone));
1950 std::map<std::string, DBus::Variant> params;
1951 AppendBgscan(service.get(), &params);
1952 string config_string;
1953 EXPECT_FALSE(
1954 DBusProperties::GetString(params,
1955 wpa_supplicant::kNetworkPropertyBgscan,
1956 &config_string));
1957 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02001958}
1959
mukesh agrawalc01f3982012-01-24 13:48:39 -08001960TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1961 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001962 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001963 InitiateConnect(service);
1964 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1965 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1966 ReportLinkUp();
1967
1968 // Verify expectations now, because WiFi may cause |service| state
1969 // changes during TearDown().
1970 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001971 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001972}
1973
1974TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001975 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001976 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001977 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001978 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1979 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1980
1981 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001982 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001983 kNetworkModeInfrastructure);
1984 InitiateConnect(service);
1985
1986 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1987 ReportCurrentBSSChanged("ap");
1988 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1989 EXPECT_EQ(Service::kStateConfiguring, service->state());
1990}
1991
1992TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001993 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1994 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1995 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1996 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001997 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001998 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08001999 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002000 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2001 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2002
mukesh agrawalc01f3982012-01-24 13:48:39 -08002003 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002004 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002005 kNetworkModeInfrastructure);
2006 InitiateConnect(service);
2007 ReportCurrentBSSChanged("ap");
2008 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2009 ReportIPConfigComplete();
2010 Mock::VerifyAndClearExpectations(service);
2011
2012 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2013 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2014}
2015
Paul Stewart66c86002012-01-30 18:00:52 -08002016TEST_F(WiFiMainTest, ClearCachedCredentials) {
2017 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2018 *supplicant_interface_proxy_;
2019
2020 StartWiFi();
2021
2022 // Ensure call to the proxy is deferred.
2023 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2024 .Times(0);
2025 ClearCachedCredentials();
2026
2027 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2028
2029 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2030 .Times(1);
2031 dispatcher_.DispatchPendingEvents();
2032
2033 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2034
2035 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2036 .Times(0);
2037 ClearCachedCredentials();
2038 ClearCachedCredentials();
2039
2040 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2041
2042 // Ensure multiple calls to ClearCachedCredentials() results in only
2043 // one call to the proxy.
2044 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2045 .Times(1);
2046 dispatcher_.DispatchPendingEvents();
2047}
2048
mukesh agrawalb20776f2012-02-10 16:00:36 -08002049TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2050 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2051 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2052 // we can test the interaction between WiFi and WiFiEndpoint. (Right
2053 // now, we're testing across multiple layers.)
2054 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2055 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2056 StartWiFi();
2057 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2058}
2059
2060TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2061 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2062 // factory for WiFiEndpoints.
2063 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2064
2065 // Get the pointer before we transfer ownership.
2066 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2067 EXPECT_CALL(*proxy, Die());
2068 StartWiFi();
2069 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2070 RemoveBSS("bss0");
2071 // Check this now, to make sure RemoveBSS killed the proxy (rather
2072 // than TearDown).
2073 Mock::VerifyAndClearExpectations(proxy);
2074}
2075
mukesh agrawal5c05b292012-03-07 10:12:52 -08002076TEST_F(WiFiMainTest, FlushBSSOnResume) {
2077 const struct timeval resume_time = {1, 0};
2078 const struct timeval scan_done_time = {6, 0};
2079 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2080 *supplicant_interface_proxy_;
2081
2082 StartWiFi();
2083
2084 EXPECT_CALL(time_, GetTimeMonotonic(_))
2085 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
2086 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
2087 EXPECT_CALL(supplicant_interface_proxy,
2088 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
Eric Shienbrood3e20a232012-02-16 11:35:56 -05002089 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
mukesh agrawal5c05b292012-03-07 10:12:52 -08002090 ReportScanDone();
2091}
2092
mukesh agrawalb66c6462012-05-07 11:45:25 -07002093TEST_F(WiFiMainTest, ScanTimerIdle) {
2094 StartWiFi();
2095 dispatcher_.DispatchPendingEvents();
2096 ReportScanDone();
2097 CancelScanTimer();
2098 EXPECT_TRUE(GetScanTimer().IsCancelled());
2099
2100 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2101 FireScanTimer();
2102 dispatcher_.DispatchPendingEvents();
2103 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2104}
2105
2106TEST_F(WiFiMainTest, ScanTimerScanning) {
2107 StartWiFi();
2108 dispatcher_.DispatchPendingEvents();
2109 CancelScanTimer();
2110 EXPECT_TRUE(GetScanTimer().IsCancelled());
2111
2112 // Should not call Scan, since we're already scanning.
2113 // (Scanning is triggered by StartWiFi.)
2114 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2115 FireScanTimer();
2116 dispatcher_.DispatchPendingEvents();
2117 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2118}
2119
2120TEST_F(WiFiMainTest, ScanTimerConnecting) {
2121 StartWiFi();
2122 dispatcher_.DispatchPendingEvents();
2123 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2124 ReportScanDone();
2125 WiFiService *service(GetServices().begin()->get());
2126 InitiateConnect(service);
2127 CancelScanTimer();
2128 EXPECT_TRUE(GetScanTimer().IsCancelled());
2129
2130 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2131 FireScanTimer();
2132 dispatcher_.DispatchPendingEvents();
2133 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2134}
2135
2136TEST_F(WiFiMainTest, ScanTimerReconfigured) {
2137 StartWiFi();
2138 CancelScanTimer();
2139 EXPECT_TRUE(GetScanTimer().IsCancelled());
2140
2141 SetScanInterval(1);
2142 EXPECT_FALSE(GetScanTimer().IsCancelled());
2143}
2144
2145TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2146 StartWiFi();
2147 CancelScanTimer();
2148 EXPECT_TRUE(GetScanTimer().IsCancelled());
2149
2150 ReportScanDone();
2151 EXPECT_FALSE(GetScanTimer().IsCancelled());
2152}
2153
2154TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2155 StartWiFi();
2156 EXPECT_FALSE(GetScanTimer().IsCancelled());
2157
2158 SetScanInterval(0);
2159 EXPECT_TRUE(GetScanTimer().IsCancelled());
2160}
2161
2162TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2163 Error e;
2164 scoped_refptr<MockProfile> profile(
2165 new NiceMock<MockProfile>(control_interface(), manager(), ""));
2166 WiFiServiceRefPtr hidden_service =
2167 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
2168 flimflam::kModeManaged, NULL, NULL, true, &e);
2169 hidden_service->set_profile(profile);
2170
2171 StartWiFi();
2172 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2173 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2174 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2175 kNetworkModeInfrastructure);
2176 InitiateConnect(service);
2177 ReportCurrentBSSChanged("an_ap");
2178 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2179 dispatcher_.DispatchPendingEvents();
2180
2181 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2182 Scan(HasHiddenSSID("hidden_ssid")));
2183 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2184 dispatcher_.DispatchPendingEvents();
2185}
2186
2187TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2188 StartWiFi();
2189 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2190 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2191 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2192 kNetworkModeInfrastructure);
2193 InitiateConnect(service);
2194 ReportCurrentBSSChanged("an_ap");
2195 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2196 dispatcher_.DispatchPendingEvents();
2197
2198 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2199 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2200 dispatcher_.DispatchPendingEvents();
2201}
2202
mukesh agrawalcf24a242012-05-21 16:46:11 -07002203TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2204 Error e;
2205 WiFiServiceRefPtr service = GetOpenService(
2206 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
2207 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2208 EXPECT_FALSE(service->has_ever_connected());
2209 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2210}
2211
2212TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
2213 Error e;
2214 WiFiServiceRefPtr service =
2215 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2216 flimflam::kSecurityWpa, "abcdefgh", &e);
2217 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2218 EXPECT_FALSE(service->has_ever_connected());
2219 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
2220}
2221
2222TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
2223 Error e;
2224 WiFiServiceRefPtr service =
2225 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2226 flimflam::kSecurityWpa, "abcdefgh", &e);
2227 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2228 service->has_ever_connected_ = true;
2229 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2230}
2231
2232TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
2233 ScopedMockLog log;
2234 Error e;
2235 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2236 SetPendingService(service);
2237 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2238 EXPECT_FALSE(service->has_ever_connected());
2239
Paul Stewartf2d60912012-07-15 08:37:30 -07002240 EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
mukesh agrawal56e32202012-07-26 16:32:11 -07002241 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
2242 EXPECT_CALL(*service, SetState(_)).Times(0);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002243 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2244 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
2245 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002246}
2247
Paul Stewarte369ece2012-05-22 09:11:03 -07002248// Scanning tests will use a mock of the event dispatcher instead of a real
2249// one.
Paul Stewart1aff7302012-08-04 20:04:47 -07002250class WiFiTimerTest : public WiFiObjectTest {
Paul Stewarte369ece2012-05-22 09:11:03 -07002251 public:
Paul Stewart1aff7302012-08-04 20:04:47 -07002252 WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
Paul Stewarte369ece2012-05-22 09:11:03 -07002253
2254 protected:
2255 void ExpectInitialScanSequence();
2256
2257 StrictMock<MockEventDispatcher> mock_dispatcher_;
2258};
2259
Paul Stewart1aff7302012-08-04 20:04:47 -07002260void WiFiTimerTest::ExpectInitialScanSequence() {
Paul Stewarte369ece2012-05-22 09:11:03 -07002261 // Choose a number of iterations some multiple higher than the fast scan
2262 // count.
2263 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2264
2265 // Each time we call FireScanTimer() below, WiFi will post a task to actually
2266 // run Scan() on the wpa_supplicant proxy.
2267 EXPECT_CALL(mock_dispatcher_, PostTask(_))
2268 .Times(kScanTimes);
2269 {
2270 InSequence seq;
2271 // The scans immediately after the initial scan should happen at the short
2272 // interval. If we add the initial scan (not invoked in this function) to
2273 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2274 // the fast scan interval.
2275 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2276 _, WiFi::kFastScanIntervalSeconds * 1000))
2277 .Times(WiFi::kNumFastScanAttempts - 1)
2278 .WillRepeatedly(Return(true));
2279
2280 // After this, the WiFi device should use the normal scan interval.
2281 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2282 _, GetScanInterval() * 1000))
2283 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2284 .WillRepeatedly(Return(true));
2285
2286 for (int i = 0; i < kScanTimes; i++) {
2287 FireScanTimer();
2288 }
2289 }
2290}
2291
Paul Stewart1aff7302012-08-04 20:04:47 -07002292TEST_F(WiFiTimerTest, FastRescan) {
Paul Stewarte369ece2012-05-22 09:11:03 -07002293 // This PostTask is a result of the call to Scan(NULL), and is meant to
2294 // post a task to call Scan() on the wpa_supplicant proxy immediately.
2295 EXPECT_CALL(mock_dispatcher_, PostTask(_));
2296 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2297 _, WiFi::kFastScanIntervalSeconds * 1000))
2298 .WillOnce(Return(true));
2299 StartWiFi();
2300
2301 ExpectInitialScanSequence();
2302
2303 // If we end up disconnecting, the sequence should repeat.
2304 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2305 _, WiFi::kFastScanIntervalSeconds * 1000))
2306 .WillOnce(Return(true));
2307 RestartFastScanAttempts();
2308
2309 ExpectInitialScanSequence();
2310}
2311
Paul Stewart1aff7302012-08-04 20:04:47 -07002312TEST_F(WiFiTimerTest, ReconnectTimer) {
2313 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
2314 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
2315 SetupConnectedService(DBus::Path());
2316 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2317
2318 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2319 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2320 StartReconnectTimer();
2321 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2322 StopReconnectTimer();
2323
2324 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2325 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2326 StartReconnectTimer();
2327 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2328 GetReconnectTimeoutCallback().callback().Run();
2329
2330 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2331 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2332 StartReconnectTimer();
2333 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2334
2335 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2336 _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
2337 StartReconnectTimer();
2338}
2339
Paul Stewartbc6e7392012-05-24 07:07:48 -07002340TEST_F(WiFiMainTest, EAPCertification) {
2341 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2342 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2343
2344 ScopedMockLog log;
2345 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2346 map<string, ::DBus::Variant> args;
2347 ReportCertification(args);
2348 Mock::VerifyAndClearExpectations(&log);
2349
2350 SetCurrentService(service);
2351 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2352 ReportCertification(args);
2353 Mock::VerifyAndClearExpectations(&log);
2354
2355 const uint32 kDepth = 123;
2356 args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2357
2358 EXPECT_CALL(log,
2359 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2360 ReportCertification(args);
2361 Mock::VerifyAndClearExpectations(&log);
2362
2363 const string kSubject("subject");
2364 args[wpa_supplicant::kInterfacePropertySubject].writer()
2365 .append_string(kSubject.c_str());
2366 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2367 ReportCertification(args);
2368}
2369
mukesh agrawalc4f368f2012-06-04 19:45:52 -07002370TEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2371 // Scan is one task that should be skipped after Stop. Others are
2372 // skipped by the same mechanism (invalidating weak pointers), so we
2373 // don't test them individually.
2374 //
2375 // Note that we can't test behavior by setting expectations on the
2376 // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2377 StartWiFi();
2378 StopWiFi();
2379 dispatcher_.DispatchPendingEvents();
2380}
2381
Chris Masone853b81b2011-06-24 14:11:41 -07002382} // namespace shill