blob: 846ff8c5cd0d6181705eaafd259447fa48bb68fb [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 }
Ben Chan381fdcc2012-10-14 21:10:36 -0700371 bool RemoveNetwork(const ::DBus::Path &network) {
372 return wifi_->RemoveNetwork(network);
373 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000374 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700375 void ReportBSS(const ::DBus::Path &bss_path,
376 const string &ssid,
377 const string &bssid,
378 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000379 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700380 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800381 void ClearCachedCredentials() {
382 wifi_->ClearCachedCredentials();
383 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800384 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100385 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800386 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700387 void ReportLinkUp() {
388 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
389 }
mukesh agrawal31950242011-07-14 11:53:38 -0700390 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700391 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700392 }
mukesh agrawal15908392011-11-16 18:29:25 +0000393 void ReportCurrentBSSChanged(const string &new_bss) {
394 wifi_->CurrentBSSChanged(new_bss);
395 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000396 void ReportStateChanged(const string &new_state) {
397 wifi_->StateChanged(new_state);
398 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700399 void SetPendingService(const WiFiServiceRefPtr &service) {
400 wifi_->pending_service_ = service;
401 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700402 void SetScanInterval(uint16_t interval_seconds) {
403 wifi_->SetScanInterval(interval_seconds, NULL);
404 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700405 uint16_t GetScanInterval() {
406 return wifi_->GetScanInterval(NULL);
407 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200408 void StartWiFi(bool supplicant_present) {
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200409 wifi_->supplicant_present_ = supplicant_present;
mukesh agrawalb66c6462012-05-07 11:45:25 -0700410 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700411 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200412 void StartWiFi() {
413 StartWiFi(true);
414 }
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700415 void OnAfterResume() {
416 wifi_->OnAfterResume();
417 }
418 void OnBeforeSuspend() {
419 wifi_->OnBeforeSuspend();
420 }
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200421 void OnSupplicantAppear() {
422 wifi_->OnSupplicantAppear(":1.7");
423 EXPECT_TRUE(wifi_->supplicant_present_);
424 }
425 void OnSupplicantVanish() {
426 wifi_->OnSupplicantVanish();
427 EXPECT_FALSE(wifi_->supplicant_present_);
428 }
429 bool GetSupplicantPresent() {
430 return wifi_->supplicant_present_;
431 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700432 WiFiServiceRefPtr GetOpenService(const char *service_type,
433 const char *ssid,
434 const char *mode,
435 Error *result) {
436 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700437 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700438 WiFiServiceRefPtr GetService(const char *service_type,
439 const char *ssid,
440 const char *mode,
441 const char *security,
442 const char *passphrase,
443 Error *result) {
444 return GetServiceInner(service_type, ssid, mode, security, passphrase,
445 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800446 }
447 WiFiServiceRefPtr GetServiceInner(const char *service_type,
448 const char *ssid,
449 const char *mode,
450 const char *security,
451 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800452 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800453 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700454 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700455 // in general, we want to avoid D-Bus specific code for any RPCs
456 // that come in via adaptors. we make an exception here, because
457 // calls to GetWifiService are rerouted from the Manager object to
458 // the Wifi class.
459 if (service_type != NULL)
460 args[flimflam::kTypeProperty].writer().append_string(service_type);
461 if (ssid != NULL)
462 args[flimflam::kSSIDProperty].writer().append_string(ssid);
463 if (mode != NULL)
464 args[flimflam::kModeProperty].writer().append_string(mode);
465 if (security != NULL)
466 args[flimflam::kSecurityProperty].writer().append_string(security);
467 if (passphrase != NULL)
468 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800469 if (!allow_hidden)
470 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700471
Paul Stewartced6a0b2011-11-08 15:32:04 -0800472 Error e;
473 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700474 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800475 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700476 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700477
478 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
479 Error *result) {
480 return wifi_->GetService(args, result);
481 }
482
Paul Stewarta41e38d2011-11-11 07:47:29 -0800483 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
484 const string &mode,
485 const string &security) {
486 return wifi_->FindService(ssid, mode, security);
487 }
488 bool LoadHiddenServices(StoreInterface *storage) {
489 return wifi_->LoadHiddenServices(storage);
490 }
491 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
492 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
493 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
494 flimflam::kTypeWifi,
495 kDeviceAddress,
496 hex_ssid.c_str(),
497 flimflam::kModeManaged,
498 flimflam::kSecurityNone));
499 const char *groups[] = { id->c_str() };
500 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
501 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
502 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
503 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
504 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
505 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
506 }
Darin Petkov4a66cc52012-06-15 10:08:29 +0200507
Paul Stewart549d44c2012-07-03 12:40:25 -0700508 WiFiService *SetupConnectedService(const DBus::Path &network_path) {
509 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
510 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
511 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
512 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
513 if (!network_path.empty()) {
514 EXPECT_CALL(*supplicant_interface_proxy_, AddNetwork(_))
515 .WillOnce(Return(network_path));
516 }
517
518 StartWiFi();
Paul Stewart44663922012-07-30 11:03:03 -0700519 ReportBSS(kBSSName, kSSIDName, "00:00:00:00:00:00", 0, 0,
520 kNetworkModeAdHoc);
Paul Stewart549d44c2012-07-03 12:40:25 -0700521 WiFiService *service(GetServices().begin()->get());
Paul Stewart2b05e622012-07-13 20:38:44 -0700522 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700523 InitiateConnect(service);
Paul Stewart2b05e622012-07-13 20:38:44 -0700524 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -0700525 ReportCurrentBSSChanged(kBSSName);
Paul Stewart2b05e622012-07-13 20:38:44 -0700526 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
Paul Stewart549d44c2012-07-03 12:40:25 -0700527 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
528
529 EXPECT_EQ(service, GetCurrentService());
530
531 return service;
532 }
533
Darin Petkov4a66cc52012-06-15 10:08:29 +0200534 bool SetBgscanMethod(const string &method) {
535 ::DBus::Error error;
536 return DBusAdaptor::SetProperty(
537 wifi_->mutable_store(),
538 flimflam::kBgscanMethodProperty,
539 DBusAdaptor::StringToVariant(method),
540 &error);
541 }
542
543 void AppendBgscan(WiFiService *service,
544 std::map<std::string, DBus::Variant> *service_params) {
545 wifi_->AppendBgscan(service, service_params);
546 }
547
Paul Stewartbc6e7392012-05-24 07:07:48 -0700548 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
549 wifi_->CertificationTask(properties);
550 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700551
Paul Stewarte369ece2012-05-22 09:11:03 -0700552 void RestartFastScanAttempts() {
553 wifi_->RestartFastScanAttempts();
554 }
555
Paul Stewart1aff7302012-08-04 20:04:47 -0700556 void StartReconnectTimer() {
557 wifi_->StartReconnectTimer();
558 }
559
560 void StopReconnectTimer() {
561 wifi_->StopReconnectTimer();
562 }
563
Paul Stewart3c508e12012-08-09 11:40:06 -0700564 void SetLinkMonitor(LinkMonitor *link_monitor) {
565 wifi_->set_link_monitor(link_monitor);
566 }
567
568 void OnLinkMonitorFailure() {
569 wifi_->OnLinkMonitorFailure();
570 }
571
Paul Stewart10ccbb32012-04-26 15:59:30 -0700572 NiceMockControl *control_interface() {
573 return &control_interface_;
574 }
575
mukesh agrawal32399322011-09-01 10:53:43 -0700576 MockManager *manager() {
577 return &manager_;
578 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800579
580 MockDeviceInfo *device_info() {
581 return &device_info_;
582 }
583
584 MockDHCPProvider *dhcp_provider() {
585 return &dhcp_provider_;
586 }
587
mukesh agrawal32399322011-09-01 10:53:43 -0700588 const WiFiConstRefPtr wifi() const {
589 return wifi_;
590 }
591
mukesh agrawalb20776f2012-02-10 16:00:36 -0800592 TestProxyFactory *proxy_factory() {
593 return &proxy_factory_;
594 }
595
Paul Stewarte369ece2012-05-22 09:11:03 -0700596 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700597 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800598 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700599
600 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700601 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800602 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700603 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700604 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800605 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700606 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700607
608 // protected fields interspersed between private fields, due to
609 // initialization order
610 protected:
611 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700612 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700613 static const char kNetworkModeAdHoc[];
614 static const char kNetworkModeInfrastructure[];
Paul Stewart44663922012-07-30 11:03:03 -0700615 static const char kBSSName[];
616 static const char kSSIDName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700617
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700618 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
619 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800620 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700621 MockDHCPProvider dhcp_provider_;
622 scoped_refptr<MockDHCPConfig> dhcp_config_;
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200623 NiceMock<MockDBusManager> *dbus_manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700624
625 private:
626 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700627};
628
Paul Stewarte369ece2012-05-22 09:11:03 -0700629const char WiFiObjectTest::kDeviceName[] = "wlan0";
630const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
631const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
632const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
Paul Stewart44663922012-07-30 11:03:03 -0700633const char WiFiObjectTest::kBSSName[] = "bss0";
634const char WiFiObjectTest::kSSIDName[] = "ssid0";
mukesh agrawal31950242011-07-14 11:53:38 -0700635
Paul Stewarte369ece2012-05-22 09:11:03 -0700636void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000637 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000638}
639
Paul Stewarte369ece2012-05-22 09:11:03 -0700640void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700641 const string &ssid,
642 const string &bssid,
643 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000644 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700645 const char *mode) {
646 map<string, ::DBus::Variant> bss_properties;
647
648 {
649 DBus::MessageIter writer(bss_properties["SSID"].writer());
650 writer << vector<uint8_t>(ssid.begin(), ssid.end());
651 }
652 {
653 string bssid_nosep;
654 vector<uint8_t> bssid_bytes;
655 RemoveChars(bssid, ":", &bssid_nosep);
656 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
657
658 DBus::MessageIter writer(bss_properties["BSSID"].writer());
659 writer << bssid_bytes;
660 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000661 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
662 append_int16(signal_strength);
663 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
664 append_uint16(frequency);
665 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000666 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700667}
668
Paul Stewarte369ece2012-05-22 09:11:03 -0700669WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800670 : test_(test) {
671 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
672 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
673 .WillByDefault(
674 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
675}
676
Paul Stewarte369ece2012-05-22 09:11:03 -0700677// Most of our tests involve using a real EventDispatcher object.
678class WiFiMainTest : public WiFiObjectTest {
679 public:
680 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
681
682 protected:
683 EventDispatcher dispatcher_;
684};
685
mukesh agrawal31950242011-07-14 11:53:38 -0700686TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
687 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
688 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
689
690 StartWiFi();
691 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
692 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
693}
694
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200695TEST_F(WiFiMainTest, SupplicantPresent) {
696 EXPECT_FALSE(GetSupplicantPresent());
697}
698
699TEST_F(WiFiMainTest, OnSupplicantAppearStarted) {
700 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
701
702 EXPECT_CALL(*dbus_manager_, WatchName(wpa_supplicant::kDBusAddr, _, _));
703 StartWiFi(false); // No supplicant present.
704 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
705
706 OnSupplicantAppear();
707 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200708
709 // If supplicant reappears while the device is started, the device should be
710 // restarted.
711 EXPECT_CALL(*manager(), DeregisterDevice(_));
712 EXPECT_CALL(*manager(), RegisterDevice(_));
713 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200714}
715
716TEST_F(WiFiMainTest, OnSupplicantAppearStopped) {
717 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
718
719 OnSupplicantAppear();
720 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
Darin Petkov9cd7ca12012-07-03 11:06:40 +0200721
722 // If supplicant reappears while the device is stopped, the device should not
723 // be restarted.
724 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
725 OnSupplicantAppear();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200726}
727
728TEST_F(WiFiMainTest, OnSupplicantVanishStarted) {
729 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
730
731 StartWiFi();
732 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
733 EXPECT_TRUE(GetSupplicantPresent());
734
735 EXPECT_CALL(*manager(), DeregisterDevice(_));
736 EXPECT_CALL(*manager(), RegisterDevice(_));
737 OnSupplicantVanish();
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200738}
739
740TEST_F(WiFiMainTest, OnSupplicantVanishStopped) {
741 OnSupplicantAppear();
742 EXPECT_TRUE(GetSupplicantPresent());
743 EXPECT_CALL(*manager(), DeregisterDevice(_)).Times(0);
744 OnSupplicantVanish();
745}
746
Paul Stewart549d44c2012-07-03 12:40:25 -0700747TEST_F(WiFiMainTest, OnSupplicantVanishedWhileConnected) {
748 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
749 *supplicant_interface_proxy_;
750 WiFiService *service(SetupConnectedService(DBus::Path()));
751 ScopedMockLog log;
752 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
753 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
754 EndsWith("silently resetting current_service_.")));
755 EXPECT_CALL(*manager(), DeregisterDevice(_))
756 .WillOnce(InvokeWithoutArgs(this, &WiFiObjectTest::StopWiFi));
757 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
758 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
759 EXPECT_CALL(supplicant_interface_proxy, Disconnect()).Times(0);
760 EXPECT_CALL(*manager(), RegisterDevice(_));
761 OnSupplicantVanish();
762 EXPECT_TRUE(GetCurrentService() == NULL);
763}
764
mukesh agrawal31950242011-07-14 11:53:38 -0700765TEST_F(WiFiMainTest, CleanStart) {
766 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
767 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
768 .Times(AnyNumber())
769 .WillRepeatedly(Throw(
770 DBus::Error(
771 "fi.w1.wpa_supplicant1.InterfaceUnknown",
772 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
773 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700774 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700775 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700776 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700777 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700778}
779
Ben Chan381fdcc2012-10-14 21:10:36 -0700780TEST_F(WiFiMainTest, RemoveNetwork) {
781 DBus::Path network = "/test/path";
782 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network));
783 StartWiFi();
784 EXPECT_TRUE(RemoveNetwork(network));
785}
786
787TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsNetworkUnknown) {
788 DBus::Path network = "/test/path";
789 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
790 .WillRepeatedly(Throw(
791 DBus::Error(
792 "fi.w1.wpa_supplicant1.NetworkUnknown",
793 "test threw fi.w1.wpa_supplicant1.NetworkUnknown")));
794 StartWiFi();
795 EXPECT_TRUE(RemoveNetwork(network));
796}
797
798TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsInvalidArgs) {
799 DBus::Path network = "/test/path";
800 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
801 .WillRepeatedly(Throw(
802 DBus::Error(
803 "fi.w1.wpa_supplicant1.InvalidArgs",
804 "test threw fi.w1.wpa_supplicant1.InvalidArgs")));
805 StartWiFi();
806 EXPECT_FALSE(RemoveNetwork(network));
807}
808
809TEST_F(WiFiMainTest, RemoveNetworkWhenSupplicantReturnsUnknownError) {
810 DBus::Path network = "/test/path";
811 EXPECT_CALL(*supplicant_interface_proxy_, RemoveNetwork(network))
812 .WillRepeatedly(Throw(
813 DBus::Error(
814 "fi.w1.wpa_supplicant1.UnknownError",
815 "test threw fi.w1.wpa_supplicant1.UnknownError")));
816 StartWiFi();
817 EXPECT_FALSE(RemoveNetwork(network));
818}
819
mukesh agrawal31950242011-07-14 11:53:38 -0700820TEST_F(WiFiMainTest, Restart) {
821 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
822 .Times(AnyNumber())
823 .WillRepeatedly(Throw(
824 DBus::Error(
825 "fi.w1.wpa_supplicant1.InterfaceExists",
Darin Petkov2b8e44e2012-06-25 15:13:26 +0200826 "test threw fi.w1.wpa_supplicant1.InterfaceExists")));
mukesh agrawal31950242011-07-14 11:53:38 -0700827 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
828 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
829 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700830 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700831}
832
833TEST_F(WiFiMainTest, StartClearsState) {
834 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
835 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
836 StartWiFi();
837}
838
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700839TEST_F(WiFiMainTest, ResumeStartsScanWhenIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800840 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
841 StartWiFi();
842 dispatcher_.DispatchPendingEvents();
843 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800844 ReportScanDone();
Gary Morainac1bdb42012-02-16 17:42:29 -0800845 ASSERT_TRUE(wifi()->IsIdle());
846 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700847 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800848 dispatcher_.DispatchPendingEvents();
849}
850
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700851TEST_F(WiFiMainTest, SuspendDoesNotStartScan) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800852 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
853 StartWiFi();
854 dispatcher_.DispatchPendingEvents();
855 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800856 ASSERT_TRUE(wifi()->IsIdle());
857 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700858 OnBeforeSuspend();
Gary Morainac1bdb42012-02-16 17:42:29 -0800859 dispatcher_.DispatchPendingEvents();
860}
861
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700862TEST_F(WiFiMainTest, ResumeDoesNotStartScanWhenNotIdle) {
Gary Morainac1bdb42012-02-16 17:42:29 -0800863 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
864 StartWiFi();
865
866 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
867 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
868 Error error;
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700869 ScopedMockLog log;
Gary Morainac1bdb42012-02-16 17:42:29 -0800870 service->AddEndpoint(ap);
871 service->AutoConnect();
872 EXPECT_FALSE(wifi()->IsIdle());
873 dispatcher_.DispatchPendingEvents();
874 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Gary Morainac1bdb42012-02-16 17:42:29 -0800875 ASSERT_FALSE(wifi()->IsIdle());
mukesh agrawal3ab56ac2012-05-31 14:41:43 -0700876 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
877 EXPECT_CALL(log, Log(_, _, EndsWith("already scanning or connected.")));
Gary Morainac1bdb42012-02-16 17:42:29 -0800878 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
mukesh agrawal2f9df4e2012-08-08 12:29:20 -0700879 OnAfterResume();
Gary Morainac1bdb42012-02-16 17:42:29 -0800880 dispatcher_.DispatchPendingEvents();
881}
882
mukesh agrawal31950242011-07-14 11:53:38 -0700883TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800884 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700885 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000886 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700887 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000888 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700889 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000890 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700891 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000892 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
893 const uint16 frequency = 2412;
894 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
895 kNetworkModeAdHoc);
896
897 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
898 EXPECT_EQ(5, endpoints_by_rpcid.size());
899
900 WiFi::EndpointMap::const_iterator i;
901 WiFiEndpointRefPtr endpoint;
902 for (i = endpoints_by_rpcid.begin();
903 i != endpoints_by_rpcid.end();
904 ++i) {
905 if (i->second->bssid_string() == "00:00:00:00:00:04")
906 break;
907 }
908 ASSERT_TRUE(i != endpoints_by_rpcid.end());
909 EXPECT_EQ(4, i->second->signal_strength());
910 EXPECT_EQ(frequency, i->second->frequency());
911 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700912}
913
914TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800915 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
916 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
917 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700918 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000919 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700920 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000921 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700922 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000923 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700924 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000925 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
926 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000927
928 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
929 EXPECT_EQ(3, endpoints_by_rpcid.size());
930
931 WiFi::EndpointMap::const_iterator i;
932 WiFiEndpointRefPtr endpoint;
933 for (i = endpoints_by_rpcid.begin();
934 i != endpoints_by_rpcid.end();
935 ++i) {
936 if (i->second->bssid_string() == "00:00:00:00:00:00")
937 break;
938 }
939 ASSERT_TRUE(i != endpoints_by_rpcid.end());
940 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700941}
942
943TEST_F(WiFiMainTest, ScanCompleted) {
944 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000945 EXPECT_CALL(*manager(), RegisterService(_))
946 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000947 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700948 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000949 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700950 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000951 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700952 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000953 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800954
mukesh agrawale9adda12012-02-09 18:33:48 -0800955 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000956 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800957 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800958 EXPECT_EQ(3, GetServices().size());
959
mukesh agrawale9adda12012-02-09 18:33:48 -0800960 // BSSes with empty SSIDs should be filtered.
961 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
962 EXPECT_EQ(3, GetEndpointMap().size());
963 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000964}
965
966TEST_F(WiFiMainTest, EndpointGroupingTogether) {
967 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000968
969 InSequence s;
970 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800971 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000972 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000973 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
974 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000975 ReportScanDone();
976 EXPECT_EQ(1, GetServices().size());
977}
978
979TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
980 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000981 EXPECT_CALL(*manager(), RegisterService(_))
982 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000983 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
984 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000985 ReportScanDone();
986 EXPECT_EQ(2, GetServices().size());
987}
988
989TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
990 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000991 EXPECT_CALL(*manager(), RegisterService(_))
992 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000993 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
994 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
995 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000996 ReportScanDone();
997 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700998}
999
mukesh agrawal261daca2011-12-02 18:56:56 +00001000TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
1001 // Removal of non-existent BSS should not cause a crash.
1002 StartWiFi();
1003 RemoveBSS("bss0");
1004 EXPECT_EQ(0, GetServices().size());
1005}
1006
mukesh agrawale9adda12012-02-09 18:33:48 -08001007TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
1008 // Removal of BSS with an empty SSID should not cause a crash.
1009 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
1010 StartWiFi();
1011 RemoveBSS("bss");
1012 EXPECT_EQ(0, GetServices().size());
1013}
1014
1015TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
1016 // Removal of BSS with a NULL SSID should not cause a crash.
1017 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
1018 StartWiFi();
1019 RemoveBSS("bss");
1020 EXPECT_EQ(0, GetServices().size());
1021}
1022
mukesh agrawal261daca2011-12-02 18:56:56 +00001023TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001024 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001025 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001026 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001027 ReportScanDone();
1028 EXPECT_EQ(1, GetServices().size());
1029 EXPECT_TRUE(GetServices().front()->IsVisible());
1030
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001031 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001032 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001033 EXPECT_TRUE(GetServices().empty());
1034}
1035
1036TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001037 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001038 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001039 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001040 ReportScanDone();
1041 ReportCurrentBSSChanged("bss0");
1042
1043 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1044 EXPECT_CALL(*manager(), DeregisterService(_));
1045 RemoveBSS("bss0");
1046 EXPECT_TRUE(GetServices().empty());
1047}
1048
1049TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001050 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1051 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001052 StartWiFi();
1053
1054 Error e;
1055 WiFiServiceRefPtr service =
1056 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
1057 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +00001058 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001059
Thieu Lee41a72d2012-02-06 20:46:51 +00001060 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
1061 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001062 ReportScanDone();
1063 ReportCurrentBSSChanged("bss");
1064 EXPECT_EQ(1, GetServices().size());
1065
1066 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001067 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001068 EXPECT_EQ(1, GetServices().size());
1069 // Verify expectations now, because WiFi may call UpdateService when
1070 // WiFi is Stop()-ed (during TearDown()).
1071 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -08001072 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +00001073}
1074
1075TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001076 EXPECT_CALL(*manager(), RegisterService(_));
1077 EXPECT_CALL(*manager(), HasService(_));
1078 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +00001079 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001080 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1081 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +00001082 ReportScanDone();
1083 EXPECT_EQ(1, GetServices().size());
1084 EXPECT_TRUE(GetServices().front()->IsVisible());
1085
1086 EXPECT_CALL(*manager(), UpdateService(_));
1087 RemoveBSS("bss0");
1088 EXPECT_TRUE(GetServices().front()->IsVisible());
1089 EXPECT_EQ(1, GetServices().size());
1090}
1091
mukesh agrawal31950242011-07-14 11:53:38 -07001092TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001093 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001094 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1095 *supplicant_interface_proxy_;
1096
mukesh agrawal31950242011-07-14 11:53:38 -07001097 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001098 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -07001099 ReportScanDone();
1100
1101 {
1102 InSequence s;
1103 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +00001104 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -07001105
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001106 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -07001107 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -07001108 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -07001109 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -07001110 EXPECT_EQ(static_cast<Service *>(service),
1111 wifi()->selected_service_.get());
Paul Stewart2b05e622012-07-13 20:38:44 -07001112 EXPECT_EQ(Service::kStateAssociating, service->state());
1113 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -07001114 }
1115}
1116
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001117TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001118 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001119 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1120 *supplicant_interface_proxy_;
1121
1122 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001123 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001124 WiFiService *service(GetServices().begin()->get());
1125 InitiateConnect(service);
1126
1127 EXPECT_FALSE(GetPendingService() == NULL);
Paul Stewartff96a842012-08-13 15:59:10 -07001128 EXPECT_TRUE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001129 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1130 InitiateDisconnect(service);
Paul Stewartff96a842012-08-13 15:59:10 -07001131 EXPECT_FALSE(service->IsConnecting());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001132
1133 EXPECT_TRUE(GetPendingService() == NULL);
1134}
1135
1136TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001137 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001138 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001139 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1140 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001141 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1142 *supplicant_interface_proxy_;
1143
1144 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001145 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1146 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001147 WiFiService *service0(GetServices()[0].get());
1148 WiFiService *service1(GetServices()[1].get());
1149
1150 InitiateConnect(service0);
1151 ReportCurrentBSSChanged("bss0");
1152 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1153 InitiateConnect(service1);
1154
1155 EXPECT_EQ(service0, GetCurrentService());
1156 EXPECT_EQ(service1, GetPendingService());
1157 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1158 InitiateDisconnect(service1);
1159
1160 // |current_service_| will be unchanged until supplicant signals
1161 // that CurrentBSS has changed.
1162 EXPECT_EQ(service0, GetCurrentService());
1163 // |pending_service_| is updated immediately.
1164 EXPECT_TRUE(GetPendingService() == NULL);
Paul Stewart2b05e622012-07-13 20:38:44 -07001165 EXPECT_TRUE(GetPendingTimeout().IsCancelled());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001166}
1167
1168TEST_F(WiFiMainTest, DisconnectCurrentService) {
1169 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1170 *supplicant_interface_proxy_;
Paul Stewart549d44c2012-07-03 12:40:25 -07001171 WiFiService *service(SetupConnectedService(DBus::Path()));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001172 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1173 InitiateDisconnect(service);
1174
1175 // |current_service_| should not change until supplicant reports
1176 // a BSS change.
1177 EXPECT_EQ(service, GetCurrentService());
1178}
1179
1180TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001181 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001182 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001183 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1184 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001185 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1186 *supplicant_interface_proxy_;
1187
1188 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001189 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1190 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001191 WiFiService *service0(GetServices()[0].get());
1192 WiFiService *service1(GetServices()[1].get());
1193
1194 InitiateConnect(service0);
1195 ReportCurrentBSSChanged("bss0");
1196 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1197 InitiateConnect(service1);
1198
1199 EXPECT_EQ(service0, GetCurrentService());
1200 EXPECT_EQ(service1, GetPendingService());
1201 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1202 .Times(0);
1203 InitiateDisconnect(service0);
1204
1205 EXPECT_EQ(service0, GetCurrentService());
1206 EXPECT_EQ(service1, GetPendingService());
Paul Stewart2b05e622012-07-13 20:38:44 -07001207 EXPECT_FALSE(GetPendingTimeout().IsCancelled());
1208}
1209
1210TEST_F(WiFiMainTest, TimeoutPendingService) {
1211 StartWiFi();
1212 dispatcher_.DispatchPendingEvents();
1213 const base::CancelableClosure &pending_timeout = GetPendingTimeout();
1214 EXPECT_TRUE(pending_timeout.IsCancelled());
1215
1216 InSequence seq;
1217 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
1218 EXPECT_CALL(*service, SetState(Service::kStateAssociating));
1219 InitiateConnect(service);
1220 EXPECT_FALSE(pending_timeout.IsCancelled());
1221 EXPECT_EQ(service, GetPendingService());
1222
Paul Stewartff96a842012-08-13 15:59:10 -07001223 {
1224 InSequence seq;
1225 EXPECT_CALL(*service, SetState(Service::kStateIdle));
1226 EXPECT_CALL(*service, SetFailure(Service::kFailureOutOfRange));
1227 pending_timeout.callback().Run();
1228 }
Paul Stewart2b05e622012-07-13 20:38:44 -07001229 EXPECT_EQ(NULL, GetPendingService().get());
1230
1231 // Verify expectations now, because WiFi may report other state changes
1232 // when WiFi is Stop()-ed (during TearDown()).
1233 Mock::VerifyAndClearExpectations(service.get());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001234}
1235
1236TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001237 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001238 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1239 *supplicant_interface_proxy_;
1240
1241 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001242 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001243 WiFiService *service(GetServices().begin()->get());
1244 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1245 .Times(0);
1246 InitiateDisconnect(service);
1247}
1248
1249TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
1250 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1251 *supplicant_interface_proxy_;
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001252 DBus::Path fake_path("/fake/path");
Paul Stewart549d44c2012-07-03 12:40:25 -07001253 WiFiService *service(SetupConnectedService(fake_path));
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001254 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1255 .WillRepeatedly(Throw(
1256 DBus::Error(
1257 "fi.w1.wpa_supplicant1.NotConnected",
1258 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1259 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1260 InitiateDisconnect(service);
1261
1262 EXPECT_TRUE(GetCurrentService() == NULL);
1263}
1264
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001265TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001266 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001267 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001268 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001269 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001270
mukesh agrawalc01f3982012-01-24 13:48:39 -08001271 EXPECT_CALL(*manager(), DeregisterService(_));
1272 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001273 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawalc4f368f2012-06-04 19:45:52 -07001274 EXPECT_FALSE(wifi()->weak_ptr_factory_.HasWeakPtrs());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001275}
1276
Paul Stewart549d44c2012-07-03 12:40:25 -07001277TEST_F(WiFiMainTest, StopWhileConnected) {
1278 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1279 *supplicant_interface_proxy_;
1280 WiFiService *service(SetupConnectedService(DBus::Path()));
1281 EXPECT_CALL(*manager(), DeregisterService(ServiceRefPtr(service)))
1282 .WillOnce(Invoke(this, &WiFiObjectTest::UnloadService));
1283 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
1284 StopWiFi();
1285 EXPECT_TRUE(GetCurrentService() == NULL);
1286}
1287
Paul Stewart44663922012-07-30 11:03:03 -07001288TEST_F(WiFiMainTest, ReconnectTimer) {
1289 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1290 *supplicant_interface_proxy_;
1291 WiFiService *service(SetupConnectedService(DBus::Path()));
1292 service->SetState(Service::kStateConnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001293 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001294 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001295 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001296 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
Paul Stewart1aff7302012-08-04 20:04:47 -07001297 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001298 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001299 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001300 ReportCurrentBSSChanged(kBSSName);
Paul Stewart1aff7302012-08-04 20:04:47 -07001301 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001302 ReportStateChanged(wpa_supplicant::kInterfaceStateDisconnected);
Paul Stewart1aff7302012-08-04 20:04:47 -07001303 EXPECT_FALSE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001304 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
Paul Stewart1aff7302012-08-04 20:04:47 -07001305 GetReconnectTimeoutCallback().callback().Run();
Paul Stewart44663922012-07-30 11:03:03 -07001306 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Paul Stewart1aff7302012-08-04 20:04:47 -07001307 EXPECT_TRUE(GetReconnectTimeoutCallback().IsCancelled());
Paul Stewart44663922012-07-30 11:03:03 -07001308}
1309
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001310TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1311 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001312 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001313 EXPECT_TRUE(e.IsSuccess());
1314}
1315
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001316TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1317 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001318 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001319 EXPECT_EQ(Error::kInvalidArguments, e.type());
1320 EXPECT_EQ("must specify SSID", e.message());
1321}
1322
1323TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1324 Error e;
1325 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001326 flimflam::kTypeWifi, "123456789012345678901234567890123",
1327 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001328 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1329 EXPECT_EQ("SSID is too long", e.message());
1330}
1331
1332TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1333 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001334 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001335 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1336 EXPECT_EQ("SSID is too short", e.message());
1337}
1338
1339TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1340 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001341 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001342 EXPECT_EQ(Error::kNotSupported, e.type());
1343 EXPECT_EQ("service mode is unsupported", e.message());
1344}
1345
1346TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1347 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001348 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001349 EXPECT_TRUE(e.IsSuccess());
1350}
1351
1352TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1353 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001354 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1355 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001356 EXPECT_TRUE(e.IsSuccess());
1357}
1358
1359TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001360 // When configuring hidden networks, Chrome expects to be able to
1361 // GetService w/o a password, and supply the password with
1362 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001363 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001364 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1365 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001366 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001367}
1368
1369TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1370 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001371 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1372 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001373 EXPECT_EQ(Error::kNotSupported, e.type());
1374 EXPECT_EQ("security mode is unsupported", e.message());
1375}
1376
1377TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001378 // When configuring hidden networks, Chrome expects to be able to
1379 // GetService w/o a password, and supply the password with
1380 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001381 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001382 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1383 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001384 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001385}
1386
1387TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1388 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001389 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1390 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001391 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1392}
1393
1394TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1395 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001396 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1397 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001398 EXPECT_TRUE(e.IsSuccess());
1399}
1400
1401TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1402 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001403 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1404 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001405 EXPECT_TRUE(e.IsSuccess());
1406}
1407
1408TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1409 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001410 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1411 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001412 EXPECT_TRUE(e.IsSuccess());
1413}
1414
1415TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1416 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001417 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1418 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001419 EXPECT_TRUE(e.IsSuccess());
1420}
1421
1422TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1423 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001424 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1425 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001426 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1427}
1428
1429TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1430 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001431 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1432 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001433 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1434}
1435
1436TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1437 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001438 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1439 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001440 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1441}
1442
1443TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1444 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001445 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1446 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001447 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1448}
1449
1450TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1451 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001452 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1453 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001454 EXPECT_TRUE(e.IsSuccess());
1455}
1456
1457TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1458 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001459 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1460 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001461 EXPECT_TRUE(e.IsSuccess());
1462}
1463
1464TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1465 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001466 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1467 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001468 EXPECT_TRUE(e.IsSuccess());
1469}
1470
1471TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1472 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001473 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1474 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001475 EXPECT_TRUE(e.IsSuccess());
1476}
1477
mukesh agrawal8ede0522011-10-03 14:57:44 -07001478class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1479class WiFiGetServiceFailureTest : public WiFiMainTest {};
1480
1481TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1482 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001483 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1484 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001485 EXPECT_TRUE(e.IsSuccess());
1486}
1487
1488TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1489 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001490 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1491 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001492 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1493}
1494
1495INSTANTIATE_TEST_CASE_P(
1496 WiFiGetServiceSuccessTestInstance,
1497 WiFiGetServiceSuccessTest,
1498 Values(
1499 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1500 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1501 // subtle: invalid length for hex key, but valid as ascii passphrase
1502 string(IEEE_80211::kWPAHexLen-1, '1'),
1503 string(IEEE_80211::kWPAHexLen, '1')));
1504
1505INSTANTIATE_TEST_CASE_P(
1506 WiFiGetServiceFailureTestInstance,
1507 WiFiGetServiceFailureTest,
1508 Values(
1509 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1510 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1511 string(IEEE_80211::kWPAHexLen+1, '1')));
1512
Paul Stewart6ab23a92011-11-09 17:17:47 -08001513TEST_F(WiFiMainTest, FindServiceWEP) {
1514 const string ssid("an_ssid");
1515 {
1516 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001517 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001518 flimflam::kSecurityWep, "abcde", &e);
1519 EXPECT_TRUE(e.IsSuccess());
1520 }
1521 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1522
Paul Stewarta41e38d2011-11-11 07:47:29 -08001523 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1524 flimflam::kSecurityWep).get());
1525 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1526 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001527}
1528
1529TEST_F(WiFiMainTest, FindServiceWPA) {
1530 const string ssid("an_ssid");
1531 {
1532 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001533 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001534 flimflam::kSecurityRsn, "abcdefgh", &e);
1535 EXPECT_TRUE(e.IsSuccess());
1536 }
1537 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001538 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1539 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001540 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001541 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1542 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001543 EXPECT_TRUE(rsn_service.get());
1544 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001545 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1546 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001547 EXPECT_EQ(wpa_service.get(), psk_service.get());
1548 // Indirectly test FindService by doing a GetService on something that
1549 // already exists.
1550 {
1551 Error e;
1552 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001553 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1554 flimflam::kModeManaged, flimflam::kSecurityWpa,
1555 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001556 EXPECT_TRUE(e.IsSuccess());
1557 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1558 }
1559}
1560
Paul Stewartcb59fed2012-03-21 21:14:46 -07001561TEST_F(WiFiMainTest, GetServiceWithGUID) {
1562 // Perform a GetService that also configures properties in the base Service
1563 // class using Service::Configure().
1564 KeyValueStore args;
1565 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1566 args.SetString(flimflam::kSSIDProperty, "ssid");
1567 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1568 const string kGUID = "aguid"; // Stored as a registered Service property.
1569 args.SetString(flimflam::kGuidProperty, kGUID);
1570 Error e;
1571 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1572 EXPECT_TRUE(e.IsSuccess());
1573 EXPECT_EQ(kGUID, service->guid());
1574}
1575
Paul Stewartced6a0b2011-11-08 15:32:04 -08001576MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001577 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001578 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1579 if (it == arg.end()) {
1580 return false;
1581 }
1582
1583 const DBus::Variant &ssids_variant = it->second;
1584 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1585 const ByteArrays &ssids = it->second.operator ByteArrays();
1586 // A valid Scan containing a single hidden SSID should contain
1587 // two SSID entries: one containing the SSID we are looking for,
1588 // and an empty entry, signifying that we also want to do a
1589 // broadcast probe request for all non-hidden APs as well.
1590 return ssids.size() == 2 &&
1591 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1592 ssids[1].empty();
1593}
1594
1595TEST_F(WiFiMainTest, ScanHidden) {
1596 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1597 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1598 .Times(AnyNumber())
1599 .WillRepeatedly(Throw(
1600 DBus::Error(
1601 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1602 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001603 scoped_refptr<MockProfile> profile(
1604 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001605 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001606 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001607 Error e;
1608 WiFiServiceRefPtr service =
1609 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1610 NULL, NULL, true, &e);
1611 EXPECT_TRUE(e.IsSuccess());
1612 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001613 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001614 }
1615 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001616 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001617 Error e;
1618 WiFiServiceRefPtr service =
1619 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1620 NULL, NULL, true, &e);
1621 EXPECT_TRUE(e.IsSuccess());
1622 EXPECT_TRUE(service->hidden_ssid());
1623 }
1624 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001625 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001626 Error e;
1627 WiFiServiceRefPtr service =
1628 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1629 NULL, NULL, false, &e);
1630 EXPECT_TRUE(e.IsSuccess());
1631 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001632 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001633 }
1634 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001635 StartWiFi();
1636 dispatcher_.DispatchPendingEvents();
1637}
1638
Paul Stewartfae4dae2012-09-13 07:43:32 -07001639TEST_F(WiFiMainTest, ScanWiFiDisabledAfterResume) {
1640 ScopedMockLog log;
1641 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1642 EXPECT_CALL(log, Log(_, _, EndsWith(
1643 "Ignoring scan request while device is not enabled."))).Times(1);
1644 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_)).Times(0);
1645 StartWiFi();
1646 StopWiFi();
1647 // A scan is queued when WiFi resumes.
1648 OnAfterResume();
1649 dispatcher_.DispatchPendingEvents();
1650}
1651
mukesh agrawal7ec71312011-11-10 02:08:26 +00001652TEST_F(WiFiMainTest, InitialSupplicantState) {
1653 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1654}
1655
1656TEST_F(WiFiMainTest, StateChangeNoService) {
1657 // State change should succeed even if there is no pending Service.
1658 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1659 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1660}
1661
1662TEST_F(WiFiMainTest, StateChangeWithService) {
1663 // Forward transition should trigger a Service state change.
1664 StartWiFi();
1665 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001666 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001667 InitiateConnect(service);
1668 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1669 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1670 // Verify expectations now, because WiFi may report other state changes
1671 // when WiFi is Stop()-ed (during TearDown()).
1672 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001673 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001674}
1675
1676TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1677 // Some backwards transitions should not trigger a Service state change.
1678 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001679 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001680 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001681 StartWiFi();
1682 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001683 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Paul Stewart2b05e622012-07-13 20:38:44 -07001684 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
Gary Moraind9f893f2012-02-06 10:03:40 -08001685 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001686 InitiateConnect(service);
1687 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001688 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1689 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1690 GetSupplicantState());
1691 // Verify expectations now, because WiFi may report other state changes
1692 // when WiFi is Stop()-ed (during TearDown()).
1693 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001694 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001695}
1696
Paul Stewarta41e38d2011-11-11 07:47:29 -08001697TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1698 StrictMock<MockStore> storage;
1699 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1700 .WillOnce(Return(set<string>()));
1701 EXPECT_FALSE(LoadHiddenServices(&storage));
1702}
1703
1704TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1705 string id;
1706 StrictMock<MockStore> storage;
1707 SetupHiddenStorage(&storage, "an_ssid", &id);
1708 // Missing "Hidden" property.
1709 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1710 .WillOnce(Return(false));
1711 EXPECT_FALSE(LoadHiddenServices(&storage));
1712}
1713
1714TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1715 string id;
1716 StrictMock<MockStore> storage;
1717 SetupHiddenStorage(&storage, "an_ssid", &id);
1718 // "Hidden" property set to "false".
1719 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1720 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1721 EXPECT_FALSE(LoadHiddenServices(&storage));
1722}
1723
1724TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1725 string id;
1726 StrictMock<MockStore> storage;
1727 SetupHiddenStorage(&storage, "an_ssid", &id);
1728 // Missing "SSID" property.
1729 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1730 .WillOnce(Return(false));
1731 EXPECT_FALSE(LoadHiddenServices(&storage));
1732}
1733
1734
1735TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1736 StrictMock<MockStore> storage;
1737 string id;
1738 SetupHiddenStorage(&storage, "an_ssid", &id);
1739 Error e;
1740 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1741 ASSERT_TRUE(e.IsSuccess());
1742 EXPECT_FALSE(LoadHiddenServices(&storage));
1743}
1744
1745TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001746 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001747 StrictMock<MockStore> storage;
1748 string ssid("an_ssid");
1749 string id;
1750 SetupHiddenStorage(&storage, ssid, &id);
1751 EXPECT_TRUE(LoadHiddenServices(&storage));
1752 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1753 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1754 flimflam::kSecurityNone).get());
1755}
1756
mukesh agrawal15908392011-11-16 18:29:25 +00001757TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001758 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001759 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001760 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1761 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001762 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1763 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1764
1765 // Note that the BSS handle used in this test ("an_ap") is not
1766 // intended to reflect the format used by supplicant. It's just
1767 // convenient for testing.
1768
1769 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001770 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001771 kNetworkModeInfrastructure);
1772 InitiateConnect(service);
1773 EXPECT_EQ(service, GetPendingService().get());
1774
1775 ReportCurrentBSSChanged("an_ap");
1776 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1777 EXPECT_EQ(Service::kStateConfiguring, service->state());
1778 EXPECT_EQ(service, GetCurrentService().get());
1779 EXPECT_EQ(NULL, GetPendingService().get());
1780
1781 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001782 EXPECT_EQ(Service::kStateIdle, service->state());
1783 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001784 EXPECT_EQ(NULL, GetCurrentService().get());
1785 EXPECT_EQ(NULL, GetPendingService().get());
1786}
1787
1788TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001789 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001790 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001791 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1792 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001793 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1794 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1795 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1796 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1797
1798 // Note that the BSS handles used in this test ("ap1", "ap2") are
1799 // not intended to reflect the format used by supplicant. They're
1800 // just convenient for testing.
1801
1802 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001803 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001804 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001805 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001806 kNetworkModeInfrastructure);
1807 InitiateConnect(service1);
1808 ReportCurrentBSSChanged("ap1");
1809 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1810 EXPECT_EQ(service1.get(), GetCurrentService().get());
1811
mukesh agrawalc01f3982012-01-24 13:48:39 -08001812 // Note that we deliberately omit intermediate supplicant states
1813 // (e.g. kInterfaceStateAssociating), on the theory that they are
1814 // unreliable. Specifically, they may be quashed if the association
1815 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001816 ReportCurrentBSSChanged("ap2");
1817 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1818 EXPECT_EQ(service2.get(), GetCurrentService().get());
1819 EXPECT_EQ(Service::kStateIdle, service1->state());
1820 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1821}
1822
1823TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001824 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1825 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001826 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001827 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001828 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1829 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1830
1831 // Note that the BSS handle used in this test ("an_ap") is not
1832 // intended to reflect the format used by supplicant. It's just
1833 // convenient for testing.
1834
1835 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001836 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001837 kNetworkModeInfrastructure);
1838 InitiateConnect(service);
1839 ReportCurrentBSSChanged("an_ap");
1840 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1841 EXPECT_EQ(service.get(), GetCurrentService().get());
1842 EXPECT_EQ(Service::kStateConfiguring, service->state());
1843}
1844
Thieu Lee41a72d2012-02-06 20:46:51 +00001845TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001846 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1847 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1848 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1849
Thieu Lee41a72d2012-02-06 20:46:51 +00001850 const uint16 frequency1 = 2412;
1851 const uint16 frequency2 = 2442;
1852 StartWiFi();
1853 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1854 kNetworkModeInfrastructure);
1855 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1856 kNetworkModeInfrastructure);
1857 EXPECT_EQ(1, GetServices().size());
1858 WiFiService *service(GetServices()[0].get());
1859 InitiateConnect(service);
1860 ReportCurrentBSSChanged("bss1");
1861 EXPECT_EQ(frequency1, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001862 EXPECT_EQ("00:00:00:00:00:01", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001863 ReportCurrentBSSChanged("bss2");
1864 EXPECT_EQ(frequency2, service->frequency_);
mukesh agrawal923f14f2012-06-04 16:46:08 -07001865 EXPECT_EQ("00:00:00:00:00:02", service->bssid_);
Thieu Lee41a72d2012-02-06 20:46:51 +00001866}
1867
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001868TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1869 Error e;
1870 EXPECT_CALL(*manager(), RegisterService(_))
1871 .Times(0);
1872 EXPECT_CALL(*manager(), HasService(_))
1873 .WillOnce(Return(false));
1874 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1875 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001876 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001877 kNetworkModeInfrastructure);
1878}
1879
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001880TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001881 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1882 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001883 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1884 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1885 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1886 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1887
1888 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001889 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001890 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001891 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001892 kNetworkModeInfrastructure);
1893 InitiateConnect(service1);
1894 EXPECT_EQ(service1.get(), GetPendingService().get());
1895
1896 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1897 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1898 InitiateConnect(service2);
1899 EXPECT_EQ(service2.get(), GetPendingService().get());
1900}
1901
1902TEST_F(WiFiMainTest, IsIdle) {
1903 StartWiFi();
1904 EXPECT_TRUE(wifi()->IsIdle());
1905
1906 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1907 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1908 Error error;
1909 service->AddEndpoint(ap);
1910 service->AutoConnect();
1911 EXPECT_FALSE(wifi()->IsIdle());
1912}
1913
Darin Petkov4a66cc52012-06-15 10:08:29 +02001914MATCHER_P(WiFiAddedArgs, bgscan, "") {
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001915 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
Darin Petkov4a66cc52012-06-15 10:08:29 +02001916 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan) == bgscan;
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001917}
1918
1919TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001920 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001921 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1922 *supplicant_interface_proxy_;
1923
1924 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001925 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001926 WiFiService *service(GetServices().begin()->get());
Darin Petkov4a66cc52012-06-15 10:08:29 +02001927 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(true)));
1928 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001929 InitiateConnect(service);
1930}
1931
Darin Petkov4a66cc52012-06-15 10:08:29 +02001932TEST_F(WiFiMainTest, AddNetworkArgsNoBgscan) {
1933 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1934 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1935 *supplicant_interface_proxy_;
1936
1937 StartWiFi();
1938 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1939 WiFiService *service(GetServices().begin()->get());
1940 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs(false)));
1941 InitiateConnect(service);
1942}
1943
1944TEST_F(WiFiMainTest, AppendBgscan) {
1945 StartWiFi();
1946 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1947 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap1);
1948 service->AddEndpoint(ap1);
1949 EXPECT_EQ(1, service->GetEndpointCount());
1950 {
1951 // 1 endpoint, default bgscan method -- background scan disabled.
1952 std::map<std::string, DBus::Variant> params;
1953 AppendBgscan(service.get(), &params);
1954 EXPECT_FALSE(ContainsKey(params, wpa_supplicant::kNetworkPropertyBgscan));
1955 }
1956 WiFiEndpointRefPtr ap2 = MakeEndpoint("an_ssid", "01:02:03:04:05:06");
1957 service->AddEndpoint(ap2);
1958 EXPECT_EQ(2, service->GetEndpointCount());
1959 {
1960 // 2 endpoints, default bgscan method -- background scan frequency reduced.
1961 map<string, DBus::Variant> params;
1962 AppendBgscan(service.get(), &params);
1963 string config_string;
1964 EXPECT_TRUE(
1965 DBusProperties::GetString(params,
1966 wpa_supplicant::kNetworkPropertyBgscan,
1967 &config_string));
1968 vector<string> elements;
1969 base::SplitString(config_string, ':', &elements);
1970 ASSERT_EQ(4, elements.size());
1971 EXPECT_EQ(WiFi::kDefaultBgscanMethod, elements[0]);
1972 EXPECT_EQ(StringPrintf("%d", WiFi::kBackgroundScanIntervalSeconds),
1973 elements[3]);
1974 }
1975 {
1976 // Explicit bgscan method -- regular background scan frequency.
1977 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodSimple));
1978 std::map<std::string, DBus::Variant> params;
1979 AppendBgscan(service.get(), &params);
1980 string config_string;
1981 EXPECT_TRUE(
1982 DBusProperties::GetString(params,
1983 wpa_supplicant::kNetworkPropertyBgscan,
1984 &config_string));
1985 vector<string> elements;
1986 base::SplitString(config_string, ':', &elements);
1987 ASSERT_EQ(4, elements.size());
1988 EXPECT_EQ(StringPrintf("%d", WiFi::kDefaultScanIntervalSeconds),
1989 elements[3]);
1990 }
Christopher Wiley5c929e22012-07-16 14:06:04 -07001991 {
1992 // No scan method, simply returns without appending properties
1993 EXPECT_TRUE(SetBgscanMethod(wpa_supplicant::kNetworkBgscanMethodNone));
1994 std::map<std::string, DBus::Variant> params;
1995 AppendBgscan(service.get(), &params);
1996 string config_string;
1997 EXPECT_FALSE(
1998 DBusProperties::GetString(params,
1999 wpa_supplicant::kNetworkPropertyBgscan,
2000 &config_string));
2001 }
Darin Petkov4a66cc52012-06-15 10:08:29 +02002002}
2003
mukesh agrawalc01f3982012-01-24 13:48:39 -08002004TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
2005 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07002006 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08002007 InitiateConnect(service);
2008 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
2009 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2010 ReportLinkUp();
2011
2012 // Verify expectations now, because WiFi may cause |service| state
2013 // changes during TearDown().
2014 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08002015 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002016}
2017
2018TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08002019 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07002020 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08002021 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002022 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2023 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2024
2025 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002026 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002027 kNetworkModeInfrastructure);
2028 InitiateConnect(service);
2029
2030 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
2031 ReportCurrentBSSChanged("ap");
2032 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2033 EXPECT_EQ(Service::kStateConfiguring, service->state());
2034}
2035
2036TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08002037 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
2038 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
2039 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
2040 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07002041 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08002042 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08002043 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08002044 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2045 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2046
mukesh agrawalc01f3982012-01-24 13:48:39 -08002047 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00002048 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08002049 kNetworkModeInfrastructure);
2050 InitiateConnect(service);
2051 ReportCurrentBSSChanged("ap");
2052 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2053 ReportIPConfigComplete();
2054 Mock::VerifyAndClearExpectations(service);
2055
2056 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
2057 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2058}
2059
Paul Stewart66c86002012-01-30 18:00:52 -08002060TEST_F(WiFiMainTest, ClearCachedCredentials) {
Paul Stewartf48eca42012-10-11 12:10:02 -07002061 {
2062 ClearCachedCredentials();
2063 ScopedMockLog log;
2064 EXPECT_CALL(log, Log(_, _, EndsWith("supplicant proxy is NULL.")));
2065 // Also expect no crash due to supplicant interface proxy being NULL.
2066 dispatcher_.DispatchPendingEvents();
2067 }
2068
Paul Stewart66c86002012-01-30 18:00:52 -08002069 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2070 *supplicant_interface_proxy_;
2071
2072 StartWiFi();
2073
2074 // Ensure call to the proxy is deferred.
2075 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2076 .Times(0);
2077 ClearCachedCredentials();
2078
2079 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2080
2081 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2082 .Times(1);
2083 dispatcher_.DispatchPendingEvents();
2084
2085 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2086
2087 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2088 .Times(0);
2089 ClearCachedCredentials();
2090 ClearCachedCredentials();
2091
2092 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
2093
2094 // Ensure multiple calls to ClearCachedCredentials() results in only
2095 // one call to the proxy.
2096 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
2097 .Times(1);
2098 dispatcher_.DispatchPendingEvents();
2099}
2100
mukesh agrawalb20776f2012-02-10 16:00:36 -08002101TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
2102 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2103 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
2104 // we can test the interaction between WiFi and WiFiEndpoint. (Right
2105 // now, we're testing across multiple layers.)
2106 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
2107 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
2108 StartWiFi();
2109 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2110}
2111
2112TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
2113 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
2114 // factory for WiFiEndpoints.
2115 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
2116
2117 // Get the pointer before we transfer ownership.
2118 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
2119 EXPECT_CALL(*proxy, Die());
2120 StartWiFi();
2121 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2122 RemoveBSS("bss0");
2123 // Check this now, to make sure RemoveBSS killed the proxy (rather
2124 // than TearDown).
2125 Mock::VerifyAndClearExpectations(proxy);
2126}
2127
mukesh agrawal5c05b292012-03-07 10:12:52 -08002128TEST_F(WiFiMainTest, FlushBSSOnResume) {
2129 const struct timeval resume_time = {1, 0};
2130 const struct timeval scan_done_time = {6, 0};
2131 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
2132 *supplicant_interface_proxy_;
2133
2134 StartWiFi();
2135
2136 EXPECT_CALL(time_, GetTimeMonotonic(_))
2137 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
2138 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
2139 EXPECT_CALL(supplicant_interface_proxy,
2140 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
mukesh agrawal2f9df4e2012-08-08 12:29:20 -07002141 OnAfterResume();
mukesh agrawal5c05b292012-03-07 10:12:52 -08002142 ReportScanDone();
2143}
2144
mukesh agrawalb66c6462012-05-07 11:45:25 -07002145TEST_F(WiFiMainTest, ScanTimerIdle) {
2146 StartWiFi();
2147 dispatcher_.DispatchPendingEvents();
2148 ReportScanDone();
2149 CancelScanTimer();
2150 EXPECT_TRUE(GetScanTimer().IsCancelled());
2151
2152 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
2153 FireScanTimer();
2154 dispatcher_.DispatchPendingEvents();
2155 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2156}
2157
2158TEST_F(WiFiMainTest, ScanTimerScanning) {
2159 StartWiFi();
2160 dispatcher_.DispatchPendingEvents();
2161 CancelScanTimer();
2162 EXPECT_TRUE(GetScanTimer().IsCancelled());
2163
2164 // Should not call Scan, since we're already scanning.
2165 // (Scanning is triggered by StartWiFi.)
2166 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2167 FireScanTimer();
2168 dispatcher_.DispatchPendingEvents();
2169 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2170}
2171
2172TEST_F(WiFiMainTest, ScanTimerConnecting) {
2173 StartWiFi();
2174 dispatcher_.DispatchPendingEvents();
2175 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
2176 ReportScanDone();
2177 WiFiService *service(GetServices().begin()->get());
2178 InitiateConnect(service);
2179 CancelScanTimer();
2180 EXPECT_TRUE(GetScanTimer().IsCancelled());
2181
2182 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2183 FireScanTimer();
2184 dispatcher_.DispatchPendingEvents();
2185 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
2186}
2187
2188TEST_F(WiFiMainTest, ScanTimerReconfigured) {
2189 StartWiFi();
2190 CancelScanTimer();
2191 EXPECT_TRUE(GetScanTimer().IsCancelled());
2192
2193 SetScanInterval(1);
2194 EXPECT_FALSE(GetScanTimer().IsCancelled());
2195}
2196
2197TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
2198 StartWiFi();
2199 CancelScanTimer();
2200 EXPECT_TRUE(GetScanTimer().IsCancelled());
2201
2202 ReportScanDone();
2203 EXPECT_FALSE(GetScanTimer().IsCancelled());
2204}
2205
2206TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
2207 StartWiFi();
2208 EXPECT_FALSE(GetScanTimer().IsCancelled());
2209
2210 SetScanInterval(0);
2211 EXPECT_TRUE(GetScanTimer().IsCancelled());
2212}
2213
2214TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
2215 Error e;
2216 scoped_refptr<MockProfile> profile(
2217 new NiceMock<MockProfile>(control_interface(), manager(), ""));
2218 WiFiServiceRefPtr hidden_service =
2219 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
2220 flimflam::kModeManaged, NULL, NULL, true, &e);
2221 hidden_service->set_profile(profile);
2222
2223 StartWiFi();
2224 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2225 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2226 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2227 kNetworkModeInfrastructure);
2228 InitiateConnect(service);
2229 ReportCurrentBSSChanged("an_ap");
2230 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2231 dispatcher_.DispatchPendingEvents();
2232
2233 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
2234 Scan(HasHiddenSSID("hidden_ssid")));
2235 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2236 dispatcher_.DispatchPendingEvents();
2237}
2238
2239TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
2240 StartWiFi();
2241 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
2242 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
2243 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
2244 kNetworkModeInfrastructure);
2245 InitiateConnect(service);
2246 ReportCurrentBSSChanged("an_ap");
2247 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
2248 dispatcher_.DispatchPendingEvents();
2249
2250 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
2251 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
2252 dispatcher_.DispatchPendingEvents();
2253}
2254
Paul Stewart3c508e12012-08-09 11:40:06 -07002255TEST_F(WiFiMainTest, LinkMonitorFailure) {
2256 StartWiFi();
2257 ScopedMockLog log;
2258 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2259 MockLinkMonitor *link_monitor = new StrictMock<MockLinkMonitor>();
2260 SetLinkMonitor(link_monitor);
2261 EXPECT_CALL(*link_monitor, IsGatewayFound())
2262 .WillOnce(Return(false))
2263 .WillRepeatedly(Return(true));
2264 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2265 EndsWith("gateway was never found."))).Times(1);
2266 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(0);
2267 OnLinkMonitorFailure();
2268 EXPECT_CALL(log, Log(logging::LOG_INFO, _,
2269 EndsWith("Called Reassociate()."))).Times(1);
2270 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Reassociate()).Times(1);
2271 OnLinkMonitorFailure();
2272 OnSupplicantVanish();
2273 EXPECT_CALL(log, Log(logging::LOG_ERROR, _,
2274 EndsWith("Cannot reassociate."))).Times(1);
2275 OnLinkMonitorFailure();
2276}
2277
mukesh agrawalcf24a242012-05-21 16:46:11 -07002278TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
2279 Error e;
2280 WiFiServiceRefPtr service = GetOpenService(
2281 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
2282 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2283 EXPECT_FALSE(service->has_ever_connected());
2284 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2285}
2286
2287TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
2288 Error e;
2289 WiFiServiceRefPtr service =
2290 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2291 flimflam::kSecurityWpa, "abcdefgh", &e);
2292 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2293 EXPECT_FALSE(service->has_ever_connected());
2294 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
2295}
2296
2297TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
2298 Error e;
2299 WiFiServiceRefPtr service =
2300 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
2301 flimflam::kSecurityWpa, "abcdefgh", &e);
2302 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2303 service->has_ever_connected_ = true;
2304 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
2305}
2306
2307TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
2308 ScopedMockLog log;
2309 Error e;
2310 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
2311 SetPendingService(service);
2312 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
2313 EXPECT_FALSE(service->has_ever_connected());
2314
Paul Stewartf2d60912012-07-15 08:37:30 -07002315 EXPECT_CALL(*service, SetFailure(Service::kFailureBadPassphrase));
mukesh agrawal56e32202012-07-26 16:32:11 -07002316 EXPECT_CALL(*service, SetFailureSilent(_)).Times(0);
2317 EXPECT_CALL(*service, SetState(_)).Times(0);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002318 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
2319 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
2320 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawalcf24a242012-05-21 16:46:11 -07002321}
2322
Paul Stewarte369ece2012-05-22 09:11:03 -07002323// Scanning tests will use a mock of the event dispatcher instead of a real
2324// one.
Paul Stewart1aff7302012-08-04 20:04:47 -07002325class WiFiTimerTest : public WiFiObjectTest {
Paul Stewarte369ece2012-05-22 09:11:03 -07002326 public:
Paul Stewart1aff7302012-08-04 20:04:47 -07002327 WiFiTimerTest() : WiFiObjectTest(&mock_dispatcher_) {}
Paul Stewarte369ece2012-05-22 09:11:03 -07002328
2329 protected:
2330 void ExpectInitialScanSequence();
2331
2332 StrictMock<MockEventDispatcher> mock_dispatcher_;
2333};
2334
Paul Stewart1aff7302012-08-04 20:04:47 -07002335void WiFiTimerTest::ExpectInitialScanSequence() {
Paul Stewarte369ece2012-05-22 09:11:03 -07002336 // Choose a number of iterations some multiple higher than the fast scan
2337 // count.
2338 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
2339
2340 // Each time we call FireScanTimer() below, WiFi will post a task to actually
2341 // run Scan() on the wpa_supplicant proxy.
2342 EXPECT_CALL(mock_dispatcher_, PostTask(_))
2343 .Times(kScanTimes);
2344 {
2345 InSequence seq;
2346 // The scans immediately after the initial scan should happen at the short
2347 // interval. If we add the initial scan (not invoked in this function) to
2348 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
2349 // the fast scan interval.
2350 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2351 _, WiFi::kFastScanIntervalSeconds * 1000))
2352 .Times(WiFi::kNumFastScanAttempts - 1)
2353 .WillRepeatedly(Return(true));
2354
2355 // After this, the WiFi device should use the normal scan interval.
2356 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2357 _, GetScanInterval() * 1000))
2358 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
2359 .WillRepeatedly(Return(true));
2360
2361 for (int i = 0; i < kScanTimes; i++) {
2362 FireScanTimer();
2363 }
2364 }
2365}
2366
Paul Stewart1aff7302012-08-04 20:04:47 -07002367TEST_F(WiFiTimerTest, FastRescan) {
Paul Stewarte369ece2012-05-22 09:11:03 -07002368 // This PostTask is a result of the call to Scan(NULL), and is meant to
2369 // post a task to call Scan() on the wpa_supplicant proxy immediately.
2370 EXPECT_CALL(mock_dispatcher_, PostTask(_));
2371 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2372 _, WiFi::kFastScanIntervalSeconds * 1000))
2373 .WillOnce(Return(true));
2374 StartWiFi();
2375
2376 ExpectInitialScanSequence();
2377
2378 // If we end up disconnecting, the sequence should repeat.
2379 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2380 _, WiFi::kFastScanIntervalSeconds * 1000))
2381 .WillOnce(Return(true));
2382 RestartFastScanAttempts();
2383
2384 ExpectInitialScanSequence();
2385}
2386
Paul Stewart1aff7302012-08-04 20:04:47 -07002387TEST_F(WiFiTimerTest, ReconnectTimer) {
2388 EXPECT_CALL(mock_dispatcher_, PostTask(_)).Times(AnyNumber());
2389 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(AnyNumber());
2390 SetupConnectedService(DBus::Path());
2391 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2392
2393 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2394 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2395 StartReconnectTimer();
2396 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2397 StopReconnectTimer();
2398
2399 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2400 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2401 StartReconnectTimer();
2402 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2403 GetReconnectTimeoutCallback().callback().Run();
2404
2405 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2406 _, GetReconnectTimeoutSeconds() * 1000)).Times(1);
2407 StartReconnectTimer();
2408 Mock::VerifyAndClearExpectations(&mock_dispatcher_);
2409
2410 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2411 _, GetReconnectTimeoutSeconds() * 1000)).Times(0);
2412 StartReconnectTimer();
2413}
2414
Paul Stewartbc6e7392012-05-24 07:07:48 -07002415TEST_F(WiFiMainTest, EAPCertification) {
2416 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2417 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2418
2419 ScopedMockLog log;
2420 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2421 map<string, ::DBus::Variant> args;
2422 ReportCertification(args);
2423 Mock::VerifyAndClearExpectations(&log);
2424
2425 SetCurrentService(service);
2426 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2427 ReportCertification(args);
2428 Mock::VerifyAndClearExpectations(&log);
2429
2430 const uint32 kDepth = 123;
2431 args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2432
2433 EXPECT_CALL(log,
2434 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2435 ReportCertification(args);
2436 Mock::VerifyAndClearExpectations(&log);
2437
2438 const string kSubject("subject");
2439 args[wpa_supplicant::kInterfacePropertySubject].writer()
2440 .append_string(kSubject.c_str());
2441 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2442 ReportCertification(args);
2443}
2444
mukesh agrawalc4f368f2012-06-04 19:45:52 -07002445TEST_F(WiFiMainTest, PendingScanDoesNotCrashAfterStop) {
2446 // Scan is one task that should be skipped after Stop. Others are
2447 // skipped by the same mechanism (invalidating weak pointers), so we
2448 // don't test them individually.
2449 //
2450 // Note that we can't test behavior by setting expectations on the
2451 // supplicant_interface_proxy_, since that is destroyed when we StopWiFi().
2452 StartWiFi();
2453 StopWiFi();
2454 dispatcher_.DispatchPendingEvents();
2455}
2456
Chris Masone853b81b2011-06-24 14:11:41 -07002457} // namespace shill