blob: 0cd4ce646addc24df28dfc21e2053ed6717df14d [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"
Gary Morainac1bdb42012-02-16 17:42:29 -080038#include "shill/mock_power_manager.h"
39#include "shill/mock_power_manager_proxy.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070040#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080041#include "shill/mock_store.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080042#include "shill/mock_supplicant_bss_proxy.h"
mukesh agrawal31950242011-07-14 11:53:38 -070043#include "shill/mock_supplicant_interface_proxy.h"
44#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal5c05b292012-03-07 10:12:52 -080045#include "shill/mock_time.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000046#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070047#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070048#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070049#include "shill/proxy_factory.h"
50#include "shill/wifi_endpoint.h"
mukesh agrawal32399322011-09-01 10:53:43 -070051#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080052#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070053
Gary Morainac1bdb42012-02-16 17:42:29 -080054
Chris Masone853b81b2011-06-24 14:11:41 -070055using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080056using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070057using std::string;
58using std::vector;
59using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070060using ::testing::AnyNumber;
61using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080062using ::testing::DoAll;
mukesh agrawal31950242011-07-14 11:53:38 -070063using ::testing::InSequence;
mukesh agrawalb20776f2012-02-10 16:00:36 -080064using ::testing::Invoke;
mukesh agrawal7ec71312011-11-10 02:08:26 +000065using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070066using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070067using ::testing::Return;
Gary Morainac1bdb42012-02-16 17:42:29 -080068using ::testing::SaveArg;
Paul Stewarta41e38d2011-11-11 07:47:29 -080069using ::testing::SetArgumentPointee;
70using ::testing::StrEq;
71using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070072using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070073using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070074using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070075
76namespace shill {
77
mukesh agrawal31950242011-07-14 11:53:38 -070078class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070079 public:
mukesh agrawal31950242011-07-14 11:53:38 -070080 WiFiPropertyTest()
Thieu Le3426c8f2012-01-11 17:35:11 -080081 : device_(new WiFi(control_interface(),
82 NULL, NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070083 }
mukesh agrawal31950242011-07-14 11:53:38 -070084 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070085
86 protected:
mukesh agrawal8abd2f62012-01-30 14:56:14 -080087 WiFiRefPtr device_;
Chris Masone853b81b2011-06-24 14:11:41 -070088};
89
mukesh agrawal31950242011-07-14 11:53:38 -070090TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070091 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
92 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070093}
94
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080095TEST_F(WiFiPropertyTest, SetProperty) {
Chris Masonea8a2c252011-06-27 22:16:30 -070096 {
97 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -080098 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawalde29fa82011-09-16 16:16:36 -070099 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700100 flimflam::kBgscanSignalThresholdProperty,
101 PropertyStoreTest::kInt32V,
102 &error));
103 }
104 {
105 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800106 EXPECT_TRUE(DBusAdaptor::SetProperty(device_->mutable_store(),
107 flimflam::kScanIntervalProperty,
108 PropertyStoreTest::kUint16V,
109 &error));
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 }
Chris Masone853b81b2011-06-24 14:11:41 -0700111 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700112 {
113 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800114 EXPECT_FALSE(DBusAdaptor::SetProperty(device_->mutable_store(),
115 flimflam::kScanningProperty,
116 PropertyStoreTest::kBoolV,
117 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700118 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700119 }
Chris Masone853b81b2011-06-24 14:11:41 -0700120
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800121 {
122 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800123 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800124 device_->mutable_store(),
125 flimflam::kBgscanMethodProperty,
126 DBusAdaptor::StringToVariant(
127 wpa_supplicant::kNetworkBgscanMethodSimple),
128 &error));
129 }
130
131 {
132 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800133 EXPECT_FALSE(DBusAdaptor::SetProperty(
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800134 device_->mutable_store(),
135 flimflam::kBgscanMethodProperty,
136 DBusAdaptor::StringToVariant("not a real scan method"),
137 &error));
138 }
139}
140
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800141TEST_F(WiFiPropertyTest, ClearDerivedProperty) {
142 EXPECT_NE(wpa_supplicant::kNetworkBgscanMethodLearn,
143 WiFi::kDefaultBgscanMethod);
144 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
145
146 ::DBus::Error error;
mukesh agrawal6bb9e7c2012-01-30 14:57:54 -0800147 EXPECT_TRUE(DBusAdaptor::SetProperty(
mukesh agrawal8abd2f62012-01-30 14:56:14 -0800148 device_->mutable_store(),
149 flimflam::kBgscanMethodProperty,
150 DBusAdaptor::StringToVariant(
151 wpa_supplicant::kNetworkBgscanMethodLearn),
152 &error));
153 EXPECT_EQ(wpa_supplicant::kNetworkBgscanMethodLearn, device_->bgscan_method_);
154
155 EXPECT_TRUE(DBusAdaptor::ClearProperty(
156 device_->mutable_store(), flimflam::kBgscanMethodProperty, &error));
157 EXPECT_EQ(WiFi::kDefaultBgscanMethod, device_->bgscan_method_);
158}
159
mukesh agrawal8ede0522011-10-03 14:57:44 -0700160class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700161 public:
162 WiFiMainTest()
Thieu Le3426c8f2012-01-11 17:35:11 -0800163 : manager_(&control_interface_, NULL, &metrics_, &glib_),
mukesh agrawalc01f3982012-01-24 13:48:39 -0800164 device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
Chris Masone626719f2011-08-18 16:58:48 -0700165 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700166 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800167 &metrics_,
Chris Masone626719f2011-08-18 16:58:48 -0700168 &manager_,
169 kDeviceName,
170 kDeviceAddress,
171 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700172 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
173 supplicant_interface_proxy_(
174 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalb20776f2012-02-10 16:00:36 -0800175 supplicant_bss_proxy_(
176 new NiceMock<MockSupplicantBSSProxy>()),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700177 dhcp_config_(new MockDHCPConfig(&control_interface_,
178 &dispatcher_,
179 &dhcp_provider_,
180 kDeviceName,
Paul Stewartd32f4842012-01-11 16:08:13 -0800181 kHostName,
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700182 &glib_)),
Gary Morainac1bdb42012-02-16 17:42:29 -0800183 proxy_factory_(this),
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500184 power_manager_(new MockPowerManager(&proxy_factory_)) {
mukesh agrawal31950242011-07-14 11:53:38 -0700185 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000186 // Except for WiFiServices created via WiFi::GetService, we expect
187 // that any WiFiService has been registered with the Manager. So
188 // default Manager.HasService to true, to make the common case
189 // easy.
190 ON_CALL(manager_, HasService(_)).
191 WillByDefault(Return(true));
mukesh agrawalc01f3982012-01-24 13:48:39 -0800192
193 ON_CALL(dhcp_provider_, CreateConfig(_, _)).
194 WillByDefault(Return(dhcp_config_));
195 ON_CALL(*dhcp_config_.get(), RequestIP()).
196 WillByDefault(Return(true));
Gary Morainac1bdb42012-02-16 17:42:29 -0800197
198 // |manager_| takes ownership of |power_manager_|.
199 manager_.set_power_manager(power_manager_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800200
201 wifi_->time_ = &time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700202 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700203
204 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700205 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700206 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
207 wifi_->set_dhcp_provider(&dhcp_provider_);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800208 ON_CALL(manager_, device_info()).
209 WillByDefault(Return(&device_info_));
Chris Masoneb9c00592011-10-06 13:10:39 -0700210 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawalb20776f2012-02-10 16:00:36 -0800211 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700212 }
213
214 virtual void TearDown() {
Gary Moraind9f893f2012-02-06 10:03:40 -0800215 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
Gary Morain91001122012-02-29 16:22:26 -0800216 EXPECT_CALL(*power_manager_, RemoveStateChangeCallback(wifi_->UniqueName()))
217 .Times(AnyNumber());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500218 wifi_->SelectService(NULL);
mukesh agrawalb20776f2012-02-10 16:00:36 -0800219 if (supplicant_bss_proxy_.get()) {
220 EXPECT_CALL(*supplicant_bss_proxy_, Die());
221 }
Darin Petkovab565bb2011-10-06 02:55:51 -0700222 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700223 // must Stop WiFi instance, to clear its list of services.
224 // otherwise, the WiFi instance will not be deleted. (because
225 // services reference a WiFi instance, creating a cycle.)
Eric Shienbrood9a245532012-03-07 14:20:39 -0500226 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700227 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700228 }
229
mukesh agrawal31950242011-07-14 11:53:38 -0700230 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000231 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
232
mukesh agrawal31950242011-07-14 11:53:38 -0700233 class TestProxyFactory : public ProxyFactory {
234 public:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800235 explicit TestProxyFactory(WiFiMainTest *test);
mukesh agrawal31950242011-07-14 11:53:38 -0700236
237 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700238 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700239 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700240 }
241
242 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700243 const WiFiRefPtr &/*wifi*/,
244 const DBus::Path &/*object_path*/,
245 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700246 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700247 }
248
mukesh agrawalb20776f2012-02-10 16:00:36 -0800249 MOCK_METHOD3(CreateSupplicantBSSProxy,
250 SupplicantBSSProxyInterface *(
251 WiFiEndpoint *wifi_endpoint,
252 const DBus::Path &object_path,
253 const char *dbus_addr));
254
Gary Morainac1bdb42012-02-16 17:42:29 -0800255 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
256 PowerManagerProxyDelegate */*delegate*/) {
257 return new MockPowerManagerProxy();
258 }
259
mukesh agrawal31950242011-07-14 11:53:38 -0700260 private:
mukesh agrawalb20776f2012-02-10 16:00:36 -0800261 SupplicantBSSProxyInterface *CreateSupplicantBSSProxyInternal(
262 WiFiEndpoint */*wifi_endpoint*/,
263 const DBus::Path &/*object_path*/,
264 const char */*dbus_addr*/) {
265 return test_->supplicant_bss_proxy_.release();
266 }
267
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700268 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700269 };
270
mukesh agrawal15908392011-11-16 18:29:25 +0000271 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
272 bool hidden_ssid = false;
273 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
274 }
275 const WiFiServiceRefPtr &GetCurrentService() {
276 return wifi_->current_service_;
277 }
mukesh agrawal31950242011-07-14 11:53:38 -0700278 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000279 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700280 }
mukesh agrawal15908392011-11-16 18:29:25 +0000281 const WiFiServiceRefPtr &GetPendingService() {
282 return wifi_->pending_service_;
283 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000284 const vector<WiFiServiceRefPtr> &GetServices() {
285 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700286 }
287 // note: the tests need the proxies referenced by WiFi (not the
288 // proxies instantiated by WiFiMainTest), to ensure that WiFi
289 // sets up its proxies correctly.
290 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
291 return wifi_->supplicant_process_proxy_.get();
292 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000293 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
294 return dynamic_cast<MockSupplicantInterfaceProxy *>(
295 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700296 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000297 const string &GetSupplicantState() {
298 return wifi_->supplicant_state_;
299 }
300 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700301 map<string, ::DBus::Variant> params;
302 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700303 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000304 void InitiateDisconnect(WiFiServiceRefPtr service) {
305 wifi_->DisconnectFrom(service);
306 }
mukesh agrawal15908392011-11-16 18:29:25 +0000307 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawale1d90e92012-02-15 17:36:08 -0800308 return WiFiEndpoint::MakeOpenEndpoint(
309 &proxy_factory_, NULL, ssid, bssid, 0, 0);
mukesh agrawal15908392011-11-16 18:29:25 +0000310 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000311 MockWiFiServiceRefPtr MakeMockService() {
312 vector<uint8_t> ssid(1, 'a');
313 return new MockWiFiService(
314 &control_interface_,
315 &dispatcher_,
Thieu Le3426c8f2012-01-11 17:35:11 -0800316 &metrics_,
mukesh agrawal7ec71312011-11-10 02:08:26 +0000317 &manager_,
318 wifi_,
319 ssid,
320 flimflam::kModeManaged,
321 flimflam::kSecurityNone,
322 false);
323 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000324 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700325 void ReportBSS(const ::DBus::Path &bss_path,
326 const string &ssid,
327 const string &bssid,
328 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000329 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700330 const char *mode);
Paul Stewart66c86002012-01-30 18:00:52 -0800331 void ClearCachedCredentials() {
332 wifi_->ClearCachedCredentials();
333 }
mukesh agrawalc01f3982012-01-24 13:48:39 -0800334 void ReportIPConfigComplete() {
Darin Petkov79d74c92012-03-07 17:20:32 +0100335 wifi_->OnIPConfigUpdated(dhcp_config_, true);
mukesh agrawalc01f3982012-01-24 13:48:39 -0800336 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700337 void ReportLinkUp() {
338 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
339 }
mukesh agrawal31950242011-07-14 11:53:38 -0700340 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700341 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700342 }
mukesh agrawal15908392011-11-16 18:29:25 +0000343 void ReportCurrentBSSChanged(const string &new_bss) {
344 wifi_->CurrentBSSChanged(new_bss);
345 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000346 void ReportStateChanged(const string &new_state) {
347 wifi_->StateChanged(new_state);
348 }
mukesh agrawal31950242011-07-14 11:53:38 -0700349 void StartWiFi() {
Gary Morainac1bdb42012-02-16 17:42:29 -0800350 EXPECT_CALL(*power_manager_, AddStateChangeCallback(wifi_->UniqueName(), _))
351 .WillOnce(SaveArg<1>(&power_state_callback_));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500352 wifi_->Start(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700353 }
354 void StopWiFi() {
Gary Morain91001122012-02-29 16:22:26 -0800355 EXPECT_CALL(*power_manager_,
356 RemoveStateChangeCallback(wifi_->UniqueName()));
Eric Shienbrood9a245532012-03-07 14:20:39 -0500357 wifi_->Stop(NULL, ResultCallback());
mukesh agrawal31950242011-07-14 11:53:38 -0700358 }
Gary Morainac1bdb42012-02-16 17:42:29 -0800359 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700360 const char *ssid,
361 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800362 Error *result) {
363 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700364 }
365 void GetService(const char *service_type,
366 const char *ssid,
367 const char *mode,
368 const char *security,
369 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800370 Error *result) {
371 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
372 result);
373 }
374 WiFiServiceRefPtr GetServiceInner(const char *service_type,
375 const char *ssid,
376 const char *mode,
377 const char *security,
378 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800379 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800380 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700381 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700382 // in general, we want to avoid D-Bus specific code for any RPCs
383 // that come in via adaptors. we make an exception here, because
384 // calls to GetWifiService are rerouted from the Manager object to
385 // the Wifi class.
386 if (service_type != NULL)
387 args[flimflam::kTypeProperty].writer().append_string(service_type);
388 if (ssid != NULL)
389 args[flimflam::kSSIDProperty].writer().append_string(ssid);
390 if (mode != NULL)
391 args[flimflam::kModeProperty].writer().append_string(mode);
392 if (security != NULL)
393 args[flimflam::kSecurityProperty].writer().append_string(security);
394 if (passphrase != NULL)
395 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800396 if (!allow_hidden)
397 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700398
Paul Stewartced6a0b2011-11-08 15:32:04 -0800399 Error e;
400 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700401 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800402 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700403 }
Paul Stewartcb59fed2012-03-21 21:14:46 -0700404
405 WiFiServiceRefPtr GetServiceWithKeyValues(const KeyValueStore &args,
406 Error *result) {
407 return wifi_->GetService(args, result);
408 }
409
Paul Stewarta41e38d2011-11-11 07:47:29 -0800410 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
411 const string &mode,
412 const string &security) {
413 return wifi_->FindService(ssid, mode, security);
414 }
415 bool LoadHiddenServices(StoreInterface *storage) {
416 return wifi_->LoadHiddenServices(storage);
417 }
418 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
419 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
420 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
421 flimflam::kTypeWifi,
422 kDeviceAddress,
423 hex_ssid.c_str(),
424 flimflam::kModeManaged,
425 flimflam::kSecurityNone));
426 const char *groups[] = { id->c_str() };
427 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
428 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
429 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
430 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
431 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
432 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
433 }
mukesh agrawal32399322011-09-01 10:53:43 -0700434 MockManager *manager() {
435 return &manager_;
436 }
Gary Moraind9f893f2012-02-06 10:03:40 -0800437
438 MockDeviceInfo *device_info() {
439 return &device_info_;
440 }
441
442 MockDHCPProvider *dhcp_provider() {
443 return &dhcp_provider_;
444 }
445
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500446 const PowerManager::PowerStateCallback &power_state_callback() const {
Gary Morainac1bdb42012-02-16 17:42:29 -0800447 return power_state_callback_;
448 }
449
mukesh agrawal32399322011-09-01 10:53:43 -0700450 const WiFiConstRefPtr wifi() const {
451 return wifi_;
452 }
453
mukesh agrawalb20776f2012-02-10 16:00:36 -0800454 TestProxyFactory *proxy_factory() {
455 return &proxy_factory_;
456 }
457
mukesh agrawal32399322011-09-01 10:53:43 -0700458 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700459 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal5c05b292012-03-07 10:12:52 -0800460 MockTime time_;
mukesh agrawal31950242011-07-14 11:53:38 -0700461
462 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700463 NiceMockControl control_interface_;
Thieu Le3426c8f2012-01-11 17:35:11 -0800464 MockMetrics metrics_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700465 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700466 MockManager manager_;
mukesh agrawalc01f3982012-01-24 13:48:39 -0800467 MockDeviceInfo device_info_;
mukesh agrawal31950242011-07-14 11:53:38 -0700468 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700469
470 // protected fields interspersed between private fields, due to
471 // initialization order
472 protected:
473 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700474 static const char kDeviceAddress[];
Paul Stewartd32f4842012-01-11 16:08:13 -0800475 static const char kHostName[];
mukesh agrawal31950242011-07-14 11:53:38 -0700476 static const char kNetworkModeAdHoc[];
477 static const char kNetworkModeInfrastructure[];
478
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700479 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
480 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalb20776f2012-02-10 16:00:36 -0800481 scoped_ptr<MockSupplicantBSSProxy> supplicant_bss_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700482 MockDHCPProvider dhcp_provider_;
483 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700484
485 private:
486 TestProxyFactory proxy_factory_;
Gary Morainac1bdb42012-02-16 17:42:29 -0800487 MockPowerManager *power_manager_;
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500488 PowerManager::PowerStateCallback power_state_callback_;
mukesh agrawal31950242011-07-14 11:53:38 -0700489};
490
491const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800492const char WiFiMainTest::kDeviceAddress[] = "000102030405";
Paul Stewartd32f4842012-01-11 16:08:13 -0800493const char WiFiMainTest::kHostName[] = "hostname";
mukesh agrawal31950242011-07-14 11:53:38 -0700494const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
495const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
496
mukesh agrawal261daca2011-12-02 18:56:56 +0000497void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000498 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000499}
500
mukesh agrawal31950242011-07-14 11:53:38 -0700501void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
502 const string &ssid,
503 const string &bssid,
504 int16_t signal_strength,
Thieu Lee41a72d2012-02-06 20:46:51 +0000505 uint16 frequency,
mukesh agrawal31950242011-07-14 11:53:38 -0700506 const char *mode) {
507 map<string, ::DBus::Variant> bss_properties;
508
509 {
510 DBus::MessageIter writer(bss_properties["SSID"].writer());
511 writer << vector<uint8_t>(ssid.begin(), ssid.end());
512 }
513 {
514 string bssid_nosep;
515 vector<uint8_t> bssid_bytes;
516 RemoveChars(bssid, ":", &bssid_nosep);
517 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
518
519 DBus::MessageIter writer(bss_properties["BSSID"].writer());
520 writer << bssid_bytes;
521 }
Thieu Lee41a72d2012-02-06 20:46:51 +0000522 bss_properties[wpa_supplicant::kBSSPropertySignal].writer().
523 append_int16(signal_strength);
524 bss_properties[wpa_supplicant::kBSSPropertyFrequency].writer().
525 append_uint16(frequency);
526 bss_properties[wpa_supplicant::kBSSPropertyMode].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000527 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700528}
529
mukesh agrawalb20776f2012-02-10 16:00:36 -0800530WiFiMainTest::TestProxyFactory::TestProxyFactory(WiFiMainTest *test)
531 : test_(test) {
532 EXPECT_CALL(*this, CreateSupplicantBSSProxy(_, _, _)).Times(AnyNumber());
533 ON_CALL(*this, CreateSupplicantBSSProxy(_, _, _))
534 .WillByDefault(
535 Invoke(this, (&TestProxyFactory::CreateSupplicantBSSProxyInternal)));
536}
537
mukesh agrawal31950242011-07-14 11:53:38 -0700538TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
539 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
540 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
541
542 StartWiFi();
543 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
544 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
545}
546
547TEST_F(WiFiMainTest, CleanStart) {
548 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
549 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
550 .Times(AnyNumber())
551 .WillRepeatedly(Throw(
552 DBus::Error(
553 "fi.w1.wpa_supplicant1.InterfaceUnknown",
554 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
555 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
556 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700557 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700558}
559
560TEST_F(WiFiMainTest, Restart) {
561 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
562 .Times(AnyNumber())
563 .WillRepeatedly(Throw(
564 DBus::Error(
565 "fi.w1.wpa_supplicant1.InterfaceExists",
566 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
567 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
568 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
569 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700570 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700571}
572
573TEST_F(WiFiMainTest, StartClearsState) {
574 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
575 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
576 StartWiFi();
577}
578
Gary Morainac1bdb42012-02-16 17:42:29 -0800579TEST_F(WiFiMainTest, PowerChangeToResumeStartsScanWhenIdle) {
580 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
581 StartWiFi();
582 dispatcher_.DispatchPendingEvents();
583 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
mukesh agrawal5c05b292012-03-07 10:12:52 -0800584 ReportScanDone();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500585 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800586 ASSERT_TRUE(wifi()->IsIdle());
587 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500588 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800589 dispatcher_.DispatchPendingEvents();
590}
591
592TEST_F(WiFiMainTest, PowerChangeToSuspendDoesNotStartScan) {
593 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
594 StartWiFi();
595 dispatcher_.DispatchPendingEvents();
596 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500597 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800598 ASSERT_TRUE(wifi()->IsIdle());
599 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500600 power_state_callback().Run(PowerManagerProxyDelegate::kStandby);
Gary Morainac1bdb42012-02-16 17:42:29 -0800601 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500602 power_state_callback().Run(PowerManagerProxyDelegate::kMem);
Gary Morainac1bdb42012-02-16 17:42:29 -0800603 dispatcher_.DispatchPendingEvents();
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500604 power_state_callback().Run(PowerManagerProxyDelegate::kDisk);
Gary Morainac1bdb42012-02-16 17:42:29 -0800605 dispatcher_.DispatchPendingEvents();
606}
607
608TEST_F(WiFiMainTest, PowerChangeDoesNotStartScanWhenNotIdle) {
609 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
610 StartWiFi();
611
612 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
613 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
614 Error error;
615 service->AddEndpoint(ap);
616 service->AutoConnect();
617 EXPECT_FALSE(wifi()->IsIdle());
618 dispatcher_.DispatchPendingEvents();
619 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500620 ASSERT_FALSE(power_state_callback().is_null());
Gary Morainac1bdb42012-02-16 17:42:29 -0800621 ASSERT_FALSE(wifi()->IsIdle());
622 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Scan(_)).Times(0);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500623 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
Gary Morainac1bdb42012-02-16 17:42:29 -0800624 dispatcher_.DispatchPendingEvents();
625}
626
mukesh agrawal31950242011-07-14 11:53:38 -0700627TEST_F(WiFiMainTest, ScanResults) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800628 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700629 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000630 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700631 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000632 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700633 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000634 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700635 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000636 "bss3", "ssid3", "00:00:00:00:00:03", 3, 0, kNetworkModeInfrastructure);
637 const uint16 frequency = 2412;
638 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, frequency,
639 kNetworkModeAdHoc);
640
641 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
642 EXPECT_EQ(5, endpoints_by_rpcid.size());
643
644 WiFi::EndpointMap::const_iterator i;
645 WiFiEndpointRefPtr endpoint;
646 for (i = endpoints_by_rpcid.begin();
647 i != endpoints_by_rpcid.end();
648 ++i) {
649 if (i->second->bssid_string() == "00:00:00:00:00:04")
650 break;
651 }
652 ASSERT_TRUE(i != endpoints_by_rpcid.end());
653 EXPECT_EQ(4, i->second->signal_strength());
654 EXPECT_EQ(frequency, i->second->frequency());
655 EXPECT_EQ("adhoc", i->second->network_mode());
mukesh agrawal31950242011-07-14 11:53:38 -0700656}
657
658TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800659 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
660 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
661 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal31950242011-07-14 11:53:38 -0700662 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000663 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700664 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000665 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700666 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000667 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700668 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000669 "bss1", "ssid1", "00:00:00:00:00:01", 3, 0, kNetworkModeInfrastructure);
670 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000671
672 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
673 EXPECT_EQ(3, endpoints_by_rpcid.size());
674
675 WiFi::EndpointMap::const_iterator i;
676 WiFiEndpointRefPtr endpoint;
677 for (i = endpoints_by_rpcid.begin();
678 i != endpoints_by_rpcid.end();
679 ++i) {
680 if (i->second->bssid_string() == "00:00:00:00:00:00")
681 break;
682 }
683 ASSERT_TRUE(i != endpoints_by_rpcid.end());
684 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700685}
686
687TEST_F(WiFiMainTest, ScanCompleted) {
688 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000689 EXPECT_CALL(*manager(), RegisterService(_))
690 .Times(3);
Thieu Lee41a72d2012-02-06 20:46:51 +0000691 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700692 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000693 "bss1", "ssid1", "00:00:00:00:00:01", 1, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700694 ReportBSS(
Thieu Lee41a72d2012-02-06 20:46:51 +0000695 "bss2", "ssid2", "00:00:00:00:00:02", 2, 0, kNetworkModeInfrastructure);
mukesh agrawal31950242011-07-14 11:53:38 -0700696 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000697 EXPECT_EQ(3, GetServices().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800698
mukesh agrawale9adda12012-02-09 18:33:48 -0800699 // BSSes with SSIDs that start with NULL should be filtered.
Thieu Lee41a72d2012-02-06 20:46:51 +0000700 ReportBSS("bss3", string(1, 0), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
mukesh agrawale9adda12012-02-09 18:33:48 -0800701 EXPECT_EQ(3, GetEndpointMap().size());
mukesh agrawalb3857612012-01-18 16:23:29 -0800702 EXPECT_EQ(3, GetServices().size());
703
mukesh agrawale9adda12012-02-09 18:33:48 -0800704 // BSSes with empty SSIDs should be filtered.
705 ReportBSS("bss3", string(), "00:00:00:00:00:03", 3, 0, kNetworkModeAdHoc);
706 EXPECT_EQ(3, GetEndpointMap().size());
707 EXPECT_EQ(3, GetServices().size());
mukesh agrawal165e6142011-11-22 02:22:56 +0000708}
709
710TEST_F(WiFiMainTest, EndpointGroupingTogether) {
711 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000712
713 InSequence s;
714 EXPECT_CALL(*manager(), RegisterService(_));
Gary Moraind9f893f2012-02-06 10:03:40 -0800715 EXPECT_CALL(*manager(), HasService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000716 EXPECT_CALL(*manager(), UpdateService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +0000717 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
718 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000719 ReportScanDone();
720 EXPECT_EQ(1, GetServices().size());
721}
722
723TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
724 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000725 EXPECT_CALL(*manager(), RegisterService(_))
726 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000727 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
728 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000729 ReportScanDone();
730 EXPECT_EQ(2, GetServices().size());
731}
732
733TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
734 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000735 EXPECT_CALL(*manager(), RegisterService(_))
736 .Times(2);
Thieu Lee41a72d2012-02-06 20:46:51 +0000737 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
738 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, 0,
739 kNetworkModeInfrastructure);
mukesh agrawal165e6142011-11-22 02:22:56 +0000740 ReportScanDone();
741 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700742}
743
mukesh agrawal261daca2011-12-02 18:56:56 +0000744TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
745 // Removal of non-existent BSS should not cause a crash.
746 StartWiFi();
747 RemoveBSS("bss0");
748 EXPECT_EQ(0, GetServices().size());
749}
750
mukesh agrawale9adda12012-02-09 18:33:48 -0800751TEST_F(WiFiMainTest, BSSWithEmptySSIDRemoved) {
752 // Removal of BSS with an empty SSID should not cause a crash.
753 ReportBSS("bss", string(), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
754 StartWiFi();
755 RemoveBSS("bss");
756 EXPECT_EQ(0, GetServices().size());
757}
758
759TEST_F(WiFiMainTest, BSSWithNullSSIDRemoved) {
760 // Removal of BSS with a NULL SSID should not cause a crash.
761 ReportBSS("bss", string(1, 0), "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
762 StartWiFi();
763 RemoveBSS("bss");
764 EXPECT_EQ(0, GetServices().size());
765}
766
mukesh agrawal261daca2011-12-02 18:56:56 +0000767TEST_F(WiFiMainTest, LoneBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800768 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000769 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000770 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000771 ReportScanDone();
772 EXPECT_EQ(1, GetServices().size());
773 EXPECT_TRUE(GetServices().front()->IsVisible());
774
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000775 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000776 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000777 EXPECT_TRUE(GetServices().empty());
778}
779
780TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800781 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000782 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000783 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000784 ReportScanDone();
785 ReportCurrentBSSChanged("bss0");
786
787 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
788 EXPECT_CALL(*manager(), DeregisterService(_));
789 RemoveBSS("bss0");
790 EXPECT_TRUE(GetServices().empty());
791}
792
793TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800794 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
795 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000796 StartWiFi();
797
798 Error e;
799 WiFiServiceRefPtr service =
800 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
801 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000802 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000803
Thieu Lee41a72d2012-02-06 20:46:51 +0000804 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, 0,
805 kNetworkModeInfrastructure);
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000806 ReportScanDone();
807 ReportCurrentBSSChanged("bss");
808 EXPECT_EQ(1, GetServices().size());
809
810 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000811 RemoveBSS("bss");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000812 EXPECT_EQ(1, GetServices().size());
813 // Verify expectations now, because WiFi may call UpdateService when
814 // WiFi is Stop()-ed (during TearDown()).
815 Mock::VerifyAndClearExpectations(manager());
Gary Moraind9f893f2012-02-06 10:03:40 -0800816 EXPECT_CALL(*manager(), DeregisterService(_)).Times(AnyNumber());
mukesh agrawal261daca2011-12-02 18:56:56 +0000817}
818
819TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800820 EXPECT_CALL(*manager(), RegisterService(_));
821 EXPECT_CALL(*manager(), HasService(_));
822 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000823 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000824 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
825 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal261daca2011-12-02 18:56:56 +0000826 ReportScanDone();
827 EXPECT_EQ(1, GetServices().size());
828 EXPECT_TRUE(GetServices().front()->IsVisible());
829
830 EXPECT_CALL(*manager(), UpdateService(_));
831 RemoveBSS("bss0");
832 EXPECT_TRUE(GetServices().front()->IsVisible());
833 EXPECT_EQ(1, GetServices().size());
834}
835
mukesh agrawal31950242011-07-14 11:53:38 -0700836TEST_F(WiFiMainTest, Connect) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800837 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700838 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
839 *supplicant_interface_proxy_;
840
mukesh agrawal31950242011-07-14 11:53:38 -0700841 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000842 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal31950242011-07-14 11:53:38 -0700843 ReportScanDone();
844
845 {
846 InSequence s;
847 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000848 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700849
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700850 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700851 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700852 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700853 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700854 EXPECT_EQ(static_cast<Service *>(service),
855 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700856 }
857}
858
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000859TEST_F(WiFiMainTest, DisconnectPendingService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800860 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000861 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
862 *supplicant_interface_proxy_;
863
864 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000865 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000866 WiFiService *service(GetServices().begin()->get());
867 InitiateConnect(service);
868
869 EXPECT_FALSE(GetPendingService() == NULL);
870 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
871 InitiateDisconnect(service);
872
873 EXPECT_TRUE(GetPendingService() == NULL);
874}
875
876TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800877 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
878 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
879 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
880 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000881 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
882 *supplicant_interface_proxy_;
883
884 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000885 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
886 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000887 WiFiService *service0(GetServices()[0].get());
888 WiFiService *service1(GetServices()[1].get());
889
890 InitiateConnect(service0);
891 ReportCurrentBSSChanged("bss0");
892 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
893 InitiateConnect(service1);
894
895 EXPECT_EQ(service0, GetCurrentService());
896 EXPECT_EQ(service1, GetPendingService());
897 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
898 InitiateDisconnect(service1);
899
900 // |current_service_| will be unchanged until supplicant signals
901 // that CurrentBSS has changed.
902 EXPECT_EQ(service0, GetCurrentService());
903 // |pending_service_| is updated immediately.
904 EXPECT_TRUE(GetPendingService() == NULL);
905}
906
907TEST_F(WiFiMainTest, DisconnectCurrentService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800908 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
909 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
910 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
911 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000912 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
913 *supplicant_interface_proxy_;
914
915 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000916 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000917 WiFiService *service(GetServices().begin()->get());
918 InitiateConnect(service);
919 ReportCurrentBSSChanged("bss0");
920 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
921
922 EXPECT_EQ(service, GetCurrentService());
923 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
924 InitiateDisconnect(service);
925
926 // |current_service_| should not change until supplicant reports
927 // a BSS change.
928 EXPECT_EQ(service, GetCurrentService());
929}
930
931TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800932 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
933 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
934 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
935 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000936 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
937 *supplicant_interface_proxy_;
938
939 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000940 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
941 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000942 WiFiService *service0(GetServices()[0].get());
943 WiFiService *service1(GetServices()[1].get());
944
945 InitiateConnect(service0);
946 ReportCurrentBSSChanged("bss0");
947 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
948 InitiateConnect(service1);
949
950 EXPECT_EQ(service0, GetCurrentService());
951 EXPECT_EQ(service1, GetPendingService());
952 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
953 .Times(0);
954 InitiateDisconnect(service0);
955
956 EXPECT_EQ(service0, GetCurrentService());
957 EXPECT_EQ(service1, GetPendingService());
958}
959
960TEST_F(WiFiMainTest, DisconnectInvalidService) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800961 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000962 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
963 *supplicant_interface_proxy_;
964
965 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000966 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000967 WiFiService *service(GetServices().begin()->get());
968 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
969 .Times(0);
970 InitiateDisconnect(service);
971}
972
973TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
Gary Moraind9f893f2012-02-06 10:03:40 -0800974 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
975 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
976 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
977 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000978 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
979 *supplicant_interface_proxy_;
980
981 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +0000982 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000983
984 WiFiService *service(GetServices().begin()->get());
985 DBus::Path fake_path("/fake/path");
986 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
987 .WillOnce(Return(fake_path));
988 InitiateConnect(service);
989 ReportCurrentBSSChanged("bss0");
990 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
991
992 EXPECT_EQ(service, GetCurrentService());
993 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
994 .WillRepeatedly(Throw(
995 DBus::Error(
996 "fi.w1.wpa_supplicant1.NotConnected",
997 "test threw fi.w1.wpa_supplicant1.NotConnected")));
998 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
999 InitiateDisconnect(service);
1000
1001 EXPECT_TRUE(GetCurrentService() == NULL);
1002}
1003
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001004TEST_F(WiFiMainTest, Stop) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001005 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001006 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001007 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawalc01f3982012-01-24 13:48:39 -08001008 ReportScanDone();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001009
mukesh agrawalc01f3982012-01-24 13:48:39 -08001010 EXPECT_CALL(*manager(), DeregisterService(_));
1011 StopWiFi();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -07001012}
1013
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001014TEST_F(WiFiMainTest, GetWifiServiceOpen) {
1015 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001016 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001017 EXPECT_TRUE(e.IsSuccess());
1018}
1019
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001020TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
1021 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001022 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001023 EXPECT_EQ(Error::kInvalidArguments, e.type());
1024 EXPECT_EQ("must specify SSID", e.message());
1025}
1026
1027TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
1028 Error e;
1029 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001030 flimflam::kTypeWifi, "123456789012345678901234567890123",
1031 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001032 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1033 EXPECT_EQ("SSID is too long", e.message());
1034}
1035
1036TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
1037 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001038 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001039 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
1040 EXPECT_EQ("SSID is too short", e.message());
1041}
1042
1043TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
1044 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001045 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001046 EXPECT_EQ(Error::kNotSupported, e.type());
1047 EXPECT_EQ("service mode is unsupported", e.message());
1048}
1049
1050TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
1051 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001052 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001053 EXPECT_TRUE(e.IsSuccess());
1054}
1055
1056TEST_F(WiFiMainTest, GetWifiServiceRSN) {
1057 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001058 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1059 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001060 EXPECT_TRUE(e.IsSuccess());
1061}
1062
1063TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
1064 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001065 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1066 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001067 EXPECT_EQ(Error::kInvalidArguments, e.type());
1068 EXPECT_EQ("must specify passphrase", e.message());
1069}
1070
1071TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
1072 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001073 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
1074 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001075 EXPECT_EQ(Error::kNotSupported, e.type());
1076 EXPECT_EQ("security mode is unsupported", e.message());
1077}
1078
1079TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
1080 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001081 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1082 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001083 EXPECT_EQ(Error::kInvalidArguments, e.type());
1084 EXPECT_EQ("must specify passphrase", e.message());
1085}
1086
1087TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
1088 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001089 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1090 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001091 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1092}
1093
1094TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
1095 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001096 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1097 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001098 EXPECT_TRUE(e.IsSuccess());
1099}
1100
1101TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
1102 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001103 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1104 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001105 EXPECT_TRUE(e.IsSuccess());
1106}
1107
1108TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
1109 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001110 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1111 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001112 EXPECT_TRUE(e.IsSuccess());
1113}
1114
1115TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
1116 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001117 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1118 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001119 EXPECT_TRUE(e.IsSuccess());
1120}
1121
1122TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
1123 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001124 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1125 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001126 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1127}
1128
1129TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
1130 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001131 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1132 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001133 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1134}
1135
1136TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
1137 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001138 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1139 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001140 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1141}
1142
1143TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
1144 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001145 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1146 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001147 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1148}
1149
1150TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
1151 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001152 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1153 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001154 EXPECT_TRUE(e.IsSuccess());
1155}
1156
1157TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
1158 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001159 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1160 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001161 EXPECT_TRUE(e.IsSuccess());
1162}
1163
1164TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
1165 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001166 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1167 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001168 EXPECT_TRUE(e.IsSuccess());
1169}
1170
1171TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
1172 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001173 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1174 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -07001175 EXPECT_TRUE(e.IsSuccess());
1176}
1177
mukesh agrawal8ede0522011-10-03 14:57:44 -07001178class WiFiGetServiceSuccessTest : public WiFiMainTest {};
1179class WiFiGetServiceFailureTest : public WiFiMainTest {};
1180
1181TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
1182 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001183 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1184 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001185 EXPECT_TRUE(e.IsSuccess());
1186}
1187
1188TEST_P(WiFiGetServiceFailureTest, Passphrase) {
1189 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001190 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
1191 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -07001192 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
1193}
1194
1195INSTANTIATE_TEST_CASE_P(
1196 WiFiGetServiceSuccessTestInstance,
1197 WiFiGetServiceSuccessTest,
1198 Values(
1199 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
1200 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
1201 // subtle: invalid length for hex key, but valid as ascii passphrase
1202 string(IEEE_80211::kWPAHexLen-1, '1'),
1203 string(IEEE_80211::kWPAHexLen, '1')));
1204
1205INSTANTIATE_TEST_CASE_P(
1206 WiFiGetServiceFailureTestInstance,
1207 WiFiGetServiceFailureTest,
1208 Values(
1209 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
1210 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
1211 string(IEEE_80211::kWPAHexLen+1, '1')));
1212
Paul Stewart6ab23a92011-11-09 17:17:47 -08001213TEST_F(WiFiMainTest, FindServiceWEP) {
1214 const string ssid("an_ssid");
1215 {
1216 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001217 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001218 flimflam::kSecurityWep, "abcde", &e);
1219 EXPECT_TRUE(e.IsSuccess());
1220 }
1221 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1222
Paul Stewarta41e38d2011-11-11 07:47:29 -08001223 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1224 flimflam::kSecurityWep).get());
1225 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1226 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001227}
1228
1229TEST_F(WiFiMainTest, FindServiceWPA) {
1230 const string ssid("an_ssid");
1231 {
1232 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001233 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001234 flimflam::kSecurityRsn, "abcdefgh", &e);
1235 EXPECT_TRUE(e.IsSuccess());
1236 }
1237 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001238 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1239 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001240 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001241 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1242 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001243 EXPECT_TRUE(rsn_service.get());
1244 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001245 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1246 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001247 EXPECT_EQ(wpa_service.get(), psk_service.get());
1248 // Indirectly test FindService by doing a GetService on something that
1249 // already exists.
1250 {
1251 Error e;
1252 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001253 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1254 flimflam::kModeManaged, flimflam::kSecurityWpa,
1255 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001256 EXPECT_TRUE(e.IsSuccess());
1257 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1258 }
1259}
1260
Paul Stewartcb59fed2012-03-21 21:14:46 -07001261TEST_F(WiFiMainTest, GetServiceWithGUID) {
1262 // Perform a GetService that also configures properties in the base Service
1263 // class using Service::Configure().
1264 KeyValueStore args;
1265 args.SetString(flimflam::kTypeProperty, flimflam::kTypeWifi);
1266 args.SetString(flimflam::kSSIDProperty, "ssid");
1267 args.SetString(flimflam::kSecurityProperty, flimflam::kSecurityNone);
1268 const string kGUID = "aguid"; // Stored as a registered Service property.
1269 args.SetString(flimflam::kGuidProperty, kGUID);
1270 Error e;
1271 WiFiServiceRefPtr service = GetServiceWithKeyValues(args, &e);
1272 EXPECT_TRUE(e.IsSuccess());
1273 EXPECT_EQ(kGUID, service->guid());
1274}
1275
Paul Stewartced6a0b2011-11-08 15:32:04 -08001276MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001277 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001278 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1279 if (it == arg.end()) {
1280 return false;
1281 }
1282
1283 const DBus::Variant &ssids_variant = it->second;
1284 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1285 const ByteArrays &ssids = it->second.operator ByteArrays();
1286 // A valid Scan containing a single hidden SSID should contain
1287 // two SSID entries: one containing the SSID we are looking for,
1288 // and an empty entry, signifying that we also want to do a
1289 // broadcast probe request for all non-hidden APs as well.
1290 return ssids.size() == 2 &&
1291 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1292 ssids[1].empty();
1293}
1294
1295TEST_F(WiFiMainTest, ScanHidden) {
1296 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1297 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1298 .Times(AnyNumber())
1299 .WillRepeatedly(Throw(
1300 DBus::Error(
1301 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1302 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001303 {
1304 // Create a hidden, favorite service.
1305 Error e;
1306 WiFiServiceRefPtr service =
1307 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1308 NULL, NULL, true, &e);
1309 EXPECT_TRUE(e.IsSuccess());
1310 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001311 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001312 }
1313 {
1314 // Create a hidden, non-favorite service.
1315 Error e;
1316 WiFiServiceRefPtr service =
1317 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1318 NULL, NULL, true, &e);
1319 EXPECT_TRUE(e.IsSuccess());
1320 EXPECT_TRUE(service->hidden_ssid());
1321 }
1322 {
1323 // Create a non-hidden, favorite service.
1324 Error e;
1325 WiFiServiceRefPtr service =
1326 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1327 NULL, NULL, false, &e);
1328 EXPECT_TRUE(e.IsSuccess());
1329 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001330 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001331 }
1332 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001333 StartWiFi();
1334 dispatcher_.DispatchPendingEvents();
1335}
1336
mukesh agrawal7ec71312011-11-10 02:08:26 +00001337TEST_F(WiFiMainTest, InitialSupplicantState) {
1338 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1339}
1340
1341TEST_F(WiFiMainTest, StateChangeNoService) {
1342 // State change should succeed even if there is no pending Service.
1343 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1344 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1345}
1346
1347TEST_F(WiFiMainTest, StateChangeWithService) {
1348 // Forward transition should trigger a Service state change.
1349 StartWiFi();
1350 dispatcher_.DispatchPendingEvents();
1351 MockWiFiServiceRefPtr service = MakeMockService();
1352 InitiateConnect(service);
1353 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1354 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1355 // Verify expectations now, because WiFi may report other state changes
1356 // when WiFi is Stop()-ed (during TearDown()).
1357 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001358 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001359}
1360
1361TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1362 // Some backwards transitions should not trigger a Service state change.
1363 // Supplicant state should still be updated, however.
Gary Moraind9f893f2012-02-06 10:03:40 -08001364 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1365 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001366 StartWiFi();
1367 dispatcher_.DispatchPendingEvents();
1368 MockWiFiServiceRefPtr service = MakeMockService();
Gary Moraind9f893f2012-02-06 10:03:40 -08001369 EXPECT_CALL(*service.get(), SetState(Service::kStateConfiguring));
mukesh agrawal7ec71312011-11-10 02:08:26 +00001370 InitiateConnect(service);
1371 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
mukesh agrawal7ec71312011-11-10 02:08:26 +00001372 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1373 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1374 GetSupplicantState());
1375 // Verify expectations now, because WiFi may report other state changes
1376 // when WiFi is Stop()-ed (during TearDown()).
1377 Mock::VerifyAndClearExpectations(service.get());
Gary Moraind9f893f2012-02-06 10:03:40 -08001378 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawal7ec71312011-11-10 02:08:26 +00001379}
1380
Paul Stewarta41e38d2011-11-11 07:47:29 -08001381TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1382 StrictMock<MockStore> storage;
1383 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1384 .WillOnce(Return(set<string>()));
1385 EXPECT_FALSE(LoadHiddenServices(&storage));
1386}
1387
1388TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1389 string id;
1390 StrictMock<MockStore> storage;
1391 SetupHiddenStorage(&storage, "an_ssid", &id);
1392 // Missing "Hidden" property.
1393 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1394 .WillOnce(Return(false));
1395 EXPECT_FALSE(LoadHiddenServices(&storage));
1396}
1397
1398TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1399 string id;
1400 StrictMock<MockStore> storage;
1401 SetupHiddenStorage(&storage, "an_ssid", &id);
1402 // "Hidden" property set to "false".
1403 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1404 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1405 EXPECT_FALSE(LoadHiddenServices(&storage));
1406}
1407
1408TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1409 string id;
1410 StrictMock<MockStore> storage;
1411 SetupHiddenStorage(&storage, "an_ssid", &id);
1412 // Missing "SSID" property.
1413 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1414 .WillOnce(Return(false));
1415 EXPECT_FALSE(LoadHiddenServices(&storage));
1416}
1417
1418
1419TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1420 StrictMock<MockStore> storage;
1421 string id;
1422 SetupHiddenStorage(&storage, "an_ssid", &id);
1423 Error e;
1424 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1425 ASSERT_TRUE(e.IsSuccess());
1426 EXPECT_FALSE(LoadHiddenServices(&storage));
1427}
1428
1429TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001430 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001431 StrictMock<MockStore> storage;
1432 string ssid("an_ssid");
1433 string id;
1434 SetupHiddenStorage(&storage, ssid, &id);
1435 EXPECT_TRUE(LoadHiddenServices(&storage));
1436 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1437 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1438 flimflam::kSecurityNone).get());
1439}
1440
mukesh agrawal15908392011-11-16 18:29:25 +00001441TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001442 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1443 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1444 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1445 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001446 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1447 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1448
1449 // Note that the BSS handle used in this test ("an_ap") is not
1450 // intended to reflect the format used by supplicant. It's just
1451 // convenient for testing.
1452
1453 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001454 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001455 kNetworkModeInfrastructure);
1456 InitiateConnect(service);
1457 EXPECT_EQ(service, GetPendingService().get());
1458
1459 ReportCurrentBSSChanged("an_ap");
1460 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1461 EXPECT_EQ(Service::kStateConfiguring, service->state());
1462 EXPECT_EQ(service, GetCurrentService().get());
1463 EXPECT_EQ(NULL, GetPendingService().get());
1464
1465 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal568b5c62012-02-28 14:44:47 -08001466 EXPECT_EQ(Service::kStateIdle, service->state());
1467 EXPECT_TRUE(service->IsFailed());
mukesh agrawal15908392011-11-16 18:29:25 +00001468 EXPECT_EQ(NULL, GetCurrentService().get());
1469 EXPECT_EQ(NULL, GetPendingService().get());
1470}
1471
1472TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001473 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1474 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1475 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
1476 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001477 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1478 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1479 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1480 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1481
1482 // Note that the BSS handles used in this test ("ap1", "ap2") are
1483 // not intended to reflect the format used by supplicant. They're
1484 // just convenient for testing.
1485
1486 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001487 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001488 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001489 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001490 kNetworkModeInfrastructure);
1491 InitiateConnect(service1);
1492 ReportCurrentBSSChanged("ap1");
1493 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1494 EXPECT_EQ(service1.get(), GetCurrentService().get());
1495
mukesh agrawalc01f3982012-01-24 13:48:39 -08001496 // Note that we deliberately omit intermediate supplicant states
1497 // (e.g. kInterfaceStateAssociating), on the theory that they are
1498 // unreliable. Specifically, they may be quashed if the association
1499 // completes before supplicant flushes its changed properties.
mukesh agrawal15908392011-11-16 18:29:25 +00001500 ReportCurrentBSSChanged("ap2");
1501 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1502 EXPECT_EQ(service2.get(), GetCurrentService().get());
1503 EXPECT_EQ(Service::kStateIdle, service1->state());
1504 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1505}
1506
1507TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001508 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1509 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1510 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1511 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(AnyNumber());
mukesh agrawal15908392011-11-16 18:29:25 +00001512 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1513 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1514
1515 // Note that the BSS handle used in this test ("an_ap") is not
1516 // intended to reflect the format used by supplicant. It's just
1517 // convenient for testing.
1518
1519 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001520 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawal15908392011-11-16 18:29:25 +00001521 kNetworkModeInfrastructure);
1522 InitiateConnect(service);
1523 ReportCurrentBSSChanged("an_ap");
1524 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1525 EXPECT_EQ(service.get(), GetCurrentService().get());
1526 EXPECT_EQ(Service::kStateConfiguring, service->state());
1527}
1528
Thieu Lee41a72d2012-02-06 20:46:51 +00001529TEST_F(WiFiMainTest, CurrentBSSChangedUpdateServiceEndpoint) {
mukesh agrawalb20776f2012-02-10 16:00:36 -08001530 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1531 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1532 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1533
Thieu Lee41a72d2012-02-06 20:46:51 +00001534 const uint16 frequency1 = 2412;
1535 const uint16 frequency2 = 2442;
1536 StartWiFi();
1537 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 1, frequency1,
1538 kNetworkModeInfrastructure);
1539 ReportBSS("bss2", "ssid1", "00:00:00:00:00:02", 1, frequency2,
1540 kNetworkModeInfrastructure);
1541 EXPECT_EQ(1, GetServices().size());
1542 WiFiService *service(GetServices()[0].get());
1543 InitiateConnect(service);
1544 ReportCurrentBSSChanged("bss1");
1545 EXPECT_EQ(frequency1, service->frequency_);
1546 ReportCurrentBSSChanged("bss2");
1547 EXPECT_EQ(frequency2, service->frequency_);
1548}
1549
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001550TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1551 Error e;
1552 EXPECT_CALL(*manager(), RegisterService(_))
1553 .Times(0);
1554 EXPECT_CALL(*manager(), HasService(_))
1555 .WillOnce(Return(false));
1556 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1557 EXPECT_CALL(*manager(), RegisterService(_));
Thieu Lee41a72d2012-02-06 20:46:51 +00001558 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0, 0,
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001559 kNetworkModeInfrastructure);
1560}
1561
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001562TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001563 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
1564 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001565 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1566 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1567 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1568 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1569
1570 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001571 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001572 kNetworkModeInfrastructure);
Thieu Lee41a72d2012-02-06 20:46:51 +00001573 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0, 0,
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001574 kNetworkModeInfrastructure);
1575 InitiateConnect(service1);
1576 EXPECT_EQ(service1.get(), GetPendingService().get());
1577
1578 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1579 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1580 InitiateConnect(service2);
1581 EXPECT_EQ(service2.get(), GetPendingService().get());
1582}
1583
1584TEST_F(WiFiMainTest, IsIdle) {
1585 StartWiFi();
1586 EXPECT_TRUE(wifi()->IsIdle());
1587
1588 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1589 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1590 Error error;
1591 service->AddEndpoint(ap);
1592 service->AutoConnect();
1593 EXPECT_FALSE(wifi()->IsIdle());
1594}
1595
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001596MATCHER(WiFiAddedArgs, "") {
1597 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1598 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1599}
1600
1601TEST_F(WiFiMainTest, AddNetworkArgs) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001602 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001603 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1604 *supplicant_interface_proxy_;
1605
1606 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001607 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001608 WiFiService *service(GetServices().begin()->get());
1609 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1610 InitiateConnect(service);
1611}
1612
mukesh agrawalc01f3982012-01-24 13:48:39 -08001613TEST_F(WiFiMainTest, StateAndIPIgnoreLinkEvent) {
1614 StartWiFi();
1615 MockWiFiServiceRefPtr service = MakeMockService();
1616 InitiateConnect(service);
1617 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1618 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1619 ReportLinkUp();
1620
1621 // Verify expectations now, because WiFi may cause |service| state
1622 // changes during TearDown().
1623 Mock::VerifyAndClearExpectations(service);
Gary Moraind9f893f2012-02-06 10:03:40 -08001624 EXPECT_CALL(*service.get(), SetState(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001625}
1626
1627TEST_F(WiFiMainTest, SupplicantCompleted) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001628 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1629 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1630 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001631 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1632 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1633
1634 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001635 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001636 kNetworkModeInfrastructure);
1637 InitiateConnect(service);
1638
1639 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1640 ReportCurrentBSSChanged("ap");
1641 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1642 EXPECT_EQ(Service::kStateConfiguring, service->state());
1643}
1644
1645TEST_F(WiFiMainTest, SupplicantCompletedAlreadyConnected) {
Gary Moraind9f893f2012-02-06 10:03:40 -08001646 EXPECT_CALL(*dhcp_config_.get(), RequestIP());
1647 EXPECT_CALL(*manager(), UpdateService(_)).Times(AnyNumber());
1648 EXPECT_CALL(*device_info(), FlushAddresses(_)).Times(AnyNumber());
1649 EXPECT_CALL(*manager(), device_info()).Times(AnyNumber());
1650 EXPECT_CALL(*dhcp_provider(), CreateConfig(_, _)).Times(AnyNumber());
1651 EXPECT_CALL(*manager(), HasService(_)).Times(AnyNumber());
Gary Morainac1bdb42012-02-16 17:42:29 -08001652 EXPECT_CALL(*manager(), IsPortalDetectionEnabled(_)).Times(AnyNumber());
mukesh agrawalc01f3982012-01-24 13:48:39 -08001653 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1654 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1655
mukesh agrawalc01f3982012-01-24 13:48:39 -08001656 StartWiFi();
Thieu Lee41a72d2012-02-06 20:46:51 +00001657 ReportBSS("ap", ap->ssid_string(), ap->bssid_string(), 0, 0,
mukesh agrawalc01f3982012-01-24 13:48:39 -08001658 kNetworkModeInfrastructure);
1659 InitiateConnect(service);
1660 ReportCurrentBSSChanged("ap");
1661 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1662 ReportIPConfigComplete();
1663 Mock::VerifyAndClearExpectations(service);
1664
1665 EXPECT_CALL(*dhcp_config_.get(), RequestIP()).Times(0);
1666 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1667}
1668
Paul Stewart66c86002012-01-30 18:00:52 -08001669TEST_F(WiFiMainTest, ClearCachedCredentials) {
1670 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1671 *supplicant_interface_proxy_;
1672
1673 StartWiFi();
1674
1675 // Ensure call to the proxy is deferred.
1676 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1677 .Times(0);
1678 ClearCachedCredentials();
1679
1680 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1681
1682 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1683 .Times(1);
1684 dispatcher_.DispatchPendingEvents();
1685
1686 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1687
1688 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1689 .Times(0);
1690 ClearCachedCredentials();
1691 ClearCachedCredentials();
1692
1693 Mock::VerifyAndClearExpectations(&supplicant_interface_proxy);
1694
1695 // Ensure multiple calls to ClearCachedCredentials() results in only
1696 // one call to the proxy.
1697 EXPECT_CALL(supplicant_interface_proxy, ClearCachedCredentials())
1698 .Times(1);
1699 dispatcher_.DispatchPendingEvents();
1700}
1701
mukesh agrawalb20776f2012-02-10 16:00:36 -08001702TEST_F(WiFiMainTest, BSSAddedCreatesBSSProxy) {
1703 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1704 // TODO(quiche): Consider using a factory for WiFiEndpoints, so that
1705 // we can test the interaction between WiFi and WiFiEndpoint. (Right
1706 // now, we're testing across multiple layers.)
1707 EXPECT_CALL(*supplicant_bss_proxy_, Die()).Times(AnyNumber());
1708 EXPECT_CALL(*proxy_factory(), CreateSupplicantBSSProxy(_, _, _));
1709 StartWiFi();
1710 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1711}
1712
1713TEST_F(WiFiMainTest, BSSRemovedDestroysBSSProxy) {
1714 // TODO(quiche): As for BSSAddedCreatesBSSProxy, consider using a
1715 // factory for WiFiEndpoints.
1716 EXPECT_CALL(*manager(), RegisterService(_)).Times(AnyNumber());
1717
1718 // Get the pointer before we transfer ownership.
1719 MockSupplicantBSSProxy *proxy = supplicant_bss_proxy_.get();
1720 EXPECT_CALL(*proxy, Die());
1721 StartWiFi();
1722 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, 0, kNetworkModeAdHoc);
1723 RemoveBSS("bss0");
1724 // Check this now, to make sure RemoveBSS killed the proxy (rather
1725 // than TearDown).
1726 Mock::VerifyAndClearExpectations(proxy);
1727}
1728
mukesh agrawal5c05b292012-03-07 10:12:52 -08001729TEST_F(WiFiMainTest, FlushBSSOnResume) {
1730 const struct timeval resume_time = {1, 0};
1731 const struct timeval scan_done_time = {6, 0};
1732 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1733 *supplicant_interface_proxy_;
1734
1735 StartWiFi();
1736
1737 EXPECT_CALL(time_, GetTimeMonotonic(_))
1738 .WillOnce(DoAll(SetArgumentPointee<0>(resume_time), Return(0)))
1739 .WillOnce(DoAll(SetArgumentPointee<0>(scan_done_time), Return(0)));
1740 EXPECT_CALL(supplicant_interface_proxy,
1741 FlushBSS(WiFi::kMaxBSSResumeAgeSeconds + 5));
Eric Shienbrood3e20a232012-02-16 11:35:56 -05001742 power_state_callback().Run(PowerManagerProxyDelegate::kOn);
mukesh agrawal5c05b292012-03-07 10:12:52 -08001743 ReportScanDone();
1744}
1745
Chris Masone853b81b2011-06-24 14:11:41 -07001746} // namespace shill