blob: 86c6f48b5437511204ec5589500a3c6f1be944e5 [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"
Paul Stewart3c508e12012-08-09 11:40:06 -070040#include "shill/mock_link_monitor.h"
mukesh agrawalcf24a242012-05-21 16:46:11 -070041#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070042#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080043#include "shill/mock_metrics.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070044#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070045#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080046#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080047#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070048#include "shill/mock_supplicant_interface_proxy.h"
49#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080050#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000051#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070052#include "shill/nice_mock_control.h"
Darin Petkov4a66cc52012-06-15 10:08:29 +020053#include "shill/property_store_inspector.h"
Chris Masone853b81b2011-06-24 14:11:41 -070054#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070055#include "shill/proxy_factory.h"
56#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070057#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080058#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070059
Gary Morainac1bdb42012-02-16 17:42:29 -080060
Chris Masone853b81b2011-06-24 14:11:41 -070061using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080062using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070063using std::string;
64using std::vector;
65using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070066using ::testing::AnyNumber;
67using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080068using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070069using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070070using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080071using ::testing::Invoke;
Paul Stewart549d44c2012-07-03 12:40:25 -070072using ::testing::InvokeWithoutArgs;
mukesh agrawal7ec71312011-11-10 02:08:26 +000073using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070074using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070075using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080076using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080077using ::testing::SetArgumentPointee;
78using ::testing::StrEq;
79using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070080using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070081using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070082using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070083
84namespace shill {
85
mukesh agrawal31950242011-07-14 11:53:38 -070086class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070087 public:
mukesh agrawal31950242011-07-14 11:53:38 -070088 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080089 : device_(new WiFi(control_interface(),
90 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070091 }
mukesh agrawal31950242011-07-14 11:53:38 -070092 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070093
94 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080095 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070096};
97
mukesh agrawal31950242011-07-14 11:53:38 -070098TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070099 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
100 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -0700101}
102
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800103TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 {
105 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800106 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700107 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 flimflam::kBgscanSignalThresholdProperty,
109 PropertyStoreTest::kInt32V,
110 &error));
111 }
112 {
113 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800114 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
115 flimflam::kScanIntervalProperty,
116 PropertyStoreTest::kUint16V,
117 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700118 }
Chris Masone853b81b2011-06-24 14:11:41 -0700119 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700120 {
121 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800122 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
123 flimflam::kScanningProperty,
124 PropertyStoreTest::kBoolV,
125 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700126 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700127 }
Chris Masone853b81b2011-06-24 14:11:41 -0700128
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800129 {
130 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800131 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800132 device_->mutable_store(),
133 flimflam::kBgscanMethodProperty,
134 DBusAdaptor::StringToVariant(
135 wpa_supplicant::kNetworkBgscanMethodSimple),
136 &error));
137 }
138
139 {
140 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800141 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800142 device_->mutable_store(),
143 flimflam::kBgscanMethodProperty,
144 DBusAdaptor::StringToVariant("not a real scan method"),
145 &error));
146 }
147}
148
Darin Petkov4a66cc52012-06-15 10:08:29 +0200149TEST_F(WiFiPropertyTest, BgscanMethodProperty) {
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800150 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
151 WiFi::kDefaultBgscanMethod);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200152 EXPECT_TRUE(device_->bgscan_method_.empty());
153
154 string method;
155 PropertyStoreInspector inspector(&device_->store());
156 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
157 &method));
158 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
159 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodSimple, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800160
161 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800162 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800163 device_->mutable_store(),
164 flimflam::kBgscanMethodProperty,
165 DBusAdaptor::StringToVariant(
166 wpa_supplicant::kNetworkBgscanMethodLearn),
167 &error));
168 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
Darin Petkov4a66cc52012-06-15 10:08:29 +0200169 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
170 &method));
171 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, method);
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800172
173 EXPECT_TRUE(DBusAdaptor::ClearProperty(
174 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
Darin Petkov4a66cc52012-06-15 10:08:29 +0200175 EXPECT_TRUE(inspector.GetStringProperty(flimflam::kBgscanMethodProperty,
176 &method));
177 EXPECT_EQ(WiFi::kDefaultBgscanMethod, method);
178 EXPECT_TRUE(device_->bgscan_method_.empty());
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800179}
180
Paul Stewarte369ece2012-05-22 09:11:03 -0700181class WiFiObjectTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700182 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700183 WiFiObjectTest(EventDispatcher *dispatcher)
184 : event_dispatcher_(dispatcher),
185 manager_(&control_interface_, NULL, &metrics_, &glib_),
186 device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700187 wifi_(new WiFi(&control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700188 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -0800189 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700190 &manager_,
191 kDeviceName,
192 kDeviceAddress,
193 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700194 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
195 supplicant_interface_proxy_(
196 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800197 supplicant_bss_proxy_(
198 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700199 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700200 kDeviceName)),
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200201 dbus_manager_(new NiceMock<MockDBusManager>()),
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700202 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700203 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000204 // Except for WiFiServices created via WiFi::GetService, we expect
205 // that any WiFiService has been registered with the Manager. So
206 // default Manager.HasService to true, to make the common case
207 // easy.
208 ON_CALL(manager_, HasService(_)).
209 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800210
Paul Stewartd408fdf2012-05-07 17:15:57 -0700211 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800212 WillByDefault(Return(dhcp_config_));
213 ON_CALL(*dhcp_config_.get(), RequestIP()).
214 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800215
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200216 manager_.dbus_manager_.reset(dbus_manager_); // Transfers ownership.
217
mukesh agrawal5c05b292012-03-07 10:12:52 -0800218 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700219 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700220
221 virtual void SetUp() {
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700222 // EnableScopes... so that we can EXPECT_CALL for scoped log messages.
223 ScopeLogger::GetInstance()->EnableScopesByName("wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700224 ScopeLogger::GetInstance()->set_verbose_level(3);
Darin Petkovab565bb2011-10-06 02:55:51 -0700225 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700226 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
227 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800228 ON_CALL(manager_, device_info()).
229 WillByDefault(Return(&device_info_));
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200230 EXPECT_CALL(manager_, UpdateEnabledTechnologies()).Times(AnyNumber());
Chris Masoneb9c00592011-10-06 13:10:39 -0700231 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800232 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700233 }
234
235 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800236 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500237 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800238 if (supplicant_bss_proxy_.get()) {
239 EXPECT_CALL(*supplicant_bss_proxy_, Die());
240 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700241 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700242 // must Stop WiFi instance, to clear its list of services.
243 // otherwise, the WiFi instance will not be deleted. (because
244 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500245 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700246 wifi_->set_dhcp_provider(NULL);
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700247 // Reset scope logging, to avoid interfering with other tests.
248 ScopeLogger::GetInstance()->EnableScopesByName("-wifi");
Christopher Wileyd34a47c2012-08-01 15:42:45 -0700249 ScopeLogger::GetInstance()->set_verbose_level(0);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700250 }
251
Paul Stewart549d44c2012-07-03 12:40:25 -0700252 // Needs to be public since it is called via Invoke().
253 void StopWiFi() {
Paul Stewart549d44c2012-07-03 12:40:25 -0700254 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
255 }
256
257 void UnloadService(const ServiceRefPtr &service) {
258 service->Unload();
259 }
260
mukesh agrawal31950242011-07-14 11:53:38 -0700261 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000262 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
263
mukesh agrawal31950242011-07-14 11:53:38 -0700264 class TestProxyFactory : public ProxyFactory {
265 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700266 explicit TestProxyFactory(WiFiObjectTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700267
268 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700269 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700270 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700271 }
272
273 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700274 const WiFiRefPtr &/*wifi*/,
275 const DBus::Path &/*object_path*/,
276 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700277 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700278 }
279
mukesh agrawalb20776f2012-02-10 16:00:36 -0800280 MOCK_METHOD3(CreateSupplicantBSSProxy,
281 SupplicantBSSProxyInterface *(
282 WiFiEndpoint *wifi_endpoint,
283 const DBus::Path &object_path,
284 const char *dbus_addr));
285
mukesh agrawal31950242011-07-14 11:53:38 -0700286 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800287 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
288 WiFiEndpoint */*wifi_endpoint*/,
289 const DBus::Path &/*object_path*/,
290 const char */*dbus_addr*/) {
291 return test_->supplicant_bss_proxy_.release();
292 }
293
Paul Stewarte369ece2012-05-22 09:11:03 -0700294 WiFiObjectTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700295 };
296
mukesh agrawalb66c6462012-05-07 11:45:25 -0700297 void CancelScanTimer() {
298 wifi_->scan_timer_callback_.Cancel();
299 }
mukesh agrawal15908392011-11-16 18:29:25 +0000300 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
301 bool hidden_ssid = false;
302 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
303 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700304 void FireScanTimer() {
305 wifi_->ScanTimerHandler();
306 }
mukesh agrawal15908392011-11-16 18:29:25 +0000307 const WiFiServiceRefPtr &GetCurrentService() {
308 return wifi_->current_service_;
309 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700310 void SetCurrentService(const WiFiServiceRefPtr &service) {
311 wifi_->current_service_ = service;
312 }
mukesh agrawal31950242011-07-14 11:53:38 -0700313 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000314 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700315 }
mukesh agrawal15908392011-11-16 18:29:25 +0000316 const WiFiServiceRefPtr &GetPendingService() {
317 return wifi_->pending_service_;
318 }
Paul Stewart2b05e622012-07-13 20:38:44 -0700319 const base::CancelableClosure &GetPendingTimeout() {
320 return wifi_->pending_timeout_callback_;
321 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700322 const base::CancelableClosure &GetReconnectTimeoutCallback() {
Paul Stewart44663922012-07-30 11:03:03 -0700323 return wifi_->reconnect_timeout_callback_;
324 }
Paul Stewart1aff7302012-08-04 20:04:47 -0700325 int GetReconnectTimeoutSeconds() {
326 return WiFi::kReconnectTimeoutSeconds;
327 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700328 const base::CancelableClosure &GetScanTimer() {
329 return wifi_->scan_timer_callback_;
330 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000331 const vector<WiFiServiceRefPtr> &GetServices() {
332 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700333 }
334 // note: the tests need the proxies referenced by WiFi (not the
Paul Stewarte369ece2012-05-22 09:11:03 -0700335 // proxies instantiated by WiFiObjectTest), to ensure that WiFi
mukesh agrawal31950242011-07-14 11:53:38 -0700336 // sets up its proxies correctly.
337 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
338 return wifi_->supplicant_process_proxy_.get();
339 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000340 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
341 return dynamic_cast<MockSupplicantInterfaceProxy *>(
342 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700343 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000344 const string &GetSupplicantState() {
345 return wifi_->supplicant_state_;
346 }
347 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700348 map<string, ::DBus::Variant> params;
349 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700350 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000351 void InitiateDisconnect(WiFiServiceRefPtr service) {
352 wifi_->DisconnectFrom(service);
353 }
mukesh agrawal15908392011-11-16 18:29:25 +0000354 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800355 return WiFiEndpoint::MakeOpenEndpoint(
356 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000357 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700358 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
mukesh agrawal7ec71312011-11-10 02:08:26 +0000359 vector<uint8_t> ssid(1, 'a');
360 return new MockWiFiService(
361 &control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700362 event_dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800363 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000364 &manager_,
365 wifi_,
366 ssid,
367 flimflam::kModeManaged,
mukesh agrawalcf24a242012-05-21 16:46:11 -0700368 security,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000369 false);
370 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000371 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700372 void ReportBSS(const ::DBus::Path &bss_path,
373 const string &ssid,
374 const string &bssid,
375 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000376 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700377 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800378 void ClearCachedCredentials() {
379 wifi_->ClearCachedCredentials();
380 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800381 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100382 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800383 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700384 void ReportLinkUp() {
385 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
386 }
mukesh agrawal31950242011-07-14 11:53:38 -0700387 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700388 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700389 }
mukesh agrawal15908392011-11-16 18:29:25 +0000390 void ReportCurrentBSSChanged(const string &new_bss) {
391 wifi_->CurrentBSSChanged(new_bss);
392 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000393 void ReportStateChanged(const string &new_state) {
394 wifi_->StateChanged(new_state);
395 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700396 void SetPendingService(const WiFiServiceRefPtr &service) {
397 wifi_->pending_service_ = service;
398 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700399 void SetScanInterval(uint16_t interval_seconds) {
400 wifi_->SetScanInterval(interval_seconds, NULL);
401 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700402 uint16_t GetScanInterval() {
403 return wifi_->GetScanInterval(NULL);
404 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200405 void StartWiFi(bool supplicant_present) {
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200406 wifi_->supplicant_present_ = supplicant_present;
mukesh agrawalb66c6462012-05-07 11:45:25 -0700407 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700408 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200409 void StartWiFi() {
410 StartWiFi(true);
411 }
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700412 void OnAfterResume() {
413 wifi_->OnAfterResume();
414 }
415 void OnBeforeSuspend() {
416 wifi_->OnBeforeSuspend();
417 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200418 void OnSupplicantAppear() {
419 wifi_->OnSupplicantAppear(":1.7");
420 EXPECT_TRUE(wifi_->supplicant_present_);
421 }
422 void OnSupplicantVanish() {
423 wifi_->OnSupplicantVanish();
424 EXPECT_FALSE(wifi_->supplicant_present_);
425 }
426 bool GetSupplicantPresent() {
427 return wifi_->supplicant_present_;
428 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700429 WiFiServiceRefPtr GetOpenService(const char *service_type,
430 const char *ssid,
431 const char *mode,
432 Error *result) {
433 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700434 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700435 WiFiServiceRefPtr GetService(const char *service_type,
436 const char *ssid,
437 const char *mode,
438 const char *security,
439 const char *passphrase,
440 Error *result) {
441 return GetServiceInner(service_type, ssid, mode, security, passphrase,
442 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800443 }
444 WiFiServiceRefPtr GetServiceInner(const char *service_type,
445 const char *ssid,
446 const char *mode,
447 const char *security,
448 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800449 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800450 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700451 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700452 // in general, we want to avoid D-Bus specific code for any RPCs
453 // that come in via adaptors. we make an exception here, because
454 // calls to GetWifiService are rerouted from the Manager object to
455 // the Wifi class.
456 if (service_type != NULL)
457 args[flimflam::kTypeProperty].writer().append_string(service_type);
458 if (ssid != NULL)
459 args[flimflam::kSSIDProperty].writer().append_string(ssid);
460 if (mode != NULL)
461 args[flimflam::kModeProperty].writer().append_string(mode);
462 if (security != NULL)
463 args[flimflam::kSecurityProperty].writer().append_string(security);
464 if (passphrase != NULL)
465 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800466 if (!allow_hidden)
467 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700468
Paul Stewartced6a0b2011-11-08 15:32:04 -0800469 Error e;
470 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700471 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800472 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700473 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700474
475 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
476 Error *result) {
477 return wifi_->GetService(args, result);
478 }
479
Paul Stewarta41e38d2011-11-11 07:47:29 -0800480 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
481 const string &mode,
482 const string &security) {
483 return wifi_->FindService(ssid, mode, security);
484 }
485 bool LoadHiddenServices(StoreInterface *storage) {
486 return wifi_->LoadHiddenServices(storage);
487 }
488 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
489 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
490 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
491 flimflam::kTypeWifi,
492 kDeviceAddress,
493 hex_ssid.c_str(),
494 flimflam::kModeManaged,
495 flimflam::kSecurityNone));
496 const char *groups[] = { id->c_str() };
497 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
498 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
499 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
500 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
501 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
502 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
503 }
Darin Petkov4a66cc52012-06-15 10:08:29 +0200504
Paul Stewart549d44c2012-07-03 12:40:25 -0700505 WiFiService *SetupConnectedService(const DBus::Path &network_path) {
506 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
507 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
508 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
509 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
510 if (!network_path.empty()) {
511 EXPECT_CALL(*supplicant_interface_proxy_, AddNetwork(_))
512 .WillOnce(Return(network_path));
513 }
514
515 StartWiFi();
Paul Stewart44663922012-07-30 11:03:03 -0700516 ReportBSS(kBSSName, kSSIDName, "00:00:00:00:00:00", 0, 0,
517 kNetworkModeAdHoc);
Paul Stewart549d44c2012-07-03 12:40:25 -0700518 WiFiService *service(GetServices().begin()->get());
Paul Stewart2b05e622012-07-13 20:38:44 -0700519 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700520 InitiateConnect(service);
Paul Stewart2b05e622012-07-13 20:38:44 -0700521 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -0700522 ReportCurrentBSSChanged(kBSSName);
Paul Stewart2b05e622012-07-13 20:38:44 -0700523 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700524 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
525
526 EXPECT_EQ(service, GetCurrentService());
527
528 return service;
529 }
530
Darin Petkov4a66cc52012-06-15 10:08:29 +0200531 bool SetBgscanMethod(const string &method) {
532 ::DBus::Error error;
533 return DBusAdaptor::SetProperty(
534 wifi_->mutable_store(),
535 flimflam::kBgscanMethodProperty,
536 DBusAdaptor::StringToVariant(method),
537 &error);
538 }
539
540 void AppendBgscan(WiFiService *service,
541 std::map<std::string, DBus::Variant> *service_params) {
542 wifi_->AppendBgscan(service, service_params);
543 }
544
Paul Stewartbc6e7392012-05-24 07:07:48 -0700545 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
546 wifi_->CertificationTask(properties);
547 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700548
Paul Stewarte369ece2012-05-22 09:11:03 -0700549 void RestartFastScanAttempts() {
550 wifi_->RestartFastScanAttempts();
551 }
552
Paul Stewart1aff7302012-08-04 20:04:47 -0700553 void StartReconnectTimer() {
554 wifi_->StartReconnectTimer();
555 }
556
557 void StopReconnectTimer() {
558 wifi_->StopReconnectTimer();
559 }
560
Paul Stewart3c508e12012-08-09 11:40:06 -0700561 void SetLinkMonitor(LinkMonitor *link_monitor) {
562 wifi_->set_link_monitor(link_monitor);
563 }
564
565 void OnLinkMonitorFailure() {
566 wifi_->OnLinkMonitorFailure();
567 }
568
Paul Stewart10ccbb32012-04-26 15:59:30 -0700569 NiceMockControl *control_interface() {
570 return &control_interface_;
571 }
572
mukesh agrawal32399322011-09-01 10:53:43 -0700573 MockManager *manager() {
574 return &manager_;
575 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800576
577 MockDeviceInfo *device_info() {
578 return &device_info_;
579 }
580
581 MockDHCPProvider *dhcp_provider() {
582 return &dhcp_provider_;
583 }
584
mukesh agrawal32399322011-09-01 10:53:43 -0700585 const WiFiConstRefPtr wifi() const {
586 return wifi_;
587 }
588
mukesh agrawalb20776f2012-02-10 16:00:36 -0800589 TestProxyFactory *proxy_factory() {
590 return &proxy_factory_;
591 }
592
Paul Stewarte369ece2012-05-22 09:11:03 -0700593 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700594 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800595 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700596
597 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700598 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800599 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700600 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700601 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800602 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700603 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700604
605 // protected fields interspersed between private fields, due to
606 // initialization order
607 protected:
608 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700609 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700610 static const char kNetworkModeAdHoc[];
611 static const char kNetworkModeInfrastructure[];
Paul Stewart44663922012-07-30 11:03:03 -0700612 static const char kBSSName[];
613 static const char kSSIDName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700614
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700615 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
616 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800617 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700618 MockDHCPProvider dhcp_provider_;
619 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200620 NiceMock<MockDBusManager> *dbus_manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700621
622 private:
623 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700624};
625
Paul Stewarte369ece2012-05-22 09:11:03 -0700626const char WiFiObjectTest::kDeviceName[] = "wlan0";
627const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
628const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
629const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
Paul Stewart44663922012-07-30 11:03:03 -0700630const char WiFiObjectTest::kBSSName[] = "bss0";
631const char WiFiObjectTest::kSSIDName[] = "ssid0";
mukesh agrawal31950242011-07-14 11:53:38 -0700632
Paul Stewarte369ece2012-05-22 09:11:03 -0700633void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000634 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000635}
636
Paul Stewarte369ece2012-05-22 09:11:03 -0700637void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700638 const string &ssid,
639 const string &bssid,
640 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000641 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700642 const char *mode) {
643 map<string, ::DBus::Variant> bss_properties;
644
645 {
646 DBus::MessageIter writer(bss_properties["SSID"].writer());
647 writer << vector<uint8_t>(ssid.begin(), ssid.end());
648 }
649 {
650 string bssid_nosep;
651 vector<uint8_t> bssid_bytes;
652 RemoveChars(bssid, ":", &bssid_nosep);
653 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
654
655 DBus::MessageIter writer(bss_properties["BSSID"].writer());
656 writer << bssid_bytes;
657 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000658 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
659 append_int16(signal_strength);
660 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
661 append_uint16(frequency);
662 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000663 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700664}
665
Paul Stewarte369ece2012-05-22 09:11:03 -0700666WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800667 : test_(test) {
668 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
669 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
670 .WillByDefault(
671 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
672}
673
Paul Stewarte369ece2012-05-22 09:11:03 -0700674// Most of our tests involve using a real EventDispatcher object.
675class WiFiMainTest : public WiFiObjectTest {
676 public:
677 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
678
679 protected:
680 EventDispatcher dispatcher_;
681};
682
mukesh agrawal31950242011-07-14 11:53:38 -0700683TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
684 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
685 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
686
687 StartWiFi();
688 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
689 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
690}
691
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200692TEST_F(WiFiMainTest, SupplicantPresent) {
693 EXPECT_FALSE(GetSupplicantPresent());
694}
695
696TEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
697 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
698
699 EXPECT_CALL(*dbus_manager_, WatchName(wpa_supplicant::kDBusAddr, _, _));
700 StartWiFi(false); // No supplicant present.
701 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
702
703 OnSupplicantAppear();
704 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200705
706 // If supplicant reappears while the device is started, the device should be
707 // restarted.
708 EXPECT_CALL(*manager(), DeregisterDevice(_));
709 EXPECT_CALL(*manager(), RegisterDevice(_));
710 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200711}
712
713TEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
714 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
715
716 OnSupplicantAppear();
717 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200718
719 // If supplicant reappears while the device is stopped, the device should not
720 // be restarted.
721 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
722 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200723}
724
725TEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
726 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
727
728 StartWiFi();
729 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
730 EXPECT_TRUE(GetSupplicantPresent());
731
732 EXPECT_CALL(*manager(), DeregisterDevice(_));
733 EXPECT_CALL(*manager(), RegisterDevice(_));
734 OnSupplicantVanish();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200735}
736
737TEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
738 OnSupplicantAppear();
739 EXPECT_TRUE(GetSupplicantPresent());
740 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
741 OnSupplicantVanish();
742}
743
Paul Stewart549d44c2012-07-03 12:40:25 -0700744TEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
745 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
746 *supplicant_interface_proxy_;
747 WiFiService *service(SetupConnectedService(DBus::Path()));
748 ScopedMockLog log;
749 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
750 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
751 EndsWith("silently resetting current_service_.")));
752 EXPECT_CALL(*manager(), DeregisterDevice(_))
753 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
754 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
755 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
756 EXPECT_CALL(supplicant_interface_proxy, Disconnect()).Times(0);
757 EXPECT_CALL(*manager(), RegisterDevice(_));
758 OnSupplicantVanish();
759 EXPECT_TRUE(GetCurrentService() == NULL);
760}
761
mukesh agrawal31950242011-07-14 11:53:38 -0700762TEST_F(WiFiMainTest, CleanStart) {
763 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
764 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
765 .Times(AnyNumber())
766 .WillRepeatedly(Throw(
767 DBus::Error(
768 "fi.w1.wpa_supplicant1.InterfaceUnknown",
769 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
770 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700771 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700772 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700773 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700774 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700775}
776
777TEST_F(WiFiMainTest, Restart) {
778 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
779 .Times(AnyNumber())
780 .WillRepeatedly(Throw(
781 DBus::Error(
782 "fi.w1.wpa_supplicant1.InterfaceExists",
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200783 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
mukesh agrawal31950242011-07-14 11:53:38 -0700784 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
785 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
786 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700787 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700788}
789
790TEST_F(WiFiMainTest, StartClearsState) {
791 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
792 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
793 StartWiFi();
794}
795
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700796TEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800797 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
798 StartWiFi();
799 dispatcher_.DispatchPendingEvents();
800 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800801 ReportScanDone();
Gary Morainac1bdb42012-02-16 17:42:29 -0800802 ASSERT_TRUE(wifi()->IsIdle());
803 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700804 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800805 dispatcher_.DispatchPendingEvents();
806}
807
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700808TEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800809 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
810 StartWiFi();
811 dispatcher_.DispatchPendingEvents();
812 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800813 ASSERT_TRUE(wifi()->IsIdle());
814 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700815 OnBeforeSuspend();
Gary Morainac1bdb42012-02-16 17:42:29 -0800816 dispatcher_.DispatchPendingEvents();
817}
818
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700819TEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800820 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
821 StartWiFi();
822
823 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
824 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
825 Error error;
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700826 ScopedMockLog log;
Gary Morainac1bdb42012-02-16 17:42:29 -0800827 service->AddEndpoint(ap);
828 service->AutoConnect();
829 EXPECT_FALSE(wifi()->IsIdle());
830 dispatcher_.DispatchPendingEvents();
831 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800832 ASSERT_FALSE(wifi()->IsIdle());
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700833 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
834 EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
Gary Morainac1bdb42012-02-16 17:42:29 -0800835 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700836 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800837 dispatcher_.DispatchPendingEvents();
838}
839
mukesh agrawal31950242011-07-14 11:53:38 -0700840TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800841 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700842 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000843 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700844 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000845 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700846 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000847 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700848 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000849 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
850 const uint16 frequency = 2412;
851 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
852 kNetworkModeAdHoc);
853
854 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
855 EXPECT_EQ(5, endpoints_by_rpcid.size());
856
857 WiFi::EndpointMap::const_iterator i;
858 WiFiEndpointRefPtr endpoint;
859 for (i = endpoints_by_rpcid.begin();
860 i != endpoints_by_rpcid.end();
861 ++i) {
862 if (i->second->bssid_string() == "00:00:00:00:00:04")
863 break;
864 }
865 ASSERT_TRUE(i != endpoints_by_rpcid.end());
866 EXPECT_EQ(4, i->second->signal_strength());
867 EXPECT_EQ(frequency, i->second->frequency());
868 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700869}
870
871TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800872 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
873 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
874 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700875 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000876 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700877 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000878 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700879 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000880 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700881 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000882 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
883 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000884
885 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
886 EXPECT_EQ(3, endpoints_by_rpcid.size());
887
888 WiFi::EndpointMap::const_iterator i;
889 WiFiEndpointRefPtr endpoint;
890 for (i = endpoints_by_rpcid.begin();
891 i != endpoints_by_rpcid.end();
892 ++i) {
893 if (i->second->bssid_string() == "00:00:00:00:00:00")
894 break;
895 }
896 ASSERT_TRUE(i != endpoints_by_rpcid.end());
897 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700898}
899
900TEST_F(WiFiMainTest, ScanCompleted) {
901 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000902 EXPECT_CALL(*manager(), RegisterService(_))
903 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000904 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700905 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000906 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700907 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000908 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700909 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000910 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800911
mukesh agrawale9adda12012-02-09 18:33:48 -0800912 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000913 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800914 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800915 EXPECT_EQ(3, GetServices().size());
916
mukesh agrawale9adda12012-02-09 18:33:48 -0800917 // BSSes with empty SSIDs should be filtered.
918 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
919 EXPECT_EQ(3, GetEndpointMap().size());
920 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000921}
922
923TEST_F(WiFiMainTest, EndpointGroupingTogether) {
924 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000925
926 InSequence s;
927 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800928 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000929 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000930 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
931 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000932 ReportScanDone();
933 EXPECT_EQ(1, GetServices().size());
934}
935
936TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
937 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000938 EXPECT_CALL(*manager(), RegisterService(_))
939 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000940 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
941 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000942 ReportScanDone();
943 EXPECT_EQ(2, GetServices().size());
944}
945
946TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
947 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000948 EXPECT_CALL(*manager(), RegisterService(_))
949 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000950 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
951 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
952 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000953 ReportScanDone();
954 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700955}
956
mukesh agrawal261daca2011-12-02 18:56:56 +0000957TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
958 // Removal of non-existent BSS should not cause a crash.
959 StartWiFi();
960 RemoveBSS("bss0");
961 EXPECT_EQ(0, GetServices().size());
962}
963
mukesh agrawale9adda12012-02-09 18:33:48 -0800964TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
965 // Removal of BSS with an empty SSID should not cause a crash.
966 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
967 StartWiFi();
968 RemoveBSS("bss");
969 EXPECT_EQ(0, GetServices().size());
970}
971
972TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
973 // Removal of BSS with a NULL SSID should not cause a crash.
974 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
975 StartWiFi();
976 RemoveBSS("bss");
977 EXPECT_EQ(0, GetServices().size());
978}
979
mukesh agrawal261daca2011-12-02 18:56:56 +0000980TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800981 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000982 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000983 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000984 ReportScanDone();
985 EXPECT_EQ(1, GetServices().size());
986 EXPECT_TRUE(GetServices().front()->IsVisible());
987
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000988 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000989 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000990 EXPECT_TRUE(GetServices().empty());
991}
992
993TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800994 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000995 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000996 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000997 ReportScanDone();
998 ReportCurrentBSSChanged("bss0");
999
1000 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1001 EXPECT_CALL(*manager(), DeregisterService(_));
1002 RemoveBSS("bss0");
1003 EXPECT_TRUE(GetServices().empty());
1004}
1005
1006TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001007 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1008 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001009 StartWiFi();
1010
1011 Error e;
1012 WiFiServiceRefPtr service =
1013 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
1014 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +00001015 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001016
Thieu Lee41a72d2012-02-06 20:46:51 +00001017 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
1018 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001019 ReportScanDone();
1020 ReportCurrentBSSChanged("bss");
1021 EXPECT_EQ(1, GetServices().size());
1022
1023 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001024 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001025 EXPECT_EQ(1, GetServices().size());
1026 // Verify expectations now, because WiFi may call UpdateService when
1027 // WiFi is Stop()-ed (during TearDown()).
1028 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -08001029 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001030}
1031
1032TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001033 EXPECT_CALL(*manager(), RegisterService(_));
1034 EXPECT_CALL(*manager(), HasService(_));
1035 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001036 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001037 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1038 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001039 ReportScanDone();
1040 EXPECT_EQ(1, GetServices().size());
1041 EXPECT_TRUE(GetServices().front()->IsVisible());
1042
1043 EXPECT_CALL(*manager(), UpdateService(_));
1044 RemoveBSS("bss0");
1045 EXPECT_TRUE(GetServices().front()->IsVisible());
1046 EXPECT_EQ(1, GetServices().size());
1047}
1048
mukesh agrawal31950242011-07-14 11:53:38 -07001049TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001050 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001051 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1052 *supplicant_interface_proxy_;
1053
mukesh agrawal31950242011-07-14 11:53:38 -07001054 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001055 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -07001056 ReportScanDone();
1057
1058 {
1059 InSequence s;
1060 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +00001061 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -07001062
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001063 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -07001064 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001065 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -07001066 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -07001067 EXPECT_EQ(static_cast<Service *>(service),
1068 wifi()->selected_service_.get());
Paul Stewart2b05e622012-07-13 20:38:44 -07001069 EXPECT_EQ(Service::kStateAssociating, service->state());
1070 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -07001071 }
1072}
1073
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001074TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001075 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001076 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1077 *supplicant_interface_proxy_;
1078
1079 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001080 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001081 WiFiService *service(GetServices().begin()->get());
1082 InitiateConnect(service);
1083
1084 EXPECT_FALSE(GetPendingService() == NULL);
Paul Stewartff96a842012-08-13 15:59:10 -07001085 EXPECT_TRUE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001086 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1087 InitiateDisconnect(service);
Paul Stewartff96a842012-08-13 15:59:10 -07001088 EXPECT_FALSE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001089
1090 EXPECT_TRUE(GetPendingService() == NULL);
1091}
1092
1093TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001094 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001095 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001096 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1097 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001098 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1099 *supplicant_interface_proxy_;
1100
1101 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001102 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1103 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001104 WiFiService *service0(GetServices()[0].get());
1105 WiFiService *service1(GetServices()[1].get());
1106
1107 InitiateConnect(service0);
1108 ReportCurrentBSSChanged("bss0");
1109 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1110 InitiateConnect(service1);
1111
1112 EXPECT_EQ(service0, GetCurrentService());
1113 EXPECT_EQ(service1, GetPendingService());
1114 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1115 InitiateDisconnect(service1);
1116
1117 // |current_service_| will be unchanged until supplicant signals
1118 // that CurrentBSS has changed.
1119 EXPECT_EQ(service0, GetCurrentService());
1120 // |pending_service_| is updated immediately.
1121 EXPECT_TRUE(GetPendingService() == NULL);
Paul Stewart2b05e622012-07-13 20:38:44 -07001122 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001123}
1124
1125TEST_F(WiFiMainTest, DisconnectCurrentService) {
1126 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1127 *supplicant_interface_proxy_;
Paul Stewart549d44c2012-07-03 12:40:25 -07001128 WiFiService *service(SetupConnectedService(DBus::Path()));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001129 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1130 InitiateDisconnect(service);
1131
1132 // |current_service_| should not change until supplicant reports
1133 // a BSS change.
1134 EXPECT_EQ(service, GetCurrentService());
1135}
1136
1137TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001138 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001139 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001140 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1141 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001142 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1143 *supplicant_interface_proxy_;
1144
1145 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001146 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1147 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001148 WiFiService *service0(GetServices()[0].get());
1149 WiFiService *service1(GetServices()[1].get());
1150
1151 InitiateConnect(service0);
1152 ReportCurrentBSSChanged("bss0");
1153 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1154 InitiateConnect(service1);
1155
1156 EXPECT_EQ(service0, GetCurrentService());
1157 EXPECT_EQ(service1, GetPendingService());
1158 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1159 .Times(0);
1160 InitiateDisconnect(service0);
1161
1162 EXPECT_EQ(service0, GetCurrentService());
1163 EXPECT_EQ(service1, GetPendingService());
Paul Stewart2b05e622012-07-13 20:38:44 -07001164 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
1165}
1166
1167TEST_F(WiFiMainTest, TimeoutPendingService) {
1168 StartWiFi();
1169 dispatcher_.DispatchPendingEvents();
1170 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1171 EXPECT_TRUE(pending_timeout.IsCancelled());
1172
1173 InSequence seq;
1174 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1175 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
1176 InitiateConnect(service);
1177 EXPECT_FALSE(pending_timeout.IsCancelled());
1178 EXPECT_EQ(service, GetPendingService());
1179
Paul Stewartff96a842012-08-13 15:59:10 -07001180 {
1181 InSequence seq;
1182 EXPECT_CALL(*service, SetState(Service::kStateIdle));
1183 EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
1184 pending_timeout.callback().Run();
1185 }
Paul Stewart2b05e622012-07-13 20:38:44 -07001186 EXPECT_EQ(NULL, GetPendingService().get());
1187
1188 // Verify expectations now, because WiFi may report other state changes
1189 // when WiFi is Stop()-ed (during TearDown()).
1190 Mock::VerifyAndClearExpectations(service.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001191}
1192
1193TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001194 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001195 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1196 *supplicant_interface_proxy_;
1197
1198 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001199 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001200 WiFiService *service(GetServices().begin()->get());
1201 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1202 .Times(0);
1203 InitiateDisconnect(service);
1204}
1205
1206TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
1207 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1208 *supplicant_interface_proxy_;
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001209 DBus::Path fake_path("/fake/path");
Paul Stewart549d44c2012-07-03 12:40:25 -07001210 WiFiService *service(SetupConnectedService(fake_path));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001211 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1212 .WillRepeatedly(Throw(
1213 DBus::Error(
1214 "fi.w1.wpa_supplicant1.NotConnected",
1215 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1216 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1217 InitiateDisconnect(service);
1218
1219 EXPECT_TRUE(GetCurrentService() == NULL);
1220}
1221
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001222TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001223 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001224 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001225 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001226 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001227
mukesh agrawalc01f3982012-01-24 13:48:39 -08001228 EXPECT_CALL(*manager(), DeregisterService(_));
1229 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001230 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawalc4f368f2012-06-04 19:45:52 -07001231 EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001232}
1233
Paul Stewart549d44c2012-07-03 12:40:25 -07001234TEST_F(WiFiMainTest, StopWhileConnected) {
1235 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1236 *supplicant_interface_proxy_;
1237 WiFiService *service(SetupConnectedService(DBus::Path()));
1238 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
1239 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
1240 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1241 StopWiFi();
1242 EXPECT_TRUE(GetCurrentService() == NULL);
1243}
1244
Paul Stewart44663922012-07-30 11:03:03 -07001245TEST_F(WiFiMainTest, ReconnectTimer) {
1246 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1247 *supplicant_interface_proxy_;
1248 WiFiService *service(SetupConnectedService(DBus::Path()));
1249 service->SetState(Service::kStateConnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001250 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001251 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001252 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001253 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
Paul Stewart1aff7302012-08-04 20:04:47 -07001254 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001255 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001256 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001257 ReportCurrentBSSChanged(kBSSName);
Paul Stewart1aff7302012-08-04 20:04:47 -07001258 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001259 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001260 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001261 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
Paul Stewart1aff7302012-08-04 20:04:47 -07001262 GetReconnectTimeoutCallback().callback().Run();
Paul Stewart44663922012-07-30 11:03:03 -07001263 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Paul Stewart1aff7302012-08-04 20:04:47 -07001264 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001265}
1266
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001267TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1268 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001269 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001270 EXPECT_TRUE(e.IsSuccess());
1271}
1272
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001273TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1274 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001275 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001276 EXPECT_EQ(Error::kInvalidArguments, e.type());
1277 EXPECT_EQ("must specify SSID", e.message());
1278}
1279
1280TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1281 Error e;
1282 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001283 flimflam::kTypeWifi, "123456789012345678901234567890123",
1284 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001285 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1286 EXPECT_EQ("SSID is too long", e.message());
1287}
1288
1289TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1290 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001291 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001292 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1293 EXPECT_EQ("SSID is too short", e.message());
1294}
1295
1296TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1297 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001298 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001299 EXPECT_EQ(Error::kNotSupported, e.type());
1300 EXPECT_EQ("service mode is unsupported", e.message());
1301}
1302
1303TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1304 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001305 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001306 EXPECT_TRUE(e.IsSuccess());
1307}
1308
1309TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1310 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001311 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1312 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001313 EXPECT_TRUE(e.IsSuccess());
1314}
1315
1316TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001317 // When configuring hidden networks, Chrome expects to be able to
1318 // GetService w/o a password, and supply the password with
1319 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001320 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001321 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1322 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001323 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001324}
1325
1326TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1327 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001328 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1329 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001330 EXPECT_EQ(Error::kNotSupported, e.type());
1331 EXPECT_EQ("security mode is unsupported", e.message());
1332}
1333
1334TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001335 // When configuring hidden networks, Chrome expects to be able to
1336 // GetService w/o a password, and supply the password with
1337 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001338 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001339 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1340 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001341 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001342}
1343
1344TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1345 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001346 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1347 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001348 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1349}
1350
1351TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1352 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001353 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1354 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001355 EXPECT_TRUE(e.IsSuccess());
1356}
1357
1358TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1359 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001360 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1361 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001362 EXPECT_TRUE(e.IsSuccess());
1363}
1364
1365TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1366 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001367 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1368 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001369 EXPECT_TRUE(e.IsSuccess());
1370}
1371
1372TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1373 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001374 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1375 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001376 EXPECT_TRUE(e.IsSuccess());
1377}
1378
1379TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1380 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001381 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1382 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001383 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1384}
1385
1386TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1387 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001388 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1389 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001390 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1391}
1392
1393TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1394 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001395 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1396 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001397 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1398}
1399
1400TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1401 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001402 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1403 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001404 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1405}
1406
1407TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1408 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001409 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1410 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001411 EXPECT_TRUE(e.IsSuccess());
1412}
1413
1414TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1415 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001416 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1417 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001418 EXPECT_TRUE(e.IsSuccess());
1419}
1420
1421TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1422 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001423 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1424 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001425 EXPECT_TRUE(e.IsSuccess());
1426}
1427
1428TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1429 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001430 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1431 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001432 EXPECT_TRUE(e.IsSuccess());
1433}
1434
mukesh agrawal8ede0522011-10-03 14:57:44 -07001435class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1436class WiFiGetServiceFailureTest : public WiFiMainTest {};
1437
1438TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1439 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001440 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1441 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001442 EXPECT_TRUE(e.IsSuccess());
1443}
1444
1445TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1446 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001447 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1448 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001449 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1450}
1451
1452INSTANTIATE_TEST_CASE_P(
1453 WiFiGetServiceSuccessTestInstance,
1454 WiFiGetServiceSuccessTest,
1455 Values(
1456 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1457 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1458 // subtle: invalid length for hex key, but valid as ascii passphrase
1459 string(IEEE_80211::kWPAHexLen-1, '1'),
1460 string(IEEE_80211::kWPAHexLen, '1')));
1461
1462INSTANTIATE_TEST_CASE_P(
1463 WiFiGetServiceFailureTestInstance,
1464 WiFiGetServiceFailureTest,
1465 Values(
1466 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1467 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1468 string(IEEE_80211::kWPAHexLen+1, '1')));
1469
Paul Stewart6ab23a92011-11-09 17:17:47 -08001470TEST_F(WiFiMainTest, FindServiceWEP) {
1471 const string ssid("an_ssid");
1472 {
1473 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001474 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001475 flimflam::kSecurityWep, "abcde", &e);
1476 EXPECT_TRUE(e.IsSuccess());
1477 }
1478 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1479
Paul Stewarta41e38d2011-11-11 07:47:29 -08001480 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1481 flimflam::kSecurityWep).get());
1482 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1483 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001484}
1485
1486TEST_F(WiFiMainTest, FindServiceWPA) {
1487 const string ssid("an_ssid");
1488 {
1489 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001490 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001491 flimflam::kSecurityRsn, "abcdefgh", &e);
1492 EXPECT_TRUE(e.IsSuccess());
1493 }
1494 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001495 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1496 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001497 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001498 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1499 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001500 EXPECT_TRUE(rsn_service.get());
1501 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001502 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1503 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001504 EXPECT_EQ(wpa_service.get(), psk_service.get());
1505 // Indirectly test FindService by doing a GetService on something that
1506 // already exists.
1507 {
1508 Error e;
1509 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001510 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1511 flimflam::kModeManaged, flimflam::kSecurityWpa,
1512 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001513 EXPECT_TRUE(e.IsSuccess());
1514 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1515 }
1516}
1517
Paul Stewartcb59fed2012-03-21 21:14:46 -07001518TEST_F(WiFiMainTest, GetServiceWithGUID) {
1519 // Perform a GetService that also configures properties in the base Service
1520 // class using Service::Configure().
1521 KeyValueStore args;
1522 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1523 args.SetString(flimflam::kSSIDProperty, "ssid");
1524 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1525 const string kGUID = "aguid"; // Stored as a registered Service property.
1526 args.SetString(flimflam::kGuidProperty, kGUID);
1527 Error e;
1528 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1529 EXPECT_TRUE(e.IsSuccess());
1530 EXPECT_EQ(kGUID, service->guid());
1531}
1532
Paul Stewartced6a0b2011-11-08 15:32:04 -08001533MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001534 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001535 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1536 if (it == arg.end()) {
1537 return false;
1538 }
1539
1540 const DBus::Variant &ssids_variant = it->second;
1541 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1542 const ByteArrays &ssids = it->second.operator ByteArrays();
1543 // A valid Scan containing a single hidden SSID should contain
1544 // two SSID entries: one containing the SSID we are looking for,
1545 // and an empty entry, signifying that we also want to do a
1546 // broadcast probe request for all non-hidden APs as well.
1547 return ssids.size() == 2 &&
1548 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1549 ssids[1].empty();
1550}
1551
1552TEST_F(WiFiMainTest, ScanHidden) {
1553 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1554 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1555 .Times(AnyNumber())
1556 .WillRepeatedly(Throw(
1557 DBus::Error(
1558 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1559 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001560 scoped_refptr<MockProfile> profile(
1561 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001562 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001563 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001564 Error e;
1565 WiFiServiceRefPtr service =
1566 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1567 NULL, NULL, true, &e);
1568 EXPECT_TRUE(e.IsSuccess());
1569 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001570 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001571 }
1572 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001573 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001574 Error e;
1575 WiFiServiceRefPtr service =
1576 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1577 NULL, NULL, true, &e);
1578 EXPECT_TRUE(e.IsSuccess());
1579 EXPECT_TRUE(service->hidden_ssid());
1580 }
1581 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001582 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001583 Error e;
1584 WiFiServiceRefPtr service =
1585 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1586 NULL, NULL, false, &e);
1587 EXPECT_TRUE(e.IsSuccess());
1588 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001589 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001590 }
1591 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001592 StartWiFi();
1593 dispatcher_.DispatchPendingEvents();
1594}
1595
Paul Stewartfae4dae2012-09-13 07:43:32 -07001596TEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1597 ScopedMockLog log;
1598 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1599 EXPECT_CALL(log, Log(_, _, EndsWith(
1600 "Ignoring scan request while device is not enabled."))).Times(1);
1601 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_)).Times(0);
1602 StartWiFi();
1603 StopWiFi();
1604 // A scan is queued when WiFi resumes.
1605 OnAfterResume();
1606 dispatcher_.DispatchPendingEvents();
1607}
1608
mukesh agrawal7ec71312011-11-10 02:08:26 +00001609TEST_F(WiFiMainTest, InitialSupplicantState) {
1610 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1611}
1612
1613TEST_F(WiFiMainTest, StateChangeNoService) {
1614 // State change should succeed even if there is no pending Service.
1615 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1616 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1617}
1618
1619TEST_F(WiFiMainTest, StateChangeWithService) {
1620 // Forward transition should trigger a Service state change.
1621 StartWiFi();
1622 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001623 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001624 InitiateConnect(service);
1625 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1626 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1627 // Verify expectations now, because WiFi may report other state changes
1628 // when WiFi is Stop()-ed (during TearDown()).
1629 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001630 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001631}
1632
1633TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1634 // Some backwards transitions should not trigger a Service state change.
1635 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001636 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001637 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001638 StartWiFi();
1639 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001640 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart2b05e622012-07-13 20:38:44 -07001641 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Gary Moraind9f893f2012-02-06 10:03:40 -08001642 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001643 InitiateConnect(service);
1644 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001645 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1646 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1647 GetSupplicantState());
1648 // Verify expectations now, because WiFi may report other state changes
1649 // when WiFi is Stop()-ed (during TearDown()).
1650 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001651 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001652}
1653
Paul Stewarta41e38d2011-11-11 07:47:29 -08001654TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1655 StrictMock<MockStore> storage;
1656 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1657 .WillOnce(Return(set<string>()));
1658 EXPECT_FALSE(LoadHiddenServices(&storage));
1659}
1660
1661TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1662 string id;
1663 StrictMock<MockStore> storage;
1664 SetupHiddenStorage(&storage, "an_ssid", &id);
1665 // Missing "Hidden" property.
1666 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1667 .WillOnce(Return(false));
1668 EXPECT_FALSE(LoadHiddenServices(&storage));
1669}
1670
1671TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1672 string id;
1673 StrictMock<MockStore> storage;
1674 SetupHiddenStorage(&storage, "an_ssid", &id);
1675 // "Hidden" property set to "false".
1676 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1677 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1678 EXPECT_FALSE(LoadHiddenServices(&storage));
1679}
1680
1681TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1682 string id;
1683 StrictMock<MockStore> storage;
1684 SetupHiddenStorage(&storage, "an_ssid", &id);
1685 // Missing "SSID" property.
1686 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1687 .WillOnce(Return(false));
1688 EXPECT_FALSE(LoadHiddenServices(&storage));
1689}
1690
1691
1692TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1693 StrictMock<MockStore> storage;
1694 string id;
1695 SetupHiddenStorage(&storage, "an_ssid", &id);
1696 Error e;
1697 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1698 ASSERT_TRUE(e.IsSuccess());
1699 EXPECT_FALSE(LoadHiddenServices(&storage));
1700}
1701
1702TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001703 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001704 StrictMock<MockStore> storage;
1705 string ssid("an_ssid");
1706 string id;
1707 SetupHiddenStorage(&storage, ssid, &id);
1708 EXPECT_TRUE(LoadHiddenServices(&storage));
1709 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1710 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1711 flimflam::kSecurityNone).get());
1712}
1713
mukesh agrawal15908392011-11-16 18:29:25 +00001714TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001715 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001716 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001717 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1718 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001719 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1720 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1721
1722 // Note that the BSS handle used in this test ("an_ap") is not
1723 // intended to reflect the format used by supplicant. It's just
1724 // convenient for testing.
1725
1726 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001727 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001728 kNetworkModeInfrastructure);
1729 InitiateConnect(service);
1730 EXPECT_EQ(service, GetPendingService().get());
1731
1732 ReportCurrentBSSChanged("an_ap");
1733 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1734 EXPECT_EQ(Service::kStateConfiguring, service->state());
1735 EXPECT_EQ(service, GetCurrentService().get());
1736 EXPECT_EQ(NULL, GetPendingService().get());
1737
1738 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001739 EXPECT_EQ(Service::kStateIdle, service->state());
1740 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001741 EXPECT_EQ(NULL, GetCurrentService().get());
1742 EXPECT_EQ(NULL, GetPendingService().get());
1743}
1744
1745TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001746 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001747 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001748 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1749 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001750 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1751 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1752 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1753 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1754
1755 // Note that the BSS handles used in this test ("ap1", "ap2") are
1756 // not intended to reflect the format used by supplicant. They're
1757 // just convenient for testing.
1758
1759 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001760 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001761 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001762 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001763 kNetworkModeInfrastructure);
1764 InitiateConnect(service1);
1765 ReportCurrentBSSChanged("ap1");
1766 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1767 EXPECT_EQ(service1.get(), GetCurrentService().get());
1768
mukesh agrawalc01f3982012-01-24 13:48:39 -08001769 // Note that we deliberately omit intermediate supplicant states
1770 // (e.g. kInterfaceStateAssociating), on the theory that they are
1771 // unreliable. Specifically, they may be quashed if the association
1772 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001773 ReportCurrentBSSChanged("ap2");
1774 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1775 EXPECT_EQ(service2.get(), GetCurrentService().get());
1776 EXPECT_EQ(Service::kStateIdle, service1->state());
1777 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1778}
1779
1780TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001781 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1782 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001783 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001784 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001785 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1786 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1787
1788 // Note that the BSS handle used in this test ("an_ap") is not
1789 // intended to reflect the format used by supplicant. It's just
1790 // convenient for testing.
1791
1792 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001793 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001794 kNetworkModeInfrastructure);
1795 InitiateConnect(service);
1796 ReportCurrentBSSChanged("an_ap");
1797 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1798 EXPECT_EQ(service.get(), GetCurrentService().get());
1799 EXPECT_EQ(Service::kStateConfiguring, service->state());
1800}
1801
Thieu Lee41a72d2012-02-06 20:46:51 +00001802TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001803 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1804 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1805 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1806
Thieu Lee41a72d2012-02-06 20:46:51 +00001807 const uint16 frequency1 = 2412;
1808 const uint16 frequency2 = 2442;
1809 StartWiFi();
1810 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1811 kNetworkModeInfrastructure);
1812 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1813 kNetworkModeInfrastructure);
1814 EXPECT_EQ(1, GetServices().size());
1815 WiFiService *service(GetServices()[0].get());
1816 InitiateConnect(service);
1817 ReportCurrentBSSChanged("bss1");
1818 EXPECT_EQ(frequency1, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001819 EXPECT_EQ("00:00:00:00:00:01", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001820 ReportCurrentBSSChanged("bss2");
1821 EXPECT_EQ(frequency2, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001822 EXPECT_EQ("00:00:00:00:00:02", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001823}
1824
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001825TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1826 Error e;
1827 EXPECT_CALL(*manager(), RegisterService(_))
1828 .Times(0);
1829 EXPECT_CALL(*manager(), HasService(_))
1830 .WillOnce(Return(false));
1831 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1832 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001833 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001834 kNetworkModeInfrastructure);
1835}
1836
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001837TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001838 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1839 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001840 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1841 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1842 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1843 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1844
1845 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001846 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001847 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001848 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001849 kNetworkModeInfrastructure);
1850 InitiateConnect(service1);
1851 EXPECT_EQ(service1.get(), GetPendingService().get());
1852
1853 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1854 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1855 InitiateConnect(service2);
1856 EXPECT_EQ(service2.get(), GetPendingService().get());
1857}
1858
1859TEST_F(WiFiMainTest, IsIdle) {
1860 StartWiFi();
1861 EXPECT_TRUE(wifi()->IsIdle());
1862
1863 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1864 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1865 Error error;
1866 service->AddEndpoint(ap);
1867 service->AutoConnect();
1868 EXPECT_FALSE(wifi()->IsIdle());
1869}
1870
Darin Petkov4a66cc52012-06-15 10:08:29 +02001871MATCHER_P(WiFiAddedArgs, bgscan, "") {
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001872 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
Darin Petkov4a66cc52012-06-15 10:08:29 +02001873 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan) == bgscan;
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001874}
1875
1876TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001877 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001878 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1879 *supplicant_interface_proxy_;
1880
1881 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001882 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001883 WiFiService *service(GetServices().begin()->get());
Darin Petkov4a66cc52012-06-15 10:08:29 +02001884 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(true)));
1885 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001886 InitiateConnect(service);
1887}
1888
Darin Petkov4a66cc52012-06-15 10:08:29 +02001889TEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
1890 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1891 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1892 *supplicant_interface_proxy_;
1893
1894 StartWiFi();
1895 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1896 WiFiService *service(GetServices().begin()->get());
1897 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(false)));
1898 InitiateConnect(service);
1899}
1900
1901TEST_F(WiFiMainTest, AppendBgscan) {
1902 StartWiFi();
1903 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1904 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap1);
1905 service->AddEndpoint(ap1);
1906 EXPECT_EQ(1, service->GetEndpointCount());
1907 {
1908 // 1 endpoint, default bgscan method -- background scan disabled.
1909 std::map<std::string, DBus::Variant> params;
1910 AppendBgscan(service.get(), &params);
1911 EXPECT_FALSE(ContainsKey(params, wpa_supplicant::kNetworkPropertyBgscan));
1912 }
1913 WiFiEndpointRefPtr ap2 = MakeEndpoint("an_ssid", "01:02:03:04:05:06");
1914 service->AddEndpoint(ap2);
1915 EXPECT_EQ(2, service->GetEndpointCount());
1916 {
1917 // 2 endpoints, default bgscan method -- background scan frequency reduced.
1918 map<string, DBus::Variant> params;
1919 AppendBgscan(service.get(), &params);
1920 string config_string;
1921 EXPECT_TRUE(
1922 DBusProperties::GetString(params,
1923 wpa_supplicant::kNetworkPropertyBgscan,
1924 &config_string));
1925 vector<string> elements;
1926 base::SplitString(config_string, ':', &elements);
1927 ASSERT_EQ(4, elements.size());
1928 EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
1929 EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
1930 elements[3]);
1931 }
1932 {
1933 // Explicit bgscan method -- regular background scan frequency.
1934 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
1935 std::map<std::string, DBus::Variant> params;
1936 AppendBgscan(service.get(), &params);
1937 string config_string;
1938 EXPECT_TRUE(
1939 DBusProperties::GetString(params,
1940 wpa_supplicant::kNetworkPropertyBgscan,
1941 &config_string));
1942 vector<string> elements;
1943 base::SplitString(config_string, ':', &elements);
1944 ASSERT_EQ(4, elements.size());
1945 EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
1946 elements[3]);
1947 }
Christopher Wiley5c929e22012-07-16 14:06:04 -07001948 {
1949 // No scan method, simply returns without appending properties
1950 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodNone));
1951 std::map<std::string, DBus::Variant> params;
1952 AppendBgscan(service.get(), &params);
1953 string config_string;
1954 EXPECT_FALSE(
1955 DBusProperties::GetString(params,
1956 wpa_supplicant::kNetworkPropertyBgscan,
1957 &config_string));
1958 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02001959}
1960
mukesh agrawalc01f3982012-01-24 13:48:39 -08001961TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1962 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001963 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001964 InitiateConnect(service);
1965 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1966 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1967 ReportLinkUp();
1968
1969 // Verify expectations now, because WiFi may cause |service| state
1970 // changes during TearDown().
1971 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001972 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001973}
1974
1975TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001976 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001977 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001978 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001979 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1980 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1981
1982 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001983 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001984 kNetworkModeInfrastructure);
1985 InitiateConnect(service);
1986
1987 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1988 ReportCurrentBSSChanged("ap");
1989 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1990 EXPECT_EQ(Service::kStateConfiguring, service->state());
1991}
1992
1993TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001994 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1995 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1996 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1997 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001998 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001999 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08002000 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002001 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2002 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2003
mukesh agrawalc01f3982012-01-24 13:48:39 -08002004 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002005 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002006 kNetworkModeInfrastructure);
2007 InitiateConnect(service);
2008 ReportCurrentBSSChanged("ap");
2009 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2010 ReportIPConfigComplete();
2011 Mock::VerifyAndClearExpectations(service);
2012
2013 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2014 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2015}
2016
Paul Stewart66c86002012-01-30 18:00:52 -08002017TEST_F(WiFiMainTest, ClearCachedCredentials) {
2018 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2019 *supplicant_interface_proxy_;
2020
2021 StartWiFi();
2022
2023 // Ensure call to the proxy is deferred.
2024 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2025 .Times(0);
2026 ClearCachedCredentials();
2027
2028 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2029
2030 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2031 .Times(1);
2032 dispatcher_.DispatchPendingEvents();
2033
2034 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2035
2036 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2037 .Times(0);
2038 ClearCachedCredentials();
2039 ClearCachedCredentials();
2040
2041 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2042
2043 // Ensure multiple calls to ClearCachedCredentials() results in only
2044 // one call to the proxy.
2045 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2046 .Times(1);
2047 dispatcher_.DispatchPendingEvents();
2048}
2049
mukesh agrawalb20776f2012-02-10 16:00:36 -08002050TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2051 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2052 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2053 // we can test the interaction between WiFi and WiFiEndpoint. (Right
2054 // now, we're testing across multiple layers.)
2055 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2056 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2057 StartWiFi();
2058 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2059}
2060
2061TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2062 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2063 // factory for WiFiEndpoints.
2064 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2065
2066 // Get the pointer before we transfer ownership.
2067 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2068 EXPECT_CALL(*proxy, Die());
2069 StartWiFi();
2070 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2071 RemoveBSS("bss0");
2072 // Check this now, to make sure RemoveBSS killed the proxy (rather
2073 // than TearDown).
2074 Mock::VerifyAndClearExpectations(proxy);
2075}
2076
mukesh agrawal5c05b292012-03-07 10:12:52 -08002077TEST_F(WiFiMainTest, FlushBSSOnResume) {
2078 const struct timeval resume_time = {1, 0};
2079 const struct timeval scan_done_time = {6, 0};
2080 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2081 *supplicant_interface_proxy_;
2082
2083 StartWiFi();
2084
2085 EXPECT_CALL(time_, GetTimeMonotonic(_))
2086 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
2087 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
2088 EXPECT_CALL(supplicant_interface_proxy,
2089 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07002090 OnAfterResume();
mukesh agrawal5c05b292012-03-07 10:12:52 -08002091 ReportScanDone();
2092}
2093
mukesh agrawalb66c6462012-05-07 11:45:25 -07002094TEST_F(WiFiMainTest, ScanTimerIdle) {
2095 StartWiFi();
2096 dispatcher_.DispatchPendingEvents();
2097 ReportScanDone();
2098 CancelScanTimer();
2099 EXPECT_TRUE(GetScanTimer().IsCancelled());
2100
2101 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2102 FireScanTimer();
2103 dispatcher_.DispatchPendingEvents();
2104 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2105}
2106
2107TEST_F(WiFiMainTest, ScanTimerScanning) {
2108 StartWiFi();
2109 dispatcher_.DispatchPendingEvents();
2110 CancelScanTimer();
2111 EXPECT_TRUE(GetScanTimer().IsCancelled());
2112
2113 // Should not call Scan, since we're already scanning.
2114 // (Scanning is triggered by StartWiFi.)
2115 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2116 FireScanTimer();
2117 dispatcher_.DispatchPendingEvents();
2118 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2119}
2120
2121TEST_F(WiFiMainTest, ScanTimerConnecting) {
2122 StartWiFi();
2123 dispatcher_.DispatchPendingEvents();
2124 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2125 ReportScanDone();
2126 WiFiService *service(GetServices().begin()->get());
2127 InitiateConnect(service);
2128 CancelScanTimer();
2129 EXPECT_TRUE(GetScanTimer().IsCancelled());
2130
2131 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2132 FireScanTimer();
2133 dispatcher_.DispatchPendingEvents();
2134 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2135}
2136
2137TEST_F(WiFiMainTest, ScanTimerReconfigured) {
2138 StartWiFi();
2139 CancelScanTimer();
2140 EXPECT_TRUE(GetScanTimer().IsCancelled());
2141
2142 SetScanInterval(1);
2143 EXPECT_FALSE(GetScanTimer().IsCancelled());
2144}
2145
2146TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2147 StartWiFi();
2148 CancelScanTimer();
2149 EXPECT_TRUE(GetScanTimer().IsCancelled());
2150
2151 ReportScanDone();
2152 EXPECT_FALSE(GetScanTimer().IsCancelled());
2153}
2154
2155TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2156 StartWiFi();
2157 EXPECT_FALSE(GetScanTimer().IsCancelled());
2158
2159 SetScanInterval(0);
2160 EXPECT_TRUE(GetScanTimer().IsCancelled());
2161}
2162
2163TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2164 Error e;
2165 scoped_refptr<MockProfile> profile(
2166 new NiceMock<MockProfile>(control_interface(), manager(), ""));
2167 WiFiServiceRefPtr hidden_service =
2168 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
2169 flimflam::kModeManaged, NULL, NULL, true, &e);
2170 hidden_service->set_profile(profile);
2171
2172 StartWiFi();
2173 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2174 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2175 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2176 kNetworkModeInfrastructure);
2177 InitiateConnect(service);
2178 ReportCurrentBSSChanged("an_ap");
2179 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2180 dispatcher_.DispatchPendingEvents();
2181
2182 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2183 Scan(HasHiddenSSID("hidden_ssid")));
2184 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2185 dispatcher_.DispatchPendingEvents();
2186}
2187
2188TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2189 StartWiFi();
2190 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2191 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2192 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2193 kNetworkModeInfrastructure);
2194 InitiateConnect(service);
2195 ReportCurrentBSSChanged("an_ap");
2196 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2197 dispatcher_.DispatchPendingEvents();
2198
2199 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2200 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2201 dispatcher_.DispatchPendingEvents();
2202}
2203
Paul Stewart3c508e12012-08-09 11:40:06 -07002204TEST_F(WiFiMainTest, LinkMonitorFailure) {
2205 StartWiFi();
2206 ScopedMockLog log;
2207 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2208 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
2209 SetLinkMonitor(link_monitor);
2210 EXPECT_CALL(*link_monitor, IsGatewayFound())
2211 .WillOnce(Return(false))
2212 .WillRepeatedly(Return(true));
2213 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2214 EndsWith("gateway was never found."))).Times(1);
2215 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
2216 OnLinkMonitorFailure();
2217 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2218 EndsWith("Called Reassociate()."))).Times(1);
2219 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
2220 OnLinkMonitorFailure();
2221 OnSupplicantVanish();
2222 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
2223 EndsWith("Cannot reassociate."))).Times(1);
2224 OnLinkMonitorFailure();
2225}
2226
mukesh agrawalcf24a242012-05-21 16:46:11 -07002227TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2228 Error e;
2229 WiFiServiceRefPtr service = GetOpenService(
2230 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
2231 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2232 EXPECT_FALSE(service->has_ever_connected());
2233 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2234}
2235
2236TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
2237 Error e;
2238 WiFiServiceRefPtr service =
2239 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2240 flimflam::kSecurityWpa, "abcdefgh", &e);
2241 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2242 EXPECT_FALSE(service->has_ever_connected());
2243 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
2244}
2245
2246TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
2247 Error e;
2248 WiFiServiceRefPtr service =
2249 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2250 flimflam::kSecurityWpa, "abcdefgh", &e);
2251 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2252 service->has_ever_connected_ = true;
2253 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2254}
2255
2256TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
2257 ScopedMockLog log;
2258 Error e;
2259 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2260 SetPendingService(service);
2261 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2262 EXPECT_FALSE(service->has_ever_connected());
2263
Paul Stewartf2d60912012-07-15 08:37:30 -07002264 EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
mukesh agrawal56e32202012-07-26 16:32:11 -07002265 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
2266 EXPECT_CALL(*service, SetState(_)).Times(0);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002267 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2268 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
2269 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002270}
2271
Paul Stewarte369ece2012-05-22 09:11:03 -07002272// Scanning tests will use a mock of the event dispatcher instead of a real
2273// one.
Paul Stewart1aff7302012-08-04 20:04:47 -07002274class WiFiTimerTest : public WiFiObjectTest {
Paul Stewarte369ece2012-05-22 09:11:03 -07002275 public:
Paul Stewart1aff7302012-08-04 20:04:47 -07002276 WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
Paul Stewarte369ece2012-05-22 09:11:03 -07002277
2278 protected:
2279 void ExpectInitialScanSequence();
2280
2281 StrictMock<MockEventDispatcher> mock_dispatcher_;
2282};
2283
Paul Stewart1aff7302012-08-04 20:04:47 -07002284void WiFiTimerTest::ExpectInitialScanSequence() {
Paul Stewarte369ece2012-05-22 09:11:03 -07002285 // Choose a number of iterations some multiple higher than the fast scan
2286 // count.
2287 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2288
2289 // Each time we call FireScanTimer() below, WiFi will post a task to actually
2290 // run Scan() on the wpa_supplicant proxy.
2291 EXPECT_CALL(mock_dispatcher_, PostTask(_))
2292 .Times(kScanTimes);
2293 {
2294 InSequence seq;
2295 // The scans immediately after the initial scan should happen at the short
2296 // interval. If we add the initial scan (not invoked in this function) to
2297 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2298 // the fast scan interval.
2299 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2300 _, WiFi::kFastScanIntervalSeconds * 1000))
2301 .Times(WiFi::kNumFastScanAttempts - 1)
2302 .WillRepeatedly(Return(true));
2303
2304 // After this, the WiFi device should use the normal scan interval.
2305 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2306 _, GetScanInterval() * 1000))
2307 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2308 .WillRepeatedly(Return(true));
2309
2310 for (int i = 0; i < kScanTimes; i++) {
2311 FireScanTimer();
2312 }
2313 }
2314}
2315
Paul Stewart1aff7302012-08-04 20:04:47 -07002316TEST_F(WiFiTimerTest, FastRescan) {
Paul Stewarte369ece2012-05-22 09:11:03 -07002317 // This PostTask is a result of the call to Scan(NULL), and is meant to
2318 // post a task to call Scan() on the wpa_supplicant proxy immediately.
2319 EXPECT_CALL(mock_dispatcher_, PostTask(_));
2320 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2321 _, WiFi::kFastScanIntervalSeconds * 1000))
2322 .WillOnce(Return(true));
2323 StartWiFi();
2324
2325 ExpectInitialScanSequence();
2326
2327 // If we end up disconnecting, the sequence should repeat.
2328 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2329 _, WiFi::kFastScanIntervalSeconds * 1000))
2330 .WillOnce(Return(true));
2331 RestartFastScanAttempts();
2332
2333 ExpectInitialScanSequence();
2334}
2335
Paul Stewart1aff7302012-08-04 20:04:47 -07002336TEST_F(WiFiTimerTest, ReconnectTimer) {
2337 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
2338 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
2339 SetupConnectedService(DBus::Path());
2340 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2341
2342 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2343 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2344 StartReconnectTimer();
2345 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2346 StopReconnectTimer();
2347
2348 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2349 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2350 StartReconnectTimer();
2351 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2352 GetReconnectTimeoutCallback().callback().Run();
2353
2354 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2355 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2356 StartReconnectTimer();
2357 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2358
2359 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2360 _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
2361 StartReconnectTimer();
2362}
2363
Paul Stewartbc6e7392012-05-24 07:07:48 -07002364TEST_F(WiFiMainTest, EAPCertification) {
2365 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2366 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2367
2368 ScopedMockLog log;
2369 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2370 map<string, ::DBus::Variant> args;
2371 ReportCertification(args);
2372 Mock::VerifyAndClearExpectations(&log);
2373
2374 SetCurrentService(service);
2375 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2376 ReportCertification(args);
2377 Mock::VerifyAndClearExpectations(&log);
2378
2379 const uint32 kDepth = 123;
2380 args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2381
2382 EXPECT_CALL(log,
2383 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2384 ReportCertification(args);
2385 Mock::VerifyAndClearExpectations(&log);
2386
2387 const string kSubject("subject");
2388 args[wpa_supplicant::kInterfacePropertySubject].writer()
2389 .append_string(kSubject.c_str());
2390 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2391 ReportCertification(args);
2392}
2393
mukesh agrawalc4f368f2012-06-04 19:45:52 -07002394TEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2395 // Scan is one task that should be skipped after Stop. Others are
2396 // skipped by the same mechanism (invalidating weak pointers), so we
2397 // don't test them individually.
2398 //
2399 // Note that we can't test behavior by setting expectations on the
2400 // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2401 StartWiFi();
2402 StopWiFi();
2403 dispatcher_.DispatchPendingEvents();
2404}
2405
Chris Masone853b81b2011-06-24 14:11:41 -07002406} // namespace shill