blob: 99bb635a8f16a9b34466ae4e296de10adbf5d3ce [file] [log] [blame]
mukesh agrawal8a3188d2011-12-01 20:56:44 +00001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Masone34af2182011-08-22 11:59:36 -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_service.h"
6
mukesh agrawald835b202011-10-07 15:26:47 -07007#include <map>
Chris Masone34af2182011-08-22 11:59:36 -07008#include <string>
9#include <vector>
10
11#include <base/string_util.h>
12#include <chromeos/dbus/service_constants.h>
13#include <gmock/gmock.h>
14#include <gtest/gtest.h>
15
Paul Stewart26b327e2011-10-19 11:38:09 -070016#include "shill/event_dispatcher.h"
Chris Masone34af2182011-08-22 11:59:36 -070017#include "shill/manager.h"
18#include "shill/mock_adaptors.h"
19#include "shill/mock_control.h"
20#include "shill/mock_service.h"
21#include "shill/mock_store.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070022#include "shill/mock_wifi.h"
Chris Masone34af2182011-08-22 11:59:36 -070023#include "shill/property_store_unittest.h"
mukesh agrawal8a3188d2011-12-01 20:56:44 +000024#include "shill/refptr_types.h"
25#include "shill/wifi_endpoint.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070026#include "shill/wpa_supplicant.h"
Chris Masone34af2182011-08-22 11:59:36 -070027
mukesh agrawald835b202011-10-07 15:26:47 -070028using std::map;
Chris Masone34af2182011-08-22 11:59:36 -070029using std::string;
30using std::vector;
31
32namespace shill {
Paul Stewartd08f4432011-11-04 07:48:20 -070033using ::testing::_;
34using ::testing::DoAll;
mukesh agrawal6e277772011-09-29 15:04:23 -070035using ::testing::NiceMock;
Paul Stewartd08f4432011-11-04 07:48:20 -070036using ::testing::Return;
37using ::testing::SetArgumentPointee;
38using ::testing::StrEq;
Paul Stewartd8ad3c42012-01-09 12:39:38 -080039using ::testing::StrNe;
Chris Masone34af2182011-08-22 11:59:36 -070040
41class WiFiServiceTest : public PropertyStoreTest {
42 public:
mukesh agrawal6e277772011-09-29 15:04:23 -070043 WiFiServiceTest() : wifi_(
44 new NiceMock<MockWiFi>(
45 control_interface(),
46 dispatcher(),
47 manager(),
48 "wifi",
49 fake_mac,
50 0)) {}
Chris Masone34af2182011-08-22 11:59:36 -070051 virtual ~WiFiServiceTest() {}
mukesh agrawal6e277772011-09-29 15:04:23 -070052
53 protected:
54 static const char fake_mac[];
mukesh agrawal29c13a12011-11-24 00:09:19 +000055 bool CheckConnectable(const std::string &security, const char *passphrase) {
56 Error error;
57 vector<uint8_t> ssid(1, 'a');
58 WiFiServiceRefPtr service = new WiFiService(control_interface(),
59 dispatcher(),
60 manager(),
61 wifi(),
62 ssid,
63 flimflam::kModeManaged,
64 security,
65 false);
66 if (passphrase)
67 service->SetPassphrase(passphrase, &error);
68 return service->connectable();
69 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +000070 WiFiEndpoint *MakeEndpoint(const string &ssid, const string &bssid) {
71 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
72 }
mukesh agrawal6e277772011-09-29 15:04:23 -070073 scoped_refptr<MockWiFi> wifi() { return wifi_; }
74
75 private:
76 scoped_refptr<MockWiFi> wifi_;
Chris Masone34af2182011-08-22 11:59:36 -070077};
78
mukesh agrawal6e277772011-09-29 15:04:23 -070079// static
80const char WiFiServiceTest::fake_mac[] = "AaBBcCDDeeFF";
81
Paul Stewartd08f4432011-11-04 07:48:20 -070082class WiFiServiceSecurityTest : public WiFiServiceTest {
83 public:
84 WiFiServiceRefPtr CreateServiceWithSecurity(const string &security) {
Gaurav Shahda6218a2011-11-11 12:09:33 -080085 vector<uint8_t> ssid(5);
Paul Stewartd08f4432011-11-04 07:48:20 -070086 ssid.push_back(0xff);
87
88 return new WiFiService(control_interface(),
89 dispatcher(),
90 manager(),
91 wifi(),
92 ssid,
93 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -080094 security,
95 false);
Paul Stewartd08f4432011-11-04 07:48:20 -070096 }
97
98 bool TestStorageSecurityIs(WiFiServiceRefPtr wifi_service,
99 const string &security) {
100 string id = wifi_service->GetStorageIdentifier();
101 size_t mac_pos = id.find(StringToLowerASCII(string(fake_mac)));
102 EXPECT_NE(mac_pos, string::npos);
103 size_t mode_pos = id.find(string(flimflam::kModeManaged), mac_pos);
104 EXPECT_NE(mode_pos, string::npos);
105 return id.find(string(security), mode_pos) != string::npos;
106 }
107
108 // Test that a service that is created with security |from_security|
109 // gets by default a storage identifier with |to_security| as its
110 // security component.
111 bool TestStorageMapping(const string &from_security,
112 const string &to_security) {
113 WiFiServiceRefPtr wifi_service = CreateServiceWithSecurity(from_security);
114 return TestStorageSecurityIs(wifi_service, to_security);
115 }
116
117 // Test whether a service of type |service_security| can load from a
118 // storage interface containing an entry for |storage_security|.
119 // Make sure the result meets |expectation|. If |expectation| is
120 // true, also make sure the service storage identifier changes to
121 // match |storage_security|.
122 bool TestLoadMapping(const string &service_security,
123 const string &storage_security,
124 bool expectation) {
125 WiFiServiceRefPtr wifi_service =
126 CreateServiceWithSecurity(service_security);
127 NiceMock<MockStore> mock_store;
128 const string storage_id =
129 wifi_service->GetStorageIdentifierForSecurity(storage_security);
130 EXPECT_CALL(mock_store, ContainsGroup(_))
131 .WillRepeatedly(Return(false));
132 EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
133 .WillRepeatedly(Return(true));
134 bool is_loadable = wifi_service->IsLoadableFrom(&mock_store);
135 EXPECT_EQ(expectation, is_loadable);
136 bool is_loaded = wifi_service->Load(&mock_store);
137 EXPECT_EQ(expectation, is_loaded);
138
139 if (expectation != is_loadable || expectation != is_loaded) {
140 return false;
141 } else if (!expectation) {
142 return true;
143 } else {
144 return TestStorageSecurityIs(wifi_service, storage_security);
145 }
146 }
147};
148
Chris Masone34af2182011-08-22 11:59:36 -0700149TEST_F(WiFiServiceTest, StorageId) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800150 vector<uint8_t> ssid(5);
Chris Masone34af2182011-08-22 11:59:36 -0700151 ssid.push_back(0xff);
Chris Masone9d779932011-08-25 16:33:41 -0700152
Chris Masone2176a882011-09-14 22:29:15 -0700153 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
154 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700155 manager(),
mukesh agrawal6e277772011-09-29 15:04:23 -0700156 wifi(),
Chris Masone9d779932011-08-25 16:33:41 -0700157 ssid,
158 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800159 flimflam::kSecurityNone,
160 false);
Chris Masone9d779932011-08-25 16:33:41 -0700161 string id = wifi_service->GetStorageIdentifier();
Chris Masone34af2182011-08-22 11:59:36 -0700162 for (uint i = 0; i < id.length(); ++i) {
163 EXPECT_TRUE(id[i] == '_' ||
164 isxdigit(id[i]) ||
165 (isalpha(id[i]) && islower(id[i])));
166 }
Paul Stewart22aa71b2011-09-16 12:15:11 -0700167 EXPECT_TRUE(wifi_service->TechnologyIs(Technology::kWifi));
Chris Masone34af2182011-08-22 11:59:36 -0700168 size_t mac_pos = id.find(StringToLowerASCII(string(fake_mac)));
169 EXPECT_NE(mac_pos, string::npos);
170 EXPECT_NE(id.find(string(flimflam::kModeManaged), mac_pos), string::npos);
171}
172
Gaurav Shahda6218a2011-11-11 12:09:33 -0800173// Make sure the passphrase is registered as a write only property
174// by reading and comparing all string properties returned on the store.
175TEST_F(WiFiServiceTest, PassphraseWriteOnly) {
176 vector<uint8_t> ssid(5);
177 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
178 dispatcher(),
179 manager(),
180 wifi(),
181 ssid,
182 flimflam::kModeManaged,
183 flimflam::kSecurityWpa,
184 false);
185 ReadablePropertyConstIterator<string> it =
186 (wifi_service->store()).GetStringPropertiesIter();
187 for( ; !it.AtEnd(); it.Advance())
188 EXPECT_NE(it.Key(), flimflam::kPassphraseProperty);
189}
190
Thieu Lef7709452011-11-15 01:13:19 +0000191// Make sure setting the passphrase via D-Bus Service.SetProperty validates
192// the passphrase.
193TEST_F(WiFiServiceTest, PassphraseSetPropertyValidation) {
194 // We only spot check two password cases here to make sure the
195 // SetProperty code path does validation. We're not going to exhaustively
196 // test for all types of passwords.
197 vector<uint8_t> ssid(5);
198 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
199 dispatcher(),
200 manager(),
201 wifi(),
202 ssid,
203 flimflam::kModeManaged,
204 flimflam::kSecurityWep,
205 false);
206 Error error;
207 EXPECT_TRUE(wifi_service->mutable_store()->SetStringProperty(
208 flimflam::kPassphraseProperty, "0:abcde", &error));
209 EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
210 flimflam::kPassphraseProperty, "invalid", &error));
211 EXPECT_EQ(Error::kInvalidPassphrase, error.type());
212}
213
214TEST_F(WiFiServiceTest, PassphraseSetPropertyOpenNetwork) {
215 vector<uint8_t> ssid(5);
216 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
217 dispatcher(),
218 manager(),
219 wifi(),
220 ssid,
221 flimflam::kModeManaged,
222 flimflam::kSecurityNone,
223 false);
224 Error error;
225 EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
226 flimflam::kPassphraseProperty, "invalid", &error));
227 EXPECT_EQ(Error::kNotSupported, error.type());
228}
229
mukesh agrawald835b202011-10-07 15:26:47 -0700230TEST_F(WiFiServiceTest, NonUTF8SSID) {
231 vector<uint8_t> ssid;
232
233 ssid.push_back(0xff); // not a valid UTF-8 byte-sequence
234 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
235 dispatcher(),
236 manager(),
237 wifi(),
238 ssid,
239 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800240 flimflam::kSecurityNone,
241 false);
mukesh agrawald835b202011-10-07 15:26:47 -0700242 map<string, ::DBus::Variant> properties;
243 // if service doesn't propertly sanitize SSID, this will generate SIGABRT.
244 DBusAdaptor::GetProperties(wifi_service->store(), &properties, NULL);
245}
246
Gaurav Shahda6218a2011-11-11 12:09:33 -0800247MATCHER(WPASecurityArgs, "") {
248 return ContainsKey(arg, wpa_supplicant::kPropertySecurityProtocol) &&
249 ContainsKey(arg, wpa_supplicant::kPropertyPreSharedKey);
250}
251
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700252TEST_F(WiFiServiceTest, ConnectTaskWPA) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800253 vector<uint8_t> ssid(5);
mukesh agrawal6e277772011-09-29 15:04:23 -0700254 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
255 dispatcher(),
256 manager(),
257 wifi(),
258 ssid,
259 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800260 flimflam::kSecurityWpa,
261 false);
mukesh agrawal6e277772011-09-29 15:04:23 -0700262 EXPECT_CALL(*wifi(),
263 ConnectTo(wifi_service.get(), WPASecurityArgs()));
264 wifi_service->ConnectTask();
265}
266
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700267TEST_F(WiFiServiceTest, ConnectTaskRSN) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800268 vector<uint8_t> ssid(5);
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700269 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
270 dispatcher(),
271 manager(),
272 wifi(),
273 ssid,
274 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800275 flimflam::kSecurityRsn,
276 false);
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700277 EXPECT_CALL(*wifi(),
278 ConnectTo(wifi_service.get(), WPASecurityArgs()));
279 wifi_service->ConnectTask();
280}
281
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800282TEST_F(WiFiServiceTest, ConnectTaskPSK) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800283 vector<uint8_t> ssid(5);
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800284 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
285 dispatcher(),
286 manager(),
287 wifi(),
288 ssid,
289 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800290 flimflam::kSecurityPsk,
291 false);
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800292 EXPECT_CALL(*wifi(),
293 ConnectTo(wifi_service.get(), WPASecurityArgs()));
294 wifi_service->ConnectTask();
295}
296
Thieu Lef4cbda92011-11-10 23:41:24 +0000297MATCHER(WEPSecurityArgsKeyIndex0, "") {
298 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
299 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("0")) &&
300 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
301 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
302 reader().get_uint32() == 0);
303}
304
305MATCHER(WEPSecurityArgsKeyIndex1, "") {
306 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
307 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("1")) &&
308 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
309 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
310 reader().get_uint32() == 1);
311}
312
313MATCHER(WEPSecurityArgsKeyIndex2, "") {
314 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
315 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("2")) &&
316 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
317 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
318 reader().get_uint32() == 2);
319}
320
321MATCHER(WEPSecurityArgsKeyIndex3, "") {
322 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
323 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("3")) &&
324 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
325 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
326 reader().get_uint32() == 3);
327}
328
329TEST_F(WiFiServiceTest, ConnectTaskWEP) {
330 vector<uint8_t> ssid(5);
331 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
332 dispatcher(),
333 manager(),
334 wifi(),
335 ssid,
336 flimflam::kModeManaged,
337 flimflam::kSecurityWep,
338 false);
339 Error error;
340 wifi_service->SetPassphrase("0:abcdefghijklm", &error);
341 EXPECT_CALL(*wifi(),
342 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex0()));
343 wifi_service->ConnectTask();
344
345 wifi_service->SetPassphrase("abcdefghijklm", &error);
346 EXPECT_CALL(*wifi(),
347 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex0()));
348 wifi_service->ConnectTask();
349
350 wifi_service->SetPassphrase("1:abcdefghijklm", &error);
351 EXPECT_CALL(*wifi(),
352 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex1()));
353 wifi_service->ConnectTask();
354
355 wifi_service->SetPassphrase("2:abcdefghijklm", &error);
356 EXPECT_CALL(*wifi(),
357 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex2()));
358 wifi_service->ConnectTask();
359
360 wifi_service->SetPassphrase("3:abcdefghijklm", &error);
361 EXPECT_CALL(*wifi(),
362 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex3()));
363 wifi_service->ConnectTask();
364}
365
Paul Stewartd08f4432011-11-04 07:48:20 -0700366TEST_F(WiFiServiceTest, LoadHidden) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800367 vector<uint8_t> ssid(5);
Paul Stewartd08f4432011-11-04 07:48:20 -0700368 ssid.push_back(0xff);
369
370 WiFiServiceRefPtr service = new WiFiService(control_interface(),
371 dispatcher(),
372 manager(),
373 wifi(),
374 ssid,
375 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800376 flimflam::kSecurityNone,
377 false);
Paul Stewartd08f4432011-11-04 07:48:20 -0700378 ASSERT_FALSE(service->hidden_ssid_);
379 NiceMock<MockStore> mock_store;
380 const string storage_id = service->GetStorageIdentifier();
381 EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
382 .WillRepeatedly(Return(true));
383 EXPECT_CALL(mock_store, GetBool(_, _, _))
384 .WillRepeatedly(Return(false));
385 EXPECT_CALL(mock_store,
386 GetBool(StrEq(storage_id), WiFiService::kStorageHiddenSSID, _))
387 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
388 EXPECT_TRUE(service->Load(&mock_store));
389 EXPECT_TRUE(service->hidden_ssid_);
390}
391
392TEST_F(WiFiServiceSecurityTest, WPAMapping) {
393 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityRsn,
394 flimflam::kSecurityPsk));
395 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityWpa,
396 flimflam::kSecurityPsk));
397 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityPsk,
398 flimflam::kSecurityPsk));
399 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityWep,
400 flimflam::kSecurityWep));
401 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityNone,
402 flimflam::kSecurityNone));
403 // TODO(pstew): 802.1x is in a NOTIMPLEMENTED block in wifi_service.cc
404 // EXPECT_TRUE(TestStorageMapping(flimflam::kSecurity8021x,
405 // flimflam::kSecurity8021x));
406}
407
408TEST_F(WiFiServiceSecurityTest, LoadMapping) {
409 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
410 flimflam::kSecurityPsk,
411 true));
412 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
413 flimflam::kSecurityRsn,
414 true));
415 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
416 flimflam::kSecurityWpa,
417 false));
418 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
419 flimflam::kSecurityPsk,
420 true));
421 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
422 flimflam::kSecurityWpa,
423 true));
424 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
425 flimflam::kSecurityRsn,
426 false));
427 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWep,
428 flimflam::kSecurityWep,
429 true));
430 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWep,
431 flimflam::kSecurityPsk,
432 false));
433}
434
Paul Stewartd8ad3c42012-01-09 12:39:38 -0800435TEST_F(WiFiServiceTest, LoadAndUnloadPassphrase) {
436 vector<uint8_t> ssid(5);
437 ssid.push_back(0xff);
438
439 WiFiServiceRefPtr service = new WiFiService(control_interface(),
440 dispatcher(),
441 manager(),
442 wifi(),
443 ssid,
444 flimflam::kModeManaged,
445 flimflam::kSecurityPsk,
446 false);
447 NiceMock<MockStore> mock_store;
448 const string storage_id = service->GetStorageIdentifier();
449 EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
450 .WillRepeatedly(Return(true));
451 EXPECT_CALL(mock_store, GetBool(_, _, _))
452 .WillRepeatedly(Return(false));
453 const string passphrase = "passphrase";
454 EXPECT_CALL(mock_store,
455 GetCryptedString(StrEq(storage_id),
456 WiFiService::kStoragePassphrase, _))
457 .WillRepeatedly(DoAll(SetArgumentPointee<2>(passphrase), Return(true)));
458 EXPECT_CALL(mock_store,
459 GetCryptedString(StrEq(storage_id),
460 StrNe(WiFiService::kStoragePassphrase), _))
461 .WillRepeatedly(Return(false));
462 EXPECT_TRUE(service->need_passphrase_);
463 EXPECT_TRUE(service->Load(&mock_store));
464 EXPECT_EQ(passphrase, service->passphrase_);
465 EXPECT_TRUE(service->connectable());
466 EXPECT_FALSE(service->need_passphrase_);
467 service->Unload();
468 EXPECT_EQ(string(""), service->passphrase_);
469 EXPECT_FALSE(service->connectable());
470 EXPECT_TRUE(service->need_passphrase_);
471}
472
Paul Stewarta41e38d2011-11-11 07:47:29 -0800473TEST_F(WiFiServiceTest, ParseStorageIdentifier) {
474 vector<uint8_t> ssid(5);
475 ssid.push_back(0xff);
476
477 WiFiServiceRefPtr service = new WiFiService(control_interface(),
478 dispatcher(),
479 manager(),
480 wifi(),
481 ssid,
482 flimflam::kModeManaged,
483 flimflam::kSecurityNone,
484 false);
485 const string storage_id = service->GetStorageIdentifier();
486 string address;
487 string mode;
488 string security;
489 EXPECT_TRUE(service->ParseStorageIdentifier(storage_id, &address, &mode,
490 &security));
491 EXPECT_EQ(StringToLowerASCII(string(fake_mac)), address);
492 EXPECT_EQ(flimflam::kModeManaged, mode);
493 EXPECT_EQ(flimflam::kSecurityNone, security);
494}
495
mukesh agrawal29c13a12011-11-24 00:09:19 +0000496TEST_F(WiFiServiceTest, Connectable) {
497 // Open network should be connectable.
498 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityNone, NULL));
499
500 // Open network should remain connectable if we try to set a password on it.
501 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityNone, "abcde"));
502
503 // WEP network with passphrase set should be connectable.
504 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityWep, "abcde"));
505
506 // WEP network without passphrase set should NOT be connectable.
507 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWep, NULL));
508
509 // A bad passphrase should not make a WEP network connectable.
510 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWep, "a"));
511
512 // Similar to WEP, for WPA.
513 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityWpa, "abcdefgh"));
514 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWpa, NULL));
515 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWpa, "a"));
516
517 // Unconfigured 802.1x should NOT be connectable.
518 EXPECT_FALSE(CheckConnectable(flimflam::kSecurity8021x, NULL));
519}
520
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000521TEST_F(WiFiServiceTest, IsAutoConnectable) {
522 vector<uint8_t> ssid(1, 'a');
523 WiFiServiceRefPtr service = new WiFiService(control_interface(),
524 dispatcher(),
525 manager(),
526 wifi(),
527 ssid,
528 flimflam::kModeManaged,
529 flimflam::kSecurityNone,
530 false);
531 EXPECT_CALL(*wifi(), IsIdle())
532 .WillRepeatedly(Return(true));
533 EXPECT_FALSE(service->HasEndpoints());
534 EXPECT_FALSE(service->IsAutoConnectable());
535
536 WiFiEndpointRefPtr endpoint = MakeEndpoint("a", "00:00:00:00:00:01");
537 service->AddEndpoint(endpoint);
538 EXPECT_CALL(*wifi(), IsIdle())
539 .WillRepeatedly(Return(true));
540 EXPECT_TRUE(service->HasEndpoints());
541 EXPECT_TRUE(service->IsAutoConnectable());
542
543 // WiFi only supports connecting to one Service at a time. So, to
544 // avoid disrupting connectivity, we only allow auto-connection to
545 // a WiFiService when the corresponding WiFi is idle.
546 EXPECT_CALL(*wifi(), IsIdle())
547 .WillRepeatedly(Return(false));
548 EXPECT_TRUE(service->HasEndpoints());
549 EXPECT_FALSE(service->IsAutoConnectable());
550}
551
552TEST_F(WiFiServiceTest, AutoConnect) {
553 vector<uint8_t> ssid(1, 'a');
554 WiFiServiceRefPtr service = new WiFiService(control_interface(),
555 dispatcher(),
556 manager(),
557 wifi(),
558 ssid,
559 flimflam::kModeManaged,
560 flimflam::kSecurityNone,
561 false);
562 EXPECT_FALSE(service->IsAutoConnectable());
563 EXPECT_CALL(*wifi(), ConnectTo(_, _))
564 .Times(0);
565 service->AutoConnect();
566
567 WiFiEndpointRefPtr endpoint = MakeEndpoint("a", "00:00:00:00:00:01");
568 service->AddEndpoint(endpoint);
569 EXPECT_CALL(*wifi(), IsIdle())
570 .WillRepeatedly(Return(true));
571 EXPECT_TRUE(service->IsAutoConnectable());
572 EXPECT_CALL(*wifi(), ConnectTo(_, _));
573 service->AutoConnect();
574}
575
Chris Masone34af2182011-08-22 11:59:36 -0700576} // namespace shill