blob: d7366ef2ff20ca77b076814f28960b529ec3ee32 [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"
Chris Masone2ae797d2011-08-23 20:41:00 -070036#include "shill/mock_manager.h"
Thieu Le3426c8f2012-01-11 17:35:11 -080037#include "shill/mock_metrics.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070038#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080039#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080040#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070041#include "shill/mock_supplicant_interface_proxy.h"
42#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000043#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070044#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070045#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070046#include "shill/proxy_factory.h"
47#include "shill/wifi_endpoint.h"
48#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070049#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080050#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070051
52using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080053using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070054using std::string;
55using std::vector;
56using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070057using ::testing::AnyNumber;
58using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080059using ::testing::DoAll;
mukesh agrawal31950242011-07-14 11:53:38 -070060using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080061using ::testing::Invoke;
mukesh agrawal7ec71312011-11-10 02:08:26 +000062using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070063using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070064using ::testing::Return;
Paul Stewarta41e38d2011-11-11 07:47:29 -080065using ::testing::SetArgumentPointee;
66using ::testing::StrEq;
67using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070068using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070069using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070070using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070071
72namespace shill {
73
mukesh agrawal31950242011-07-14 11:53:38 -070074class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070075 public:
mukesh agrawal31950242011-07-14 11:53:38 -070076 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080077 : device_(new WiFi(control_interface(),
78 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070079 }
mukesh agrawal31950242011-07-14 11:53:38 -070080 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070081
82 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080083 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070084};
85
mukesh agrawal31950242011-07-14 11:53:38 -070086TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070087 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
88 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070089}
90
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080091TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070092 {
93 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080094 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070095 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070096 flimflam::kBgscanSignalThresholdProperty,
97 PropertyStoreTest::kInt32V,
98 &error));
99 }
100 {
101 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800102 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
103 flimflam::kScanIntervalProperty,
104 PropertyStoreTest::kUint16V,
105 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 }
Chris Masone853b81b2011-06-24 14:11:41 -0700107 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700108 {
109 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800110 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
111 flimflam::kScanningProperty,
112 PropertyStoreTest::kBoolV,
113 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700114 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700115 }
Chris Masone853b81b2011-06-24 14:11:41 -0700116
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800117 {
118 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800119 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800120 device_->mutable_store(),
121 flimflam::kBgscanMethodProperty,
122 DBusAdaptor::StringToVariant(
123 wpa_supplicant::kNetworkBgscanMethodSimple),
124 &error));
125 }
126
127 {
128 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800129 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800130 device_->mutable_store(),
131 flimflam::kBgscanMethodProperty,
132 DBusAdaptor::StringToVariant("not a real scan method"),
133 &error));
134 }
135}
136
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800137TEST_F(WiFiPropertyTest, ClearDerivedProperty) {
138 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
139 WiFi::kDefaultBgscanMethod);
140 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
141
142 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800143 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800144 device_->mutable_store(),
145 flimflam::kBgscanMethodProperty,
146 DBusAdaptor::StringToVariant(
147 wpa_supplicant::kNetworkBgscanMethodLearn),
148 &error));
149 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
150
151 EXPECT_TRUE(DBusAdaptor::ClearProperty(
152 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
153 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
154}
155
mukesh agrawal8ede0522011-10-03 14:57:44 -0700156class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700157 public:
158 WiFiMainTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800159 : manager_(&control_interface_, NULL, &metrics_, &glib_),
mukesh agrawalc01f3982012-01-24 13:48:39 -0800160 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700161 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700162 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800163 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700164 &manager_,
165 kDeviceName,
166 kDeviceAddress,
167 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700168 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
169 supplicant_interface_proxy_(
170 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800171 supplicant_bss_proxy_(
172 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700173 dhcp_config_(new MockDHCPConfig(&control_interface_,
174 &dispatcher_,
175 &dhcp_provider_,
176 kDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -0800177 kHostName,
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700178 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700179 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700180 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000181 // Except for WiFiServices created via WiFi::GetService, we expect
182 // that any WiFiService has been registered with the Manager. So
183 // default Manager.HasService to true, to make the common case
184 // easy.
185 ON_CALL(manager_, HasService(_)).
186 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800187
188 ON_CALL(dhcp_provider_, CreateConfig(_, _)).
189 WillByDefault(Return(dhcp_config_));
190 ON_CALL(*dhcp_config_.get(), RequestIP()).
191 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700192 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700193
194 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700195 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700196 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
197 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800198 ON_CALL(manager_, device_info()).
199 WillByDefault(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700200 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800201 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700202 }
203
204 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800205 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800206 if (supplicant_bss_proxy_.get()) {
207 EXPECT_CALL(*supplicant_bss_proxy_, Die());
208 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700209 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700210 // must Stop WiFi instance, to clear its list of services.
211 // otherwise, the WiFi instance will not be deleted. (because
212 // services reference a WiFi instance, creating a cycle.)
213 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700214 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700215 }
216
mukesh agrawal31950242011-07-14 11:53:38 -0700217 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000218 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
219
mukesh agrawal31950242011-07-14 11:53:38 -0700220 class TestProxyFactory : public ProxyFactory {
221 public:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800222 explicit TestProxyFactory(WiFiMainTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700223
224 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700225 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700226 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700227 }
228
229 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700230 const WiFiRefPtr &/*wifi*/,
231 const DBus::Path &/*object_path*/,
232 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700233 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700234 }
235
mukesh agrawalb20776f2012-02-10 16:00:36 -0800236 MOCK_METHOD3(CreateSupplicantBSSProxy,
237 SupplicantBSSProxyInterface *(
238 WiFiEndpoint *wifi_endpoint,
239 const DBus::Path &object_path,
240 const char *dbus_addr));
241
mukesh agrawal31950242011-07-14 11:53:38 -0700242 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800243 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
244 WiFiEndpoint */*wifi_endpoint*/,
245 const DBus::Path &/*object_path*/,
246 const char */*dbus_addr*/) {
247 return test_->supplicant_bss_proxy_.release();
248 }
249
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700250 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700251 };
252
mukesh agrawal15908392011-11-16 18:29:25 +0000253 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
254 bool hidden_ssid = false;
255 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
256 }
257 const WiFiServiceRefPtr &GetCurrentService() {
258 return wifi_->current_service_;
259 }
mukesh agrawal31950242011-07-14 11:53:38 -0700260 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000261 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700262 }
mukesh agrawal15908392011-11-16 18:29:25 +0000263 const WiFiServiceRefPtr &GetPendingService() {
264 return wifi_->pending_service_;
265 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000266 const vector<WiFiServiceRefPtr> &GetServices() {
267 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700268 }
269 // note: the tests need the proxies referenced by WiFi (not the
270 // proxies instantiated by WiFiMainTest), to ensure that WiFi
271 // sets up its proxies correctly.
272 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
273 return wifi_->supplicant_process_proxy_.get();
274 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000275 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
276 return dynamic_cast<MockSupplicantInterfaceProxy *>(
277 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700278 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000279 const string &GetSupplicantState() {
280 return wifi_->supplicant_state_;
281 }
282 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700283 map<string, ::DBus::Variant> params;
284 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700285 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000286 void InitiateDisconnect(WiFiServiceRefPtr service) {
287 wifi_->DisconnectFrom(service);
288 }
mukesh agrawal15908392011-11-16 18:29:25 +0000289 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawalb20776f2012-02-10 16:00:36 -0800290 return WiFiEndpoint::MakeOpenEndpoint(&proxy_factory_, NULL, ssid, bssid);
mukesh agrawal15908392011-11-16 18:29:25 +0000291 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000292 MockWiFiServiceRefPtr MakeMockService() {
293 vector<uint8_t> ssid(1, 'a');
294 return new MockWiFiService(
295 &control_interface_,
296 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800297 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000298 &manager_,
299 wifi_,
300 ssid,
301 flimflam::kModeManaged,
302 flimflam::kSecurityNone,
303 false);
304 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000305 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700306 void ReportBSS(const ::DBus::Path &bss_path,
307 const string &ssid,
308 const string &bssid,
309 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000310 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700311 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800312 void ClearCachedCredentials() {
313 wifi_->ClearCachedCredentials();
314 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800315 void ReportIPConfigComplete() {
316 wifi_->IPConfigUpdatedCallback(dhcp_config_, true);
317 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700318 void ReportLinkUp() {
319 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
320 }
mukesh agrawal31950242011-07-14 11:53:38 -0700321 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700322 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700323 }
mukesh agrawal15908392011-11-16 18:29:25 +0000324 void ReportCurrentBSSChanged(const string &new_bss) {
325 wifi_->CurrentBSSChanged(new_bss);
326 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000327 void ReportStateChanged(const string &new_state) {
328 wifi_->StateChanged(new_state);
329 }
mukesh agrawal31950242011-07-14 11:53:38 -0700330 void StartWiFi() {
331 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700332 }
333 void StopWiFi() {
334 wifi_->Stop();
335 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800336 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700337 const char *ssid,
338 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800339 Error *result) {
340 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700341 }
342 void GetService(const char *service_type,
343 const char *ssid,
344 const char *mode,
345 const char *security,
346 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800347 Error *result) {
348 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
349 result);
350 }
351 WiFiServiceRefPtr GetServiceInner(const char *service_type,
352 const char *ssid,
353 const char *mode,
354 const char *security,
355 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800356 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800357 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700358 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700359 // in general, we want to avoid D-Bus specific code for any RPCs
360 // that come in via adaptors. we make an exception here, because
361 // calls to GetWifiService are rerouted from the Manager object to
362 // the Wifi class.
363 if (service_type != NULL)
364 args[flimflam::kTypeProperty].writer().append_string(service_type);
365 if (ssid != NULL)
366 args[flimflam::kSSIDProperty].writer().append_string(ssid);
367 if (mode != NULL)
368 args[flimflam::kModeProperty].writer().append_string(mode);
369 if (security != NULL)
370 args[flimflam::kSecurityProperty].writer().append_string(security);
371 if (passphrase != NULL)
372 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800373 if (!allow_hidden)
374 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700375
Paul Stewartced6a0b2011-11-08 15:32:04 -0800376 Error e;
377 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700378 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800379 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700380 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800381 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
382 const string &mode,
383 const string &security) {
384 return wifi_->FindService(ssid, mode, security);
385 }
386 bool LoadHiddenServices(StoreInterface *storage) {
387 return wifi_->LoadHiddenServices(storage);
388 }
389 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
390 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
391 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
392 flimflam::kTypeWifi,
393 kDeviceAddress,
394 hex_ssid.c_str(),
395 flimflam::kModeManaged,
396 flimflam::kSecurityNone));
397 const char *groups[] = { id->c_str() };
398 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
399 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
400 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
401 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
402 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
403 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
404 }
mukesh agrawal32399322011-09-01 10:53:43 -0700405 MockManager *manager() {
406 return &manager_;
407 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800408
409 MockDeviceInfo *device_info() {
410 return &device_info_;
411 }
412
413 MockDHCPProvider *dhcp_provider() {
414 return &dhcp_provider_;
415 }
416
mukesh agrawal32399322011-09-01 10:53:43 -0700417 const WiFiConstRefPtr wifi() const {
418 return wifi_;
419 }
420
mukesh agrawalb20776f2012-02-10 16:00:36 -0800421 TestProxyFactory *proxy_factory() {
422 return &proxy_factory_;
423 }
424
mukesh agrawal32399322011-09-01 10:53:43 -0700425 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700426 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700427
428 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700429 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800430 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700431 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700432 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800433 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700434 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700435
436 // protected fields interspersed between private fields, due to
437 // initialization order
438 protected:
439 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700440 static const char kDeviceAddress[];
Paul Stewartd32f4842012-01-11 16:08:13 -0800441 static const char kHostName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700442 static const char kNetworkModeAdHoc[];
443 static const char kNetworkModeInfrastructure[];
444
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700445 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
446 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800447 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700448 MockDHCPProvider dhcp_provider_;
449 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700450
451 private:
452 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700453};
454
455const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800456const char WiFiMainTest::kDeviceAddress[] = "000102030405";
Paul Stewartd32f4842012-01-11 16:08:13 -0800457const char WiFiMainTest::kHostName[] = "hostname";
mukesh agrawal31950242011-07-14 11:53:38 -0700458const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
459const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
460
mukesh agrawal261daca2011-12-02 18:56:56 +0000461void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000462 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000463}
464
mukesh agrawal31950242011-07-14 11:53:38 -0700465void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
466 const string &ssid,
467 const string &bssid,
468 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000469 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700470 const char *mode) {
471 map<string, ::DBus::Variant> bss_properties;
472
473 {
474 DBus::MessageIter writer(bss_properties["SSID"].writer());
475 writer << vector<uint8_t>(ssid.begin(), ssid.end());
476 }
477 {
478 string bssid_nosep;
479 vector<uint8_t> bssid_bytes;
480 RemoveChars(bssid, ":", &bssid_nosep);
481 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
482
483 DBus::MessageIter writer(bss_properties["BSSID"].writer());
484 writer << bssid_bytes;
485 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000486 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
487 append_int16(signal_strength);
488 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
489 append_uint16(frequency);
490 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000491 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700492}
493
mukesh agrawalb20776f2012-02-10 16:00:36 -0800494WiFiMainTest::TestProxyFactory::TestProxyFactory(WiFiMainTest *test)
495 : test_(test) {
496 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
497 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
498 .WillByDefault(
499 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
500}
501
mukesh agrawal31950242011-07-14 11:53:38 -0700502TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
503 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
504 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
505
506 StartWiFi();
507 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
508 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
509}
510
511TEST_F(WiFiMainTest, CleanStart) {
512 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
513 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
514 .Times(AnyNumber())
515 .WillRepeatedly(Throw(
516 DBus::Error(
517 "fi.w1.wpa_supplicant1.InterfaceUnknown",
518 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
519 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
520 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700521 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700522}
523
524TEST_F(WiFiMainTest, Restart) {
525 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
526 .Times(AnyNumber())
527 .WillRepeatedly(Throw(
528 DBus::Error(
529 "fi.w1.wpa_supplicant1.InterfaceExists",
530 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
531 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
532 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
533 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700534 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700535}
536
537TEST_F(WiFiMainTest, StartClearsState) {
538 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
539 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
540 StartWiFi();
541}
542
543TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800544 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700545 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000546 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700547 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000548 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700549 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000550 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700551 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000552 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
553 const uint16 frequency = 2412;
554 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
555 kNetworkModeAdHoc);
556
557 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
558 EXPECT_EQ(5, endpoints_by_rpcid.size());
559
560 WiFi::EndpointMap::const_iterator i;
561 WiFiEndpointRefPtr endpoint;
562 for (i = endpoints_by_rpcid.begin();
563 i != endpoints_by_rpcid.end();
564 ++i) {
565 if (i->second->bssid_string() == "00:00:00:00:00:04")
566 break;
567 }
568 ASSERT_TRUE(i != endpoints_by_rpcid.end());
569 EXPECT_EQ(4, i->second->signal_strength());
570 EXPECT_EQ(frequency, i->second->frequency());
571 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700572}
573
574TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800575 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
576 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
577 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700578 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000579 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700580 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000581 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700582 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000583 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700584 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000585 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
586 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000587
588 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
589 EXPECT_EQ(3, endpoints_by_rpcid.size());
590
591 WiFi::EndpointMap::const_iterator i;
592 WiFiEndpointRefPtr endpoint;
593 for (i = endpoints_by_rpcid.begin();
594 i != endpoints_by_rpcid.end();
595 ++i) {
596 if (i->second->bssid_string() == "00:00:00:00:00:00")
597 break;
598 }
599 ASSERT_TRUE(i != endpoints_by_rpcid.end());
600 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700601}
602
603TEST_F(WiFiMainTest, ScanCompleted) {
604 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000605 EXPECT_CALL(*manager(), RegisterService(_))
606 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000607 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700608 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000609 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700610 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000611 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700612 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000613 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800614
mukesh agrawale9adda12012-02-09 18:33:48 -0800615 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000616 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800617 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800618 EXPECT_EQ(3, GetServices().size());
619
mukesh agrawale9adda12012-02-09 18:33:48 -0800620 // BSSes with empty SSIDs should be filtered.
621 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
622 EXPECT_EQ(3, GetEndpointMap().size());
623 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000624}
625
626TEST_F(WiFiMainTest, EndpointGroupingTogether) {
627 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000628
629 InSequence s;
630 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800631 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000632 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000633 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
634 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000635 ReportScanDone();
636 EXPECT_EQ(1, GetServices().size());
637}
638
639TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
640 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000641 EXPECT_CALL(*manager(), RegisterService(_))
642 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000643 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
644 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000645 ReportScanDone();
646 EXPECT_EQ(2, GetServices().size());
647}
648
649TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
650 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000651 EXPECT_CALL(*manager(), RegisterService(_))
652 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000653 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
654 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
655 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000656 ReportScanDone();
657 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700658}
659
mukesh agrawal261daca2011-12-02 18:56:56 +0000660TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
661 // Removal of non-existent BSS should not cause a crash.
662 StartWiFi();
663 RemoveBSS("bss0");
664 EXPECT_EQ(0, GetServices().size());
665}
666
mukesh agrawale9adda12012-02-09 18:33:48 -0800667TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
668 // Removal of BSS with an empty SSID should not cause a crash.
669 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
670 StartWiFi();
671 RemoveBSS("bss");
672 EXPECT_EQ(0, GetServices().size());
673}
674
675TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
676 // Removal of BSS with a NULL SSID should not cause a crash.
677 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
678 StartWiFi();
679 RemoveBSS("bss");
680 EXPECT_EQ(0, GetServices().size());
681}
682
mukesh agrawal261daca2011-12-02 18:56:56 +0000683TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800684 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000685 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000686 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000687 ReportScanDone();
688 EXPECT_EQ(1, GetServices().size());
689 EXPECT_TRUE(GetServices().front()->IsVisible());
690
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000691 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000692 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000693 EXPECT_TRUE(GetServices().empty());
694}
695
696TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800697 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000698 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000699 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000700 ReportScanDone();
701 ReportCurrentBSSChanged("bss0");
702
703 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
704 EXPECT_CALL(*manager(), DeregisterService(_));
705 RemoveBSS("bss0");
706 EXPECT_TRUE(GetServices().empty());
707}
708
709TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800710 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
711 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000712 StartWiFi();
713
714 Error e;
715 WiFiServiceRefPtr service =
716 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
717 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000718 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000719
Thieu Lee41a72d2012-02-06 20:46:51 +0000720 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
721 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000722 ReportScanDone();
723 ReportCurrentBSSChanged("bss");
724 EXPECT_EQ(1, GetServices().size());
725
726 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000727 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000728 EXPECT_EQ(1, GetServices().size());
729 // Verify expectations now, because WiFi may call UpdateService when
730 // WiFi is Stop()-ed (during TearDown()).
731 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -0800732 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000733}
734
735TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800736 EXPECT_CALL(*manager(), RegisterService(_));
737 EXPECT_CALL(*manager(), HasService(_));
738 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000739 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000740 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
741 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000742 ReportScanDone();
743 EXPECT_EQ(1, GetServices().size());
744 EXPECT_TRUE(GetServices().front()->IsVisible());
745
746 EXPECT_CALL(*manager(), UpdateService(_));
747 RemoveBSS("bss0");
748 EXPECT_TRUE(GetServices().front()->IsVisible());
749 EXPECT_EQ(1, GetServices().size());
750}
751
mukesh agrawal31950242011-07-14 11:53:38 -0700752TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800753 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700754 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
755 *supplicant_interface_proxy_;
756
mukesh agrawal31950242011-07-14 11:53:38 -0700757 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000758 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700759 ReportScanDone();
760
761 {
762 InSequence s;
763 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000764 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700765
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700766 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700767 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700768 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700769 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700770 EXPECT_EQ(static_cast<Service *>(service),
771 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700772 }
773}
774
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000775TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800776 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000777 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
778 *supplicant_interface_proxy_;
779
780 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000781 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000782 WiFiService *service(GetServices().begin()->get());
783 InitiateConnect(service);
784
785 EXPECT_FALSE(GetPendingService() == NULL);
786 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
787 InitiateDisconnect(service);
788
789 EXPECT_TRUE(GetPendingService() == NULL);
790}
791
792TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800793 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
794 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
795 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
796 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000797 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
798 *supplicant_interface_proxy_;
799
800 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000801 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
802 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000803 WiFiService *service0(GetServices()[0].get());
804 WiFiService *service1(GetServices()[1].get());
805
806 InitiateConnect(service0);
807 ReportCurrentBSSChanged("bss0");
808 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
809 InitiateConnect(service1);
810
811 EXPECT_EQ(service0, GetCurrentService());
812 EXPECT_EQ(service1, GetPendingService());
813 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
814 InitiateDisconnect(service1);
815
816 // |current_service_| will be unchanged until supplicant signals
817 // that CurrentBSS has changed.
818 EXPECT_EQ(service0, GetCurrentService());
819 // |pending_service_| is updated immediately.
820 EXPECT_TRUE(GetPendingService() == NULL);
821}
822
823TEST_F(WiFiMainTest, DisconnectCurrentService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800824 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
825 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
826 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
827 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000828 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
829 *supplicant_interface_proxy_;
830
831 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000832 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000833 WiFiService *service(GetServices().begin()->get());
834 InitiateConnect(service);
835 ReportCurrentBSSChanged("bss0");
836 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
837
838 EXPECT_EQ(service, GetCurrentService());
839 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
840 InitiateDisconnect(service);
841
842 // |current_service_| should not change until supplicant reports
843 // a BSS change.
844 EXPECT_EQ(service, GetCurrentService());
845}
846
847TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800848 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
849 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
850 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
851 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000852 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
853 *supplicant_interface_proxy_;
854
855 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000856 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
857 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000858 WiFiService *service0(GetServices()[0].get());
859 WiFiService *service1(GetServices()[1].get());
860
861 InitiateConnect(service0);
862 ReportCurrentBSSChanged("bss0");
863 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
864 InitiateConnect(service1);
865
866 EXPECT_EQ(service0, GetCurrentService());
867 EXPECT_EQ(service1, GetPendingService());
868 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
869 .Times(0);
870 InitiateDisconnect(service0);
871
872 EXPECT_EQ(service0, GetCurrentService());
873 EXPECT_EQ(service1, GetPendingService());
874}
875
876TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800877 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000878 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
879 *supplicant_interface_proxy_;
880
881 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000882 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000883 WiFiService *service(GetServices().begin()->get());
884 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
885 .Times(0);
886 InitiateDisconnect(service);
887}
888
889TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800890 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
891 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
892 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
893 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000894 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
895 *supplicant_interface_proxy_;
896
897 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000898 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000899
900 WiFiService *service(GetServices().begin()->get());
901 DBus::Path fake_path("/fake/path");
902 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
903 .WillOnce(Return(fake_path));
904 InitiateConnect(service);
905 ReportCurrentBSSChanged("bss0");
906 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
907
908 EXPECT_EQ(service, GetCurrentService());
909 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
910 .WillRepeatedly(Throw(
911 DBus::Error(
912 "fi.w1.wpa_supplicant1.NotConnected",
913 "test threw fi.w1.wpa_supplicant1.NotConnected")));
914 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
915 InitiateDisconnect(service);
916
917 EXPECT_TRUE(GetCurrentService() == NULL);
918}
919
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700920TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800921 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -0800922 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000923 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800924 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700925
mukesh agrawalc01f3982012-01-24 13:48:39 -0800926 EXPECT_CALL(*manager(), DeregisterService(_));
927 StopWiFi();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700928}
929
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700930TEST_F(WiFiMainTest, GetWifiServiceOpen) {
931 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800932 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700933 EXPECT_TRUE(e.IsSuccess());
934}
935
936TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
937 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800938 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700939 EXPECT_EQ(Error::kInvalidArguments, e.type());
940 EXPECT_EQ("must specify service type", e.message());
941}
942
943TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
944 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800945 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700946 EXPECT_EQ(Error::kInvalidArguments, e.type());
947 EXPECT_EQ("must specify SSID", e.message());
948}
949
950TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
951 Error e;
952 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800953 flimflam::kTypeWifi, "123456789012345678901234567890123",
954 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700955 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
956 EXPECT_EQ("SSID is too long", e.message());
957}
958
959TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
960 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800961 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700962 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
963 EXPECT_EQ("SSID is too short", e.message());
964}
965
966TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
967 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800968 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700969 EXPECT_EQ(Error::kNotSupported, e.type());
970 EXPECT_EQ("service mode is unsupported", e.message());
971}
972
973TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
974 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800975 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700976 EXPECT_TRUE(e.IsSuccess());
977}
978
979TEST_F(WiFiMainTest, GetWifiServiceRSN) {
980 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800981 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
982 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700983 EXPECT_TRUE(e.IsSuccess());
984}
985
986TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
987 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800988 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
989 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700990 EXPECT_EQ(Error::kInvalidArguments, e.type());
991 EXPECT_EQ("must specify passphrase", e.message());
992}
993
994TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
995 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800996 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
997 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700998 EXPECT_EQ(Error::kNotSupported, e.type());
999 EXPECT_EQ("security mode is unsupported", e.message());
1000}
1001
1002TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
1003 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001004 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1005 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001006 EXPECT_EQ(Error::kInvalidArguments, e.type());
1007 EXPECT_EQ("must specify passphrase", e.message());
1008}
1009
1010TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1011 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001012 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1013 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001014 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1015}
1016
1017TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1018 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001019 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1020 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001021 EXPECT_TRUE(e.IsSuccess());
1022}
1023
1024TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1025 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001026 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1027 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001028 EXPECT_TRUE(e.IsSuccess());
1029}
1030
1031TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1032 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001033 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1034 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001035 EXPECT_TRUE(e.IsSuccess());
1036}
1037
1038TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1039 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001040 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1041 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001042 EXPECT_TRUE(e.IsSuccess());
1043}
1044
1045TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1046 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001047 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1048 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001049 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1050}
1051
1052TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1053 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001054 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1055 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001056 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1057}
1058
1059TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1060 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001061 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1062 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001063 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1064}
1065
1066TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1067 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001068 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1069 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001070 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1071}
1072
1073TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1074 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001075 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1076 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001077 EXPECT_TRUE(e.IsSuccess());
1078}
1079
1080TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1081 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001082 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1083 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001084 EXPECT_TRUE(e.IsSuccess());
1085}
1086
1087TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1088 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001089 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1090 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001091 EXPECT_TRUE(e.IsSuccess());
1092}
1093
1094TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1095 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001096 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1097 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001098 EXPECT_TRUE(e.IsSuccess());
1099}
1100
mukesh agrawal8ede0522011-10-03 14:57:44 -07001101class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1102class WiFiGetServiceFailureTest : public WiFiMainTest {};
1103
1104TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1105 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001106 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1107 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001108 EXPECT_TRUE(e.IsSuccess());
1109}
1110
1111TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1112 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001113 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1114 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001115 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1116}
1117
1118INSTANTIATE_TEST_CASE_P(
1119 WiFiGetServiceSuccessTestInstance,
1120 WiFiGetServiceSuccessTest,
1121 Values(
1122 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1123 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1124 // subtle: invalid length for hex key, but valid as ascii passphrase
1125 string(IEEE_80211::kWPAHexLen-1, '1'),
1126 string(IEEE_80211::kWPAHexLen, '1')));
1127
1128INSTANTIATE_TEST_CASE_P(
1129 WiFiGetServiceFailureTestInstance,
1130 WiFiGetServiceFailureTest,
1131 Values(
1132 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1133 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1134 string(IEEE_80211::kWPAHexLen+1, '1')));
1135
Paul Stewart6ab23a92011-11-09 17:17:47 -08001136TEST_F(WiFiMainTest, FindServiceWEP) {
1137 const string ssid("an_ssid");
1138 {
1139 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001140 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001141 flimflam::kSecurityWep, "abcde", &e);
1142 EXPECT_TRUE(e.IsSuccess());
1143 }
1144 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1145
Paul Stewarta41e38d2011-11-11 07:47:29 -08001146 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1147 flimflam::kSecurityWep).get());
1148 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1149 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001150}
1151
1152TEST_F(WiFiMainTest, FindServiceWPA) {
1153 const string ssid("an_ssid");
1154 {
1155 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001156 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001157 flimflam::kSecurityRsn, "abcdefgh", &e);
1158 EXPECT_TRUE(e.IsSuccess());
1159 }
1160 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001161 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1162 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001163 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001164 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1165 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001166 EXPECT_TRUE(rsn_service.get());
1167 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001168 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1169 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001170 EXPECT_EQ(wpa_service.get(), psk_service.get());
1171 // Indirectly test FindService by doing a GetService on something that
1172 // already exists.
1173 {
1174 Error e;
1175 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001176 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1177 flimflam::kModeManaged, flimflam::kSecurityWpa,
1178 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001179 EXPECT_TRUE(e.IsSuccess());
1180 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1181 }
1182}
1183
Paul Stewartced6a0b2011-11-08 15:32:04 -08001184MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001185 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001186 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1187 if (it == arg.end()) {
1188 return false;
1189 }
1190
1191 const DBus::Variant &ssids_variant = it->second;
1192 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1193 const ByteArrays &ssids = it->second.operator ByteArrays();
1194 // A valid Scan containing a single hidden SSID should contain
1195 // two SSID entries: one containing the SSID we are looking for,
1196 // and an empty entry, signifying that we also want to do a
1197 // broadcast probe request for all non-hidden APs as well.
1198 return ssids.size() == 2 &&
1199 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1200 ssids[1].empty();
1201}
1202
1203TEST_F(WiFiMainTest, ScanHidden) {
1204 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1205 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1206 .Times(AnyNumber())
1207 .WillRepeatedly(Throw(
1208 DBus::Error(
1209 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1210 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001211 {
1212 // Create a hidden, favorite service.
1213 Error e;
1214 WiFiServiceRefPtr service =
1215 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1216 NULL, NULL, true, &e);
1217 EXPECT_TRUE(e.IsSuccess());
1218 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001219 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001220 }
1221 {
1222 // Create a hidden, non-favorite service.
1223 Error e;
1224 WiFiServiceRefPtr service =
1225 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1226 NULL, NULL, true, &e);
1227 EXPECT_TRUE(e.IsSuccess());
1228 EXPECT_TRUE(service->hidden_ssid());
1229 }
1230 {
1231 // Create a non-hidden, favorite service.
1232 Error e;
1233 WiFiServiceRefPtr service =
1234 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1235 NULL, NULL, false, &e);
1236 EXPECT_TRUE(e.IsSuccess());
1237 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001238 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001239 }
1240 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001241 StartWiFi();
1242 dispatcher_.DispatchPendingEvents();
1243}
1244
mukesh agrawal7ec71312011-11-10 02:08:26 +00001245TEST_F(WiFiMainTest, InitialSupplicantState) {
1246 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1247}
1248
1249TEST_F(WiFiMainTest, StateChangeNoService) {
1250 // State change should succeed even if there is no pending Service.
1251 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1252 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1253}
1254
1255TEST_F(WiFiMainTest, StateChangeWithService) {
1256 // Forward transition should trigger a Service state change.
1257 StartWiFi();
1258 dispatcher_.DispatchPendingEvents();
1259 MockWiFiServiceRefPtr service = MakeMockService();
1260 InitiateConnect(service);
1261 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1262 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1263 // Verify expectations now, because WiFi may report other state changes
1264 // when WiFi is Stop()-ed (during TearDown()).
1265 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001266 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001267}
1268
1269TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1270 // Some backwards transitions should not trigger a Service state change.
1271 // Supplicant state should still be updated, however.
Gary Moraind9f893f2012-02-06 10:03:40 -08001272 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1273 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001274 StartWiFi();
1275 dispatcher_.DispatchPendingEvents();
1276 MockWiFiServiceRefPtr service = MakeMockService();
Gary Moraind9f893f2012-02-06 10:03:40 -08001277 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001278 InitiateConnect(service);
1279 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001280 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1281 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1282 GetSupplicantState());
1283 // Verify expectations now, because WiFi may report other state changes
1284 // when WiFi is Stop()-ed (during TearDown()).
1285 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001286 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001287}
1288
Paul Stewarta41e38d2011-11-11 07:47:29 -08001289TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1290 StrictMock<MockStore> storage;
1291 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1292 .WillOnce(Return(set<string>()));
1293 EXPECT_FALSE(LoadHiddenServices(&storage));
1294}
1295
1296TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1297 string id;
1298 StrictMock<MockStore> storage;
1299 SetupHiddenStorage(&storage, "an_ssid", &id);
1300 // Missing "Hidden" property.
1301 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1302 .WillOnce(Return(false));
1303 EXPECT_FALSE(LoadHiddenServices(&storage));
1304}
1305
1306TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1307 string id;
1308 StrictMock<MockStore> storage;
1309 SetupHiddenStorage(&storage, "an_ssid", &id);
1310 // "Hidden" property set to "false".
1311 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1312 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1313 EXPECT_FALSE(LoadHiddenServices(&storage));
1314}
1315
1316TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1317 string id;
1318 StrictMock<MockStore> storage;
1319 SetupHiddenStorage(&storage, "an_ssid", &id);
1320 // Missing "SSID" property.
1321 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1322 .WillOnce(Return(false));
1323 EXPECT_FALSE(LoadHiddenServices(&storage));
1324}
1325
1326
1327TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1328 StrictMock<MockStore> storage;
1329 string id;
1330 SetupHiddenStorage(&storage, "an_ssid", &id);
1331 Error e;
1332 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1333 ASSERT_TRUE(e.IsSuccess());
1334 EXPECT_FALSE(LoadHiddenServices(&storage));
1335}
1336
1337TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001338 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001339 StrictMock<MockStore> storage;
1340 string ssid("an_ssid");
1341 string id;
1342 SetupHiddenStorage(&storage, ssid, &id);
1343 EXPECT_TRUE(LoadHiddenServices(&storage));
1344 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1345 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1346 flimflam::kSecurityNone).get());
1347}
1348
mukesh agrawal15908392011-11-16 18:29:25 +00001349TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001350 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1351 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1352 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1353 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001354 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1355 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1356
1357 // Note that the BSS handle used in this test ("an_ap") is not
1358 // intended to reflect the format used by supplicant. It's just
1359 // convenient for testing.
1360
1361 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001362 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001363 kNetworkModeInfrastructure);
1364 InitiateConnect(service);
1365 EXPECT_EQ(service, GetPendingService().get());
1366
1367 ReportCurrentBSSChanged("an_ap");
1368 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1369 EXPECT_EQ(Service::kStateConfiguring, service->state());
1370 EXPECT_EQ(service, GetCurrentService().get());
1371 EXPECT_EQ(NULL, GetPendingService().get());
1372
1373 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001374 EXPECT_EQ(Service::kStateFailure, service->state());
mukesh agrawal15908392011-11-16 18:29:25 +00001375 EXPECT_EQ(NULL, GetCurrentService().get());
1376 EXPECT_EQ(NULL, GetPendingService().get());
1377}
1378
1379TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001380 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1381 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1382 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1383 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001384 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1385 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1386 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1387 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1388
1389 // Note that the BSS handles used in this test ("ap1", "ap2") are
1390 // not intended to reflect the format used by supplicant. They're
1391 // just convenient for testing.
1392
1393 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001394 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001395 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001396 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001397 kNetworkModeInfrastructure);
1398 InitiateConnect(service1);
1399 ReportCurrentBSSChanged("ap1");
1400 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1401 EXPECT_EQ(service1.get(), GetCurrentService().get());
1402
mukesh agrawalc01f3982012-01-24 13:48:39 -08001403 // Note that we deliberately omit intermediate supplicant states
1404 // (e.g. kInterfaceStateAssociating), on the theory that they are
1405 // unreliable. Specifically, they may be quashed if the association
1406 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001407 ReportCurrentBSSChanged("ap2");
1408 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1409 EXPECT_EQ(service2.get(), GetCurrentService().get());
1410 EXPECT_EQ(Service::kStateIdle, service1->state());
1411 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1412}
1413
1414TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001415 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1416 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1417 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1418 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001419 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1420 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1421
1422 // Note that the BSS handle used in this test ("an_ap") is not
1423 // intended to reflect the format used by supplicant. It's just
1424 // convenient for testing.
1425
1426 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001427 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001428 kNetworkModeInfrastructure);
1429 InitiateConnect(service);
1430 ReportCurrentBSSChanged("an_ap");
1431 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1432 EXPECT_EQ(service.get(), GetCurrentService().get());
1433 EXPECT_EQ(Service::kStateConfiguring, service->state());
1434}
1435
Thieu Lee41a72d2012-02-06 20:46:51 +00001436TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001437 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1438 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1439 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1440
Thieu Lee41a72d2012-02-06 20:46:51 +00001441 const uint16 frequency1 = 2412;
1442 const uint16 frequency2 = 2442;
1443 StartWiFi();
1444 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1445 kNetworkModeInfrastructure);
1446 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1447 kNetworkModeInfrastructure);
1448 EXPECT_EQ(1, GetServices().size());
1449 WiFiService *service(GetServices()[0].get());
1450 InitiateConnect(service);
1451 ReportCurrentBSSChanged("bss1");
1452 EXPECT_EQ(frequency1, service->frequency_);
1453 ReportCurrentBSSChanged("bss2");
1454 EXPECT_EQ(frequency2, service->frequency_);
1455}
1456
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001457TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1458 Error e;
1459 EXPECT_CALL(*manager(), RegisterService(_))
1460 .Times(0);
1461 EXPECT_CALL(*manager(), HasService(_))
1462 .WillOnce(Return(false));
1463 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1464 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001465 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001466 kNetworkModeInfrastructure);
1467}
1468
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001469TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001470 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1471 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001472 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1473 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1474 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1475 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1476
1477 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001478 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001479 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001480 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001481 kNetworkModeInfrastructure);
1482 InitiateConnect(service1);
1483 EXPECT_EQ(service1.get(), GetPendingService().get());
1484
1485 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1486 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1487 InitiateConnect(service2);
1488 EXPECT_EQ(service2.get(), GetPendingService().get());
1489}
1490
1491TEST_F(WiFiMainTest, IsIdle) {
1492 StartWiFi();
1493 EXPECT_TRUE(wifi()->IsIdle());
1494
1495 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1496 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1497 Error error;
1498 service->AddEndpoint(ap);
1499 service->AutoConnect();
1500 EXPECT_FALSE(wifi()->IsIdle());
1501}
1502
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001503MATCHER(WiFiAddedArgs, "") {
1504 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1505 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1506}
1507
1508TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001509 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001510 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1511 *supplicant_interface_proxy_;
1512
1513 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001514 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001515 WiFiService *service(GetServices().begin()->get());
1516 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1517 InitiateConnect(service);
1518}
1519
mukesh agrawalc01f3982012-01-24 13:48:39 -08001520TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1521 StartWiFi();
1522 MockWiFiServiceRefPtr service = MakeMockService();
1523 InitiateConnect(service);
1524 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1525 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1526 ReportLinkUp();
1527
1528 // Verify expectations now, because WiFi may cause |service| state
1529 // changes during TearDown().
1530 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001531 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001532}
1533
1534TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001535 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1536 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1537 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001538 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1539 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1540
1541 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001542 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001543 kNetworkModeInfrastructure);
1544 InitiateConnect(service);
1545
1546 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1547 ReportCurrentBSSChanged("ap");
1548 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1549 EXPECT_EQ(Service::kStateConfiguring, service->state());
1550}
1551
1552TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001553 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1554 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1555 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1556 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
1557 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1558 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001559 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1560 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1561
mukesh agrawalc01f3982012-01-24 13:48:39 -08001562 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001563 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001564 kNetworkModeInfrastructure);
1565 InitiateConnect(service);
1566 ReportCurrentBSSChanged("ap");
1567 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1568 ReportIPConfigComplete();
1569 Mock::VerifyAndClearExpectations(service);
1570
1571 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1572 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1573}
1574
Paul Stewart66c86002012-01-30 18:00:52 -08001575TEST_F(WiFiMainTest, ClearCachedCredentials) {
1576 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1577 *supplicant_interface_proxy_;
1578
1579 StartWiFi();
1580
1581 // Ensure call to the proxy is deferred.
1582 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1583 .Times(0);
1584 ClearCachedCredentials();
1585
1586 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1587
1588 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1589 .Times(1);
1590 dispatcher_.DispatchPendingEvents();
1591
1592 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1593
1594 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1595 .Times(0);
1596 ClearCachedCredentials();
1597 ClearCachedCredentials();
1598
1599 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1600
1601 // Ensure multiple calls to ClearCachedCredentials() results in only
1602 // one call to the proxy.
1603 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1604 .Times(1);
1605 dispatcher_.DispatchPendingEvents();
1606}
1607
mukesh agrawalb20776f2012-02-10 16:00:36 -08001608TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1609 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1610 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1611 // we can test the interaction between WiFi and WiFiEndpoint. (Right
1612 // now, we're testing across multiple layers.)
1613 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1614 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1615 StartWiFi();
1616 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1617}
1618
1619TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1620 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1621 // factory for WiFiEndpoints.
1622 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1623
1624 // Get the pointer before we transfer ownership.
1625 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1626 EXPECT_CALL(*proxy, Die());
1627 StartWiFi();
1628 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1629 RemoveBSS("bss0");
1630 // Check this now, to make sure RemoveBSS killed the proxy (rather
1631 // than TearDown).
1632 Mock::VerifyAndClearExpectations(proxy);
1633}
1634
Chris Masone853b81b2011-06-24 14:11:41 -07001635} // namespace shill