blob: ed35eeb63a32b971df58557c07e6ad788b7c637a [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 agrawalf2f68a52011-09-01 12:15:48 -070033#include "shill/mock_dhcp_config.h"
34#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070035#include "shill/mock_manager.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070036#include "shill/mock_rtnl_handler.h"
Paul Stewarta41e38d2011-11-11 07:47:29 -080037#include "shill/mock_store.h"
mukesh agrawal31950242011-07-14 11:53:38 -070038#include "shill/mock_supplicant_interface_proxy.h"
39#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawal7ec71312011-11-10 02:08:26 +000040#include "shill/mock_wifi_service.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070041#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070042#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070043#include "shill/proxy_factory.h"
44#include "shill/wifi_endpoint.h"
45#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070046#include "shill/wifi_service.h"
Paul Stewartced6a0b2011-11-08 15:32:04 -080047#include "shill/wpa_supplicant.h"
Chris Masone853b81b2011-06-24 14:11:41 -070048
49using std::map;
Paul Stewarta41e38d2011-11-11 07:47:29 -080050using std::set;
Chris Masone853b81b2011-06-24 14:11:41 -070051using std::string;
52using std::vector;
53using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070054using ::testing::AnyNumber;
55using ::testing::DefaultValue;
Paul Stewarta41e38d2011-11-11 07:47:29 -080056using ::testing::DoAll;
mukesh agrawal31950242011-07-14 11:53:38 -070057using ::testing::InSequence;
mukesh agrawal7ec71312011-11-10 02:08:26 +000058using ::testing::Mock;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070059using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070060using ::testing::Return;
Paul Stewarta41e38d2011-11-11 07:47:29 -080061using ::testing::SetArgumentPointee;
62using ::testing::StrEq;
63using ::testing::StrictMock;
Chris Masone853b81b2011-06-24 14:11:41 -070064using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070065using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070066using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070067
68namespace shill {
69
mukesh agrawal31950242011-07-14 11:53:38 -070070class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070071 public:
mukesh agrawal31950242011-07-14 11:53:38 -070072 WiFiPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070073 : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070074 }
mukesh agrawal31950242011-07-14 11:53:38 -070075 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070076
77 protected:
78 DeviceRefPtr device_;
79};
80
mukesh agrawal31950242011-07-14 11:53:38 -070081TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070082 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
83 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070084}
85
mukesh agrawal31950242011-07-14 11:53:38 -070086TEST_F(WiFiPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070087 {
88 ::DBus::Error error;
Chris Masonea8a2c252011-06-27 22:16:30 -070089 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070090 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070091 flimflam::kBgscanSignalThresholdProperty,
92 PropertyStoreTest::kInt32V,
93 &error));
94 }
95 {
96 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070097 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070098 flimflam::kScanIntervalProperty,
99 PropertyStoreTest::kUint16V,
100 &error));
101 }
Chris Masone853b81b2011-06-24 14:11:41 -0700102 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 {
104 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700105 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700106 flimflam::kScanningProperty,
107 PropertyStoreTest::kBoolV,
108 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700109 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 }
Chris Masone853b81b2011-06-24 14:11:41 -0700111}
112
mukesh agrawal4d0401c2012-01-06 16:05:31 -0800113TEST_F(WiFiPropertyTest, BgscanMethod) {
114 {
115 ::DBus::Error error;
116 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
117 device_->mutable_store(),
118 flimflam::kBgscanMethodProperty,
119 DBusAdaptor::StringToVariant(
120 wpa_supplicant::kNetworkBgscanMethodSimple),
121 &error));
122 }
123
124 {
125 ::DBus::Error error;
126 EXPECT_FALSE(DBusAdaptor::DispatchOnType(
127 device_->mutable_store(),
128 flimflam::kBgscanMethodProperty,
129 DBusAdaptor::StringToVariant("not a real scan method"),
130 &error));
131 }
132}
133
mukesh agrawal8ede0522011-10-03 14:57:44 -0700134class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700135 public:
136 WiFiMainTest()
Chris Masoneb9c00592011-10-06 13:10:39 -0700137 : manager_(&control_interface_, NULL, &glib_),
Chris Masone626719f2011-08-18 16:58:48 -0700138 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700139 &dispatcher_,
Chris Masone626719f2011-08-18 16:58:48 -0700140 &manager_,
141 kDeviceName,
142 kDeviceAddress,
143 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700144 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
145 supplicant_interface_proxy_(
146 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700147 dhcp_config_(new MockDHCPConfig(&control_interface_,
148 &dispatcher_,
149 &dhcp_provider_,
150 kDeviceName,
151 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700152 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700153 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000154 // Except for WiFiServices created via WiFi::GetService, we expect
155 // that any WiFiService has been registered with the Manager. So
156 // default Manager.HasService to true, to make the common case
157 // easy.
158 ON_CALL(manager_, HasService(_)).
159 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700160 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700161
162 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700163 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700164 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
165 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700166 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700167 }
168
169 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700170 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700171 // must Stop WiFi instance, to clear its list of services.
172 // otherwise, the WiFi instance will not be deleted. (because
173 // services reference a WiFi instance, creating a cycle.)
174 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700175 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700176 }
177
mukesh agrawal31950242011-07-14 11:53:38 -0700178 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000179 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
180
mukesh agrawal31950242011-07-14 11:53:38 -0700181 class TestProxyFactory : public ProxyFactory {
182 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700183 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700184
185 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700186 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700187 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700188 }
189
190 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700191 const WiFiRefPtr &/*wifi*/,
192 const DBus::Path &/*object_path*/,
193 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700194 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700195 }
196
197 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700198 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700199 };
200
mukesh agrawal15908392011-11-16 18:29:25 +0000201 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
202 bool hidden_ssid = false;
203 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
204 }
205 const WiFiServiceRefPtr &GetCurrentService() {
206 return wifi_->current_service_;
207 }
mukesh agrawal31950242011-07-14 11:53:38 -0700208 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000209 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700210 }
mukesh agrawal15908392011-11-16 18:29:25 +0000211 const WiFiServiceRefPtr &GetPendingService() {
212 return wifi_->pending_service_;
213 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000214 const vector<WiFiServiceRefPtr> &GetServices() {
215 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700216 }
217 // note: the tests need the proxies referenced by WiFi (not the
218 // proxies instantiated by WiFiMainTest), to ensure that WiFi
219 // sets up its proxies correctly.
220 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
221 return wifi_->supplicant_process_proxy_.get();
222 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000223 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
224 return dynamic_cast<MockSupplicantInterfaceProxy *>(
225 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700226 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000227 const string &GetSupplicantState() {
228 return wifi_->supplicant_state_;
229 }
230 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700231 map<string, ::DBus::Variant> params;
232 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700233 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000234 void InitiateDisconnect(WiFiServiceRefPtr service) {
235 wifi_->DisconnectFrom(service);
236 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700237 bool IsLinkUp() {
238 return wifi_->link_up_;
239 }
mukesh agrawal15908392011-11-16 18:29:25 +0000240 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000241 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
mukesh agrawal15908392011-11-16 18:29:25 +0000242 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000243 MockWiFiServiceRefPtr MakeMockService() {
244 vector<uint8_t> ssid(1, 'a');
245 return new MockWiFiService(
246 &control_interface_,
247 &dispatcher_,
248 &manager_,
249 wifi_,
250 ssid,
251 flimflam::kModeManaged,
252 flimflam::kSecurityNone,
253 false);
254 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000255 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700256 void ReportBSS(const ::DBus::Path &bss_path,
257 const string &ssid,
258 const string &bssid,
259 int16_t signal_strength,
260 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700261 void ReportLinkUp() {
262 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
263 }
mukesh agrawal31950242011-07-14 11:53:38 -0700264 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700265 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700266 }
mukesh agrawal15908392011-11-16 18:29:25 +0000267 void ReportCurrentBSSChanged(const string &new_bss) {
268 wifi_->CurrentBSSChanged(new_bss);
269 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000270 void ReportStateChanged(const string &new_state) {
271 wifi_->StateChanged(new_state);
272 }
mukesh agrawal31950242011-07-14 11:53:38 -0700273 void StartWiFi() {
274 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700275 }
276 void StopWiFi() {
277 wifi_->Stop();
278 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800279 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700280 const char *ssid,
281 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800282 Error *result) {
283 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700284 }
285 void GetService(const char *service_type,
286 const char *ssid,
287 const char *mode,
288 const char *security,
289 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800290 Error *result) {
291 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
292 result);
293 }
294 WiFiServiceRefPtr GetServiceInner(const char *service_type,
295 const char *ssid,
296 const char *mode,
297 const char *security,
298 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800299 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800300 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700301 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700302 // in general, we want to avoid D-Bus specific code for any RPCs
303 // that come in via adaptors. we make an exception here, because
304 // calls to GetWifiService are rerouted from the Manager object to
305 // the Wifi class.
306 if (service_type != NULL)
307 args[flimflam::kTypeProperty].writer().append_string(service_type);
308 if (ssid != NULL)
309 args[flimflam::kSSIDProperty].writer().append_string(ssid);
310 if (mode != NULL)
311 args[flimflam::kModeProperty].writer().append_string(mode);
312 if (security != NULL)
313 args[flimflam::kSecurityProperty].writer().append_string(security);
314 if (passphrase != NULL)
315 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800316 if (!allow_hidden)
317 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700318
Paul Stewartced6a0b2011-11-08 15:32:04 -0800319 Error e;
320 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700321 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800322 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700323 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800324 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
325 const string &mode,
326 const string &security) {
327 return wifi_->FindService(ssid, mode, security);
328 }
329 bool LoadHiddenServices(StoreInterface *storage) {
330 return wifi_->LoadHiddenServices(storage);
331 }
332 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
333 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
334 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
335 flimflam::kTypeWifi,
336 kDeviceAddress,
337 hex_ssid.c_str(),
338 flimflam::kModeManaged,
339 flimflam::kSecurityNone));
340 const char *groups[] = { id->c_str() };
341 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
342 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
343 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
344 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
345 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
346 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
347 }
mukesh agrawal32399322011-09-01 10:53:43 -0700348 MockManager *manager() {
349 return &manager_;
350 }
351 const WiFiConstRefPtr wifi() const {
352 return wifi_;
353 }
354
355 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700356 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700357
358 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700359 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700360 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700361 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700362 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700363
364 // protected fields interspersed between private fields, due to
365 // initialization order
366 protected:
367 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700368 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700369 static const char kNetworkModeAdHoc[];
370 static const char kNetworkModeInfrastructure[];
371
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700372 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
373 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700374 MockDHCPProvider dhcp_provider_;
375 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700376
377 private:
378 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700379};
380
381const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800382const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700383const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
384const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
385
mukesh agrawal261daca2011-12-02 18:56:56 +0000386void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000387 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000388}
389
mukesh agrawal31950242011-07-14 11:53:38 -0700390void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
391 const string &ssid,
392 const string &bssid,
393 int16_t signal_strength,
394 const char *mode) {
395 map<string, ::DBus::Variant> bss_properties;
396
397 {
398 DBus::MessageIter writer(bss_properties["SSID"].writer());
399 writer << vector<uint8_t>(ssid.begin(), ssid.end());
400 }
401 {
402 string bssid_nosep;
403 vector<uint8_t> bssid_bytes;
404 RemoveChars(bssid, ":", &bssid_nosep);
405 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
406
407 DBus::MessageIter writer(bss_properties["BSSID"].writer());
408 writer << bssid_bytes;
409 }
410 bss_properties["Signal"].writer().append_int16(signal_strength);
411 bss_properties["Mode"].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000412 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700413}
414
415TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
416 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
417 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
418
419 StartWiFi();
420 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
421 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
422}
423
424TEST_F(WiFiMainTest, CleanStart) {
425 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
426 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
427 .Times(AnyNumber())
428 .WillRepeatedly(Throw(
429 DBus::Error(
430 "fi.w1.wpa_supplicant1.InterfaceUnknown",
431 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
432 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
433 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700434 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700435}
436
437TEST_F(WiFiMainTest, Restart) {
438 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
439 .Times(AnyNumber())
440 .WillRepeatedly(Throw(
441 DBus::Error(
442 "fi.w1.wpa_supplicant1.InterfaceExists",
443 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
444 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
445 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
446 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700447 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700448}
449
450TEST_F(WiFiMainTest, StartClearsState) {
451 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
452 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
453 StartWiFi();
454}
455
456TEST_F(WiFiMainTest, ScanResults) {
457 StartWiFi();
458 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
459 ReportBSS(
460 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
461 ReportBSS(
462 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
463 ReportBSS(
464 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
465 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
466 EXPECT_EQ(5, GetEndpointMap().size());
467}
468
469TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
470 StartWiFi();
471 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
472 ReportBSS(
473 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
474 ReportBSS(
475 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
476 ReportBSS(
477 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
478 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000479
480 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
481 EXPECT_EQ(3, endpoints_by_rpcid.size());
482
483 WiFi::EndpointMap::const_iterator i;
484 WiFiEndpointRefPtr endpoint;
485 for (i = endpoints_by_rpcid.begin();
486 i != endpoints_by_rpcid.end();
487 ++i) {
488 if (i->second->bssid_string() == "00:00:00:00:00:00")
489 break;
490 }
491 ASSERT_TRUE(i != endpoints_by_rpcid.end());
492 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700493}
494
495TEST_F(WiFiMainTest, ScanCompleted) {
496 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000497 EXPECT_CALL(*manager(), RegisterService(_))
498 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700499 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
500 ReportBSS(
501 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
502 ReportBSS(
503 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
504 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000505 EXPECT_EQ(3, GetServices().size());
506}
507
508TEST_F(WiFiMainTest, EndpointGroupingTogether) {
509 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000510
511 InSequence s;
512 EXPECT_CALL(*manager(), RegisterService(_));
513 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal165e6142011-11-22 02:22:56 +0000514 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
515 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
516 ReportScanDone();
517 EXPECT_EQ(1, GetServices().size());
518}
519
520TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
521 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000522 EXPECT_CALL(*manager(), RegisterService(_))
523 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000524 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
525 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
526 ReportScanDone();
527 EXPECT_EQ(2, GetServices().size());
528}
529
530TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
531 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000532 EXPECT_CALL(*manager(), RegisterService(_))
533 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000534 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
535 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
536 ReportScanDone();
537 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700538}
539
mukesh agrawal261daca2011-12-02 18:56:56 +0000540TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
541 // Removal of non-existent BSS should not cause a crash.
542 StartWiFi();
543 RemoveBSS("bss0");
544 EXPECT_EQ(0, GetServices().size());
545}
546
547TEST_F(WiFiMainTest, LoneBSSRemoved) {
548 StartWiFi();
549 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
550 ReportScanDone();
551 EXPECT_EQ(1, GetServices().size());
552 EXPECT_TRUE(GetServices().front()->IsVisible());
553
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000554 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000555 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000556 EXPECT_TRUE(GetServices().empty());
557}
558
559TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
560 StartWiFi();
561 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
562 ReportScanDone();
563 ReportCurrentBSSChanged("bss0");
564
565 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
566 EXPECT_CALL(*manager(), DeregisterService(_));
567 RemoveBSS("bss0");
568 EXPECT_TRUE(GetServices().empty());
569}
570
571TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
572 StartWiFi();
573
574 Error e;
575 WiFiServiceRefPtr service =
576 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
577 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000578 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000579
580 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
581 ReportScanDone();
582 ReportCurrentBSSChanged("bss");
583 EXPECT_EQ(1, GetServices().size());
584
585 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
586 EXPECT_CALL(*manager(), UpdateService(_));
587 RemoveBSS("bss");
588 EXPECT_TRUE(manager()->HasService(service));
589 EXPECT_EQ(1, GetServices().size());
590 // Verify expectations now, because WiFi may call UpdateService when
591 // WiFi is Stop()-ed (during TearDown()).
592 Mock::VerifyAndClearExpectations(manager());
mukesh agrawal261daca2011-12-02 18:56:56 +0000593}
594
595TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
596 StartWiFi();
597 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
598 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
599 ReportScanDone();
600 EXPECT_EQ(1, GetServices().size());
601 EXPECT_TRUE(GetServices().front()->IsVisible());
602
603 EXPECT_CALL(*manager(), UpdateService(_));
604 RemoveBSS("bss0");
605 EXPECT_TRUE(GetServices().front()->IsVisible());
606 EXPECT_EQ(1, GetServices().size());
607}
608
mukesh agrawal31950242011-07-14 11:53:38 -0700609TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700610 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
611 *supplicant_interface_proxy_;
612
mukesh agrawal31950242011-07-14 11:53:38 -0700613 StartWiFi();
614 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
615 ReportScanDone();
616
617 {
618 InSequence s;
619 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000620 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700621
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700622 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700623 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700624 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700625 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700626 EXPECT_EQ(static_cast<Service *>(service),
627 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700628 }
629}
630
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000631TEST_F(WiFiMainTest, DisconnectPendingService) {
632 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
633 *supplicant_interface_proxy_;
634
635 StartWiFi();
636 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
637 WiFiService *service(GetServices().begin()->get());
638 InitiateConnect(service);
639
640 EXPECT_FALSE(GetPendingService() == NULL);
641 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
642 InitiateDisconnect(service);
643
644 EXPECT_TRUE(GetPendingService() == NULL);
645}
646
647TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
648 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
649 *supplicant_interface_proxy_;
650
651 StartWiFi();
652 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
653 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
654 WiFiService *service0(GetServices()[0].get());
655 WiFiService *service1(GetServices()[1].get());
656
657 InitiateConnect(service0);
658 ReportCurrentBSSChanged("bss0");
659 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
660 InitiateConnect(service1);
661
662 EXPECT_EQ(service0, GetCurrentService());
663 EXPECT_EQ(service1, GetPendingService());
664 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
665 InitiateDisconnect(service1);
666
667 // |current_service_| will be unchanged until supplicant signals
668 // that CurrentBSS has changed.
669 EXPECT_EQ(service0, GetCurrentService());
670 // |pending_service_| is updated immediately.
671 EXPECT_TRUE(GetPendingService() == NULL);
672}
673
674TEST_F(WiFiMainTest, DisconnectCurrentService) {
675 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
676 *supplicant_interface_proxy_;
677
678 StartWiFi();
679 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
680 WiFiService *service(GetServices().begin()->get());
681 InitiateConnect(service);
682 ReportCurrentBSSChanged("bss0");
683 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
684
685 EXPECT_EQ(service, GetCurrentService());
686 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
687 InitiateDisconnect(service);
688
689 // |current_service_| should not change until supplicant reports
690 // a BSS change.
691 EXPECT_EQ(service, GetCurrentService());
692}
693
694TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
695 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
696 *supplicant_interface_proxy_;
697
698 StartWiFi();
699 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
700 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
701 WiFiService *service0(GetServices()[0].get());
702 WiFiService *service1(GetServices()[1].get());
703
704 InitiateConnect(service0);
705 ReportCurrentBSSChanged("bss0");
706 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
707 InitiateConnect(service1);
708
709 EXPECT_EQ(service0, GetCurrentService());
710 EXPECT_EQ(service1, GetPendingService());
711 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
712 .Times(0);
713 InitiateDisconnect(service0);
714
715 EXPECT_EQ(service0, GetCurrentService());
716 EXPECT_EQ(service1, GetPendingService());
717}
718
719TEST_F(WiFiMainTest, DisconnectInvalidService) {
720 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
721 *supplicant_interface_proxy_;
722
723 StartWiFi();
724 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
725 WiFiService *service(GetServices().begin()->get());
726 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
727 .Times(0);
728 InitiateDisconnect(service);
729}
730
731TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
732 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
733 *supplicant_interface_proxy_;
734
735 StartWiFi();
736 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
737
738 WiFiService *service(GetServices().begin()->get());
739 DBus::Path fake_path("/fake/path");
740 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
741 .WillOnce(Return(fake_path));
742 InitiateConnect(service);
743 ReportCurrentBSSChanged("bss0");
744 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
745
746 EXPECT_EQ(service, GetCurrentService());
747 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
748 .WillRepeatedly(Throw(
749 DBus::Error(
750 "fi.w1.wpa_supplicant1.NotConnected",
751 "test threw fi.w1.wpa_supplicant1.NotConnected")));
752 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
753 InitiateDisconnect(service);
754
755 EXPECT_TRUE(GetCurrentService() == NULL);
756}
757
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700758TEST_F(WiFiMainTest, LinkEvent) {
759 EXPECT_FALSE(IsLinkUp());
760 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
761 WillOnce(Return(dhcp_config_));
762 ReportLinkUp();
763}
764
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700765TEST_F(WiFiMainTest, Stop) {
766 {
767 InSequence s;
768
769 StartWiFi();
770 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
771 ReportScanDone();
772 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
773 WillOnce(Return(dhcp_config_));
774 ReportLinkUp();
775 }
776
777 {
778 EXPECT_CALL(*manager(), DeregisterService(_));
779 StopWiFi();
780 }
781}
782
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700783TEST_F(WiFiMainTest, GetWifiServiceOpen) {
784 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800785 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700786 EXPECT_TRUE(e.IsSuccess());
787}
788
789TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
790 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800791 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700792 EXPECT_EQ(Error::kInvalidArguments, e.type());
793 EXPECT_EQ("must specify service type", e.message());
794}
795
796TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
797 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800798 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700799 EXPECT_EQ(Error::kInvalidArguments, e.type());
800 EXPECT_EQ("must specify SSID", e.message());
801}
802
803TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
804 Error e;
805 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800806 flimflam::kTypeWifi, "123456789012345678901234567890123",
807 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700808 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
809 EXPECT_EQ("SSID is too long", e.message());
810}
811
812TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
813 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800814 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700815 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
816 EXPECT_EQ("SSID is too short", e.message());
817}
818
819TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
820 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800821 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700822 EXPECT_EQ(Error::kNotSupported, e.type());
823 EXPECT_EQ("service mode is unsupported", e.message());
824}
825
826TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
827 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800828 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700829 EXPECT_TRUE(e.IsSuccess());
830}
831
832TEST_F(WiFiMainTest, GetWifiServiceRSN) {
833 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800834 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
835 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700836 EXPECT_TRUE(e.IsSuccess());
837}
838
839TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
840 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800841 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
842 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700843 EXPECT_EQ(Error::kInvalidArguments, e.type());
844 EXPECT_EQ("must specify passphrase", e.message());
845}
846
847TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
848 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800849 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
850 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700851 EXPECT_EQ(Error::kNotSupported, e.type());
852 EXPECT_EQ("security mode is unsupported", e.message());
853}
854
855TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
856 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800857 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
858 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700859 EXPECT_EQ(Error::kInvalidArguments, e.type());
860 EXPECT_EQ("must specify passphrase", e.message());
861}
862
863TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
864 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800865 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
866 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700867 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
868}
869
870TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
871 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800872 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
873 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700874 EXPECT_TRUE(e.IsSuccess());
875}
876
877TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
878 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800879 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
880 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700881 EXPECT_TRUE(e.IsSuccess());
882}
883
884TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
885 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800886 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
887 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700888 EXPECT_TRUE(e.IsSuccess());
889}
890
891TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
892 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800893 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
894 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700895 EXPECT_TRUE(e.IsSuccess());
896}
897
898TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
899 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800900 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
901 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700902 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
903}
904
905TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
906 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800907 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
908 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700909 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
910}
911
912TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
913 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800914 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
915 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700916 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
917}
918
919TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
920 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800921 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
922 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700923 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
924}
925
926TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
927 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800928 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
929 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700930 EXPECT_TRUE(e.IsSuccess());
931}
932
933TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
934 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800935 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
936 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700937 EXPECT_TRUE(e.IsSuccess());
938}
939
940TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
941 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800942 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
943 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700944 EXPECT_TRUE(e.IsSuccess());
945}
946
947TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
948 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800949 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
950 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700951 EXPECT_TRUE(e.IsSuccess());
952}
953
mukesh agrawal8ede0522011-10-03 14:57:44 -0700954class WiFiGetServiceSuccessTest : public WiFiMainTest {};
955class WiFiGetServiceFailureTest : public WiFiMainTest {};
956
957TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
958 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800959 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
960 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700961 EXPECT_TRUE(e.IsSuccess());
962}
963
964TEST_P(WiFiGetServiceFailureTest, Passphrase) {
965 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800966 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
967 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700968 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
969}
970
971INSTANTIATE_TEST_CASE_P(
972 WiFiGetServiceSuccessTestInstance,
973 WiFiGetServiceSuccessTest,
974 Values(
975 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
976 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
977 // subtle: invalid length for hex key, but valid as ascii passphrase
978 string(IEEE_80211::kWPAHexLen-1, '1'),
979 string(IEEE_80211::kWPAHexLen, '1')));
980
981INSTANTIATE_TEST_CASE_P(
982 WiFiGetServiceFailureTestInstance,
983 WiFiGetServiceFailureTest,
984 Values(
985 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
986 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
987 string(IEEE_80211::kWPAHexLen+1, '1')));
988
Paul Stewart6ab23a92011-11-09 17:17:47 -0800989TEST_F(WiFiMainTest, FindServiceWEP) {
990 const string ssid("an_ssid");
991 {
992 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800993 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800994 flimflam::kSecurityWep, "abcde", &e);
995 EXPECT_TRUE(e.IsSuccess());
996 }
997 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
998
Paul Stewarta41e38d2011-11-11 07:47:29 -0800999 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1000 flimflam::kSecurityWep).get());
1001 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
1002 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -08001003}
1004
1005TEST_F(WiFiMainTest, FindServiceWPA) {
1006 const string ssid("an_ssid");
1007 {
1008 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -08001009 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -08001010 flimflam::kSecurityRsn, "abcdefgh", &e);
1011 EXPECT_TRUE(e.IsSuccess());
1012 }
1013 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001014 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1015 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001016 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001017 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1018 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001019 EXPECT_TRUE(rsn_service.get());
1020 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001021 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1022 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001023 EXPECT_EQ(wpa_service.get(), psk_service.get());
1024 // Indirectly test FindService by doing a GetService on something that
1025 // already exists.
1026 {
1027 Error e;
1028 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001029 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1030 flimflam::kModeManaged, flimflam::kSecurityWpa,
1031 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001032 EXPECT_TRUE(e.IsSuccess());
1033 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1034 }
1035}
1036
Paul Stewartced6a0b2011-11-08 15:32:04 -08001037MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001038 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001039 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1040 if (it == arg.end()) {
1041 return false;
1042 }
1043
1044 const DBus::Variant &ssids_variant = it->second;
1045 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1046 const ByteArrays &ssids = it->second.operator ByteArrays();
1047 // A valid Scan containing a single hidden SSID should contain
1048 // two SSID entries: one containing the SSID we are looking for,
1049 // and an empty entry, signifying that we also want to do a
1050 // broadcast probe request for all non-hidden APs as well.
1051 return ssids.size() == 2 &&
1052 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1053 ssids[1].empty();
1054}
1055
1056TEST_F(WiFiMainTest, ScanHidden) {
1057 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1058 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1059 .Times(AnyNumber())
1060 .WillRepeatedly(Throw(
1061 DBus::Error(
1062 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1063 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001064 {
1065 // Create a hidden, favorite service.
1066 Error e;
1067 WiFiServiceRefPtr service =
1068 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1069 NULL, NULL, true, &e);
1070 EXPECT_TRUE(e.IsSuccess());
1071 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001072 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001073 }
1074 {
1075 // Create a hidden, non-favorite service.
1076 Error e;
1077 WiFiServiceRefPtr service =
1078 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1079 NULL, NULL, true, &e);
1080 EXPECT_TRUE(e.IsSuccess());
1081 EXPECT_TRUE(service->hidden_ssid());
1082 }
1083 {
1084 // Create a non-hidden, favorite service.
1085 Error e;
1086 WiFiServiceRefPtr service =
1087 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1088 NULL, NULL, false, &e);
1089 EXPECT_TRUE(e.IsSuccess());
1090 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001091 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001092 }
1093 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001094 StartWiFi();
1095 dispatcher_.DispatchPendingEvents();
1096}
1097
mukesh agrawal7ec71312011-11-10 02:08:26 +00001098TEST_F(WiFiMainTest, InitialSupplicantState) {
1099 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1100}
1101
1102TEST_F(WiFiMainTest, StateChangeNoService) {
1103 // State change should succeed even if there is no pending Service.
1104 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1105 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1106}
1107
1108TEST_F(WiFiMainTest, StateChangeWithService) {
1109 // Forward transition should trigger a Service state change.
1110 StartWiFi();
1111 dispatcher_.DispatchPendingEvents();
1112 MockWiFiServiceRefPtr service = MakeMockService();
1113 InitiateConnect(service);
1114 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1115 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1116 // Verify expectations now, because WiFi may report other state changes
1117 // when WiFi is Stop()-ed (during TearDown()).
1118 Mock::VerifyAndClearExpectations(service.get());
1119}
1120
1121TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1122 // Some backwards transitions should not trigger a Service state change.
1123 // Supplicant state should still be updated, however.
1124 StartWiFi();
1125 dispatcher_.DispatchPendingEvents();
1126 MockWiFiServiceRefPtr service = MakeMockService();
1127 InitiateConnect(service);
1128 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1129 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1130 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1131 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1132 GetSupplicantState());
1133 // Verify expectations now, because WiFi may report other state changes
1134 // when WiFi is Stop()-ed (during TearDown()).
1135 Mock::VerifyAndClearExpectations(service.get());
1136}
1137
Paul Stewarta41e38d2011-11-11 07:47:29 -08001138TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1139 StrictMock<MockStore> storage;
1140 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1141 .WillOnce(Return(set<string>()));
1142 EXPECT_FALSE(LoadHiddenServices(&storage));
1143}
1144
1145TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1146 string id;
1147 StrictMock<MockStore> storage;
1148 SetupHiddenStorage(&storage, "an_ssid", &id);
1149 // Missing "Hidden" property.
1150 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1151 .WillOnce(Return(false));
1152 EXPECT_FALSE(LoadHiddenServices(&storage));
1153}
1154
1155TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1156 string id;
1157 StrictMock<MockStore> storage;
1158 SetupHiddenStorage(&storage, "an_ssid", &id);
1159 // "Hidden" property set to "false".
1160 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1161 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1162 EXPECT_FALSE(LoadHiddenServices(&storage));
1163}
1164
1165TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1166 string id;
1167 StrictMock<MockStore> storage;
1168 SetupHiddenStorage(&storage, "an_ssid", &id);
1169 // Missing "SSID" property.
1170 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1171 .WillOnce(Return(false));
1172 EXPECT_FALSE(LoadHiddenServices(&storage));
1173}
1174
1175
1176TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1177 StrictMock<MockStore> storage;
1178 string id;
1179 SetupHiddenStorage(&storage, "an_ssid", &id);
1180 Error e;
1181 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1182 ASSERT_TRUE(e.IsSuccess());
1183 EXPECT_FALSE(LoadHiddenServices(&storage));
1184}
1185
1186TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1187 StrictMock<MockStore> storage;
1188 string ssid("an_ssid");
1189 string id;
1190 SetupHiddenStorage(&storage, ssid, &id);
1191 EXPECT_TRUE(LoadHiddenServices(&storage));
1192 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1193 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1194 flimflam::kSecurityNone).get());
1195}
1196
mukesh agrawal15908392011-11-16 18:29:25 +00001197TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1198 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1199 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1200
1201 // Note that the BSS handle used in this test ("an_ap") is not
1202 // intended to reflect the format used by supplicant. It's just
1203 // convenient for testing.
1204
1205 StartWiFi();
1206 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1207 kNetworkModeInfrastructure);
1208 InitiateConnect(service);
1209 EXPECT_EQ(service, GetPendingService().get());
1210
1211 ReportCurrentBSSChanged("an_ap");
1212 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1213 EXPECT_EQ(Service::kStateConfiguring, service->state());
1214 EXPECT_EQ(service, GetCurrentService().get());
1215 EXPECT_EQ(NULL, GetPendingService().get());
1216
1217 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001218 EXPECT_EQ(Service::kStateFailure, service->state());
mukesh agrawal15908392011-11-16 18:29:25 +00001219 EXPECT_EQ(NULL, GetCurrentService().get());
1220 EXPECT_EQ(NULL, GetPendingService().get());
1221}
1222
1223TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1224 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1225 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1226 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1227 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1228
1229 // Note that the BSS handles used in this test ("ap1", "ap2") are
1230 // not intended to reflect the format used by supplicant. They're
1231 // just convenient for testing.
1232
1233 StartWiFi();
1234 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1235 kNetworkModeInfrastructure);
1236 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1237 kNetworkModeInfrastructure);
1238 InitiateConnect(service1);
1239 ReportCurrentBSSChanged("ap1");
1240 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1241 EXPECT_EQ(service1.get(), GetCurrentService().get());
1242
1243 ReportCurrentBSSChanged("ap2");
1244 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1245 EXPECT_EQ(service2.get(), GetCurrentService().get());
1246 EXPECT_EQ(Service::kStateIdle, service1->state());
1247 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1248}
1249
1250TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1251 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1252 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1253
1254 // Note that the BSS handle used in this test ("an_ap") is not
1255 // intended to reflect the format used by supplicant. It's just
1256 // convenient for testing.
1257
1258 StartWiFi();
1259 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1260 kNetworkModeInfrastructure);
1261 InitiateConnect(service);
1262 ReportCurrentBSSChanged("an_ap");
1263 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1264 EXPECT_EQ(service.get(), GetCurrentService().get());
1265 EXPECT_EQ(Service::kStateConfiguring, service->state());
1266}
1267
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001268TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1269 Error e;
1270 EXPECT_CALL(*manager(), RegisterService(_))
1271 .Times(0);
1272 EXPECT_CALL(*manager(), HasService(_))
1273 .WillOnce(Return(false));
1274 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1275 EXPECT_CALL(*manager(), RegisterService(_));
1276 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0,
1277 kNetworkModeInfrastructure);
1278}
1279
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001280TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1281 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1282 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1283 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1284 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1285
1286 StartWiFi();
1287 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1288 kNetworkModeInfrastructure);
1289 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1290 kNetworkModeInfrastructure);
1291 InitiateConnect(service1);
1292 EXPECT_EQ(service1.get(), GetPendingService().get());
1293
1294 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1295 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1296 InitiateConnect(service2);
1297 EXPECT_EQ(service2.get(), GetPendingService().get());
1298}
1299
1300TEST_F(WiFiMainTest, IsIdle) {
1301 StartWiFi();
1302 EXPECT_TRUE(wifi()->IsIdle());
1303
1304 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1305 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1306 Error error;
1307 service->AddEndpoint(ap);
1308 service->AutoConnect();
1309 EXPECT_FALSE(wifi()->IsIdle());
1310}
1311
mukesh agrawal4d0401c2012-01-06 16:05:31 -08001312MATCHER(WiFiAddedArgs, "") {
1313 return ContainsKey(arg, wpa_supplicant::kNetworkPropertyScanSSID) &&
1314 ContainsKey(arg, wpa_supplicant::kNetworkPropertyBgscan);
1315}
1316
1317TEST_F(WiFiMainTest, AddNetworkArgs) {
1318 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
1319 *supplicant_interface_proxy_;
1320
1321 StartWiFi();
1322 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
1323 WiFiService *service(GetServices().begin()->get());
1324 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(WiFiAddedArgs()));
1325 InitiateConnect(service);
1326}
1327
Chris Masone853b81b2011-06-24 14:11:41 -07001328} // namespace shill