blob: 11f7c9a16a27bcd7d985e52252b4006862080ac0 [file] [log] [blame]
Chris Masone853b81b2011-06-24 14:11:41 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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");
140 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700141
142 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700143 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700144 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
145 wifi_->set_dhcp_provider(&dhcp_provider_);
Chris Masoneb9c00592011-10-06 13:10:39 -0700146 EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700147 }
148
149 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700150 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700151 // must Stop WiFi instance, to clear its list of services.
152 // otherwise, the WiFi instance will not be deleted. (because
153 // services reference a WiFi instance, creating a cycle.)
154 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700155 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700156 }
157
mukesh agrawal31950242011-07-14 11:53:38 -0700158 protected:
mukesh agrawal7ec71312011-11-10 02:08:26 +0000159 typedef scoped_refptr<MockWiFiService> MockWiFiServiceRefPtr;
160
mukesh agrawal31950242011-07-14 11:53:38 -0700161 class TestProxyFactory : public ProxyFactory {
162 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700163 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700164
165 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700166 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700167 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700168 }
169
170 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700171 const WiFiRefPtr &/*wifi*/,
172 const DBus::Path &/*object_path*/,
173 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700174 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700175 }
176
177 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700178 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700179 };
180
mukesh agrawal15908392011-11-16 18:29:25 +0000181 WiFiServiceRefPtr CreateServiceForEndpoint(const WiFiEndpoint &endpoint) {
182 bool hidden_ssid = false;
183 return wifi_->CreateServiceForEndpoint(endpoint, hidden_ssid);
184 }
185 const WiFiServiceRefPtr &GetCurrentService() {
186 return wifi_->current_service_;
187 }
mukesh agrawal31950242011-07-14 11:53:38 -0700188 const WiFi::EndpointMap &GetEndpointMap() {
mukesh agrawal165e6142011-11-22 02:22:56 +0000189 return wifi_->endpoint_by_rpcid_;
mukesh agrawal31950242011-07-14 11:53:38 -0700190 }
mukesh agrawal15908392011-11-16 18:29:25 +0000191 const WiFiServiceRefPtr &GetPendingService() {
192 return wifi_->pending_service_;
193 }
mukesh agrawal165e6142011-11-22 02:22:56 +0000194 const vector<WiFiServiceRefPtr> &GetServices() {
195 return wifi_->services_;
mukesh agrawal31950242011-07-14 11:53:38 -0700196 }
197 // note: the tests need the proxies referenced by WiFi (not the
198 // proxies instantiated by WiFiMainTest), to ensure that WiFi
199 // sets up its proxies correctly.
200 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
201 return wifi_->supplicant_process_proxy_.get();
202 }
203 SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
204 return wifi_->supplicant_interface_proxy_.get();
205 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000206 const string &GetSupplicantState() {
207 return wifi_->supplicant_state_;
208 }
209 void InitiateConnect(WiFiServiceRefPtr service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700210 map<string, ::DBus::Variant> params;
211 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700212 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700213 bool IsLinkUp() {
214 return wifi_->link_up_;
215 }
mukesh agrawal15908392011-11-16 18:29:25 +0000216 WiFiEndpointRefPtr MakeEndpoint(const string &ssid, const string &bssid) {
217 map <string, ::DBus::Variant> args;
218 ::DBus::MessageIter writer;
219
220 writer = args[wpa_supplicant::kBSSPropertySSID].writer();
221 writer << vector<uint8_t>(ssid.begin(), ssid.end());
222
223 string bssid_nosep;
224 RemoveChars(bssid, ":", &bssid_nosep);
225 vector<uint8_t> bssid_bytes;
226 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
227 writer = args[wpa_supplicant::kBSSPropertyBSSID].writer();
228 writer << bssid_bytes;
229
230 args[wpa_supplicant::kBSSPropertySignal].writer().append_int16(0);
231 args[wpa_supplicant::kBSSPropertyMode].writer().append_string(
232 wpa_supplicant::kNetworkModeInfrastructure);
233 // We indicate this is an open BSS by leaving out all security properties.
234
235 return new WiFiEndpoint(args);
236 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000237 MockWiFiServiceRefPtr MakeMockService() {
238 vector<uint8_t> ssid(1, 'a');
239 return new MockWiFiService(
240 &control_interface_,
241 &dispatcher_,
242 &manager_,
243 wifi_,
244 ssid,
245 flimflam::kModeManaged,
246 flimflam::kSecurityNone,
247 false);
248 }
mukesh agrawal31950242011-07-14 11:53:38 -0700249 void ReportBSS(const ::DBus::Path &bss_path,
250 const string &ssid,
251 const string &bssid,
252 int16_t signal_strength,
253 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700254 void ReportLinkUp() {
255 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
256 }
mukesh agrawal31950242011-07-14 11:53:38 -0700257 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700258 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700259 }
mukesh agrawal15908392011-11-16 18:29:25 +0000260 void ReportCurrentBSSChanged(const string &new_bss) {
261 wifi_->CurrentBSSChanged(new_bss);
262 }
mukesh agrawal7ec71312011-11-10 02:08:26 +0000263 void ReportStateChanged(const string &new_state) {
264 wifi_->StateChanged(new_state);
265 }
mukesh agrawal31950242011-07-14 11:53:38 -0700266 void StartWiFi() {
267 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700268 }
269 void StopWiFi() {
270 wifi_->Stop();
271 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800272 void GetOpenService(const char *service_type,
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700273 const char *ssid,
274 const char *mode,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800275 Error *result) {
276 GetServiceInner(service_type, ssid, mode, NULL, NULL, false, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700277 }
278 void GetService(const char *service_type,
279 const char *ssid,
280 const char *mode,
281 const char *security,
282 const char *passphrase,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800283 Error *result) {
284 GetServiceInner(service_type, ssid, mode, security, passphrase, false,
285 result);
286 }
287 WiFiServiceRefPtr GetServiceInner(const char *service_type,
288 const char *ssid,
289 const char *mode,
290 const char *security,
291 const char *passphrase,
Paul Stewarta41e38d2011-11-11 07:47:29 -0800292 bool allow_hidden,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800293 Error *result) {
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700294 map<string, ::DBus::Variant> args;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700295 // in general, we want to avoid D-Bus specific code for any RPCs
296 // that come in via adaptors. we make an exception here, because
297 // calls to GetWifiService are rerouted from the Manager object to
298 // the Wifi class.
299 if (service_type != NULL)
300 args[flimflam::kTypeProperty].writer().append_string(service_type);
301 if (ssid != NULL)
302 args[flimflam::kSSIDProperty].writer().append_string(ssid);
303 if (mode != NULL)
304 args[flimflam::kModeProperty].writer().append_string(mode);
305 if (security != NULL)
306 args[flimflam::kSecurityProperty].writer().append_string(security);
307 if (passphrase != NULL)
308 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
Paul Stewarta41e38d2011-11-11 07:47:29 -0800309 if (!allow_hidden)
310 args[flimflam::kWifiHiddenSsid].writer().append_bool(false);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700311
Paul Stewartced6a0b2011-11-08 15:32:04 -0800312 Error e;
313 KeyValueStore args_kv;
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700314 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
Paul Stewartced6a0b2011-11-08 15:32:04 -0800315 return wifi_->GetService(args_kv, result);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700316 }
Paul Stewarta41e38d2011-11-11 07:47:29 -0800317 WiFiServiceRefPtr FindService(const vector<uint8_t> &ssid,
318 const string &mode,
319 const string &security) {
320 return wifi_->FindService(ssid, mode, security);
321 }
322 bool LoadHiddenServices(StoreInterface *storage) {
323 return wifi_->LoadHiddenServices(storage);
324 }
325 void SetupHiddenStorage(MockStore *storage, const string &ssid, string *id) {
326 const string hex_ssid = base::HexEncode(ssid.data(), ssid.size());
327 *id = StringToLowerASCII(base::StringPrintf("%s_%s_%s_%s_%s",
328 flimflam::kTypeWifi,
329 kDeviceAddress,
330 hex_ssid.c_str(),
331 flimflam::kModeManaged,
332 flimflam::kSecurityNone));
333 const char *groups[] = { id->c_str() };
334 EXPECT_CALL(*storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
335 .WillRepeatedly(Return(set<string>(groups, groups + 1)));
336 EXPECT_CALL(*storage, GetBool(StrEq(*id), flimflam::kWifiHiddenSsid, _))
337 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
338 EXPECT_CALL(*storage, GetString(StrEq(*id), flimflam::kSSIDProperty, _))
339 .WillRepeatedly(DoAll(SetArgumentPointee<2>(hex_ssid), Return(true)));
340 }
mukesh agrawal32399322011-09-01 10:53:43 -0700341 MockManager *manager() {
342 return &manager_;
343 }
344 const WiFiConstRefPtr wifi() const {
345 return wifi_;
346 }
347
348 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700349 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700350
351 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700352 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700353 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700354 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700355 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700356
357 // protected fields interspersed between private fields, due to
358 // initialization order
359 protected:
360 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700361 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700362 static const char kNetworkModeAdHoc[];
363 static const char kNetworkModeInfrastructure[];
364
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700365 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
366 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700367 MockDHCPProvider dhcp_provider_;
368 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700369
370 private:
371 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700372};
373
374const char WiFiMainTest::kDeviceName[] = "wlan0";
Paul Stewarta41e38d2011-11-11 07:47:29 -0800375const char WiFiMainTest::kDeviceAddress[] = "000102030405";
mukesh agrawal31950242011-07-14 11:53:38 -0700376const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
377const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
378
379void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
380 const string &ssid,
381 const string &bssid,
382 int16_t signal_strength,
383 const char *mode) {
384 map<string, ::DBus::Variant> bss_properties;
385
386 {
387 DBus::MessageIter writer(bss_properties["SSID"].writer());
388 writer << vector<uint8_t>(ssid.begin(), ssid.end());
389 }
390 {
391 string bssid_nosep;
392 vector<uint8_t> bssid_bytes;
393 RemoveChars(bssid, ":", &bssid_nosep);
394 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
395
396 DBus::MessageIter writer(bss_properties["BSSID"].writer());
397 writer << bssid_bytes;
398 }
399 bss_properties["Signal"].writer().append_int16(signal_strength);
400 bss_properties["Mode"].writer().append_string(mode);
401 wifi_->BSSAdded(bss_path, bss_properties);
402}
403
404TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
405 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
406 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
407
408 StartWiFi();
409 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
410 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
411}
412
413TEST_F(WiFiMainTest, CleanStart) {
414 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
415 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
416 .Times(AnyNumber())
417 .WillRepeatedly(Throw(
418 DBus::Error(
419 "fi.w1.wpa_supplicant1.InterfaceUnknown",
420 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
421 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
422 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700423 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700424}
425
426TEST_F(WiFiMainTest, Restart) {
427 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
428 .Times(AnyNumber())
429 .WillRepeatedly(Throw(
430 DBus::Error(
431 "fi.w1.wpa_supplicant1.InterfaceExists",
432 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
433 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
434 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
435 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700436 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700437}
438
439TEST_F(WiFiMainTest, StartClearsState) {
440 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
441 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
442 StartWiFi();
443}
444
445TEST_F(WiFiMainTest, ScanResults) {
446 StartWiFi();
447 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
448 ReportBSS(
449 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
450 ReportBSS(
451 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
452 ReportBSS(
453 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
454 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
455 EXPECT_EQ(5, GetEndpointMap().size());
456}
457
458TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
459 StartWiFi();
460 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
461 ReportBSS(
462 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
463 ReportBSS(
464 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
465 ReportBSS(
466 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
467 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
mukesh agrawal165e6142011-11-22 02:22:56 +0000468
469 const WiFi::EndpointMap &endpoints_by_rpcid = GetEndpointMap();
470 EXPECT_EQ(3, endpoints_by_rpcid.size());
471
472 WiFi::EndpointMap::const_iterator i;
473 WiFiEndpointRefPtr endpoint;
474 for (i = endpoints_by_rpcid.begin();
475 i != endpoints_by_rpcid.end();
476 ++i) {
477 if (i->second->bssid_string() == "00:00:00:00:00:00")
478 break;
479 }
480 ASSERT_TRUE(i != endpoints_by_rpcid.end());
481 EXPECT_EQ(4, i->second->signal_strength());
mukesh agrawal31950242011-07-14 11:53:38 -0700482}
483
484TEST_F(WiFiMainTest, ScanCompleted) {
485 StartWiFi();
486 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
487 ReportBSS(
488 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
489 ReportBSS(
490 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
mukesh agrawal32399322011-09-01 10:53:43 -0700491 EXPECT_CALL(*manager(), RegisterService(_))
492 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700493 ReportScanDone();
mukesh agrawal165e6142011-11-22 02:22:56 +0000494 EXPECT_EQ(3, GetServices().size());
495}
496
497TEST_F(WiFiMainTest, EndpointGroupingTogether) {
498 StartWiFi();
499 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
500 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
501 ReportScanDone();
502 EXPECT_EQ(1, GetServices().size());
503}
504
505TEST_F(WiFiMainTest, EndpointGroupingDifferentSSID) {
506 StartWiFi();
507 ReportBSS("bss0", "ssid1", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
508 ReportBSS("bss1", "ssid2", "00:00:00:00:00:01", 0, kNetworkModeAdHoc);
509 ReportScanDone();
510 EXPECT_EQ(2, GetServices().size());
511}
512
513TEST_F(WiFiMainTest, EndpointGroupingDifferentMode) {
514 StartWiFi();
515 ReportBSS("bss0", "ssid", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
516 ReportBSS("bss1", "ssid", "00:00:00:00:00:01", 0, kNetworkModeInfrastructure);
517 ReportScanDone();
518 EXPECT_EQ(2, GetServices().size());
mukesh agrawal31950242011-07-14 11:53:38 -0700519}
520
521TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700522 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
523 *supplicant_interface_proxy_;
524
mukesh agrawal31950242011-07-14 11:53:38 -0700525 StartWiFi();
526 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
527 ReportScanDone();
528
529 {
530 InSequence s;
531 DBus::Path fake_path("/fake/path");
mukesh agrawal165e6142011-11-22 02:22:56 +0000532 WiFiService *service(GetServices().begin()->get());
mukesh agrawal31950242011-07-14 11:53:38 -0700533
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700534 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700535 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700536 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700537 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700538 EXPECT_EQ(static_cast<Service *>(service),
539 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700540 }
541}
542
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700543TEST_F(WiFiMainTest, LinkEvent) {
544 EXPECT_FALSE(IsLinkUp());
545 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
546 WillOnce(Return(dhcp_config_));
547 ReportLinkUp();
548}
549
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700550TEST_F(WiFiMainTest, Stop) {
551 {
552 InSequence s;
553
554 StartWiFi();
555 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
556 ReportScanDone();
557 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
558 WillOnce(Return(dhcp_config_));
559 ReportLinkUp();
560 }
561
562 {
563 EXPECT_CALL(*manager(), DeregisterService(_));
564 StopWiFi();
565 }
566}
567
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700568TEST_F(WiFiMainTest, GetWifiServiceOpen) {
569 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800570 GetOpenService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700571 EXPECT_TRUE(e.IsSuccess());
572}
573
574TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
575 Error e;
Paul Stewart6ab23a92011-11-09 17:17:47 -0800576 GetOpenService(NULL, "an_ssid", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700577 EXPECT_EQ(Error::kInvalidArguments, e.type());
578 EXPECT_EQ("must specify service type", e.message());
579}
580
581TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
582 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800583 GetOpenService(flimflam::kTypeWifi, NULL, flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700584 EXPECT_EQ(Error::kInvalidArguments, e.type());
585 EXPECT_EQ("must specify SSID", e.message());
586}
587
588TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
589 Error e;
590 GetOpenService(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800591 flimflam::kTypeWifi, "123456789012345678901234567890123",
592 flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700593 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
594 EXPECT_EQ("SSID is too long", e.message());
595}
596
597TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
598 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800599 GetOpenService(flimflam::kTypeWifi, "", flimflam::kModeManaged, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700600 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
601 EXPECT_EQ("SSID is too short", e.message());
602}
603
604TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
605 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800606 GetOpenService(flimflam::kTypeWifi, "an_ssid", "ad-hoc", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700607 EXPECT_EQ(Error::kNotSupported, e.type());
608 EXPECT_EQ("service mode is unsupported", e.message());
609}
610
611TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
612 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800613 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700614 EXPECT_TRUE(e.IsSuccess());
615}
616
617TEST_F(WiFiMainTest, GetWifiServiceRSN) {
618 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800619 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
620 flimflam::kSecurityRsn, "secure password", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700621 EXPECT_TRUE(e.IsSuccess());
622}
623
624TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
625 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800626 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
627 flimflam::kSecurityRsn, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700628 EXPECT_EQ(Error::kInvalidArguments, e.type());
629 EXPECT_EQ("must specify passphrase", e.message());
630}
631
632TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
633 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800634 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged, "rot-13",
635 NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700636 EXPECT_EQ(Error::kNotSupported, e.type());
637 EXPECT_EQ("security mode is unsupported", e.message());
638}
639
640TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
641 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800642 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
643 flimflam::kSecurityWep, NULL, &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700644 EXPECT_EQ(Error::kInvalidArguments, e.type());
645 EXPECT_EQ("must specify passphrase", e.message());
646}
647
648TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
649 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800650 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
651 flimflam::kSecurityWep, "", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700652 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
653}
654
655TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
656 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800657 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
658 flimflam::kSecurityWep, "abcde", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700659 EXPECT_TRUE(e.IsSuccess());
660}
661
662TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
663 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800664 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
665 flimflam::kSecurityWep, "abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700666 EXPECT_TRUE(e.IsSuccess());
667}
668
669TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
670 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800671 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
672 flimflam::kSecurityWep, "0:abcdefghijklm", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700673 EXPECT_TRUE(e.IsSuccess());
674}
675
676TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
677 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800678 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
679 flimflam::kSecurityWep, "0102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700680 EXPECT_TRUE(e.IsSuccess());
681}
682
683TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
684 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800685 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
686 flimflam::kSecurityWep, "O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700687 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
688}
689
690TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
691 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800692 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
693 flimflam::kSecurityWep, "1:O102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700694 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
695}
696
697TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
698 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800699 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
700 flimflam::kSecurityWep, "1:0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700701 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
702}
703
704TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
705 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800706 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
707 flimflam::kSecurityWep, "0xO102030405", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700708 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
709}
710
711TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
712 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800713 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
714 flimflam::kSecurityWep, "0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700715 EXPECT_TRUE(e.IsSuccess());
716}
717
718TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
719 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800720 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
721 flimflam::kSecurityWep, "0102030405060708090A0B0C0D", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700722 EXPECT_TRUE(e.IsSuccess());
723}
724
725TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
726 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800727 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
728 flimflam::kSecurityWep, "0:0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700729 EXPECT_TRUE(e.IsSuccess());
730}
731
732TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
733 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800734 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
735 flimflam::kSecurityWep, "0:0x0102030405060708090a0b0c0d", &e);
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700736 EXPECT_TRUE(e.IsSuccess());
737}
738
mukesh agrawal8ede0522011-10-03 14:57:44 -0700739class WiFiGetServiceSuccessTest : public WiFiMainTest {};
740class WiFiGetServiceFailureTest : public WiFiMainTest {};
741
742TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
743 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800744 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
745 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700746 EXPECT_TRUE(e.IsSuccess());
747}
748
749TEST_P(WiFiGetServiceFailureTest, Passphrase) {
750 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800751 GetService(flimflam::kTypeWifi, "an_ssid", flimflam::kModeManaged,
752 flimflam::kSecurityWpa, GetParam().c_str(), &e);
mukesh agrawal8ede0522011-10-03 14:57:44 -0700753 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
754}
755
756INSTANTIATE_TEST_CASE_P(
757 WiFiGetServiceSuccessTestInstance,
758 WiFiGetServiceSuccessTest,
759 Values(
760 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
761 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
762 // subtle: invalid length for hex key, but valid as ascii passphrase
763 string(IEEE_80211::kWPAHexLen-1, '1'),
764 string(IEEE_80211::kWPAHexLen, '1')));
765
766INSTANTIATE_TEST_CASE_P(
767 WiFiGetServiceFailureTestInstance,
768 WiFiGetServiceFailureTest,
769 Values(
770 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
771 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
772 string(IEEE_80211::kWPAHexLen+1, '1')));
773
Paul Stewart6ab23a92011-11-09 17:17:47 -0800774TEST_F(WiFiMainTest, FindServiceWEP) {
775 const string ssid("an_ssid");
776 {
777 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800778 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800779 flimflam::kSecurityWep, "abcde", &e);
780 EXPECT_TRUE(e.IsSuccess());
781 }
782 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
783
Paul Stewarta41e38d2011-11-11 07:47:29 -0800784 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
785 flimflam::kSecurityWep).get());
786 EXPECT_FALSE(FindService(ssid_bytes, flimflam::kModeManaged,
787 flimflam::kSecurityWpa).get());
Paul Stewart6ab23a92011-11-09 17:17:47 -0800788}
789
790TEST_F(WiFiMainTest, FindServiceWPA) {
791 const string ssid("an_ssid");
792 {
793 Error e;
Paul Stewarta41e38d2011-11-11 07:47:29 -0800794 GetService(flimflam::kTypeWifi, ssid.c_str(), flimflam::kModeManaged,
Paul Stewart6ab23a92011-11-09 17:17:47 -0800795 flimflam::kSecurityRsn, "abcdefgh", &e);
796 EXPECT_TRUE(e.IsSuccess());
797 }
798 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800799 WiFiServiceRefPtr wpa_service(FindService(ssid_bytes, flimflam::kModeManaged,
800 flimflam::kSecurityWpa));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800801 EXPECT_TRUE(wpa_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800802 WiFiServiceRefPtr rsn_service(FindService(ssid_bytes, flimflam::kModeManaged,
803 flimflam::kSecurityRsn));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800804 EXPECT_TRUE(rsn_service.get());
805 EXPECT_EQ(wpa_service.get(), rsn_service.get());
Paul Stewarta41e38d2011-11-11 07:47:29 -0800806 WiFiServiceRefPtr psk_service(FindService(ssid_bytes, flimflam::kModeManaged,
807 flimflam::kSecurityPsk));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800808 EXPECT_EQ(wpa_service.get(), psk_service.get());
809 // Indirectly test FindService by doing a GetService on something that
810 // already exists.
811 {
812 Error e;
813 WiFiServiceRefPtr wpa_service2(
Paul Stewarta41e38d2011-11-11 07:47:29 -0800814 GetServiceInner(flimflam::kTypeWifi, ssid.c_str(),
815 flimflam::kModeManaged, flimflam::kSecurityWpa,
816 "abcdefgh", false, &e));
Paul Stewart6ab23a92011-11-09 17:17:47 -0800817 EXPECT_TRUE(e.IsSuccess());
818 EXPECT_EQ(wpa_service.get(), wpa_service2.get());
819 }
820}
821
Paul Stewartced6a0b2011-11-08 15:32:04 -0800822MATCHER_P(HasHiddenSSID, ssid, "") {
Paul Stewarta41e38d2011-11-11 07:47:29 -0800823 map<string, DBus::Variant>::const_iterator it =
Paul Stewartced6a0b2011-11-08 15:32:04 -0800824 arg.find(wpa_supplicant::kPropertyScanSSIDs);
825 if (it == arg.end()) {
826 return false;
827 }
828
829 const DBus::Variant &ssids_variant = it->second;
830 EXPECT_TRUE(DBusAdaptor::IsByteArrays(ssids_variant.signature()));
831 const ByteArrays &ssids = it->second.operator ByteArrays();
832 // A valid Scan containing a single hidden SSID should contain
833 // two SSID entries: one containing the SSID we are looking for,
834 // and an empty entry, signifying that we also want to do a
835 // broadcast probe request for all non-hidden APs as well.
836 return ssids.size() == 2 &&
837 string(ssids[0].begin(), ssids[0].end()) == ssid &&
838 ssids[1].empty();
839}
840
841TEST_F(WiFiMainTest, ScanHidden) {
842 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
843 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
844 .Times(AnyNumber())
845 .WillRepeatedly(Throw(
846 DBus::Error(
847 "fi.w1.wpa_supplicant1.InterfaceUnknown",
848 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
Paul Stewarta41e38d2011-11-11 07:47:29 -0800849 {
850 // Create a hidden, favorite service.
851 Error e;
852 WiFiServiceRefPtr service =
853 GetServiceInner(flimflam::kTypeWifi, "ssid0", flimflam::kModeManaged,
854 NULL, NULL, true, &e);
855 EXPECT_TRUE(e.IsSuccess());
856 EXPECT_TRUE(service->hidden_ssid());
857 service->set_favorite(true);
858 }
859 {
860 // Create a hidden, non-favorite service.
861 Error e;
862 WiFiServiceRefPtr service =
863 GetServiceInner(flimflam::kTypeWifi, "ssid1", flimflam::kModeManaged,
864 NULL, NULL, true, &e);
865 EXPECT_TRUE(e.IsSuccess());
866 EXPECT_TRUE(service->hidden_ssid());
867 }
868 {
869 // Create a non-hidden, favorite service.
870 Error e;
871 WiFiServiceRefPtr service =
872 GetServiceInner(flimflam::kTypeWifi, "ssid2", flimflam::kModeManaged,
873 NULL, NULL, false, &e);
874 EXPECT_TRUE(e.IsSuccess());
875 EXPECT_FALSE(service->hidden_ssid());
876 service->set_favorite(true);
877 }
878 EXPECT_CALL(*supplicant_interface_proxy_, Scan(HasHiddenSSID("ssid0")));
Paul Stewartced6a0b2011-11-08 15:32:04 -0800879 StartWiFi();
880 dispatcher_.DispatchPendingEvents();
881}
882
mukesh agrawal7ec71312011-11-10 02:08:26 +0000883TEST_F(WiFiMainTest, InitialSupplicantState) {
884 EXPECT_EQ(WiFi::kInterfaceStateUnknown, GetSupplicantState());
885}
886
887TEST_F(WiFiMainTest, StateChangeNoService) {
888 // State change should succeed even if there is no pending Service.
889 ReportStateChanged(wpa_supplicant::kInterfaceStateScanning);
890 EXPECT_EQ(wpa_supplicant::kInterfaceStateScanning, GetSupplicantState());
891}
892
893TEST_F(WiFiMainTest, StateChangeWithService) {
894 // Forward transition should trigger a Service state change.
895 StartWiFi();
896 dispatcher_.DispatchPendingEvents();
897 MockWiFiServiceRefPtr service = MakeMockService();
898 InitiateConnect(service);
899 EXPECT_CALL(*service.get(), SetState(Service::kStateAssociating));
900 ReportStateChanged(wpa_supplicant::kInterfaceStateAssociated);
901 // Verify expectations now, because WiFi may report other state changes
902 // when WiFi is Stop()-ed (during TearDown()).
903 Mock::VerifyAndClearExpectations(service.get());
904}
905
906TEST_F(WiFiMainTest, StateChangeBackwardsWithService) {
907 // Some backwards transitions should not trigger a Service state change.
908 // Supplicant state should still be updated, however.
909 StartWiFi();
910 dispatcher_.DispatchPendingEvents();
911 MockWiFiServiceRefPtr service = MakeMockService();
912 InitiateConnect(service);
913 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
914 EXPECT_CALL(*service.get(), SetState(_)).Times(0);
915 ReportStateChanged(wpa_supplicant::kInterfaceStateAuthenticating);
916 EXPECT_EQ(wpa_supplicant::kInterfaceStateAuthenticating,
917 GetSupplicantState());
918 // Verify expectations now, because WiFi may report other state changes
919 // when WiFi is Stop()-ed (during TearDown()).
920 Mock::VerifyAndClearExpectations(service.get());
921}
922
Paul Stewarta41e38d2011-11-11 07:47:29 -0800923TEST_F(WiFiMainTest, LoadHiddenServicesFailWithNoGroups) {
924 StrictMock<MockStore> storage;
925 EXPECT_CALL(storage, GetGroupsWithKey(flimflam::kWifiHiddenSsid))
926 .WillOnce(Return(set<string>()));
927 EXPECT_FALSE(LoadHiddenServices(&storage));
928}
929
930TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingHidden) {
931 string id;
932 StrictMock<MockStore> storage;
933 SetupHiddenStorage(&storage, "an_ssid", &id);
934 // Missing "Hidden" property.
935 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
936 .WillOnce(Return(false));
937 EXPECT_FALSE(LoadHiddenServices(&storage));
938}
939
940TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFalseHidden) {
941 string id;
942 StrictMock<MockStore> storage;
943 SetupHiddenStorage(&storage, "an_ssid", &id);
944 // "Hidden" property set to "false".
945 EXPECT_CALL(storage, GetBool(StrEq(id), flimflam::kWifiHiddenSsid, _))
946 .WillOnce(DoAll(SetArgumentPointee<2>(true), Return(false)));
947 EXPECT_FALSE(LoadHiddenServices(&storage));
948}
949
950TEST_F(WiFiMainTest, LoadHiddenServicesFailWithMissingSSID) {
951 string id;
952 StrictMock<MockStore> storage;
953 SetupHiddenStorage(&storage, "an_ssid", &id);
954 // Missing "SSID" property.
955 EXPECT_CALL(storage, GetString(StrEq(id), flimflam::kSSIDProperty, _))
956 .WillOnce(Return(false));
957 EXPECT_FALSE(LoadHiddenServices(&storage));
958}
959
960
961TEST_F(WiFiMainTest, LoadHiddenServicesFailWithFoundService) {
962 StrictMock<MockStore> storage;
963 string id;
964 SetupHiddenStorage(&storage, "an_ssid", &id);
965 Error e;
966 GetOpenService(flimflam::kTypeWifi, "an_ssid", NULL, &e);
967 ASSERT_TRUE(e.IsSuccess());
968 EXPECT_FALSE(LoadHiddenServices(&storage));
969}
970
971TEST_F(WiFiMainTest, LoadHiddenServicesSuccess) {
972 StrictMock<MockStore> storage;
973 string ssid("an_ssid");
974 string id;
975 SetupHiddenStorage(&storage, ssid, &id);
976 EXPECT_TRUE(LoadHiddenServices(&storage));
977 vector<uint8_t> ssid_bytes(ssid.begin(), ssid.end());
978 EXPECT_TRUE(FindService(ssid_bytes, flimflam::kModeManaged,
979 flimflam::kSecurityNone).get());
980}
981
mukesh agrawal15908392011-11-16 18:29:25 +0000982TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToDisconnected) {
983 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
984 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
985
986 // Note that the BSS handle used in this test ("an_ap") is not
987 // intended to reflect the format used by supplicant. It's just
988 // convenient for testing.
989
990 StartWiFi();
991 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
992 kNetworkModeInfrastructure);
993 InitiateConnect(service);
994 EXPECT_EQ(service, GetPendingService().get());
995
996 ReportCurrentBSSChanged("an_ap");
997 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
998 EXPECT_EQ(Service::kStateConfiguring, service->state());
999 EXPECT_EQ(service, GetCurrentService().get());
1000 EXPECT_EQ(NULL, GetPendingService().get());
1001
1002 ReportCurrentBSSChanged(wpa_supplicant::kCurrentBSSNull);
1003 EXPECT_EQ(Service::kStateIdle, service->state());
1004 EXPECT_EQ(NULL, GetCurrentService().get());
1005 EXPECT_EQ(NULL, GetPendingService().get());
1006}
1007
1008TEST_F(WiFiMainTest, CurrentBSSChangeConnectedToConnectedNewService) {
1009 WiFiEndpointRefPtr ap1 = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1010 WiFiEndpointRefPtr ap2 = MakeEndpoint("another_ssid", "01:02:03:04:05:06");
1011 WiFiServiceRefPtr service1 = CreateServiceForEndpoint(*ap1);
1012 WiFiServiceRefPtr service2 = CreateServiceForEndpoint(*ap2);
1013
1014 // Note that the BSS handles used in this test ("ap1", "ap2") are
1015 // not intended to reflect the format used by supplicant. They're
1016 // just convenient for testing.
1017
1018 StartWiFi();
1019 ReportBSS("ap1", ap1->ssid_string(), ap1->bssid_string(), 0,
1020 kNetworkModeInfrastructure);
1021 ReportBSS("ap2", ap2->ssid_string(), ap2->bssid_string(), 0,
1022 kNetworkModeInfrastructure);
1023 InitiateConnect(service1);
1024 ReportCurrentBSSChanged("ap1");
1025 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1026 EXPECT_EQ(service1.get(), GetCurrentService().get());
1027
1028 ReportCurrentBSSChanged("ap2");
1029 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1030 EXPECT_EQ(service2.get(), GetCurrentService().get());
1031 EXPECT_EQ(Service::kStateIdle, service1->state());
1032 EXPECT_EQ(Service::kStateConfiguring, service2->state());
1033}
1034
1035TEST_F(WiFiMainTest, CurrentBSSChangeDisconnectedToConnected) {
1036 WiFiEndpointRefPtr ap = MakeEndpoint("an_ssid", "00:01:02:03:04:05");
1037 WiFiServiceRefPtr service = CreateServiceForEndpoint(*ap);
1038
1039 // Note that the BSS handle used in this test ("an_ap") is not
1040 // intended to reflect the format used by supplicant. It's just
1041 // convenient for testing.
1042
1043 StartWiFi();
1044 ReportBSS("an_ap", ap->ssid_string(), ap->bssid_string(), 0,
1045 kNetworkModeInfrastructure);
1046 InitiateConnect(service);
1047 ReportCurrentBSSChanged("an_ap");
1048 ReportStateChanged(wpa_supplicant::kInterfaceStateCompleted);
1049 EXPECT_EQ(service.get(), GetCurrentService().get());
1050 EXPECT_EQ(Service::kStateConfiguring, service->state());
1051}
1052
Chris Masone853b81b2011-06-24 14:11:41 -07001053} // namespace shill