blob: 9b18316951bab368717d5b317be0dc7f32bce52f [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>
21#include <base/string_util.h>
Chris Masone853b81b2011-06-24 14:11:41 -070022#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070023#include <dbus-c++/dbus.h>
Chris Masone7156c922011-08-23 20:36:21 -070024#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070025#include <gtest/gtest.h>
Chris Masone853b81b2011-06-24 14:11:41 -070026
27#include "shill/dbus_adaptor.h"
Paul Stewart26b327e2011-10-19 11:38:09 -070028#include "shill/event_dispatcher.h"
mukesh agrawal8ede0522011-10-03 14:57:44 -070029#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070030#include "shill/key_value_store.h"
Chris Masone853b81b2011-06-24 14:11:41 -070031#include "shill/manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070032#include "shill/mock_device.h"
mukesh agrawalc01f3982012-01-24 13:48:39 -080033#include "shill/mock_device_info.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070034#include "shill/mock_dhcp_config.h"
35#include "shill/mock_dhcp_provider.h"
Paul Stewarte369ece2012-05-22 09:11:03 -070036#include "shill/mock_event_dispatcher.h"
mukesh agrawalcf24a242012-05-21 16:46:11 -070037#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070038#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080039#include "shill/mock_metrics.h"
Gary Morainac1bdb42012-02-16 17:42:29 -080040#include "shill/mock_power_manager.h"
41#include "shill/mock_power_manager_proxy.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070042#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070043#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080044#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080045#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070046#include "shill/mock_supplicant_interface_proxy.h"
47#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080048#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000049#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070050#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070051#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070052#include "shill/proxy_factory.h"
53#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070054#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080055#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070056
Gary Morainac1bdb42012-02-16 17:42:29 -080057
Chris Masone853b81b2011-06-24 14:11:41 -070058using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080059using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070060using std::string;
61using std::vector;
62using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070063using ::testing::AnyNumber;
64using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080065using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070066using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070067using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080068using ::testing::Invoke;
mukesh agrawal7ec71312011-11-10 02:08:26 +000069using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070070using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070071using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080072using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080073using ::testing::SetArgumentPointee;
74using ::testing::StrEq;
75using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070076using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070077using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070078using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070079
80namespace shill {
81
mukesh agrawal31950242011-07-14 11:53:38 -070082class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070083 public:
mukesh agrawal31950242011-07-14 11:53:38 -070084 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080085 : device_(new WiFi(control_interface(),
86 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070087 }
mukesh agrawal31950242011-07-14 11:53:38 -070088 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070089
90 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080091 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070092};
93
mukesh agrawal31950242011-07-14 11:53:38 -070094TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070095 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
96 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070097}
98
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080099TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 {
101 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800102 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700103 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700104 flimflam::kBgscanSignalThresholdProperty,
105 PropertyStoreTest::kInt32V,
106 &error));
107 }
108 {
109 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800110 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
111 flimflam::kScanIntervalProperty,
112 PropertyStoreTest::kUint16V,
113 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700114 }
Chris Masone853b81b2011-06-24 14:11:41 -0700115 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700116 {
117 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800118 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
119 flimflam::kScanningProperty,
120 PropertyStoreTest::kBoolV,
121 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700122 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700123 }
Chris Masone853b81b2011-06-24 14:11:41 -0700124
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800125 {
126 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800127 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800128 device_->mutable_store(),
129 flimflam::kBgscanMethodProperty,
130 DBusAdaptor::StringToVariant(
131 wpa_supplicant::kNetworkBgscanMethodSimple),
132 &error));
133 }
134
135 {
136 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800137 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800138 device_->mutable_store(),
139 flimflam::kBgscanMethodProperty,
140 DBusAdaptor::StringToVariant("not a real scan method"),
141 &error));
142 }
143}
144
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800145TEST_F(WiFiPropertyTest, ClearDerivedProperty) {
146 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
147 WiFi::kDefaultBgscanMethod);
148 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
149
150 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800151 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800152 device_->mutable_store(),
153 flimflam::kBgscanMethodProperty,
154 DBusAdaptor::StringToVariant(
155 wpa_supplicant::kNetworkBgscanMethodLearn),
156 &error));
157 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
158
159 EXPECT_TRUE(DBusAdaptor::ClearProperty(
160 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
161 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
162}
163
Paul Stewarte369ece2012-05-22 09:11:03 -0700164class WiFiObjectTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700165 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700166 WiFiObjectTest(EventDispatcher *dispatcher)
167 : event_dispatcher_(dispatcher),
168 manager_(&control_interface_, NULL, &metrics_, &glib_),
169 device_info_(&control_interface_, dispatcher, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700170 wifi_(new WiFi(&control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700171 dispatcher,
Thieu Le3426c8f2012-01-11 17:35:11 -0800172 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700173 &manager_,
174 kDeviceName,
175 kDeviceAddress,
176 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700177 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
178 supplicant_interface_proxy_(
179 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800180 supplicant_bss_proxy_(
181 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700182 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700183 kDeviceName)),
Gary Morainac1bdb42012-02-16 17:42:29 -0800184 proxy_factory_(this),
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500185 power_manager_(new MockPowerManager(&proxy_factory_)) {
mukesh agrawal31950242011-07-14 11:53:38 -0700186 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000187 // Except for WiFiServices created via WiFi::GetService, we expect
188 // that any WiFiService has been registered with the Manager. So
189 // default Manager.HasService to true, to make the common case
190 // easy.
191 ON_CALL(manager_, HasService(_)).
192 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800193
Paul Stewartd408fdf2012-05-07 17:15:57 -0700194 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800195 WillByDefault(Return(dhcp_config_));
196 ON_CALL(*dhcp_config_.get(), RequestIP()).
197 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800198
199 // |manager_| takes ownership of |power_manager_|.
200 manager_.set_power_manager(power_manager_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800201
202 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700203 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700204
205 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700206 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700207 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
208 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800209 ON_CALL(manager_, device_info()).
210 WillByDefault(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700211 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800212 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700213 }
214
215 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800216 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Gary Morain91001122012-02-29 16:22:26 -0800217 EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
218 .Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500219 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800220 if (supplicant_bss_proxy_.get()) {
221 EXPECT_CALL(*supplicant_bss_proxy_, Die());
222 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700223 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700224 // must Stop WiFi instance, to clear its list of services.
225 // otherwise, the WiFi instance will not be deleted. (because
226 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500227 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700228 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700229 }
230
mukesh agrawal31950242011-07-14 11:53:38 -0700231 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000232 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
233
mukesh agrawal31950242011-07-14 11:53:38 -0700234 class TestProxyFactory : public ProxyFactory {
235 public:
Paul Stewarte369ece2012-05-22 09:11:03 -0700236 explicit TestProxyFactory(WiFiObjectTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700237
238 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700239 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700240 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700241 }
242
243 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700244 const WiFiRefPtr &/*wifi*/,
245 const DBus::Path &/*object_path*/,
246 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700247 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700248 }
249
mukesh agrawalb20776f2012-02-10 16:00:36 -0800250 MOCK_METHOD3(CreateSupplicantBSSProxy,
251 SupplicantBSSProxyInterface *(
252 WiFiEndpoint *wifi_endpoint,
253 const DBus::Path &object_path,
254 const char *dbus_addr));
255
Gary Morainac1bdb42012-02-16 17:42:29 -0800256 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
257 PowerManagerProxyDelegate */*delegate*/) {
258 return new MockPowerManagerProxy();
259 }
260
mukesh agrawal31950242011-07-14 11:53:38 -0700261 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800262 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
263 WiFiEndpoint */*wifi_endpoint*/,
264 const DBus::Path &/*object_path*/,
265 const char */*dbus_addr*/) {
266 return test_->supplicant_bss_proxy_.release();
267 }
268
Paul Stewarte369ece2012-05-22 09:11:03 -0700269 WiFiObjectTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700270 };
271
mukesh agrawalb66c6462012-05-07 11:45:25 -0700272 void CancelScanTimer() {
273 wifi_->scan_timer_callback_.Cancel();
274 }
mukesh agrawal15908392011-11-16 18:29:25 +0000275 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
276 bool hidden_ssid = false;
277 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
278 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700279 void FireScanTimer() {
280 wifi_->ScanTimerHandler();
281 }
mukesh agrawal15908392011-11-16 18:29:25 +0000282 const WiFiServiceRefPtr &GetCurrentService() {
283 return wifi_->current_service_;
284 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700285 void SetCurrentService(const WiFiServiceRefPtr &service) {
286 wifi_->current_service_ = service;
287 }
mukesh agrawal31950242011-07-14 11:53:38 -0700288 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000289 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700290 }
mukesh agrawal15908392011-11-16 18:29:25 +0000291 const WiFiServiceRefPtr &GetPendingService() {
292 return wifi_->pending_service_;
293 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700294 const base::CancelableClosure &GetScanTimer() {
295 return wifi_->scan_timer_callback_;
296 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000297 const vector<WiFiServiceRefPtr> &GetServices() {
298 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700299 }
300 // note: the tests need the proxies referenced by WiFi (not the
Paul Stewarte369ece2012-05-22 09:11:03 -0700301 // proxies instantiated by WiFiObjectTest), to ensure that WiFi
mukesh agrawal31950242011-07-14 11:53:38 -0700302 // sets up its proxies correctly.
303 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
304 return wifi_->supplicant_process_proxy_.get();
305 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000306 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
307 return dynamic_cast<MockSupplicantInterfaceProxy *>(
308 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700309 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000310 const string &GetSupplicantState() {
311 return wifi_->supplicant_state_;
312 }
313 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700314 map<string, ::DBus::Variant> params;
315 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700316 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000317 void InitiateDisconnect(WiFiServiceRefPtr service) {
318 wifi_->DisconnectFrom(service);
319 }
mukesh agrawal15908392011-11-16 18:29:25 +0000320 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800321 return WiFiEndpoint::MakeOpenEndpoint(
322 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000323 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700324 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
mukesh agrawal7ec71312011-11-10 02:08:26 +0000325 vector<uint8_t> ssid(1, 'a');
326 return new MockWiFiService(
327 &control_interface_,
Paul Stewarte369ece2012-05-22 09:11:03 -0700328 event_dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800329 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000330 &manager_,
331 wifi_,
332 ssid,
333 flimflam::kModeManaged,
mukesh agrawalcf24a242012-05-21 16:46:11 -0700334 security,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000335 false);
336 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000337 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700338 void ReportBSS(const ::DBus::Path &bss_path,
339 const string &ssid,
340 const string &bssid,
341 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000342 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700343 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800344 void ClearCachedCredentials() {
345 wifi_->ClearCachedCredentials();
346 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800347 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100348 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800349 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700350 void ReportLinkUp() {
351 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
352 }
mukesh agrawal31950242011-07-14 11:53:38 -0700353 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700354 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700355 }
mukesh agrawal15908392011-11-16 18:29:25 +0000356 void ReportCurrentBSSChanged(const string &new_bss) {
357 wifi_->CurrentBSSChanged(new_bss);
358 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000359 void ReportStateChanged(const string &new_state) {
360 wifi_->StateChanged(new_state);
361 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700362 void SetPendingService(const WiFiServiceRefPtr &service) {
363 wifi_->pending_service_ = service;
364 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700365 void SetScanInterval(uint16_t interval_seconds) {
366 wifi_->SetScanInterval(interval_seconds, NULL);
367 }
Paul Stewarte369ece2012-05-22 09:11:03 -0700368 uint16_t GetScanInterval() {
369 return wifi_->GetScanInterval(NULL);
370 }
mukesh agrawal31950242011-07-14 11:53:38 -0700371 void StartWiFi() {
Gary Morainac1bdb42012-02-16 17:42:29 -0800372 EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
373 .WillOnce(SaveArg<1>(&power_state_callback_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700374 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700375 }
376 void StopWiFi() {
Gary Morain91001122012-02-29 16:22:26 -0800377 EXPECT_CALL(*power_manager_,
378 RemoveStateChangeCallback(wifi_->UniqueName()));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700379 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700380 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700381 WiFiServiceRefPtr GetOpenService(const char *service_type,
382 const char *ssid,
383 const char *mode,
384 Error *result) {
385 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700386 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700387 WiFiServiceRefPtr GetService(const char *service_type,
388 const char *ssid,
389 const char *mode,
390 const char *security,
391 const char *passphrase,
392 Error *result) {
393 return GetServiceInner(service_type, ssid, mode, security, passphrase,
394 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800395 }
396 WiFiServiceRefPtr GetServiceInner(const char *service_type,
397 const char *ssid,
398 const char *mode,
399 const char *security,
400 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800401 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800402 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700403 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700404 // in general, we want to avoid D-Bus specific code for any RPCs
405 // that come in via adaptors. we make an exception here, because
406 // calls to GetWifiService are rerouted from the Manager object to
407 // the Wifi class.
408 if (service_type != NULL)
409 args[flimflam::kTypeProperty].writer().append_string(service_type);
410 if (ssid != NULL)
411 args[flimflam::kSSIDProperty].writer().append_string(ssid);
412 if (mode != NULL)
413 args[flimflam::kModeProperty].writer().append_string(mode);
414 if (security != NULL)
415 args[flimflam::kSecurityProperty].writer().append_string(security);
416 if (passphrase != NULL)
417 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800418 if (!allow_hidden)
419 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700420
Paul Stewartced6a0b2011-11-08 15:32:04 -0800421 Error e;
422 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700423 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800424 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700425 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700426
427 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
428 Error *result) {
429 return wifi_->GetService(args, result);
430 }
431
Paul Stewarta41e38d2011-11-11 07:47:29 -0800432 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
433 const string &mode,
434 const string &security) {
435 return wifi_->FindService(ssid, mode, security);
436 }
437 bool LoadHiddenServices(StoreInterface *storage) {
438 return wifi_->LoadHiddenServices(storage);
439 }
440 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
441 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
442 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
443 flimflam::kTypeWifi,
444 kDeviceAddress,
445 hex_ssid.c_str(),
446 flimflam::kModeManaged,
447 flimflam::kSecurityNone));
448 const char *groups[] = { id->c_str() };
449 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
450 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
451 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
452 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
453 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
454 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
455 }
Paul Stewartbc6e7392012-05-24 07:07:48 -0700456 void ReportCertification(const map<string, ::DBus::Variant> &properties) {
457 wifi_->CertificationTask(properties);
458 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700459
Paul Stewarte369ece2012-05-22 09:11:03 -0700460 void RestartFastScanAttempts() {
461 wifi_->RestartFastScanAttempts();
462 }
463
Paul Stewart10ccbb32012-04-26 15:59:30 -0700464 NiceMockControl *control_interface() {
465 return &control_interface_;
466 }
467
mukesh agrawal32399322011-09-01 10:53:43 -0700468 MockManager *manager() {
469 return &manager_;
470 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800471
472 MockDeviceInfo *device_info() {
473 return &device_info_;
474 }
475
476 MockDHCPProvider *dhcp_provider() {
477 return &dhcp_provider_;
478 }
479
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500480 const PowerManager::PowerStateCallback &power_state_callback() const {
Gary Morainac1bdb42012-02-16 17:42:29 -0800481 return power_state_callback_;
482 }
483
mukesh agrawal32399322011-09-01 10:53:43 -0700484 const WiFiConstRefPtr wifi() const {
485 return wifi_;
486 }
487
mukesh agrawalb20776f2012-02-10 16:00:36 -0800488 TestProxyFactory *proxy_factory() {
489 return &proxy_factory_;
490 }
491
Paul Stewarte369ece2012-05-22 09:11:03 -0700492 EventDispatcher *event_dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700493 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800494 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700495
496 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700497 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800498 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700499 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700500 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800501 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700502 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700503
504 // protected fields interspersed between private fields, due to
505 // initialization order
506 protected:
507 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700508 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700509 static const char kNetworkModeAdHoc[];
510 static const char kNetworkModeInfrastructure[];
511
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700512 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
513 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800514 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700515 MockDHCPProvider dhcp_provider_;
516 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700517
518 private:
519 TestProxyFactory proxy_factory_;
Gary Morainac1bdb42012-02-16 17:42:29 -0800520 MockPowerManager *power_manager_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500521 PowerManager::PowerStateCallback power_state_callback_;
mukesh agrawal31950242011-07-14 11:53:38 -0700522};
523
Paul Stewarte369ece2012-05-22 09:11:03 -0700524const char WiFiObjectTest::kDeviceName[] = "wlan0";
525const char WiFiObjectTest::kDeviceAddress[] = "000102030405";
526const char WiFiObjectTest::kNetworkModeAdHoc[] = "ad-hoc";
527const char WiFiObjectTest::kNetworkModeInfrastructure[] = "infrastructure";
mukesh agrawal31950242011-07-14 11:53:38 -0700528
Paul Stewarte369ece2012-05-22 09:11:03 -0700529void WiFiObjectTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000530 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000531}
532
Paul Stewarte369ece2012-05-22 09:11:03 -0700533void WiFiObjectTest::ReportBSS(const ::DBus::Path &bss_path,
mukesh agrawal31950242011-07-14 11:53:38 -0700534 const string &ssid,
535 const string &bssid,
536 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000537 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700538 const char *mode) {
539 map<string, ::DBus::Variant> bss_properties;
540
541 {
542 DBus::MessageIter writer(bss_properties["SSID"].writer());
543 writer << vector<uint8_t>(ssid.begin(), ssid.end());
544 }
545 {
546 string bssid_nosep;
547 vector<uint8_t> bssid_bytes;
548 RemoveChars(bssid, ":", &bssid_nosep);
549 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
550
551 DBus::MessageIter writer(bss_properties["BSSID"].writer());
552 writer << bssid_bytes;
553 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000554 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
555 append_int16(signal_strength);
556 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
557 append_uint16(frequency);
558 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000559 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700560}
561
Paul Stewarte369ece2012-05-22 09:11:03 -0700562WiFiObjectTest::TestProxyFactory::TestProxyFactory(WiFiObjectTest *test)
mukesh agrawalb20776f2012-02-10 16:00:36 -0800563 : test_(test) {
564 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
565 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
566 .WillByDefault(
567 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
568}
569
Paul Stewarte369ece2012-05-22 09:11:03 -0700570// Most of our tests involve using a real EventDispatcher object.
571class WiFiMainTest : public WiFiObjectTest {
572 public:
573 WiFiMainTest() : WiFiObjectTest(&dispatcher_) {}
574
575 protected:
576 EventDispatcher dispatcher_;
577};
578
mukesh agrawal31950242011-07-14 11:53:38 -0700579TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
580 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
581 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
582
583 StartWiFi();
584 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
585 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
586}
587
588TEST_F(WiFiMainTest, CleanStart) {
589 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
590 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
591 .Times(AnyNumber())
592 .WillRepeatedly(Throw(
593 DBus::Error(
594 "fi.w1.wpa_supplicant1.InterfaceUnknown",
595 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
596 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700597 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700598 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700599 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700600 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700601}
602
603TEST_F(WiFiMainTest, Restart) {
604 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
605 .Times(AnyNumber())
606 .WillRepeatedly(Throw(
607 DBus::Error(
608 "fi.w1.wpa_supplicant1.InterfaceExists",
609 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
610 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
611 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
612 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700613 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700614}
615
616TEST_F(WiFiMainTest, StartClearsState) {
617 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
618 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
619 StartWiFi();
620}
621
Gary Morainac1bdb42012-02-16 17:42:29 -0800622TEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
623 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
624 StartWiFi();
625 dispatcher_.DispatchPendingEvents();
626 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800627 ReportScanDone();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500628 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800629 ASSERT_TRUE(wifi()->IsIdle());
630 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500631 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800632 dispatcher_.DispatchPendingEvents();
633}
634
635TEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
636 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
637 StartWiFi();
638 dispatcher_.DispatchPendingEvents();
639 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500640 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800641 ASSERT_TRUE(wifi()->IsIdle());
642 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500643 power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
Gary Morainac1bdb42012-02-16 17:42:29 -0800644 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500645 power_state_callback().Run(PowerManagerProxyDelegate::kMem);
Gary Morainac1bdb42012-02-16 17:42:29 -0800646 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500647 power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
Gary Morainac1bdb42012-02-16 17:42:29 -0800648 dispatcher_.DispatchPendingEvents();
649}
650
651TEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
652 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
653 StartWiFi();
654
655 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
656 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
657 Error error;
658 service->AddEndpoint(ap);
659 service->AutoConnect();
660 EXPECT_FALSE(wifi()->IsIdle());
661 dispatcher_.DispatchPendingEvents();
662 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500663 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800664 ASSERT_FALSE(wifi()->IsIdle());
665 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500666 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800667 dispatcher_.DispatchPendingEvents();
668}
669
mukesh agrawal31950242011-07-14 11:53:38 -0700670TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800671 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700672 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000673 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700674 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000675 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700676 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000677 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700678 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000679 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
680 const uint16 frequency = 2412;
681 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
682 kNetworkModeAdHoc);
683
684 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
685 EXPECT_EQ(5, endpoints_by_rpcid.size());
686
687 WiFi::EndpointMap::const_iterator i;
688 WiFiEndpointRefPtr endpoint;
689 for (i = endpoints_by_rpcid.begin();
690 i != endpoints_by_rpcid.end();
691 ++i) {
692 if (i->second->bssid_string() == "00:00:00:00:00:04")
693 break;
694 }
695 ASSERT_TRUE(i != endpoints_by_rpcid.end());
696 EXPECT_EQ(4, i->second->signal_strength());
697 EXPECT_EQ(frequency, i->second->frequency());
698 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700699}
700
701TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800702 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
703 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
704 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700705 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000706 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700707 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000708 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700709 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000710 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700711 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000712 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
713 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000714
715 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
716 EXPECT_EQ(3, endpoints_by_rpcid.size());
717
718 WiFi::EndpointMap::const_iterator i;
719 WiFiEndpointRefPtr endpoint;
720 for (i = endpoints_by_rpcid.begin();
721 i != endpoints_by_rpcid.end();
722 ++i) {
723 if (i->second->bssid_string() == "00:00:00:00:00:00")
724 break;
725 }
726 ASSERT_TRUE(i != endpoints_by_rpcid.end());
727 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700728}
729
730TEST_F(WiFiMainTest, ScanCompleted) {
731 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000732 EXPECT_CALL(*manager(), RegisterService(_))
733 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000734 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700735 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000736 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700737 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000738 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700739 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000740 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800741
mukesh agrawale9adda12012-02-09 18:33:48 -0800742 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000743 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800744 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800745 EXPECT_EQ(3, GetServices().size());
746
mukesh agrawale9adda12012-02-09 18:33:48 -0800747 // BSSes with empty SSIDs should be filtered.
748 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
749 EXPECT_EQ(3, GetEndpointMap().size());
750 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000751}
752
753TEST_F(WiFiMainTest, EndpointGroupingTogether) {
754 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000755
756 InSequence s;
757 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800758 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000759 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000760 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
761 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000762 ReportScanDone();
763 EXPECT_EQ(1, GetServices().size());
764}
765
766TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
767 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000768 EXPECT_CALL(*manager(), RegisterService(_))
769 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000770 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
771 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000772 ReportScanDone();
773 EXPECT_EQ(2, GetServices().size());
774}
775
776TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
777 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000778 EXPECT_CALL(*manager(), RegisterService(_))
779 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000780 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
781 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
782 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000783 ReportScanDone();
784 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700785}
786
mukesh agrawal261daca2011-12-02 18:56:56 +0000787TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
788 // Removal of non-existent BSS should not cause a crash.
789 StartWiFi();
790 RemoveBSS("bss0");
791 EXPECT_EQ(0, GetServices().size());
792}
793
mukesh agrawale9adda12012-02-09 18:33:48 -0800794TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
795 // Removal of BSS with an empty SSID should not cause a crash.
796 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
797 StartWiFi();
798 RemoveBSS("bss");
799 EXPECT_EQ(0, GetServices().size());
800}
801
802TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
803 // Removal of BSS with a NULL SSID should not cause a crash.
804 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
805 StartWiFi();
806 RemoveBSS("bss");
807 EXPECT_EQ(0, GetServices().size());
808}
809
mukesh agrawal261daca2011-12-02 18:56:56 +0000810TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800811 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000812 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000813 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000814 ReportScanDone();
815 EXPECT_EQ(1, GetServices().size());
816 EXPECT_TRUE(GetServices().front()->IsVisible());
817
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000818 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000819 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000820 EXPECT_TRUE(GetServices().empty());
821}
822
823TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800824 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000825 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000826 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000827 ReportScanDone();
828 ReportCurrentBSSChanged("bss0");
829
830 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
831 EXPECT_CALL(*manager(), DeregisterService(_));
832 RemoveBSS("bss0");
833 EXPECT_TRUE(GetServices().empty());
834}
835
836TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800837 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
838 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000839 StartWiFi();
840
841 Error e;
842 WiFiServiceRefPtr service =
843 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
844 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000845 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000846
Thieu Lee41a72d2012-02-06 20:46:51 +0000847 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
848 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000849 ReportScanDone();
850 ReportCurrentBSSChanged("bss");
851 EXPECT_EQ(1, GetServices().size());
852
853 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000854 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000855 EXPECT_EQ(1, GetServices().size());
856 // Verify expectations now, because WiFi may call UpdateService when
857 // WiFi is Stop()-ed (during TearDown()).
858 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -0800859 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000860}
861
862TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800863 EXPECT_CALL(*manager(), RegisterService(_));
864 EXPECT_CALL(*manager(), HasService(_));
865 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000866 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000867 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
868 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000869 ReportScanDone();
870 EXPECT_EQ(1, GetServices().size());
871 EXPECT_TRUE(GetServices().front()->IsVisible());
872
873 EXPECT_CALL(*manager(), UpdateService(_));
874 RemoveBSS("bss0");
875 EXPECT_TRUE(GetServices().front()->IsVisible());
876 EXPECT_EQ(1, GetServices().size());
877}
878
mukesh agrawal31950242011-07-14 11:53:38 -0700879TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800880 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700881 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
882 *supplicant_interface_proxy_;
883
mukesh agrawal31950242011-07-14 11:53:38 -0700884 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000885 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700886 ReportScanDone();
887
888 {
889 InSequence s;
890 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000891 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700892
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700893 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700894 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700895 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700896 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700897 EXPECT_EQ(static_cast<Service *>(service),
898 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700899 }
900}
901
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000902TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800903 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000904 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
905 *supplicant_interface_proxy_;
906
907 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000908 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000909 WiFiService *service(GetServices().begin()->get());
910 InitiateConnect(service);
911
912 EXPECT_FALSE(GetPendingService() == NULL);
913 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
914 InitiateDisconnect(service);
915
916 EXPECT_TRUE(GetPendingService() == NULL);
917}
918
919TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800920 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700921 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800922 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
923 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000924 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
925 *supplicant_interface_proxy_;
926
927 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000928 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
929 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000930 WiFiService *service0(GetServices()[0].get());
931 WiFiService *service1(GetServices()[1].get());
932
933 InitiateConnect(service0);
934 ReportCurrentBSSChanged("bss0");
935 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
936 InitiateConnect(service1);
937
938 EXPECT_EQ(service0, GetCurrentService());
939 EXPECT_EQ(service1, GetPendingService());
940 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
941 InitiateDisconnect(service1);
942
943 // |current_service_| will be unchanged until supplicant signals
944 // that CurrentBSS has changed.
945 EXPECT_EQ(service0, GetCurrentService());
946 // |pending_service_| is updated immediately.
947 EXPECT_TRUE(GetPendingService() == NULL);
948}
949
950TEST_F(WiFiMainTest, DisconnectCurrentService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800951 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700952 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800953 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
954 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000955 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
956 *supplicant_interface_proxy_;
957
958 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000959 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000960 WiFiService *service(GetServices().begin()->get());
961 InitiateConnect(service);
962 ReportCurrentBSSChanged("bss0");
963 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
964
965 EXPECT_EQ(service, GetCurrentService());
966 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
967 InitiateDisconnect(service);
968
969 // |current_service_| should not change until supplicant reports
970 // a BSS change.
971 EXPECT_EQ(service, GetCurrentService());
972}
973
974TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800975 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700976 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800977 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
978 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000979 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
980 *supplicant_interface_proxy_;
981
982 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000983 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
984 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000985 WiFiService *service0(GetServices()[0].get());
986 WiFiService *service1(GetServices()[1].get());
987
988 InitiateConnect(service0);
989 ReportCurrentBSSChanged("bss0");
990 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
991 InitiateConnect(service1);
992
993 EXPECT_EQ(service0, GetCurrentService());
994 EXPECT_EQ(service1, GetPendingService());
995 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
996 .Times(0);
997 InitiateDisconnect(service0);
998
999 EXPECT_EQ(service0, GetCurrentService());
1000 EXPECT_EQ(service1, GetPendingService());
1001}
1002
1003TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001004 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001005 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1006 *supplicant_interface_proxy_;
1007
1008 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001009 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001010 WiFiService *service(GetServices().begin()->get());
1011 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1012 .Times(0);
1013 InitiateDisconnect(service);
1014}
1015
1016TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001017 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001018 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001019 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1020 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001021 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1022 *supplicant_interface_proxy_;
1023
1024 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001025 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001026
1027 WiFiService *service(GetServices().begin()->get());
1028 DBus::Path fake_path("/fake/path");
1029 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
1030 .WillOnce(Return(fake_path));
1031 InitiateConnect(service);
1032 ReportCurrentBSSChanged("bss0");
1033 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1034
1035 EXPECT_EQ(service, GetCurrentService());
1036 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1037 .WillRepeatedly(Throw(
1038 DBus::Error(
1039 "fi.w1.wpa_supplicant1.NotConnected",
1040 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1041 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1042 InitiateDisconnect(service);
1043
1044 EXPECT_TRUE(GetCurrentService() == NULL);
1045}
1046
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001047TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001048 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001049 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001050 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001051 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001052
mukesh agrawalc01f3982012-01-24 13:48:39 -08001053 EXPECT_CALL(*manager(), DeregisterService(_));
1054 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001055 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001056}
1057
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001058TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1059 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001060 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001061 EXPECT_TRUE(e.IsSuccess());
1062}
1063
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001064TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1065 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001066 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001067 EXPECT_EQ(Error::kInvalidArguments, e.type());
1068 EXPECT_EQ("must specify SSID", e.message());
1069}
1070
1071TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1072 Error e;
1073 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001074 flimflam::kTypeWifi, "123456789012345678901234567890123",
1075 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001076 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1077 EXPECT_EQ("SSID is too long", e.message());
1078}
1079
1080TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1081 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001082 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001083 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1084 EXPECT_EQ("SSID is too short", e.message());
1085}
1086
1087TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1088 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001089 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001090 EXPECT_EQ(Error::kNotSupported, e.type());
1091 EXPECT_EQ("service mode is unsupported", e.message());
1092}
1093
1094TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1095 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001096 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001097 EXPECT_TRUE(e.IsSuccess());
1098}
1099
1100TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1101 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001102 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1103 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001104 EXPECT_TRUE(e.IsSuccess());
1105}
1106
1107TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001108 // When configuring hidden networks, Chrome expects to be able to
1109 // GetService w/o a password, and supply the password with
1110 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001111 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001112 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1113 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001114 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001115}
1116
1117TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1118 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001119 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1120 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001121 EXPECT_EQ(Error::kNotSupported, e.type());
1122 EXPECT_EQ("security mode is unsupported", e.message());
1123}
1124
1125TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001126 // When configuring hidden networks, Chrome expects to be able to
1127 // GetService w/o a password, and supply the password with
1128 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001129 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001130 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1131 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001132 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001133}
1134
1135TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1136 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001137 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1138 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001139 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1140}
1141
1142TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1143 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001144 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1145 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001146 EXPECT_TRUE(e.IsSuccess());
1147}
1148
1149TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1150 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001151 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1152 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001153 EXPECT_TRUE(e.IsSuccess());
1154}
1155
1156TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1157 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001158 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1159 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001160 EXPECT_TRUE(e.IsSuccess());
1161}
1162
1163TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1164 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001165 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1166 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001167 EXPECT_TRUE(e.IsSuccess());
1168}
1169
1170TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1171 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001172 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1173 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001174 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1175}
1176
1177TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1178 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001179 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1180 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001181 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1182}
1183
1184TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1185 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001186 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1187 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001188 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1189}
1190
1191TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1192 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001193 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1194 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001195 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1196}
1197
1198TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1199 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001200 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1201 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001202 EXPECT_TRUE(e.IsSuccess());
1203}
1204
1205TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1206 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001207 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1208 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001209 EXPECT_TRUE(e.IsSuccess());
1210}
1211
1212TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1213 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001214 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1215 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001216 EXPECT_TRUE(e.IsSuccess());
1217}
1218
1219TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1220 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001221 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1222 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001223 EXPECT_TRUE(e.IsSuccess());
1224}
1225
mukesh agrawal8ede0522011-10-03 14:57:44 -07001226class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1227class WiFiGetServiceFailureTest : public WiFiMainTest {};
1228
1229TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1230 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001231 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1232 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001233 EXPECT_TRUE(e.IsSuccess());
1234}
1235
1236TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1237 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001238 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1239 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001240 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1241}
1242
1243INSTANTIATE_TEST_CASE_P(
1244 WiFiGetServiceSuccessTestInstance,
1245 WiFiGetServiceSuccessTest,
1246 Values(
1247 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1248 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1249 // subtle: invalid length for hex key, but valid as ascii passphrase
1250 string(IEEE_80211::kWPAHexLen-1, '1'),
1251 string(IEEE_80211::kWPAHexLen, '1')));
1252
1253INSTANTIATE_TEST_CASE_P(
1254 WiFiGetServiceFailureTestInstance,
1255 WiFiGetServiceFailureTest,
1256 Values(
1257 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1258 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1259 string(IEEE_80211::kWPAHexLen+1, '1')));
1260
Paul Stewart6ab23a92011-11-09 17:17:47 -08001261TEST_F(WiFiMainTest, FindServiceWEP) {
1262 const string ssid("an_ssid");
1263 {
1264 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001265 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001266 flimflam::kSecurityWep, "abcde", &e);
1267 EXPECT_TRUE(e.IsSuccess());
1268 }
1269 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1270
Paul Stewarta41e38d2011-11-11 07:47:29 -08001271 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1272 flimflam::kSecurityWep).get());
1273 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1274 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001275}
1276
1277TEST_F(WiFiMainTest, FindServiceWPA) {
1278 const string ssid("an_ssid");
1279 {
1280 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001281 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001282 flimflam::kSecurityRsn, "abcdefgh", &e);
1283 EXPECT_TRUE(e.IsSuccess());
1284 }
1285 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001286 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1287 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001288 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001289 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1290 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001291 EXPECT_TRUE(rsn_service.get());
1292 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001293 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1294 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001295 EXPECT_EQ(wpa_service.get(), psk_service.get());
1296 // Indirectly test FindService by doing a GetService on something that
1297 // already exists.
1298 {
1299 Error e;
1300 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001301 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1302 flimflam::kModeManaged, flimflam::kSecurityWpa,
1303 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001304 EXPECT_TRUE(e.IsSuccess());
1305 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1306 }
1307}
1308
Paul Stewartcb59fed2012-03-21 21:14:46 -07001309TEST_F(WiFiMainTest, GetServiceWithGUID) {
1310 // Perform a GetService that also configures properties in the base Service
1311 // class using Service::Configure().
1312 KeyValueStore args;
1313 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1314 args.SetString(flimflam::kSSIDProperty, "ssid");
1315 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1316 const string kGUID = "aguid"; // Stored as a registered Service property.
1317 args.SetString(flimflam::kGuidProperty, kGUID);
1318 Error e;
1319 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1320 EXPECT_TRUE(e.IsSuccess());
1321 EXPECT_EQ(kGUID, service->guid());
1322}
1323
Paul Stewartced6a0b2011-11-08 15:32:04 -08001324MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001325 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001326 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1327 if (it == arg.end()) {
1328 return false;
1329 }
1330
1331 const DBus::Variant &ssids_variant = it->second;
1332 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1333 const ByteArrays &ssids = it->second.operator ByteArrays();
1334 // A valid Scan containing a single hidden SSID should contain
1335 // two SSID entries: one containing the SSID we are looking for,
1336 // and an empty entry, signifying that we also want to do a
1337 // broadcast probe request for all non-hidden APs as well.
1338 return ssids.size() == 2 &&
1339 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1340 ssids[1].empty();
1341}
1342
1343TEST_F(WiFiMainTest, ScanHidden) {
1344 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1345 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1346 .Times(AnyNumber())
1347 .WillRepeatedly(Throw(
1348 DBus::Error(
1349 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1350 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001351 scoped_refptr<MockProfile> profile(
1352 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001353 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001354 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001355 Error e;
1356 WiFiServiceRefPtr service =
1357 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1358 NULL, NULL, true, &e);
1359 EXPECT_TRUE(e.IsSuccess());
1360 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001361 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001362 }
1363 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001364 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001365 Error e;
1366 WiFiServiceRefPtr service =
1367 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1368 NULL, NULL, true, &e);
1369 EXPECT_TRUE(e.IsSuccess());
1370 EXPECT_TRUE(service->hidden_ssid());
1371 }
1372 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001373 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001374 Error e;
1375 WiFiServiceRefPtr service =
1376 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1377 NULL, NULL, false, &e);
1378 EXPECT_TRUE(e.IsSuccess());
1379 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001380 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001381 }
1382 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001383 StartWiFi();
1384 dispatcher_.DispatchPendingEvents();
1385}
1386
mukesh agrawal7ec71312011-11-10 02:08:26 +00001387TEST_F(WiFiMainTest, InitialSupplicantState) {
1388 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1389}
1390
1391TEST_F(WiFiMainTest, StateChangeNoService) {
1392 // State change should succeed even if there is no pending Service.
1393 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1394 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1395}
1396
1397TEST_F(WiFiMainTest, StateChangeWithService) {
1398 // Forward transition should trigger a Service state change.
1399 StartWiFi();
1400 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001401 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001402 InitiateConnect(service);
1403 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1404 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1405 // Verify expectations now, because WiFi may report other state changes
1406 // when WiFi is Stop()-ed (during TearDown()).
1407 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001408 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001409}
1410
1411TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1412 // Some backwards transitions should not trigger a Service state change.
1413 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001414 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001415 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001416 StartWiFi();
1417 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001418 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Gary Moraind9f893f2012-02-06 10:03:40 -08001419 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001420 InitiateConnect(service);
1421 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001422 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1423 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1424 GetSupplicantState());
1425 // Verify expectations now, because WiFi may report other state changes
1426 // when WiFi is Stop()-ed (during TearDown()).
1427 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001428 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001429}
1430
Paul Stewarta41e38d2011-11-11 07:47:29 -08001431TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1432 StrictMock<MockStore> storage;
1433 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1434 .WillOnce(Return(set<string>()));
1435 EXPECT_FALSE(LoadHiddenServices(&storage));
1436}
1437
1438TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1439 string id;
1440 StrictMock<MockStore> storage;
1441 SetupHiddenStorage(&storage, "an_ssid", &id);
1442 // Missing "Hidden" property.
1443 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1444 .WillOnce(Return(false));
1445 EXPECT_FALSE(LoadHiddenServices(&storage));
1446}
1447
1448TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1449 string id;
1450 StrictMock<MockStore> storage;
1451 SetupHiddenStorage(&storage, "an_ssid", &id);
1452 // "Hidden" property set to "false".
1453 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1454 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1455 EXPECT_FALSE(LoadHiddenServices(&storage));
1456}
1457
1458TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1459 string id;
1460 StrictMock<MockStore> storage;
1461 SetupHiddenStorage(&storage, "an_ssid", &id);
1462 // Missing "SSID" property.
1463 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1464 .WillOnce(Return(false));
1465 EXPECT_FALSE(LoadHiddenServices(&storage));
1466}
1467
1468
1469TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1470 StrictMock<MockStore> storage;
1471 string id;
1472 SetupHiddenStorage(&storage, "an_ssid", &id);
1473 Error e;
1474 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1475 ASSERT_TRUE(e.IsSuccess());
1476 EXPECT_FALSE(LoadHiddenServices(&storage));
1477}
1478
1479TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001480 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001481 StrictMock<MockStore> storage;
1482 string ssid("an_ssid");
1483 string id;
1484 SetupHiddenStorage(&storage, ssid, &id);
1485 EXPECT_TRUE(LoadHiddenServices(&storage));
1486 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1487 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1488 flimflam::kSecurityNone).get());
1489}
1490
mukesh agrawal15908392011-11-16 18:29:25 +00001491TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001492 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001493 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001494 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1495 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001496 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1497 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1498
1499 // Note that the BSS handle used in this test ("an_ap") is not
1500 // intended to reflect the format used by supplicant. It's just
1501 // convenient for testing.
1502
1503 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001504 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001505 kNetworkModeInfrastructure);
1506 InitiateConnect(service);
1507 EXPECT_EQ(service, GetPendingService().get());
1508
1509 ReportCurrentBSSChanged("an_ap");
1510 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1511 EXPECT_EQ(Service::kStateConfiguring, service->state());
1512 EXPECT_EQ(service, GetCurrentService().get());
1513 EXPECT_EQ(NULL, GetPendingService().get());
1514
1515 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001516 EXPECT_EQ(Service::kStateIdle, service->state());
1517 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001518 EXPECT_EQ(NULL, GetCurrentService().get());
1519 EXPECT_EQ(NULL, GetPendingService().get());
1520}
1521
1522TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001523 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001524 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001525 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1526 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001527 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1528 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1529 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1530 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1531
1532 // Note that the BSS handles used in this test ("ap1", "ap2") are
1533 // not intended to reflect the format used by supplicant. They're
1534 // just convenient for testing.
1535
1536 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001537 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001538 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001539 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001540 kNetworkModeInfrastructure);
1541 InitiateConnect(service1);
1542 ReportCurrentBSSChanged("ap1");
1543 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1544 EXPECT_EQ(service1.get(), GetCurrentService().get());
1545
mukesh agrawalc01f3982012-01-24 13:48:39 -08001546 // Note that we deliberately omit intermediate supplicant states
1547 // (e.g. kInterfaceStateAssociating), on the theory that they are
1548 // unreliable. Specifically, they may be quashed if the association
1549 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001550 ReportCurrentBSSChanged("ap2");
1551 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1552 EXPECT_EQ(service2.get(), GetCurrentService().get());
1553 EXPECT_EQ(Service::kStateIdle, service1->state());
1554 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1555}
1556
1557TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001558 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1559 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001560 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001561 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001562 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1563 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1564
1565 // Note that the BSS handle used in this test ("an_ap") is not
1566 // intended to reflect the format used by supplicant. It's just
1567 // convenient for testing.
1568
1569 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001570 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001571 kNetworkModeInfrastructure);
1572 InitiateConnect(service);
1573 ReportCurrentBSSChanged("an_ap");
1574 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1575 EXPECT_EQ(service.get(), GetCurrentService().get());
1576 EXPECT_EQ(Service::kStateConfiguring, service->state());
1577}
1578
Thieu Lee41a72d2012-02-06 20:46:51 +00001579TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001580 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1581 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1582 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1583
Thieu Lee41a72d2012-02-06 20:46:51 +00001584 const uint16 frequency1 = 2412;
1585 const uint16 frequency2 = 2442;
1586 StartWiFi();
1587 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1588 kNetworkModeInfrastructure);
1589 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1590 kNetworkModeInfrastructure);
1591 EXPECT_EQ(1, GetServices().size());
1592 WiFiService *service(GetServices()[0].get());
1593 InitiateConnect(service);
1594 ReportCurrentBSSChanged("bss1");
1595 EXPECT_EQ(frequency1, service->frequency_);
1596 ReportCurrentBSSChanged("bss2");
1597 EXPECT_EQ(frequency2, service->frequency_);
1598}
1599
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001600TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1601 Error e;
1602 EXPECT_CALL(*manager(), RegisterService(_))
1603 .Times(0);
1604 EXPECT_CALL(*manager(), HasService(_))
1605 .WillOnce(Return(false));
1606 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1607 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001608 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001609 kNetworkModeInfrastructure);
1610}
1611
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001612TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001613 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1614 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001615 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1616 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1617 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1618 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1619
1620 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001621 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001622 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001623 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001624 kNetworkModeInfrastructure);
1625 InitiateConnect(service1);
1626 EXPECT_EQ(service1.get(), GetPendingService().get());
1627
1628 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1629 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1630 InitiateConnect(service2);
1631 EXPECT_EQ(service2.get(), GetPendingService().get());
1632}
1633
1634TEST_F(WiFiMainTest, IsIdle) {
1635 StartWiFi();
1636 EXPECT_TRUE(wifi()->IsIdle());
1637
1638 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1639 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1640 Error error;
1641 service->AddEndpoint(ap);
1642 service->AutoConnect();
1643 EXPECT_FALSE(wifi()->IsIdle());
1644}
1645
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001646MATCHER(WiFiAddedArgs, "") {
1647 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1648 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1649}
1650
1651TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001652 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001653 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1654 *supplicant_interface_proxy_;
1655
1656 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001657 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001658 WiFiService *service(GetServices().begin()->get());
1659 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1660 InitiateConnect(service);
1661}
1662
mukesh agrawalc01f3982012-01-24 13:48:39 -08001663TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1664 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001665 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001666 InitiateConnect(service);
1667 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1668 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1669 ReportLinkUp();
1670
1671 // Verify expectations now, because WiFi may cause |service| state
1672 // changes during TearDown().
1673 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001674 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001675}
1676
1677TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001678 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
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(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001681 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1682 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1683
1684 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001685 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001686 kNetworkModeInfrastructure);
1687 InitiateConnect(service);
1688
1689 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1690 ReportCurrentBSSChanged("ap");
1691 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1692 EXPECT_EQ(Service::kStateConfiguring, service->state());
1693}
1694
1695TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001696 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1697 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1698 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1699 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001700 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001701 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08001702 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001703 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1704 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1705
mukesh agrawalc01f3982012-01-24 13:48:39 -08001706 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001707 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001708 kNetworkModeInfrastructure);
1709 InitiateConnect(service);
1710 ReportCurrentBSSChanged("ap");
1711 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1712 ReportIPConfigComplete();
1713 Mock::VerifyAndClearExpectations(service);
1714
1715 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1716 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1717}
1718
Paul Stewart66c86002012-01-30 18:00:52 -08001719TEST_F(WiFiMainTest, ClearCachedCredentials) {
1720 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1721 *supplicant_interface_proxy_;
1722
1723 StartWiFi();
1724
1725 // Ensure call to the proxy is deferred.
1726 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1727 .Times(0);
1728 ClearCachedCredentials();
1729
1730 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1731
1732 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1733 .Times(1);
1734 dispatcher_.DispatchPendingEvents();
1735
1736 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1737
1738 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1739 .Times(0);
1740 ClearCachedCredentials();
1741 ClearCachedCredentials();
1742
1743 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1744
1745 // Ensure multiple calls to ClearCachedCredentials() results in only
1746 // one call to the proxy.
1747 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1748 .Times(1);
1749 dispatcher_.DispatchPendingEvents();
1750}
1751
mukesh agrawalb20776f2012-02-10 16:00:36 -08001752TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1753 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1754 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1755 // we can test the interaction between WiFi and WiFiEndpoint. (Right
1756 // now, we're testing across multiple layers.)
1757 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1758 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1759 StartWiFi();
1760 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1761}
1762
1763TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1764 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1765 // factory for WiFiEndpoints.
1766 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1767
1768 // Get the pointer before we transfer ownership.
1769 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1770 EXPECT_CALL(*proxy, Die());
1771 StartWiFi();
1772 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1773 RemoveBSS("bss0");
1774 // Check this now, to make sure RemoveBSS killed the proxy (rather
1775 // than TearDown).
1776 Mock::VerifyAndClearExpectations(proxy);
1777}
1778
mukesh agrawal5c05b292012-03-07 10:12:52 -08001779TEST_F(WiFiMainTest, FlushBSSOnResume) {
1780 const struct timeval resume_time = {1, 0};
1781 const struct timeval scan_done_time = {6, 0};
1782 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1783 *supplicant_interface_proxy_;
1784
1785 StartWiFi();
1786
1787 EXPECT_CALL(time_, GetTimeMonotonic(_))
1788 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
1789 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
1790 EXPECT_CALL(supplicant_interface_proxy,
1791 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
Eric Shienbrood3e20a232012-02-16 11:35:56 -05001792 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
mukesh agrawal5c05b292012-03-07 10:12:52 -08001793 ReportScanDone();
1794}
1795
mukesh agrawalb66c6462012-05-07 11:45:25 -07001796TEST_F(WiFiMainTest, ScanTimerIdle) {
1797 StartWiFi();
1798 dispatcher_.DispatchPendingEvents();
1799 ReportScanDone();
1800 CancelScanTimer();
1801 EXPECT_TRUE(GetScanTimer().IsCancelled());
1802
1803 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1804 FireScanTimer();
1805 dispatcher_.DispatchPendingEvents();
1806 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1807}
1808
1809TEST_F(WiFiMainTest, ScanTimerScanning) {
1810 StartWiFi();
1811 dispatcher_.DispatchPendingEvents();
1812 CancelScanTimer();
1813 EXPECT_TRUE(GetScanTimer().IsCancelled());
1814
1815 // Should not call Scan, since we're already scanning.
1816 // (Scanning is triggered by StartWiFi.)
1817 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1818 FireScanTimer();
1819 dispatcher_.DispatchPendingEvents();
1820 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1821}
1822
1823TEST_F(WiFiMainTest, ScanTimerConnecting) {
1824 StartWiFi();
1825 dispatcher_.DispatchPendingEvents();
1826 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1827 ReportScanDone();
1828 WiFiService *service(GetServices().begin()->get());
1829 InitiateConnect(service);
1830 CancelScanTimer();
1831 EXPECT_TRUE(GetScanTimer().IsCancelled());
1832
1833 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1834 FireScanTimer();
1835 dispatcher_.DispatchPendingEvents();
1836 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1837}
1838
1839TEST_F(WiFiMainTest, ScanTimerReconfigured) {
1840 StartWiFi();
1841 CancelScanTimer();
1842 EXPECT_TRUE(GetScanTimer().IsCancelled());
1843
1844 SetScanInterval(1);
1845 EXPECT_FALSE(GetScanTimer().IsCancelled());
1846}
1847
1848TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1849 StartWiFi();
1850 CancelScanTimer();
1851 EXPECT_TRUE(GetScanTimer().IsCancelled());
1852
1853 ReportScanDone();
1854 EXPECT_FALSE(GetScanTimer().IsCancelled());
1855}
1856
1857TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1858 StartWiFi();
1859 EXPECT_FALSE(GetScanTimer().IsCancelled());
1860
1861 SetScanInterval(0);
1862 EXPECT_TRUE(GetScanTimer().IsCancelled());
1863}
1864
1865TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1866 Error e;
1867 scoped_refptr<MockProfile> profile(
1868 new NiceMock<MockProfile>(control_interface(), manager(), ""));
1869 WiFiServiceRefPtr hidden_service =
1870 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
1871 flimflam::kModeManaged, NULL, NULL, true, &e);
1872 hidden_service->set_profile(profile);
1873
1874 StartWiFi();
1875 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1876 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1877 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1878 kNetworkModeInfrastructure);
1879 InitiateConnect(service);
1880 ReportCurrentBSSChanged("an_ap");
1881 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1882 dispatcher_.DispatchPendingEvents();
1883
1884 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1885 Scan(HasHiddenSSID("hidden_ssid")));
1886 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1887 dispatcher_.DispatchPendingEvents();
1888}
1889
1890TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1891 StartWiFi();
1892 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1893 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1894 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1895 kNetworkModeInfrastructure);
1896 InitiateConnect(service);
1897 ReportCurrentBSSChanged("an_ap");
1898 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1899 dispatcher_.DispatchPendingEvents();
1900
1901 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1902 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1903 dispatcher_.DispatchPendingEvents();
1904}
1905
mukesh agrawalcf24a242012-05-21 16:46:11 -07001906TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
1907 Error e;
1908 WiFiServiceRefPtr service = GetOpenService(
1909 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1910 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1911 EXPECT_FALSE(service->has_ever_connected());
1912 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1913}
1914
1915TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
1916 Error e;
1917 WiFiServiceRefPtr service =
1918 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1919 flimflam::kSecurityWpa, "abcdefgh", &e);
1920 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1921 EXPECT_FALSE(service->has_ever_connected());
1922 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
1923}
1924
1925TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
1926 Error e;
1927 WiFiServiceRefPtr service =
1928 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1929 flimflam::kSecurityWpa, "abcdefgh", &e);
1930 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1931 service->has_ever_connected_ = true;
1932 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1933}
1934
1935TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
1936 ScopedMockLog log;
1937 Error e;
1938 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1939 SetPendingService(service);
1940 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1941 EXPECT_FALSE(service->has_ever_connected());
1942
1943 EXPECT_CALL(*service, SetFailure(Service::kFailureBadCredentials));
1944 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1945 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
1946 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1947 EXPECT_EQ(Service::kStateIdle, service->state());
1948 EXPECT_TRUE(service->IsFailed());
1949}
1950
Paul Stewartbc6e7392012-05-24 07:07:48 -07001951
Paul Stewarte369ece2012-05-22 09:11:03 -07001952// Scanning tests will use a mock of the event dispatcher instead of a real
1953// one.
1954class WiFiScanTest : public WiFiObjectTest {
1955 public:
1956 WiFiScanTest() : WiFiObjectTest(&mock_dispatcher_) {}
1957
1958 protected:
1959 void ExpectInitialScanSequence();
1960
1961 StrictMock<MockEventDispatcher> mock_dispatcher_;
1962};
1963
1964void WiFiScanTest::ExpectInitialScanSequence() {
1965 // Choose a number of iterations some multiple higher than the fast scan
1966 // count.
1967 const int kScanTimes = WiFi::kNumFastScanAttempts * 4;
1968
1969 // Each time we call FireScanTimer() below, WiFi will post a task to actually
1970 // run Scan() on the wpa_supplicant proxy.
1971 EXPECT_CALL(mock_dispatcher_, PostTask(_))
1972 .Times(kScanTimes);
1973 {
1974 InSequence seq;
1975 // The scans immediately after the initial scan should happen at the short
1976 // interval. If we add the initial scan (not invoked in this function) to
1977 // the ones in the expectation below, we get WiFi::kNumFastScanAttempts at
1978 // the fast scan interval.
1979 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1980 _, WiFi::kFastScanIntervalSeconds * 1000))
1981 .Times(WiFi::kNumFastScanAttempts - 1)
1982 .WillRepeatedly(Return(true));
1983
1984 // After this, the WiFi device should use the normal scan interval.
1985 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
1986 _, GetScanInterval() * 1000))
1987 .Times(kScanTimes - WiFi::kNumFastScanAttempts + 1)
1988 .WillRepeatedly(Return(true));
1989
1990 for (int i = 0; i < kScanTimes; i++) {
1991 FireScanTimer();
1992 }
1993 }
1994}
1995
1996TEST_F(WiFiScanTest, FastRescan) {
1997 // This PostTask is a result of the call to Scan(NULL), and is meant to
1998 // post a task to call Scan() on the wpa_supplicant proxy immediately.
1999 EXPECT_CALL(mock_dispatcher_, PostTask(_));
2000 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2001 _, WiFi::kFastScanIntervalSeconds * 1000))
2002 .WillOnce(Return(true));
2003 StartWiFi();
2004
2005 ExpectInitialScanSequence();
2006
2007 // If we end up disconnecting, the sequence should repeat.
2008 EXPECT_CALL(mock_dispatcher_, PostDelayedTask(
2009 _, WiFi::kFastScanIntervalSeconds * 1000))
2010 .WillOnce(Return(true));
2011 RestartFastScanAttempts();
2012
2013 ExpectInitialScanSequence();
2014}
2015
Paul Stewartbc6e7392012-05-24 07:07:48 -07002016TEST_F(WiFiMainTest, EAPCertification) {
2017 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurity8021x);
2018 EXPECT_CALL(*service, AddEAPCertification(_, _)).Times(0);
2019
2020 ScopedMockLog log;
2021 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no current service.")));
2022 map<string, ::DBus::Variant> args;
2023 ReportCertification(args);
2024 Mock::VerifyAndClearExpectations(&log);
2025
2026 SetCurrentService(service);
2027 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("no depth parameter.")));
2028 ReportCertification(args);
2029 Mock::VerifyAndClearExpectations(&log);
2030
2031 const uint32 kDepth = 123;
2032 args[wpa_supplicant::kInterfacePropertyDepth].writer().append_uint32(kDepth);
2033
2034 EXPECT_CALL(log,
2035 Log(logging::LOG_ERROR, _, EndsWith("no subject parameter.")));
2036 ReportCertification(args);
2037 Mock::VerifyAndClearExpectations(&log);
2038
2039 const string kSubject("subject");
2040 args[wpa_supplicant::kInterfacePropertySubject].writer()
2041 .append_string(kSubject.c_str());
2042 EXPECT_CALL(*service, AddEAPCertification(kSubject, kDepth)).Times(1);
2043 ReportCertification(args);
2044}
2045
Chris Masone853b81b2011-06-24 14:11:41 -07002046} // namespace shill