blob: 846884e19fc7713e31d0f5f62955647ec1c516e5 [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"
mukesh agrawalcf24a242012-05-21 16:46:11 -070036#include "shill/mock_log.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070037#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080038#include "shill/mock_metrics.h"
Gary Morainac1bdb42012-02-16 17:42:29 -080039#include "shill/mock_power_manager.h"
40#include "shill/mock_power_manager_proxy.h"
Paul Stewart10ccbb32012-04-26 15:59:30 -070041#include "shill/mock_profile.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070042#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080043#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080044#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070045#include "shill/mock_supplicant_interface_proxy.h"
46#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080047#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000048#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070049#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070050#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070051#include "shill/proxy_factory.h"
52#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070053#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080054#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070055
Gary Morainac1bdb42012-02-16 17:42:29 -080056
Chris Masone853b81b2011-06-24 14:11:41 -070057using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080058using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070059using std::string;
60using std::vector;
61using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070062using ::testing::AnyNumber;
63using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080064using ::testing::DoAll;
mukesh agrawalcf24a242012-05-21 16:46:11 -070065using ::testing::EndsWith;
mukesh agrawal31950242011-07-14 11:53:38 -070066using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080067using ::testing::Invoke;
mukesh agrawal7ec71312011-11-10 02:08:26 +000068using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070069using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070070using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080071using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080072using ::testing::SetArgumentPointee;
73using ::testing::StrEq;
74using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070075using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070076using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070077using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070078
79namespace shill {
80
mukesh agrawal31950242011-07-14 11:53:38 -070081class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070082 public:
mukesh agrawal31950242011-07-14 11:53:38 -070083 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080084 : device_(new WiFi(control_interface(),
85 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070086 }
mukesh agrawal31950242011-07-14 11:53:38 -070087 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070088
89 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080090 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070091};
92
mukesh agrawal31950242011-07-14 11:53:38 -070093TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070094 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
95 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070096}
97
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080098TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070099 {
100 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800101 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -0700102 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 flimflam::kBgscanSignalThresholdProperty,
104 PropertyStoreTest::kInt32V,
105 &error));
106 }
107 {
108 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800109 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
110 flimflam::kScanIntervalProperty,
111 PropertyStoreTest::kUint16V,
112 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700113 }
Chris Masone853b81b2011-06-24 14:11:41 -0700114 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 {
116 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800117 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
118 flimflam::kScanningProperty,
119 PropertyStoreTest::kBoolV,
120 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700121 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700122 }
Chris Masone853b81b2011-06-24 14:11:41 -0700123
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800124 {
125 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800126 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800127 device_->mutable_store(),
128 flimflam::kBgscanMethodProperty,
129 DBusAdaptor::StringToVariant(
130 wpa_supplicant::kNetworkBgscanMethodSimple),
131 &error));
132 }
133
134 {
135 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800136 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800137 device_->mutable_store(),
138 flimflam::kBgscanMethodProperty,
139 DBusAdaptor::StringToVariant("not a real scan method"),
140 &error));
141 }
142}
143
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800144TEST_F(WiFiPropertyTest, ClearDerivedProperty) {
145 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
146 WiFi::kDefaultBgscanMethod);
147 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
148
149 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800150 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800151 device_->mutable_store(),
152 flimflam::kBgscanMethodProperty,
153 DBusAdaptor::StringToVariant(
154 wpa_supplicant::kNetworkBgscanMethodLearn),
155 &error));
156 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
157
158 EXPECT_TRUE(DBusAdaptor::ClearProperty(
159 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
160 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
161}
162
mukesh agrawal8ede0522011-10-03 14:57:44 -0700163class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700164 public:
165 WiFiMainTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800166 : manager_(&control_interface_, NULL, &metrics_, &glib_),
mukesh agrawalc01f3982012-01-24 13:48:39 -0800167 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700168 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700169 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800170 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700171 &manager_,
172 kDeviceName,
173 kDeviceAddress,
174 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700175 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
176 supplicant_interface_proxy_(
177 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800178 supplicant_bss_proxy_(
179 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700180 dhcp_config_(new MockDHCPConfig(&control_interface_,
Paul Stewartd408fdf2012-05-07 17:15:57 -0700181 kDeviceName)),
Gary Morainac1bdb42012-02-16 17:42:29 -0800182 proxy_factory_(this),
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500183 power_manager_(new MockPowerManager(&proxy_factory_)) {
mukesh agrawal31950242011-07-14 11:53:38 -0700184 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000185 // Except for WiFiServices created via WiFi::GetService, we expect
186 // that any WiFiService has been registered with the Manager. So
187 // default Manager.HasService to true, to make the common case
188 // easy.
189 ON_CALL(manager_, HasService(_)).
190 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800191
Paul Stewartd408fdf2012-05-07 17:15:57 -0700192 ON_CALL(dhcp_provider_, CreateConfig(_, _, _, _)).
mukesh agrawalc01f3982012-01-24 13:48:39 -0800193 WillByDefault(Return(dhcp_config_));
194 ON_CALL(*dhcp_config_.get(), RequestIP()).
195 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800196
197 // |manager_| takes ownership of |power_manager_|.
198 manager_.set_power_manager(power_manager_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800199
200 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700201 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700202
203 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700204 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700205 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
206 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800207 ON_CALL(manager_, device_info()).
208 WillByDefault(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700209 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800210 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700211 }
212
213 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800214 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Gary Morain91001122012-02-29 16:22:26 -0800215 EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
216 .Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500217 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800218 if (supplicant_bss_proxy_.get()) {
219 EXPECT_CALL(*supplicant_bss_proxy_, Die());
220 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700221 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700222 // must Stop WiFi instance, to clear its list of services.
223 // otherwise, the WiFi instance will not be deleted. (because
224 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500225 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700226 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700227 }
228
mukesh agrawal31950242011-07-14 11:53:38 -0700229 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000230 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
231
mukesh agrawal31950242011-07-14 11:53:38 -0700232 class TestProxyFactory : public ProxyFactory {
233 public:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800234 explicit TestProxyFactory(WiFiMainTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700235
236 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700237 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700238 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700239 }
240
241 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700242 const WiFiRefPtr &/*wifi*/,
243 const DBus::Path &/*object_path*/,
244 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700245 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700246 }
247
mukesh agrawalb20776f2012-02-10 16:00:36 -0800248 MOCK_METHOD3(CreateSupplicantBSSProxy,
249 SupplicantBSSProxyInterface *(
250 WiFiEndpoint *wifi_endpoint,
251 const DBus::Path &object_path,
252 const char *dbus_addr));
253
Gary Morainac1bdb42012-02-16 17:42:29 -0800254 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
255 PowerManagerProxyDelegate */*delegate*/) {
256 return new MockPowerManagerProxy();
257 }
258
mukesh agrawal31950242011-07-14 11:53:38 -0700259 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800260 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
261 WiFiEndpoint */*wifi_endpoint*/,
262 const DBus::Path &/*object_path*/,
263 const char */*dbus_addr*/) {
264 return test_->supplicant_bss_proxy_.release();
265 }
266
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700267 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700268 };
269
mukesh agrawalb66c6462012-05-07 11:45:25 -0700270 void CancelScanTimer() {
271 wifi_->scan_timer_callback_.Cancel();
272 }
mukesh agrawal15908392011-11-16 18:29:25 +0000273 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
274 bool hidden_ssid = false;
275 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
276 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700277 void FireScanTimer() {
278 wifi_->ScanTimerHandler();
279 }
mukesh agrawal15908392011-11-16 18:29:25 +0000280 const WiFiServiceRefPtr &GetCurrentService() {
281 return wifi_->current_service_;
282 }
mukesh agrawal31950242011-07-14 11:53:38 -0700283 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000284 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700285 }
mukesh agrawal15908392011-11-16 18:29:25 +0000286 const WiFiServiceRefPtr &GetPendingService() {
287 return wifi_->pending_service_;
288 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700289 const base::CancelableClosure &GetScanTimer() {
290 return wifi_->scan_timer_callback_;
291 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000292 const vector<WiFiServiceRefPtr> &GetServices() {
293 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700294 }
295 // note: the tests need the proxies referenced by WiFi (not the
296 // proxies instantiated by WiFiMainTest), to ensure that WiFi
297 // sets up its proxies correctly.
298 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
299 return wifi_->supplicant_process_proxy_.get();
300 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000301 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
302 return dynamic_cast<MockSupplicantInterfaceProxy *>(
303 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700304 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000305 const string &GetSupplicantState() {
306 return wifi_->supplicant_state_;
307 }
308 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700309 map<string, ::DBus::Variant> params;
310 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700311 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000312 void InitiateDisconnect(WiFiServiceRefPtr service) {
313 wifi_->DisconnectFrom(service);
314 }
mukesh agrawal15908392011-11-16 18:29:25 +0000315 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800316 return WiFiEndpoint::MakeOpenEndpoint(
317 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000318 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700319 MockWiFiServiceRefPtr MakeMockService(const std::string &security) {
mukesh agrawal7ec71312011-11-10 02:08:26 +0000320 vector<uint8_t> ssid(1, 'a');
321 return new MockWiFiService(
322 &control_interface_,
323 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800324 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000325 &manager_,
326 wifi_,
327 ssid,
328 flimflam::kModeManaged,
mukesh agrawalcf24a242012-05-21 16:46:11 -0700329 security,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000330 false);
331 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000332 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700333 void ReportBSS(const ::DBus::Path &bss_path,
334 const string &ssid,
335 const string &bssid,
336 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000337 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700338 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800339 void ClearCachedCredentials() {
340 wifi_->ClearCachedCredentials();
341 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800342 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100343 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800344 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700345 void ReportLinkUp() {
346 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
347 }
mukesh agrawal31950242011-07-14 11:53:38 -0700348 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700349 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700350 }
mukesh agrawal15908392011-11-16 18:29:25 +0000351 void ReportCurrentBSSChanged(const string &new_bss) {
352 wifi_->CurrentBSSChanged(new_bss);
353 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000354 void ReportStateChanged(const string &new_state) {
355 wifi_->StateChanged(new_state);
356 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700357 void SetPendingService(const WiFiServiceRefPtr &service) {
358 wifi_->pending_service_ = service;
359 }
mukesh agrawalb66c6462012-05-07 11:45:25 -0700360 void SetScanInterval(uint16_t interval_seconds) {
361 wifi_->SetScanInterval(interval_seconds, NULL);
362 }
mukesh agrawal31950242011-07-14 11:53:38 -0700363 void StartWiFi() {
Gary Morainac1bdb42012-02-16 17:42:29 -0800364 EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
365 .WillOnce(SaveArg<1>(&power_state_callback_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700366 wifi_->SetEnabled(true); // Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700367 }
368 void StopWiFi() {
Gary Morain91001122012-02-29 16:22:26 -0800369 EXPECT_CALL(*power_manager_,
370 RemoveStateChangeCallback(wifi_->UniqueName()));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700371 wifi_->SetEnabled(false); // Stop(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700372 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700373 WiFiServiceRefPtr GetOpenService(const char *service_type,
374 const char *ssid,
375 const char *mode,
376 Error *result) {
377 return GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700378 }
mukesh agrawalcf24a242012-05-21 16:46:11 -0700379 WiFiServiceRefPtr GetService(const char *service_type,
380 const char *ssid,
381 const char *mode,
382 const char *security,
383 const char *passphrase,
384 Error *result) {
385 return GetServiceInner(service_type, ssid, mode, security, passphrase,
386 false, result);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800387 }
388 WiFiServiceRefPtr GetServiceInner(const char *service_type,
389 const char *ssid,
390 const char *mode,
391 const char *security,
392 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800393 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800394 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700395 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700396 // in general, we want to avoid D-Bus specific code for any RPCs
397 // that come in via adaptors. we make an exception here, because
398 // calls to GetWifiService are rerouted from the Manager object to
399 // the Wifi class.
400 if (service_type != NULL)
401 args[flimflam::kTypeProperty].writer().append_string(service_type);
402 if (ssid != NULL)
403 args[flimflam::kSSIDProperty].writer().append_string(ssid);
404 if (mode != NULL)
405 args[flimflam::kModeProperty].writer().append_string(mode);
406 if (security != NULL)
407 args[flimflam::kSecurityProperty].writer().append_string(security);
408 if (passphrase != NULL)
409 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800410 if (!allow_hidden)
411 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700412
Paul Stewartced6a0b2011-11-08 15:32:04 -0800413 Error e;
414 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700415 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800416 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700417 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700418
419 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
420 Error *result) {
421 return wifi_->GetService(args, result);
422 }
423
Paul Stewarta41e38d2011-11-11 07:47:29 -0800424 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
425 const string &mode,
426 const string &security) {
427 return wifi_->FindService(ssid, mode, security);
428 }
429 bool LoadHiddenServices(StoreInterface *storage) {
430 return wifi_->LoadHiddenServices(storage);
431 }
432 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
433 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
434 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
435 flimflam::kTypeWifi,
436 kDeviceAddress,
437 hex_ssid.c_str(),
438 flimflam::kModeManaged,
439 flimflam::kSecurityNone));
440 const char *groups[] = { id->c_str() };
441 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
442 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
443 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
444 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
445 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
446 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
447 }
Paul Stewart10ccbb32012-04-26 15:59:30 -0700448
449 NiceMockControl *control_interface() {
450 return &control_interface_;
451 }
452
mukesh agrawal32399322011-09-01 10:53:43 -0700453 MockManager *manager() {
454 return &manager_;
455 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800456
457 MockDeviceInfo *device_info() {
458 return &device_info_;
459 }
460
461 MockDHCPProvider *dhcp_provider() {
462 return &dhcp_provider_;
463 }
464
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500465 const PowerManager::PowerStateCallback &power_state_callback() const {
Gary Morainac1bdb42012-02-16 17:42:29 -0800466 return power_state_callback_;
467 }
468
mukesh agrawal32399322011-09-01 10:53:43 -0700469 const WiFiConstRefPtr wifi() const {
470 return wifi_;
471 }
472
mukesh agrawalb20776f2012-02-10 16:00:36 -0800473 TestProxyFactory *proxy_factory() {
474 return &proxy_factory_;
475 }
476
mukesh agrawal32399322011-09-01 10:53:43 -0700477 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700478 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800479 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700480
481 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700482 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800483 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700484 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700485 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800486 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700487 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700488
489 // protected fields interspersed between private fields, due to
490 // initialization order
491 protected:
492 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700493 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700494 static const char kNetworkModeAdHoc[];
495 static const char kNetworkModeInfrastructure[];
496
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700497 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
498 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800499 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700500 MockDHCPProvider dhcp_provider_;
501 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700502
503 private:
504 TestProxyFactory proxy_factory_;
Gary Morainac1bdb42012-02-16 17:42:29 -0800505 MockPowerManager *power_manager_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500506 PowerManager::PowerStateCallback power_state_callback_;
mukesh agrawal31950242011-07-14 11:53:38 -0700507};
508
509const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800510const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700511const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
512const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
513
mukesh agrawal261daca2011-12-02 18:56:56 +0000514void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000515 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000516}
517
mukesh agrawal31950242011-07-14 11:53:38 -0700518void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
519 const string &ssid,
520 const string &bssid,
521 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000522 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700523 const char *mode) {
524 map<string, ::DBus::Variant> bss_properties;
525
526 {
527 DBus::MessageIter writer(bss_properties["SSID"].writer());
528 writer << vector<uint8_t>(ssid.begin(), ssid.end());
529 }
530 {
531 string bssid_nosep;
532 vector<uint8_t> bssid_bytes;
533 RemoveChars(bssid, ":", &bssid_nosep);
534 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
535
536 DBus::MessageIter writer(bss_properties["BSSID"].writer());
537 writer << bssid_bytes;
538 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000539 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
540 append_int16(signal_strength);
541 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
542 append_uint16(frequency);
543 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000544 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700545}
546
mukesh agrawalb20776f2012-02-10 16:00:36 -0800547WiFiMainTest::TestProxyFactory::TestProxyFactory(WiFiMainTest *test)
548 : test_(test) {
549 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
550 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
551 .WillByDefault(
552 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
553}
554
mukesh agrawal31950242011-07-14 11:53:38 -0700555TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
556 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
557 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
558
559 StartWiFi();
560 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
561 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
562}
563
564TEST_F(WiFiMainTest, CleanStart) {
565 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
566 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
567 .Times(AnyNumber())
568 .WillRepeatedly(Throw(
569 DBus::Error(
570 "fi.w1.wpa_supplicant1.InterfaceUnknown",
571 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
572 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
mukesh agrawalb66c6462012-05-07 11:45:25 -0700573 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700574 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700575 dispatcher_.DispatchPendingEvents();
mukesh agrawalb66c6462012-05-07 11:45:25 -0700576 EXPECT_FALSE(GetScanTimer().IsCancelled());
mukesh agrawal31950242011-07-14 11:53:38 -0700577}
578
579TEST_F(WiFiMainTest, Restart) {
580 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
581 .Times(AnyNumber())
582 .WillRepeatedly(Throw(
583 DBus::Error(
584 "fi.w1.wpa_supplicant1.InterfaceExists",
585 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
586 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
587 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
588 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700589 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700590}
591
592TEST_F(WiFiMainTest, StartClearsState) {
593 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
594 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
595 StartWiFi();
596}
597
Gary Morainac1bdb42012-02-16 17:42:29 -0800598TEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
599 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
600 StartWiFi();
601 dispatcher_.DispatchPendingEvents();
602 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800603 ReportScanDone();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500604 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800605 ASSERT_TRUE(wifi()->IsIdle());
606 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500607 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800608 dispatcher_.DispatchPendingEvents();
609}
610
611TEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
612 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
613 StartWiFi();
614 dispatcher_.DispatchPendingEvents();
615 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500616 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800617 ASSERT_TRUE(wifi()->IsIdle());
618 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500619 power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
Gary Morainac1bdb42012-02-16 17:42:29 -0800620 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500621 power_state_callback().Run(PowerManagerProxyDelegate::kMem);
Gary Morainac1bdb42012-02-16 17:42:29 -0800622 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500623 power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
Gary Morainac1bdb42012-02-16 17:42:29 -0800624 dispatcher_.DispatchPendingEvents();
625}
626
627TEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
628 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
629 StartWiFi();
630
631 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
632 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
633 Error error;
634 service->AddEndpoint(ap);
635 service->AutoConnect();
636 EXPECT_FALSE(wifi()->IsIdle());
637 dispatcher_.DispatchPendingEvents();
638 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500639 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800640 ASSERT_FALSE(wifi()->IsIdle());
641 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500642 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800643 dispatcher_.DispatchPendingEvents();
644}
645
mukesh agrawal31950242011-07-14 11:53:38 -0700646TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800647 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700648 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000649 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700650 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000651 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700652 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000653 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700654 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000655 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
656 const uint16 frequency = 2412;
657 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
658 kNetworkModeAdHoc);
659
660 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
661 EXPECT_EQ(5, endpoints_by_rpcid.size());
662
663 WiFi::EndpointMap::const_iterator i;
664 WiFiEndpointRefPtr endpoint;
665 for (i = endpoints_by_rpcid.begin();
666 i != endpoints_by_rpcid.end();
667 ++i) {
668 if (i->second->bssid_string() == "00:00:00:00:00:04")
669 break;
670 }
671 ASSERT_TRUE(i != endpoints_by_rpcid.end());
672 EXPECT_EQ(4, i->second->signal_strength());
673 EXPECT_EQ(frequency, i->second->frequency());
674 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700675}
676
677TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800678 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
679 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
680 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700681 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000682 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700683 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000684 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700685 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000686 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700687 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000688 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
689 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000690
691 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
692 EXPECT_EQ(3, endpoints_by_rpcid.size());
693
694 WiFi::EndpointMap::const_iterator i;
695 WiFiEndpointRefPtr endpoint;
696 for (i = endpoints_by_rpcid.begin();
697 i != endpoints_by_rpcid.end();
698 ++i) {
699 if (i->second->bssid_string() == "00:00:00:00:00:00")
700 break;
701 }
702 ASSERT_TRUE(i != endpoints_by_rpcid.end());
703 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700704}
705
706TEST_F(WiFiMainTest, ScanCompleted) {
707 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000708 EXPECT_CALL(*manager(), RegisterService(_))
709 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000710 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
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", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700713 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000714 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700715 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000716 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800717
mukesh agrawale9adda12012-02-09 18:33:48 -0800718 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000719 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800720 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800721 EXPECT_EQ(3, GetServices().size());
722
mukesh agrawale9adda12012-02-09 18:33:48 -0800723 // BSSes with empty SSIDs should be filtered.
724 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
725 EXPECT_EQ(3, GetEndpointMap().size());
726 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000727}
728
729TEST_F(WiFiMainTest, EndpointGroupingTogether) {
730 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000731
732 InSequence s;
733 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800734 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000735 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000736 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
737 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000738 ReportScanDone();
739 EXPECT_EQ(1, GetServices().size());
740}
741
742TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
743 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000744 EXPECT_CALL(*manager(), RegisterService(_))
745 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000746 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
747 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000748 ReportScanDone();
749 EXPECT_EQ(2, GetServices().size());
750}
751
752TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
753 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000754 EXPECT_CALL(*manager(), RegisterService(_))
755 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000756 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
757 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
758 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000759 ReportScanDone();
760 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700761}
762
mukesh agrawal261daca2011-12-02 18:56:56 +0000763TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
764 // Removal of non-existent BSS should not cause a crash.
765 StartWiFi();
766 RemoveBSS("bss0");
767 EXPECT_EQ(0, GetServices().size());
768}
769
mukesh agrawale9adda12012-02-09 18:33:48 -0800770TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
771 // Removal of BSS with an empty SSID should not cause a crash.
772 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
773 StartWiFi();
774 RemoveBSS("bss");
775 EXPECT_EQ(0, GetServices().size());
776}
777
778TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
779 // Removal of BSS with a NULL SSID should not cause a crash.
780 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
781 StartWiFi();
782 RemoveBSS("bss");
783 EXPECT_EQ(0, GetServices().size());
784}
785
mukesh agrawal261daca2011-12-02 18:56:56 +0000786TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800787 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000788 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000789 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000790 ReportScanDone();
791 EXPECT_EQ(1, GetServices().size());
792 EXPECT_TRUE(GetServices().front()->IsVisible());
793
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000794 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000795 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000796 EXPECT_TRUE(GetServices().empty());
797}
798
799TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800800 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000801 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000802 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000803 ReportScanDone();
804 ReportCurrentBSSChanged("bss0");
805
806 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
807 EXPECT_CALL(*manager(), DeregisterService(_));
808 RemoveBSS("bss0");
809 EXPECT_TRUE(GetServices().empty());
810}
811
812TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800813 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
814 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000815 StartWiFi();
816
817 Error e;
818 WiFiServiceRefPtr service =
819 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
820 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000821 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000822
Thieu Lee41a72d2012-02-06 20:46:51 +0000823 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
824 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000825 ReportScanDone();
826 ReportCurrentBSSChanged("bss");
827 EXPECT_EQ(1, GetServices().size());
828
829 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000830 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000831 EXPECT_EQ(1, GetServices().size());
832 // Verify expectations now, because WiFi may call UpdateService when
833 // WiFi is Stop()-ed (during TearDown()).
834 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -0800835 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000836}
837
838TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800839 EXPECT_CALL(*manager(), RegisterService(_));
840 EXPECT_CALL(*manager(), HasService(_));
841 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000842 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000843 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
844 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000845 ReportScanDone();
846 EXPECT_EQ(1, GetServices().size());
847 EXPECT_TRUE(GetServices().front()->IsVisible());
848
849 EXPECT_CALL(*manager(), UpdateService(_));
850 RemoveBSS("bss0");
851 EXPECT_TRUE(GetServices().front()->IsVisible());
852 EXPECT_EQ(1, GetServices().size());
853}
854
mukesh agrawal31950242011-07-14 11:53:38 -0700855TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800856 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700857 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
858 *supplicant_interface_proxy_;
859
mukesh agrawal31950242011-07-14 11:53:38 -0700860 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000861 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700862 ReportScanDone();
863
864 {
865 InSequence s;
866 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000867 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700868
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700869 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700870 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700871 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700872 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700873 EXPECT_EQ(static_cast<Service *>(service),
874 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700875 }
876}
877
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000878TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800879 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000880 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
881 *supplicant_interface_proxy_;
882
883 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000884 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000885 WiFiService *service(GetServices().begin()->get());
886 InitiateConnect(service);
887
888 EXPECT_FALSE(GetPendingService() == NULL);
889 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
890 InitiateDisconnect(service);
891
892 EXPECT_TRUE(GetPendingService() == NULL);
893}
894
895TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800896 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700897 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800898 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
899 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000900 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
901 *supplicant_interface_proxy_;
902
903 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000904 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
905 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000906 WiFiService *service0(GetServices()[0].get());
907 WiFiService *service1(GetServices()[1].get());
908
909 InitiateConnect(service0);
910 ReportCurrentBSSChanged("bss0");
911 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
912 InitiateConnect(service1);
913
914 EXPECT_EQ(service0, GetCurrentService());
915 EXPECT_EQ(service1, GetPendingService());
916 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
917 InitiateDisconnect(service1);
918
919 // |current_service_| will be unchanged until supplicant signals
920 // that CurrentBSS has changed.
921 EXPECT_EQ(service0, GetCurrentService());
922 // |pending_service_| is updated immediately.
923 EXPECT_TRUE(GetPendingService() == NULL);
924}
925
926TEST_F(WiFiMainTest, DisconnectCurrentService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800927 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700928 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800929 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
930 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000931 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
932 *supplicant_interface_proxy_;
933
934 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000935 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000936 WiFiService *service(GetServices().begin()->get());
937 InitiateConnect(service);
938 ReportCurrentBSSChanged("bss0");
939 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
940
941 EXPECT_EQ(service, GetCurrentService());
942 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
943 InitiateDisconnect(service);
944
945 // |current_service_| should not change until supplicant reports
946 // a BSS change.
947 EXPECT_EQ(service, GetCurrentService());
948}
949
950TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
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);
960 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000961 WiFiService *service0(GetServices()[0].get());
962 WiFiService *service1(GetServices()[1].get());
963
964 InitiateConnect(service0);
965 ReportCurrentBSSChanged("bss0");
966 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
967 InitiateConnect(service1);
968
969 EXPECT_EQ(service0, GetCurrentService());
970 EXPECT_EQ(service1, GetPendingService());
971 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
972 .Times(0);
973 InitiateDisconnect(service0);
974
975 EXPECT_EQ(service0, GetCurrentService());
976 EXPECT_EQ(service1, GetPendingService());
977}
978
979TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800980 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000981 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
982 *supplicant_interface_proxy_;
983
984 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000985 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000986 WiFiService *service(GetServices().begin()->get());
987 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
988 .Times(0);
989 InitiateDisconnect(service);
990}
991
992TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800993 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -0700994 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -0800995 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
996 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000997 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
998 *supplicant_interface_proxy_;
999
1000 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001001 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +00001002
1003 WiFiService *service(GetServices().begin()->get());
1004 DBus::Path fake_path("/fake/path");
1005 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
1006 .WillOnce(Return(fake_path));
1007 InitiateConnect(service);
1008 ReportCurrentBSSChanged("bss0");
1009 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1010
1011 EXPECT_EQ(service, GetCurrentService());
1012 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
1013 .WillRepeatedly(Throw(
1014 DBus::Error(
1015 "fi.w1.wpa_supplicant1.NotConnected",
1016 "test threw fi.w1.wpa_supplicant1.NotConnected")));
1017 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
1018 InitiateDisconnect(service);
1019
1020 EXPECT_TRUE(GetCurrentService() == NULL);
1021}
1022
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001023TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001024 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001025 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001026 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001027 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001028
mukesh agrawalc01f3982012-01-24 13:48:39 -08001029 EXPECT_CALL(*manager(), DeregisterService(_));
1030 StopWiFi();
mukesh agrawalb66c6462012-05-07 11:45:25 -07001031 EXPECT_TRUE(GetScanTimer().IsCancelled());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001032}
1033
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001034TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1035 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001036 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001037 EXPECT_TRUE(e.IsSuccess());
1038}
1039
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001040TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1041 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001042 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001043 EXPECT_EQ(Error::kInvalidArguments, e.type());
1044 EXPECT_EQ("must specify SSID", e.message());
1045}
1046
1047TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1048 Error e;
1049 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001050 flimflam::kTypeWifi, "123456789012345678901234567890123",
1051 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001052 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1053 EXPECT_EQ("SSID is too long", e.message());
1054}
1055
1056TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1057 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001058 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001059 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1060 EXPECT_EQ("SSID is too short", e.message());
1061}
1062
1063TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1064 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001065 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001066 EXPECT_EQ(Error::kNotSupported, e.type());
1067 EXPECT_EQ("service mode is unsupported", e.message());
1068}
1069
1070TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1071 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001072 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001073 EXPECT_TRUE(e.IsSuccess());
1074}
1075
1076TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1077 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001078 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1079 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001080 EXPECT_TRUE(e.IsSuccess());
1081}
1082
1083TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001084 // When configuring hidden networks, Chrome expects to be able to
1085 // GetService w/o a password, and supply the password with
1086 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001087 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001088 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1089 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001090 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001091}
1092
1093TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1094 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001095 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1096 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001097 EXPECT_EQ(Error::kNotSupported, e.type());
1098 EXPECT_EQ("security mode is unsupported", e.message());
1099}
1100
1101TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001102 // When configuring hidden networks, Chrome expects to be able to
1103 // GetService w/o a password, and supply the password with
1104 // SetProperty afterwards.
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001105 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001106 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1107 flimflam::kSecurityWep, NULL, &e);
mukesh agrawalb172e4a2012-04-25 18:15:30 -07001108 EXPECT_TRUE(e.IsSuccess());
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001109}
1110
1111TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1112 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001113 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1114 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001115 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1116}
1117
1118TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1119 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001120 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1121 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001122 EXPECT_TRUE(e.IsSuccess());
1123}
1124
1125TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1126 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001127 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1128 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001129 EXPECT_TRUE(e.IsSuccess());
1130}
1131
1132TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1133 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001134 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1135 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001136 EXPECT_TRUE(e.IsSuccess());
1137}
1138
1139TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1140 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001141 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1142 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001143 EXPECT_TRUE(e.IsSuccess());
1144}
1145
1146TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1147 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001148 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1149 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001150 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1151}
1152
1153TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1154 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001155 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1156 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001157 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1158}
1159
1160TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1161 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001162 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1163 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001164 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1165}
1166
1167TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1168 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001169 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1170 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001171 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1172}
1173
1174TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1175 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001176 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1177 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001178 EXPECT_TRUE(e.IsSuccess());
1179}
1180
1181TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1182 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001183 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1184 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001185 EXPECT_TRUE(e.IsSuccess());
1186}
1187
1188TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1189 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001190 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1191 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001192 EXPECT_TRUE(e.IsSuccess());
1193}
1194
1195TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1196 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001197 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1198 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001199 EXPECT_TRUE(e.IsSuccess());
1200}
1201
mukesh agrawal8ede0522011-10-03 14:57:44 -07001202class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1203class WiFiGetServiceFailureTest : public WiFiMainTest {};
1204
1205TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1206 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001207 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1208 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001209 EXPECT_TRUE(e.IsSuccess());
1210}
1211
1212TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1213 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001214 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1215 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001216 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1217}
1218
1219INSTANTIATE_TEST_CASE_P(
1220 WiFiGetServiceSuccessTestInstance,
1221 WiFiGetServiceSuccessTest,
1222 Values(
1223 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1224 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1225 // subtle: invalid length for hex key, but valid as ascii passphrase
1226 string(IEEE_80211::kWPAHexLen-1, '1'),
1227 string(IEEE_80211::kWPAHexLen, '1')));
1228
1229INSTANTIATE_TEST_CASE_P(
1230 WiFiGetServiceFailureTestInstance,
1231 WiFiGetServiceFailureTest,
1232 Values(
1233 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1234 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1235 string(IEEE_80211::kWPAHexLen+1, '1')));
1236
Paul Stewart6ab23a92011-11-09 17:17:47 -08001237TEST_F(WiFiMainTest, FindServiceWEP) {
1238 const string ssid("an_ssid");
1239 {
1240 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001241 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001242 flimflam::kSecurityWep, "abcde", &e);
1243 EXPECT_TRUE(e.IsSuccess());
1244 }
1245 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1246
Paul Stewarta41e38d2011-11-11 07:47:29 -08001247 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1248 flimflam::kSecurityWep).get());
1249 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1250 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001251}
1252
1253TEST_F(WiFiMainTest, FindServiceWPA) {
1254 const string ssid("an_ssid");
1255 {
1256 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001257 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001258 flimflam::kSecurityRsn, "abcdefgh", &e);
1259 EXPECT_TRUE(e.IsSuccess());
1260 }
1261 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001262 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1263 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001264 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001265 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1266 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001267 EXPECT_TRUE(rsn_service.get());
1268 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001269 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1270 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001271 EXPECT_EQ(wpa_service.get(), psk_service.get());
1272 // Indirectly test FindService by doing a GetService on something that
1273 // already exists.
1274 {
1275 Error e;
1276 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001277 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1278 flimflam::kModeManaged, flimflam::kSecurityWpa,
1279 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001280 EXPECT_TRUE(e.IsSuccess());
1281 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1282 }
1283}
1284
Paul Stewartcb59fed2012-03-21 21:14:46 -07001285TEST_F(WiFiMainTest, GetServiceWithGUID) {
1286 // Perform a GetService that also configures properties in the base Service
1287 // class using Service::Configure().
1288 KeyValueStore args;
1289 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1290 args.SetString(flimflam::kSSIDProperty, "ssid");
1291 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1292 const string kGUID = "aguid"; // Stored as a registered Service property.
1293 args.SetString(flimflam::kGuidProperty, kGUID);
1294 Error e;
1295 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1296 EXPECT_TRUE(e.IsSuccess());
1297 EXPECT_EQ(kGUID, service->guid());
1298}
1299
Paul Stewartced6a0b2011-11-08 15:32:04 -08001300MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001301 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001302 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1303 if (it == arg.end()) {
1304 return false;
1305 }
1306
1307 const DBus::Variant &ssids_variant = it->second;
1308 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1309 const ByteArrays &ssids = it->second.operator ByteArrays();
1310 // A valid Scan containing a single hidden SSID should contain
1311 // two SSID entries: one containing the SSID we are looking for,
1312 // and an empty entry, signifying that we also want to do a
1313 // broadcast probe request for all non-hidden APs as well.
1314 return ssids.size() == 2 &&
1315 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1316 ssids[1].empty();
1317}
1318
1319TEST_F(WiFiMainTest, ScanHidden) {
1320 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1321 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1322 .Times(AnyNumber())
1323 .WillRepeatedly(Throw(
1324 DBus::Error(
1325 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1326 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewart10ccbb32012-04-26 15:59:30 -07001327 scoped_refptr<MockProfile> profile(
1328 new NiceMock<MockProfile>(control_interface(), manager(), ""));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001329 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001330 // Create a hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001331 Error e;
1332 WiFiServiceRefPtr service =
1333 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1334 NULL, NULL, true, &e);
1335 EXPECT_TRUE(e.IsSuccess());
1336 EXPECT_TRUE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001337 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001338 }
1339 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001340 // Create a hidden service without an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001341 Error e;
1342 WiFiServiceRefPtr service =
1343 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1344 NULL, NULL, true, &e);
1345 EXPECT_TRUE(e.IsSuccess());
1346 EXPECT_TRUE(service->hidden_ssid());
1347 }
1348 {
Paul Stewart10ccbb32012-04-26 15:59:30 -07001349 // Create a non-hidden service with an associated profile.
Paul Stewarta41e38d2011-11-11 07:47:29 -08001350 Error e;
1351 WiFiServiceRefPtr service =
1352 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1353 NULL, NULL, false, &e);
1354 EXPECT_TRUE(e.IsSuccess());
1355 EXPECT_FALSE(service->hidden_ssid());
Paul Stewart10ccbb32012-04-26 15:59:30 -07001356 service->set_profile(profile);
Paul Stewarta41e38d2011-11-11 07:47:29 -08001357 }
1358 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001359 StartWiFi();
1360 dispatcher_.DispatchPendingEvents();
1361}
1362
mukesh agrawal7ec71312011-11-10 02:08:26 +00001363TEST_F(WiFiMainTest, InitialSupplicantState) {
1364 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1365}
1366
1367TEST_F(WiFiMainTest, StateChangeNoService) {
1368 // State change should succeed even if there is no pending Service.
1369 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1370 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1371}
1372
1373TEST_F(WiFiMainTest, StateChangeWithService) {
1374 // Forward transition should trigger a Service state change.
1375 StartWiFi();
1376 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001377 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001378 InitiateConnect(service);
1379 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1380 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1381 // Verify expectations now, because WiFi may report other state changes
1382 // when WiFi is Stop()-ed (during TearDown()).
1383 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001384 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001385}
1386
1387TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1388 // Some backwards transitions should not trigger a Service state change.
1389 // Supplicant state should still be updated, however.
Paul Stewartd408fdf2012-05-07 17:15:57 -07001390 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001391 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001392 StartWiFi();
1393 dispatcher_.DispatchPendingEvents();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001394 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
Gary Moraind9f893f2012-02-06 10:03:40 -08001395 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001396 InitiateConnect(service);
1397 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001398 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1399 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1400 GetSupplicantState());
1401 // Verify expectations now, because WiFi may report other state changes
1402 // when WiFi is Stop()-ed (during TearDown()).
1403 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001404 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001405}
1406
Paul Stewarta41e38d2011-11-11 07:47:29 -08001407TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1408 StrictMock<MockStore> storage;
1409 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1410 .WillOnce(Return(set<string>()));
1411 EXPECT_FALSE(LoadHiddenServices(&storage));
1412}
1413
1414TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1415 string id;
1416 StrictMock<MockStore> storage;
1417 SetupHiddenStorage(&storage, "an_ssid", &id);
1418 // Missing "Hidden" property.
1419 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1420 .WillOnce(Return(false));
1421 EXPECT_FALSE(LoadHiddenServices(&storage));
1422}
1423
1424TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1425 string id;
1426 StrictMock<MockStore> storage;
1427 SetupHiddenStorage(&storage, "an_ssid", &id);
1428 // "Hidden" property set to "false".
1429 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1430 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1431 EXPECT_FALSE(LoadHiddenServices(&storage));
1432}
1433
1434TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1435 string id;
1436 StrictMock<MockStore> storage;
1437 SetupHiddenStorage(&storage, "an_ssid", &id);
1438 // Missing "SSID" property.
1439 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1440 .WillOnce(Return(false));
1441 EXPECT_FALSE(LoadHiddenServices(&storage));
1442}
1443
1444
1445TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1446 StrictMock<MockStore> storage;
1447 string id;
1448 SetupHiddenStorage(&storage, "an_ssid", &id);
1449 Error e;
1450 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1451 ASSERT_TRUE(e.IsSuccess());
1452 EXPECT_FALSE(LoadHiddenServices(&storage));
1453}
1454
1455TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001456 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001457 StrictMock<MockStore> storage;
1458 string ssid("an_ssid");
1459 string id;
1460 SetupHiddenStorage(&storage, ssid, &id);
1461 EXPECT_TRUE(LoadHiddenServices(&storage));
1462 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1463 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1464 flimflam::kSecurityNone).get());
1465}
1466
mukesh agrawal15908392011-11-16 18:29:25 +00001467TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001468 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001469 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001470 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1471 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001472 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1473 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1474
1475 // Note that the BSS handle used in this test ("an_ap") is not
1476 // intended to reflect the format used by supplicant. It's just
1477 // convenient for testing.
1478
1479 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001480 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001481 kNetworkModeInfrastructure);
1482 InitiateConnect(service);
1483 EXPECT_EQ(service, GetPendingService().get());
1484
1485 ReportCurrentBSSChanged("an_ap");
1486 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1487 EXPECT_EQ(Service::kStateConfiguring, service->state());
1488 EXPECT_EQ(service, GetCurrentService().get());
1489 EXPECT_EQ(NULL, GetPendingService().get());
1490
1491 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001492 EXPECT_EQ(Service::kStateIdle, service->state());
1493 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001494 EXPECT_EQ(NULL, GetCurrentService().get());
1495 EXPECT_EQ(NULL, GetPendingService().get());
1496}
1497
1498TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001499 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001500 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001501 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1502 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001503 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1504 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1505 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1506 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1507
1508 // Note that the BSS handles used in this test ("ap1", "ap2") are
1509 // not intended to reflect the format used by supplicant. They're
1510 // just convenient for testing.
1511
1512 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001513 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001514 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001515 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001516 kNetworkModeInfrastructure);
1517 InitiateConnect(service1);
1518 ReportCurrentBSSChanged("ap1");
1519 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1520 EXPECT_EQ(service1.get(), GetCurrentService().get());
1521
mukesh agrawalc01f3982012-01-24 13:48:39 -08001522 // Note that we deliberately omit intermediate supplicant states
1523 // (e.g. kInterfaceStateAssociating), on the theory that they are
1524 // unreliable. Specifically, they may be quashed if the association
1525 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001526 ReportCurrentBSSChanged("ap2");
1527 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1528 EXPECT_EQ(service2.get(), GetCurrentService().get());
1529 EXPECT_EQ(Service::kStateIdle, service1->state());
1530 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1531}
1532
1533TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001534 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1535 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001536 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001537 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001538 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1539 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1540
1541 // Note that the BSS handle used in this test ("an_ap") is not
1542 // intended to reflect the format used by supplicant. It's just
1543 // convenient for testing.
1544
1545 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001546 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001547 kNetworkModeInfrastructure);
1548 InitiateConnect(service);
1549 ReportCurrentBSSChanged("an_ap");
1550 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1551 EXPECT_EQ(service.get(), GetCurrentService().get());
1552 EXPECT_EQ(Service::kStateConfiguring, service->state());
1553}
1554
Thieu Lee41a72d2012-02-06 20:46:51 +00001555TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001556 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1557 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1558 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1559
Thieu Lee41a72d2012-02-06 20:46:51 +00001560 const uint16 frequency1 = 2412;
1561 const uint16 frequency2 = 2442;
1562 StartWiFi();
1563 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1564 kNetworkModeInfrastructure);
1565 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1566 kNetworkModeInfrastructure);
1567 EXPECT_EQ(1, GetServices().size());
1568 WiFiService *service(GetServices()[0].get());
1569 InitiateConnect(service);
1570 ReportCurrentBSSChanged("bss1");
1571 EXPECT_EQ(frequency1, service->frequency_);
1572 ReportCurrentBSSChanged("bss2");
1573 EXPECT_EQ(frequency2, service->frequency_);
1574}
1575
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001576TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1577 Error e;
1578 EXPECT_CALL(*manager(), RegisterService(_))
1579 .Times(0);
1580 EXPECT_CALL(*manager(), HasService(_))
1581 .WillOnce(Return(false));
1582 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1583 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001584 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001585 kNetworkModeInfrastructure);
1586}
1587
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001588TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001589 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1590 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001591 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1592 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1593 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1594 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1595
1596 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001597 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001598 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001599 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001600 kNetworkModeInfrastructure);
1601 InitiateConnect(service1);
1602 EXPECT_EQ(service1.get(), GetPendingService().get());
1603
1604 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1605 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1606 InitiateConnect(service2);
1607 EXPECT_EQ(service2.get(), GetPendingService().get());
1608}
1609
1610TEST_F(WiFiMainTest, IsIdle) {
1611 StartWiFi();
1612 EXPECT_TRUE(wifi()->IsIdle());
1613
1614 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1615 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1616 Error error;
1617 service->AddEndpoint(ap);
1618 service->AutoConnect();
1619 EXPECT_FALSE(wifi()->IsIdle());
1620}
1621
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001622MATCHER(WiFiAddedArgs, "") {
1623 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1624 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1625}
1626
1627TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001628 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001629 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1630 *supplicant_interface_proxy_;
1631
1632 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001633 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001634 WiFiService *service(GetServices().begin()->get());
1635 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1636 InitiateConnect(service);
1637}
1638
mukesh agrawalc01f3982012-01-24 13:48:39 -08001639TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1640 StartWiFi();
mukesh agrawalcf24a242012-05-21 16:46:11 -07001641 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityNone);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001642 InitiateConnect(service);
1643 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1644 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1645 ReportLinkUp();
1646
1647 // Verify expectations now, because WiFi may cause |service| state
1648 // changes during TearDown().
1649 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001650 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001651}
1652
1653TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001654 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001655 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001656 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001657 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1658 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1659
1660 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001661 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001662 kNetworkModeInfrastructure);
1663 InitiateConnect(service);
1664
1665 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1666 ReportCurrentBSSChanged("ap");
1667 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1668 EXPECT_EQ(Service::kStateConfiguring, service->state());
1669}
1670
1671TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001672 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1673 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1674 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1675 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
Paul Stewartd408fdf2012-05-07 17:15:57 -07001676 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _, _, _)).Times(AnyNumber());
Gary Moraind9f893f2012-02-06 10:03:40 -08001677 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08001678 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001679 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1680 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1681
mukesh agrawalc01f3982012-01-24 13:48:39 -08001682 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001683 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001684 kNetworkModeInfrastructure);
1685 InitiateConnect(service);
1686 ReportCurrentBSSChanged("ap");
1687 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1688 ReportIPConfigComplete();
1689 Mock::VerifyAndClearExpectations(service);
1690
1691 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1692 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1693}
1694
Paul Stewart66c86002012-01-30 18:00:52 -08001695TEST_F(WiFiMainTest, ClearCachedCredentials) {
1696 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1697 *supplicant_interface_proxy_;
1698
1699 StartWiFi();
1700
1701 // Ensure call to the proxy is deferred.
1702 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1703 .Times(0);
1704 ClearCachedCredentials();
1705
1706 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1707
1708 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1709 .Times(1);
1710 dispatcher_.DispatchPendingEvents();
1711
1712 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1713
1714 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1715 .Times(0);
1716 ClearCachedCredentials();
1717 ClearCachedCredentials();
1718
1719 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1720
1721 // Ensure multiple calls to ClearCachedCredentials() results in only
1722 // one call to the proxy.
1723 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1724 .Times(1);
1725 dispatcher_.DispatchPendingEvents();
1726}
1727
mukesh agrawalb20776f2012-02-10 16:00:36 -08001728TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1729 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1730 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1731 // we can test the interaction between WiFi and WiFiEndpoint. (Right
1732 // now, we're testing across multiple layers.)
1733 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1734 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1735 StartWiFi();
1736 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1737}
1738
1739TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1740 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1741 // factory for WiFiEndpoints.
1742 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1743
1744 // Get the pointer before we transfer ownership.
1745 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1746 EXPECT_CALL(*proxy, Die());
1747 StartWiFi();
1748 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1749 RemoveBSS("bss0");
1750 // Check this now, to make sure RemoveBSS killed the proxy (rather
1751 // than TearDown).
1752 Mock::VerifyAndClearExpectations(proxy);
1753}
1754
mukesh agrawal5c05b292012-03-07 10:12:52 -08001755TEST_F(WiFiMainTest, FlushBSSOnResume) {
1756 const struct timeval resume_time = {1, 0};
1757 const struct timeval scan_done_time = {6, 0};
1758 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1759 *supplicant_interface_proxy_;
1760
1761 StartWiFi();
1762
1763 EXPECT_CALL(time_, GetTimeMonotonic(_))
1764 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
1765 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
1766 EXPECT_CALL(supplicant_interface_proxy,
1767 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
Eric Shienbrood3e20a232012-02-16 11:35:56 -05001768 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
mukesh agrawal5c05b292012-03-07 10:12:52 -08001769 ReportScanDone();
1770}
1771
mukesh agrawalb66c6462012-05-07 11:45:25 -07001772TEST_F(WiFiMainTest, ScanTimerIdle) {
1773 StartWiFi();
1774 dispatcher_.DispatchPendingEvents();
1775 ReportScanDone();
1776 CancelScanTimer();
1777 EXPECT_TRUE(GetScanTimer().IsCancelled());
1778
1779 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
1780 FireScanTimer();
1781 dispatcher_.DispatchPendingEvents();
1782 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1783}
1784
1785TEST_F(WiFiMainTest, ScanTimerScanning) {
1786 StartWiFi();
1787 dispatcher_.DispatchPendingEvents();
1788 CancelScanTimer();
1789 EXPECT_TRUE(GetScanTimer().IsCancelled());
1790
1791 // Should not call Scan, since we're already scanning.
1792 // (Scanning is triggered by StartWiFi.)
1793 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1794 FireScanTimer();
1795 dispatcher_.DispatchPendingEvents();
1796 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1797}
1798
1799TEST_F(WiFiMainTest, ScanTimerConnecting) {
1800 StartWiFi();
1801 dispatcher_.DispatchPendingEvents();
1802 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1803 ReportScanDone();
1804 WiFiService *service(GetServices().begin()->get());
1805 InitiateConnect(service);
1806 CancelScanTimer();
1807 EXPECT_TRUE(GetScanTimer().IsCancelled());
1808
1809 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1810 FireScanTimer();
1811 dispatcher_.DispatchPendingEvents();
1812 EXPECT_FALSE(GetScanTimer().IsCancelled()); // Automatically re-armed.
1813}
1814
1815TEST_F(WiFiMainTest, ScanTimerReconfigured) {
1816 StartWiFi();
1817 CancelScanTimer();
1818 EXPECT_TRUE(GetScanTimer().IsCancelled());
1819
1820 SetScanInterval(1);
1821 EXPECT_FALSE(GetScanTimer().IsCancelled());
1822}
1823
1824TEST_F(WiFiMainTest, ScanTimerResetOnScanDone) {
1825 StartWiFi();
1826 CancelScanTimer();
1827 EXPECT_TRUE(GetScanTimer().IsCancelled());
1828
1829 ReportScanDone();
1830 EXPECT_FALSE(GetScanTimer().IsCancelled());
1831}
1832
1833TEST_F(WiFiMainTest, ScanTimerStopOnZeroInterval) {
1834 StartWiFi();
1835 EXPECT_FALSE(GetScanTimer().IsCancelled());
1836
1837 SetScanInterval(0);
1838 EXPECT_TRUE(GetScanTimer().IsCancelled());
1839}
1840
1841TEST_F(WiFiMainTest, ScanOnDisconnectWithHidden) {
1842 Error e;
1843 scoped_refptr<MockProfile> profile(
1844 new NiceMock<MockProfile>(control_interface(), manager(), ""));
1845 WiFiServiceRefPtr hidden_service =
1846 GetServiceInner(flimflam::kTypeWifi, "hidden_ssid",
1847 flimflam::kModeManaged, NULL, NULL, true, &e);
1848 hidden_service->set_profile(profile);
1849
1850 StartWiFi();
1851 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1852 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1853 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1854 kNetworkModeInfrastructure);
1855 InitiateConnect(service);
1856 ReportCurrentBSSChanged("an_ap");
1857 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1858 dispatcher_.DispatchPendingEvents();
1859
1860 EXPECT_CALL(*GetSupplicantInterfaceProxy(),
1861 Scan(HasHiddenSSID("hidden_ssid")));
1862 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1863 dispatcher_.DispatchPendingEvents();
1864}
1865
1866TEST_F(WiFiMainTest, NoScanOnDisconnectWithoutHidden) {
1867 StartWiFi();
1868 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1869 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1870 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
1871 kNetworkModeInfrastructure);
1872 InitiateConnect(service);
1873 ReportCurrentBSSChanged("an_ap");
1874 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1875 dispatcher_.DispatchPendingEvents();
1876
1877 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
1878 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1879 dispatcher_.DispatchPendingEvents();
1880}
1881
mukesh agrawalcf24a242012-05-21 16:46:11 -07001882TEST_F(WiFiMainTest, SuspectCredentialsOpen) {
1883 Error e;
1884 WiFiServiceRefPtr service = GetOpenService(
1885 flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1886 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1887 EXPECT_FALSE(service->has_ever_connected());
1888 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1889}
1890
1891TEST_F(WiFiMainTest, SuspectCredentialsWPANeverConnected) {
1892 Error e;
1893 WiFiServiceRefPtr service =
1894 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1895 flimflam::kSecurityWpa, "abcdefgh", &e);
1896 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1897 EXPECT_FALSE(service->has_ever_connected());
1898 EXPECT_TRUE(wifi()->SuspectCredentials(*service));
1899}
1900
1901TEST_F(WiFiMainTest, SuspectCredentialsWPAPreviouslyConnected) {
1902 Error e;
1903 WiFiServiceRefPtr service =
1904 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1905 flimflam::kSecurityWpa, "abcdefgh", &e);
1906 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1907 service->has_ever_connected_ = true;
1908 EXPECT_FALSE(wifi()->SuspectCredentials(*service));
1909}
1910
1911TEST_F(WiFiMainTest, SuspectCredentialsYieldFailure) {
1912 ScopedMockLog log;
1913 Error e;
1914 MockWiFiServiceRefPtr service = MakeMockService(flimflam::kSecurityWpa);
1915 SetPendingService(service);
1916 ReportStateChanged(wpa_supplicant::kInterfaceState4WayHandshake);
1917 EXPECT_FALSE(service->has_ever_connected());
1918
1919 EXPECT_CALL(*service, SetFailure(Service::kFailureBadCredentials));
1920 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());
1921 EXPECT_CALL(log, Log(logging::LOG_ERROR, _, EndsWith("Bad passphrase?")));
1922 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1923 EXPECT_EQ(Service::kStateIdle, service->state());
1924 EXPECT_TRUE(service->IsFailed());
1925}
1926
Chris Masone853b81b2011-06-24 14:11:41 -07001927} // namespace shill