blob: 649ee959d4c7f9b43350f832caee184aeda2e861 [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;
mukesh agrawalde29fa82011-09-16 16:16:36 -070089 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070090 flimflam::kBgscanMethodProperty,
91 PropertyStoreTest::kStringV,
92 &error));
93 }
94 {
95 ::DBus::Error error;
96 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070097 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070098 flimflam::kBgscanSignalThresholdProperty,
99 PropertyStoreTest::kInt32V,
100 &error));
101 }
102 {
103 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700104 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 flimflam::kScanIntervalProperty,
106 PropertyStoreTest::kUint16V,
107 &error));
108 }
Chris Masone853b81b2011-06-24 14:11:41 -0700109 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -0700110 {
111 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700112 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700113 flimflam::kScanningProperty,
114 PropertyStoreTest::kBoolV,
115 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700116 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700117 }
Chris Masone853b81b2011-06-24 14:11:41 -0700118}
119
mukesh agrawal8ede0522011-10-03 14:57:44 -0700120class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700121 public:
122 WiFiMainTest()
Chris Masoneb9c00592011-10-06 13:10:39 -0700123 : manager_(&control_interface_, NULL, &glib_),
Chris Masone626719f2011-08-18 16:58:48 -0700124 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700125 &dispatcher_,
Chris Masone626719f2011-08-18 16:58:48 -0700126 &manager_,
127 kDeviceName,
128 kDeviceAddress,
129 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700130 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
131 supplicant_interface_proxy_(
132 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700133 dhcp_config_(new MockDHCPConfig(&control_interface_,
134 &dispatcher_,
135 &dhcp_provider_,
136 kDeviceName,
137 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700138 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700139 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
mukesh agrawal4eb4d782011-12-05 17:34:37 +0000140 // Except for WiFiServices created via WiFi::GetService, we expect
141 // that any WiFiService has been registered with the Manager. So
142 // default Manager.HasService to true, to make the common case
143 // easy.
144 ON_CALL(manager_, HasService(_)).
145 WillByDefault(Return(true));
mukesh agrawal31950242011-07-14 11:53:38 -0700146 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700147
148 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700149 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700150 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
151 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700152 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700153 }
154
155 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700156 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700157 // must Stop WiFi instance, to clear its list of services.
158 // otherwise, the WiFi instance will not be deleted. (because
159 // services reference a WiFi instance, creating a cycle.)
160 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700161 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700162 }
163
mukesh agrawal31950242011-07-14 11:53:38 -0700164 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000165 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
166
mukesh agrawal31950242011-07-14 11:53:38 -0700167 class TestProxyFactory : public ProxyFactory {
168 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700169 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700170
171 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700172 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700173 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700174 }
175
176 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700177 const WiFiRefPtr &/*wifi*/,
178 const DBus::Path &/*object_path*/,
179 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700180 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700181 }
182
183 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700184 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700185 };
186
mukesh agrawal15908392011-11-16 18:29:25 +0000187 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
188 bool hidden_ssid = false;
189 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
190 }
191 const WiFiServiceRefPtr &GetCurrentService() {
192 return wifi_->current_service_;
193 }
mukesh agrawal31950242011-07-14 11:53:38 -0700194 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000195 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700196 }
mukesh agrawal15908392011-11-16 18:29:25 +0000197 const WiFiServiceRefPtr &GetPendingService() {
198 return wifi_->pending_service_;
199 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000200 const vector<WiFiServiceRefPtr> &GetServices() {
201 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700202 }
203 // note: the tests need the proxies referenced by WiFi (not the
204 // proxies instantiated by WiFiMainTest), to ensure that WiFi
205 // sets up its proxies correctly.
206 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
207 return wifi_->supplicant_process_proxy_.get();
208 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000209 MockSupplicantInterfaceProxy *GetSupplicantInterfaceProxy() {
210 return dynamic_cast<MockSupplicantInterfaceProxy *>(
211 wifi_->supplicant_interface_proxy_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700212 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000213 const string &GetSupplicantState() {
214 return wifi_->supplicant_state_;
215 }
216 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700217 map<string, ::DBus::Variant> params;
218 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700219 }
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000220 void InitiateDisconnect(WiFiServiceRefPtr service) {
221 wifi_->DisconnectFrom(service);
222 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700223 bool IsLinkUp() {
224 return wifi_->link_up_;
225 }
mukesh agrawal15908392011-11-16 18:29:25 +0000226 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000227 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
mukesh agrawal15908392011-11-16 18:29:25 +0000228 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000229 MockWiFiServiceRefPtr MakeMockService() {
230 vector<uint8_t> ssid(1, 'a');
231 return new MockWiFiService(
232 &control_interface_,
233 &dispatcher_,
234 &manager_,
235 wifi_,
236 ssid,
237 flimflam::kModeManaged,
238 flimflam::kSecurityNone,
239 false);
240 }
mukesh agrawal261daca2011-12-02 18:56:56 +0000241 void RemoveBSS(const ::DBus::Path &bss_path);
mukesh agrawal31950242011-07-14 11:53:38 -0700242 void ReportBSS(const ::DBus::Path &bss_path,
243 const string &ssid,
244 const string &bssid,
245 int16_t signal_strength,
246 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700247 void ReportLinkUp() {
248 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
249 }
mukesh agrawal31950242011-07-14 11:53:38 -0700250 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700251 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700252 }
mukesh agrawal15908392011-11-16 18:29:25 +0000253 void ReportCurrentBSSChanged(const string &new_bss) {
254 wifi_->CurrentBSSChanged(new_bss);
255 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000256 void ReportStateChanged(const string &new_state) {
257 wifi_->StateChanged(new_state);
258 }
mukesh agrawal31950242011-07-14 11:53:38 -0700259 void StartWiFi() {
260 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700261 }
262 void StopWiFi() {
263 wifi_->Stop();
264 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800265 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700266 const char *ssid,
267 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800268 Error *result) {
269 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700270 }
271 void GetService(const char *service_type,
272 const char *ssid,
273 const char *mode,
274 const char *security,
275 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800276 Error *result) {
277 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
278 result);
279 }
280 WiFiServiceRefPtr GetServiceInner(const char *service_type,
281 const char *ssid,
282 const char *mode,
283 const char *security,
284 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800285 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800286 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700287 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700288 // in general, we want to avoid D-Bus specific code for any RPCs
289 // that come in via adaptors. we make an exception here, because
290 // calls to GetWifiService are rerouted from the Manager object to
291 // the Wifi class.
292 if (service_type != NULL)
293 args[flimflam::kTypeProperty].writer().append_string(service_type);
294 if (ssid != NULL)
295 args[flimflam::kSSIDProperty].writer().append_string(ssid);
296 if (mode != NULL)
297 args[flimflam::kModeProperty].writer().append_string(mode);
298 if (security != NULL)
299 args[flimflam::kSecurityProperty].writer().append_string(security);
300 if (passphrase != NULL)
301 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800302 if (!allow_hidden)
303 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700304
Paul Stewartced6a0b2011-11-08 15:32:04 -0800305 Error e;
306 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700307 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800308 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700309 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800310 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
311 const string &mode,
312 const string &security) {
313 return wifi_->FindService(ssid, mode, security);
314 }
315 bool LoadHiddenServices(StoreInterface *storage) {
316 return wifi_->LoadHiddenServices(storage);
317 }
318 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
319 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
320 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
321 flimflam::kTypeWifi,
322 kDeviceAddress,
323 hex_ssid.c_str(),
324 flimflam::kModeManaged,
325 flimflam::kSecurityNone));
326 const char *groups[] = { id->c_str() };
327 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
328 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
329 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
330 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
331 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
332 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
333 }
mukesh agrawal32399322011-09-01 10:53:43 -0700334 MockManager *manager() {
335 return &manager_;
336 }
337 const WiFiConstRefPtr wifi() const {
338 return wifi_;
339 }
340
341 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700342 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700343
344 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700345 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700346 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700347 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700348 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700349
350 // protected fields interspersed between private fields, due to
351 // initialization order
352 protected:
353 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700354 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700355 static const char kNetworkModeAdHoc[];
356 static const char kNetworkModeInfrastructure[];
357
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700358 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
359 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700360 MockDHCPProvider dhcp_provider_;
361 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700362
363 private:
364 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700365};
366
367const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800368const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700369const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
370const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
371
mukesh agrawal261daca2011-12-02 18:56:56 +0000372void WiFiMainTest::RemoveBSS(const ::DBus::Path &bss_path) {
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000373 wifi_->BSSRemovedTask(bss_path);
mukesh agrawal261daca2011-12-02 18:56:56 +0000374}
375
mukesh agrawal31950242011-07-14 11:53:38 -0700376void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
377 const string &ssid,
378 const string &bssid,
379 int16_t signal_strength,
380 const char *mode) {
381 map<string, ::DBus::Variant> bss_properties;
382
383 {
384 DBus::MessageIter writer(bss_properties["SSID"].writer());
385 writer << vector<uint8_t>(ssid.begin(), ssid.end());
386 }
387 {
388 string bssid_nosep;
389 vector<uint8_t> bssid_bytes;
390 RemoveChars(bssid, ":", &bssid_nosep);
391 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
392
393 DBus::MessageIter writer(bss_properties["BSSID"].writer());
394 writer << bssid_bytes;
395 }
396 bss_properties["Signal"].writer().append_int16(signal_strength);
397 bss_properties["Mode"].writer().append_string(mode);
mukesh agrawalb4bc57d2011-12-07 01:07:47 +0000398 wifi_->BSSAddedTask(bss_path, bss_properties);
mukesh agrawal31950242011-07-14 11:53:38 -0700399}
400
401TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
402 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
403 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
404
405 StartWiFi();
406 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
407 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
408}
409
410TEST_F(WiFiMainTest, CleanStart) {
411 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
412 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
413 .Times(AnyNumber())
414 .WillRepeatedly(Throw(
415 DBus::Error(
416 "fi.w1.wpa_supplicant1.InterfaceUnknown",
417 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
418 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
419 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700420 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700421}
422
423TEST_F(WiFiMainTest, Restart) {
424 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
425 .Times(AnyNumber())
426 .WillRepeatedly(Throw(
427 DBus::Error(
428 "fi.w1.wpa_supplicant1.InterfaceExists",
429 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
430 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
431 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
432 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700433 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700434}
435
436TEST_F(WiFiMainTest, StartClearsState) {
437 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
438 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
439 StartWiFi();
440}
441
442TEST_F(WiFiMainTest, ScanResults) {
443 StartWiFi();
444 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
445 ReportBSS(
446 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
447 ReportBSS(
448 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
449 ReportBSS(
450 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
451 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
452 EXPECT_EQ(5, GetEndpointMap().size());
453}
454
455TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
456 StartWiFi();
457 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
458 ReportBSS(
459 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
460 ReportBSS(
461 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
462 ReportBSS(
463 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
464 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000465
466 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
467 EXPECT_EQ(3, endpoints_by_rpcid.size());
468
469 WiFi::EndpointMap::const_iterator i;
470 WiFiEndpointRefPtr endpoint;
471 for (i = endpoints_by_rpcid.begin();
472 i != endpoints_by_rpcid.end();
473 ++i) {
474 if (i->second->bssid_string() == "00:00:00:00:00:00")
475 break;
476 }
477 ASSERT_TRUE(i != endpoints_by_rpcid.end());
478 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700479}
480
481TEST_F(WiFiMainTest, ScanCompleted) {
482 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000483 EXPECT_CALL(*manager(), RegisterService(_))
484 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700485 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
486 ReportBSS(
487 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
488 ReportBSS(
489 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
490 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000491 EXPECT_EQ(3, GetServices().size());
492}
493
494TEST_F(WiFiMainTest, EndpointGroupingTogether) {
495 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000496
497 InSequence s;
498 EXPECT_CALL(*manager(), RegisterService(_));
499 EXPECT_CALL(*manager(), UpdateService(_));
mukesh agrawal165e6142011-11-22 02:22:56 +0000500 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
501 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
502 ReportScanDone();
503 EXPECT_EQ(1, GetServices().size());
504}
505
506TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
507 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000508 EXPECT_CALL(*manager(), RegisterService(_))
509 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000510 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
511 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
512 ReportScanDone();
513 EXPECT_EQ(2, GetServices().size());
514}
515
516TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
517 StartWiFi();
mukesh agrawal261daca2011-12-02 18:56:56 +0000518 EXPECT_CALL(*manager(), RegisterService(_))
519 .Times(2);
mukesh agrawal165e6142011-11-22 02:22:56 +0000520 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
521 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
522 ReportScanDone();
523 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700524}
525
mukesh agrawal261daca2011-12-02 18:56:56 +0000526TEST_F(WiFiMainTest, NonExistentBSSRemoved) {
527 // Removal of non-existent BSS should not cause a crash.
528 StartWiFi();
529 RemoveBSS("bss0");
530 EXPECT_EQ(0, GetServices().size());
531}
532
533TEST_F(WiFiMainTest, LoneBSSRemoved) {
534 StartWiFi();
535 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
536 ReportScanDone();
537 EXPECT_EQ(1, GetServices().size());
538 EXPECT_TRUE(GetServices().front()->IsVisible());
539
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000540 EXPECT_CALL(*manager(), DeregisterService(_));
mukesh agrawal261daca2011-12-02 18:56:56 +0000541 RemoveBSS("bss0");
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000542 EXPECT_TRUE(GetServices().empty());
543}
544
545TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnected) {
546 StartWiFi();
547 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
548 ReportScanDone();
549 ReportCurrentBSSChanged("bss0");
550
551 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
552 EXPECT_CALL(*manager(), DeregisterService(_));
553 RemoveBSS("bss0");
554 EXPECT_TRUE(GetServices().empty());
555}
556
557TEST_F(WiFiMainTest, LoneBSSRemovedWhileConnectedToHidden) {
558 StartWiFi();
559
560 Error e;
561 WiFiServiceRefPtr service =
562 GetServiceInner(flimflam::kTypeWifi, "ssid", flimflam::kModeManaged,
563 NULL, NULL, true, &e);
mukesh agrawal261daca2011-12-02 18:56:56 +0000564 EXPECT_EQ(1, GetServices().size());
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000565
566 ReportBSS("bss", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
567 ReportScanDone();
568 ReportCurrentBSSChanged("bss");
569 EXPECT_EQ(1, GetServices().size());
570
571 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
572 EXPECT_CALL(*manager(), UpdateService(_));
573 RemoveBSS("bss");
574 EXPECT_TRUE(manager()->HasService(service));
575 EXPECT_EQ(1, GetServices().size());
576 // Verify expectations now, because WiFi may call UpdateService when
577 // WiFi is Stop()-ed (during TearDown()).
578 Mock::VerifyAndClearExpectations(manager());
mukesh agrawal261daca2011-12-02 18:56:56 +0000579}
580
581TEST_F(WiFiMainTest, NonSolitaryBSSRemoved) {
582 StartWiFi();
583 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
584 ReportBSS("bss1", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
585 ReportScanDone();
586 EXPECT_EQ(1, GetServices().size());
587 EXPECT_TRUE(GetServices().front()->IsVisible());
588
589 EXPECT_CALL(*manager(), UpdateService(_));
590 RemoveBSS("bss0");
591 EXPECT_TRUE(GetServices().front()->IsVisible());
592 EXPECT_EQ(1, GetServices().size());
593}
594
mukesh agrawal31950242011-07-14 11:53:38 -0700595TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700596 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
597 *supplicant_interface_proxy_;
598
mukesh agrawal31950242011-07-14 11:53:38 -0700599 StartWiFi();
600 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
601 ReportScanDone();
602
603 {
604 InSequence s;
605 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000606 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700607
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700608 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700609 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700610 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700611 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700612 EXPECT_EQ(static_cast<Service *>(service),
613 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700614 }
615}
616
mukesh agrawal0ed0f2e2011-12-05 20:36:17 +0000617TEST_F(WiFiMainTest, DisconnectPendingService) {
618 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
619 *supplicant_interface_proxy_;
620
621 StartWiFi();
622 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
623 WiFiService *service(GetServices().begin()->get());
624 InitiateConnect(service);
625
626 EXPECT_FALSE(GetPendingService() == NULL);
627 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
628 InitiateDisconnect(service);
629
630 EXPECT_TRUE(GetPendingService() == NULL);
631}
632
633TEST_F(WiFiMainTest, DisconnectPendingServiceWithCurrent) {
634 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
635 *supplicant_interface_proxy_;
636
637 StartWiFi();
638 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
639 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
640 WiFiService *service0(GetServices()[0].get());
641 WiFiService *service1(GetServices()[1].get());
642
643 InitiateConnect(service0);
644 ReportCurrentBSSChanged("bss0");
645 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
646 InitiateConnect(service1);
647
648 EXPECT_EQ(service0, GetCurrentService());
649 EXPECT_EQ(service1, GetPendingService());
650 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
651 InitiateDisconnect(service1);
652
653 // |current_service_| will be unchanged until supplicant signals
654 // that CurrentBSS has changed.
655 EXPECT_EQ(service0, GetCurrentService());
656 // |pending_service_| is updated immediately.
657 EXPECT_TRUE(GetPendingService() == NULL);
658}
659
660TEST_F(WiFiMainTest, DisconnectCurrentService) {
661 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
662 *supplicant_interface_proxy_;
663
664 StartWiFi();
665 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
666 WiFiService *service(GetServices().begin()->get());
667 InitiateConnect(service);
668 ReportCurrentBSSChanged("bss0");
669 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
670
671 EXPECT_EQ(service, GetCurrentService());
672 EXPECT_CALL(supplicant_interface_proxy, Disconnect());
673 InitiateDisconnect(service);
674
675 // |current_service_| should not change until supplicant reports
676 // a BSS change.
677 EXPECT_EQ(service, GetCurrentService());
678}
679
680TEST_F(WiFiMainTest, DisconnectCurrentServiceWithPending) {
681 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
682 *supplicant_interface_proxy_;
683
684 StartWiFi();
685 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
686 ReportBSS("bss1", "ssid1", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
687 WiFiService *service0(GetServices()[0].get());
688 WiFiService *service1(GetServices()[1].get());
689
690 InitiateConnect(service0);
691 ReportCurrentBSSChanged("bss0");
692 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
693 InitiateConnect(service1);
694
695 EXPECT_EQ(service0, GetCurrentService());
696 EXPECT_EQ(service1, GetPendingService());
697 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
698 .Times(0);
699 InitiateDisconnect(service0);
700
701 EXPECT_EQ(service0, GetCurrentService());
702 EXPECT_EQ(service1, GetPendingService());
703}
704
705TEST_F(WiFiMainTest, DisconnectInvalidService) {
706 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
707 *supplicant_interface_proxy_;
708
709 StartWiFi();
710 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
711 WiFiService *service(GetServices().begin()->get());
712 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
713 .Times(0);
714 InitiateDisconnect(service);
715}
716
717TEST_F(WiFiMainTest, DisconnectCurrentServiceFailure) {
718 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
719 *supplicant_interface_proxy_;
720
721 StartWiFi();
722 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
723
724 WiFiService *service(GetServices().begin()->get());
725 DBus::Path fake_path("/fake/path");
726 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
727 .WillOnce(Return(fake_path));
728 InitiateConnect(service);
729 ReportCurrentBSSChanged("bss0");
730 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
731
732 EXPECT_EQ(service, GetCurrentService());
733 EXPECT_CALL(supplicant_interface_proxy, Disconnect())
734 .WillRepeatedly(Throw(
735 DBus::Error(
736 "fi.w1.wpa_supplicant1.NotConnected",
737 "test threw fi.w1.wpa_supplicant1.NotConnected")));
738 EXPECT_CALL(supplicant_interface_proxy, RemoveNetwork(fake_path));
739 InitiateDisconnect(service);
740
741 EXPECT_TRUE(GetCurrentService() == NULL);
742}
743
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700744TEST_F(WiFiMainTest, LinkEvent) {
745 EXPECT_FALSE(IsLinkUp());
746 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
747 WillOnce(Return(dhcp_config_));
748 ReportLinkUp();
749}
750
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700751TEST_F(WiFiMainTest, Stop) {
752 {
753 InSequence s;
754
755 StartWiFi();
756 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
757 ReportScanDone();
758 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
759 WillOnce(Return(dhcp_config_));
760 ReportLinkUp();
761 }
762
763 {
764 EXPECT_CALL(*manager(), DeregisterService(_));
765 StopWiFi();
766 }
767}
768
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700769TEST_F(WiFiMainTest, GetWifiServiceOpen) {
770 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800771 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700772 EXPECT_TRUE(e.IsSuccess());
773}
774
775TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
776 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800777 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700778 EXPECT_EQ(Error::kInvalidArguments, e.type());
779 EXPECT_EQ("must specify service type", e.message());
780}
781
782TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
783 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800784 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700785 EXPECT_EQ(Error::kInvalidArguments, e.type());
786 EXPECT_EQ("must specify SSID", e.message());
787}
788
789TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
790 Error e;
791 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800792 flimflam::kTypeWifi, "123456789012345678901234567890123",
793 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700794 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
795 EXPECT_EQ("SSID is too long", e.message());
796}
797
798TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
799 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800800 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700801 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
802 EXPECT_EQ("SSID is too short", e.message());
803}
804
805TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
806 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800807 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700808 EXPECT_EQ(Error::kNotSupported, e.type());
809 EXPECT_EQ("service mode is unsupported", e.message());
810}
811
812TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
813 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800814 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700815 EXPECT_TRUE(e.IsSuccess());
816}
817
818TEST_F(WiFiMainTest, GetWifiServiceRSN) {
819 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800820 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
821 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700822 EXPECT_TRUE(e.IsSuccess());
823}
824
825TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
826 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800827 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
828 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700829 EXPECT_EQ(Error::kInvalidArguments, e.type());
830 EXPECT_EQ("must specify passphrase", e.message());
831}
832
833TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
834 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800835 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
836 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700837 EXPECT_EQ(Error::kNotSupported, e.type());
838 EXPECT_EQ("security mode is unsupported", e.message());
839}
840
841TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
842 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800843 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
844 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700845 EXPECT_EQ(Error::kInvalidArguments, e.type());
846 EXPECT_EQ("must specify passphrase", e.message());
847}
848
849TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
850 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800851 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
852 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700853 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
854}
855
856TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
857 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800858 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
859 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700860 EXPECT_TRUE(e.IsSuccess());
861}
862
863TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
864 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800865 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
866 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700867 EXPECT_TRUE(e.IsSuccess());
868}
869
870TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
871 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800872 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
873 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700874 EXPECT_TRUE(e.IsSuccess());
875}
876
877TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
878 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800879 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
880 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700881 EXPECT_TRUE(e.IsSuccess());
882}
883
884TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
885 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800886 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
887 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700888 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
889}
890
891TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
892 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800893 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
894 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700895 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
896}
897
898TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
899 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800900 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
901 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700902 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
903}
904
905TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
906 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800907 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
908 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700909 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
910}
911
912TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
913 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800914 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
915 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700916 EXPECT_TRUE(e.IsSuccess());
917}
918
919TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
920 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800921 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
922 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700923 EXPECT_TRUE(e.IsSuccess());
924}
925
926TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
927 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800928 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
929 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700930 EXPECT_TRUE(e.IsSuccess());
931}
932
933TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
934 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800935 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
936 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700937 EXPECT_TRUE(e.IsSuccess());
938}
939
mukesh agrawal8ede0522011-10-03 14:57:44 -0700940class WiFiGetServiceSuccessTest : public WiFiMainTest {};
941class WiFiGetServiceFailureTest : public WiFiMainTest {};
942
943TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
944 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800945 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
946 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700947 EXPECT_TRUE(e.IsSuccess());
948}
949
950TEST_P(WiFiGetServiceFailureTest, Passphrase) {
951 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800952 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
953 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700954 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
955}
956
957INSTANTIATE_TEST_CASE_P(
958 WiFiGetServiceSuccessTestInstance,
959 WiFiGetServiceSuccessTest,
960 Values(
961 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
962 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
963 // subtle: invalid length for hex key, but valid as ascii passphrase
964 string(IEEE_80211::kWPAHexLen-1, '1'),
965 string(IEEE_80211::kWPAHexLen, '1')));
966
967INSTANTIATE_TEST_CASE_P(
968 WiFiGetServiceFailureTestInstance,
969 WiFiGetServiceFailureTest,
970 Values(
971 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
972 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
973 string(IEEE_80211::kWPAHexLen+1, '1')));
974
Paul Stewart6ab23a92011-11-09 17:17:47 -0800975TEST_F(WiFiMainTest, FindServiceWEP) {
976 const string ssid("an_ssid");
977 {
978 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800979 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800980 flimflam::kSecurityWep, "abcde", &e);
981 EXPECT_TRUE(e.IsSuccess());
982 }
983 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
984
Paul Stewarta41e38d2011-11-11 07:47:29 -0800985 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
986 flimflam::kSecurityWep).get());
987 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
988 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -0800989}
990
991TEST_F(WiFiMainTest, FindServiceWPA) {
992 const string ssid("an_ssid");
993 {
994 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800995 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800996 flimflam::kSecurityRsn, "abcdefgh", &e);
997 EXPECT_TRUE(e.IsSuccess());
998 }
999 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001000 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
1001 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001002 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001003 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
1004 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001005 EXPECT_TRUE(rsn_service.get());
1006 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -08001007 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
1008 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001009 EXPECT_EQ(wpa_service.get(), psk_service.get());
1010 // Indirectly test FindService by doing a GetService on something that
1011 // already exists.
1012 {
1013 Error e;
1014 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -08001015 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
1016 flimflam::kModeManaged, flimflam::kSecurityWpa,
1017 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -08001018 EXPECT_TRUE(e.IsSuccess());
1019 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
1020 }
1021}
1022
Paul Stewartced6a0b2011-11-08 15:32:04 -08001023MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -08001024 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -08001025 arg.find(wpa_supplicant::kPropertyScanSSIDs);
1026 if (it == arg.end()) {
1027 return false;
1028 }
1029
1030 const DBus::Variant &ssids_variant = it->second;
1031 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
1032 const ByteArrays &ssids = it->second.operator ByteArrays();
1033 // A valid Scan containing a single hidden SSID should contain
1034 // two SSID entries: one containing the SSID we are looking for,
1035 // and an empty entry, signifying that we also want to do a
1036 // broadcast probe request for all non-hidden APs as well.
1037 return ssids.size() == 2 &&
1038 string(ssids[0].begin(), ssids[0].end()) == ssid &&
1039 ssids[1].empty();
1040}
1041
1042TEST_F(WiFiMainTest, ScanHidden) {
1043 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
1044 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
1045 .Times(AnyNumber())
1046 .WillRepeatedly(Throw(
1047 DBus::Error(
1048 "fi.w1.wpa_supplicant1.InterfaceUnknown",
1049 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -08001050 {
1051 // Create a hidden, favorite service.
1052 Error e;
1053 WiFiServiceRefPtr service =
1054 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
1055 NULL, NULL, true, &e);
1056 EXPECT_TRUE(e.IsSuccess());
1057 EXPECT_TRUE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001058 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001059 }
1060 {
1061 // Create a hidden, non-favorite service.
1062 Error e;
1063 WiFiServiceRefPtr service =
1064 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
1065 NULL, NULL, true, &e);
1066 EXPECT_TRUE(e.IsSuccess());
1067 EXPECT_TRUE(service->hidden_ssid());
1068 }
1069 {
1070 // Create a non-hidden, favorite service.
1071 Error e;
1072 WiFiServiceRefPtr service =
1073 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
1074 NULL, NULL, false, &e);
1075 EXPECT_TRUE(e.IsSuccess());
1076 EXPECT_FALSE(service->hidden_ssid());
mukesh agrawal00917ce2011-11-22 23:56:55 +00001077 service->MakeFavorite();
Paul Stewarta41e38d2011-11-11 07:47:29 -08001078 }
1079 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -08001080 StartWiFi();
1081 dispatcher_.DispatchPendingEvents();
1082}
1083
mukesh agrawal7ec71312011-11-10 02:08:26 +00001084TEST_F(WiFiMainTest, InitialSupplicantState) {
1085 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
1086}
1087
1088TEST_F(WiFiMainTest, StateChangeNoService) {
1089 // State change should succeed even if there is no pending Service.
1090 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
1091 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
1092}
1093
1094TEST_F(WiFiMainTest, StateChangeWithService) {
1095 // Forward transition should trigger a Service state change.
1096 StartWiFi();
1097 dispatcher_.DispatchPendingEvents();
1098 MockWiFiServiceRefPtr service = MakeMockService();
1099 InitiateConnect(service);
1100 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
1101 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
1102 // Verify expectations now, because WiFi may report other state changes
1103 // when WiFi is Stop()-ed (during TearDown()).
1104 Mock::VerifyAndClearExpectations(service.get());
1105}
1106
1107TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
1108 // Some backwards transitions should not trigger a Service state change.
1109 // Supplicant state should still be updated, however.
1110 StartWiFi();
1111 dispatcher_.DispatchPendingEvents();
1112 MockWiFiServiceRefPtr service = MakeMockService();
1113 InitiateConnect(service);
1114 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1115 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
1116 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
1117 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
1118 GetSupplicantState());
1119 // Verify expectations now, because WiFi may report other state changes
1120 // when WiFi is Stop()-ed (during TearDown()).
1121 Mock::VerifyAndClearExpectations(service.get());
1122}
1123
Paul Stewarta41e38d2011-11-11 07:47:29 -08001124TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
1125 StrictMock<MockStore> storage;
1126 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
1127 .WillOnce(Return(set<string>()));
1128 EXPECT_FALSE(LoadHiddenServices(&storage));
1129}
1130
1131TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
1132 string id;
1133 StrictMock<MockStore> storage;
1134 SetupHiddenStorage(&storage, "an_ssid", &id);
1135 // Missing "Hidden" property.
1136 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1137 .WillOnce(Return(false));
1138 EXPECT_FALSE(LoadHiddenServices(&storage));
1139}
1140
1141TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
1142 string id;
1143 StrictMock<MockStore> storage;
1144 SetupHiddenStorage(&storage, "an_ssid", &id);
1145 // "Hidden" property set to "false".
1146 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
1147 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
1148 EXPECT_FALSE(LoadHiddenServices(&storage));
1149}
1150
1151TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
1152 string id;
1153 StrictMock<MockStore> storage;
1154 SetupHiddenStorage(&storage, "an_ssid", &id);
1155 // Missing "SSID" property.
1156 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
1157 .WillOnce(Return(false));
1158 EXPECT_FALSE(LoadHiddenServices(&storage));
1159}
1160
1161
1162TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
1163 StrictMock<MockStore> storage;
1164 string id;
1165 SetupHiddenStorage(&storage, "an_ssid", &id);
1166 Error e;
1167 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
1168 ASSERT_TRUE(e.IsSuccess());
1169 EXPECT_FALSE(LoadHiddenServices(&storage));
1170}
1171
1172TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
1173 StrictMock<MockStore> storage;
1174 string ssid("an_ssid");
1175 string id;
1176 SetupHiddenStorage(&storage, ssid, &id);
1177 EXPECT_TRUE(LoadHiddenServices(&storage));
1178 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
1179 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
1180 flimflam::kSecurityNone).get());
1181}
1182
mukesh agrawal15908392011-11-16 18:29:25 +00001183TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
1184 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1185 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1186
1187 // Note that the BSS handle used in this test ("an_ap") is not
1188 // intended to reflect the format used by supplicant. It's just
1189 // convenient for testing.
1190
1191 StartWiFi();
1192 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1193 kNetworkModeInfrastructure);
1194 InitiateConnect(service);
1195 EXPECT_EQ(service, GetPendingService().get());
1196
1197 ReportCurrentBSSChanged("an_ap");
1198 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1199 EXPECT_EQ(Service::kStateConfiguring, service->state());
1200 EXPECT_EQ(service, GetCurrentService().get());
1201 EXPECT_EQ(NULL, GetPendingService().get());
1202
1203 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001204 EXPECT_EQ(Service::kStateFailure, service->state());
mukesh agrawal15908392011-11-16 18:29:25 +00001205 EXPECT_EQ(NULL, GetCurrentService().get());
1206 EXPECT_EQ(NULL, GetPendingService().get());
1207}
1208
1209TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1210 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1211 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1212 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1213 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1214
1215 // Note that the BSS handles used in this test ("ap1", "ap2") are
1216 // not intended to reflect the format used by supplicant. They're
1217 // just convenient for testing.
1218
1219 StartWiFi();
1220 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1221 kNetworkModeInfrastructure);
1222 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1223 kNetworkModeInfrastructure);
1224 InitiateConnect(service1);
1225 ReportCurrentBSSChanged("ap1");
1226 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1227 EXPECT_EQ(service1.get(), GetCurrentService().get());
1228
1229 ReportCurrentBSSChanged("ap2");
1230 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1231 EXPECT_EQ(service2.get(), GetCurrentService().get());
1232 EXPECT_EQ(Service::kStateIdle, service1->state());
1233 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1234}
1235
1236TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1237 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1238 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1239
1240 // Note that the BSS handle used in this test ("an_ap") is not
1241 // intended to reflect the format used by supplicant. It's just
1242 // convenient for testing.
1243
1244 StartWiFi();
1245 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1246 kNetworkModeInfrastructure);
1247 InitiateConnect(service);
1248 ReportCurrentBSSChanged("an_ap");
1249 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1250 EXPECT_EQ(service.get(), GetCurrentService().get());
1251 EXPECT_EQ(Service::kStateConfiguring, service->state());
1252}
1253
mukesh agrawal4eb4d782011-12-05 17:34:37 +00001254TEST_F(WiFiMainTest, ConfiguredServiceRegistration) {
1255 Error e;
1256 EXPECT_CALL(*manager(), RegisterService(_))
1257 .Times(0);
1258 EXPECT_CALL(*manager(), HasService(_))
1259 .WillOnce(Return(false));
1260 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
1261 EXPECT_CALL(*manager(), RegisterService(_));
1262 ReportBSS("ap0", "an_ssid", "00:00:00:00:00:00", 0,
1263 kNetworkModeInfrastructure);
1264}
1265
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001266TEST_F(WiFiMainTest, NewConnectPreemptsPending) {
1267 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1268 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1269 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1270 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1271
1272 StartWiFi();
1273 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1274 kNetworkModeInfrastructure);
1275 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1276 kNetworkModeInfrastructure);
1277 InitiateConnect(service1);
1278 EXPECT_EQ(service1.get(), GetPendingService().get());
1279
1280 EXPECT_CALL(*GetSupplicantInterfaceProxy(), Disconnect());
1281 EXPECT_CALL(*GetSupplicantInterfaceProxy(), AddNetwork(_));
1282 InitiateConnect(service2);
1283 EXPECT_EQ(service2.get(), GetPendingService().get());
1284}
1285
1286TEST_F(WiFiMainTest, IsIdle) {
1287 StartWiFi();
1288 EXPECT_TRUE(wifi()->IsIdle());
1289
1290 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1291 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1292 Error error;
1293 service->AddEndpoint(ap);
1294 service->AutoConnect();
1295 EXPECT_FALSE(wifi()->IsIdle());
1296}
1297
Chris Masone853b81b2011-06-24 14:11:41 -07001298} // namespace shill