blob: 7254bd07603e2e2af57a3ef1aa9ca5225c1d10d3 [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;
Chris Masone34af2182011-08-22 11:59:36 -070039
40class WiFiServiceTest : public PropertyStoreTest {
41 public:
mukesh agrawal6e277772011-09-29 15:04:23 -070042 WiFiServiceTest() : wifi_(
43 new NiceMock<MockWiFi>(
44 control_interface(),
45 dispatcher(),
46 manager(),
47 "wifi",
48 fake_mac,
49 0)) {}
Chris Masone34af2182011-08-22 11:59:36 -070050 virtual ~WiFiServiceTest() {}
mukesh agrawal6e277772011-09-29 15:04:23 -070051
52 protected:
53 static const char fake_mac[];
mukesh agrawal29c13a12011-11-24 00:09:19 +000054 bool CheckConnectable(const std::string &security, const char *passphrase) {
55 Error error;
56 vector<uint8_t> ssid(1, 'a');
57 WiFiServiceRefPtr service = new WiFiService(control_interface(),
58 dispatcher(),
59 manager(),
60 wifi(),
61 ssid,
62 flimflam::kModeManaged,
63 security,
64 false);
65 if (passphrase)
66 service->SetPassphrase(passphrase, &error);
67 return service->connectable();
68 }
mukesh agrawal8a3188d2011-12-01 20:56:44 +000069 WiFiEndpoint *MakeEndpoint(const string &ssid, const string &bssid) {
70 return WiFiEndpoint::MakeOpenEndpoint(ssid, bssid);
71 }
mukesh agrawal6e277772011-09-29 15:04:23 -070072 scoped_refptr<MockWiFi> wifi() { return wifi_; }
73
74 private:
75 scoped_refptr<MockWiFi> wifi_;
Chris Masone34af2182011-08-22 11:59:36 -070076};
77
mukesh agrawal6e277772011-09-29 15:04:23 -070078// static
79const char WiFiServiceTest::fake_mac[] = "AaBBcCDDeeFF";
80
Paul Stewartd08f4432011-11-04 07:48:20 -070081class WiFiServiceSecurityTest : public WiFiServiceTest {
82 public:
83 WiFiServiceRefPtr CreateServiceWithSecurity(const string &security) {
Gaurav Shahda6218a2011-11-11 12:09:33 -080084 vector<uint8_t> ssid(5);
Paul Stewartd08f4432011-11-04 07:48:20 -070085 ssid.push_back(0xff);
86
87 return new WiFiService(control_interface(),
88 dispatcher(),
89 manager(),
90 wifi(),
91 ssid,
92 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -080093 security,
94 false);
Paul Stewartd08f4432011-11-04 07:48:20 -070095 }
96
97 bool TestStorageSecurityIs(WiFiServiceRefPtr wifi_service,
98 const string &security) {
99 string id = wifi_service->GetStorageIdentifier();
100 size_t mac_pos = id.find(StringToLowerASCII(string(fake_mac)));
101 EXPECT_NE(mac_pos, string::npos);
102 size_t mode_pos = id.find(string(flimflam::kModeManaged), mac_pos);
103 EXPECT_NE(mode_pos, string::npos);
104 return id.find(string(security), mode_pos) != string::npos;
105 }
106
107 // Test that a service that is created with security |from_security|
108 // gets by default a storage identifier with |to_security| as its
109 // security component.
110 bool TestStorageMapping(const string &from_security,
111 const string &to_security) {
112 WiFiServiceRefPtr wifi_service = CreateServiceWithSecurity(from_security);
113 return TestStorageSecurityIs(wifi_service, to_security);
114 }
115
116 // Test whether a service of type |service_security| can load from a
117 // storage interface containing an entry for |storage_security|.
118 // Make sure the result meets |expectation|. If |expectation| is
119 // true, also make sure the service storage identifier changes to
120 // match |storage_security|.
121 bool TestLoadMapping(const string &service_security,
122 const string &storage_security,
123 bool expectation) {
124 WiFiServiceRefPtr wifi_service =
125 CreateServiceWithSecurity(service_security);
126 NiceMock<MockStore> mock_store;
127 const string storage_id =
128 wifi_service->GetStorageIdentifierForSecurity(storage_security);
129 EXPECT_CALL(mock_store, ContainsGroup(_))
130 .WillRepeatedly(Return(false));
131 EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
132 .WillRepeatedly(Return(true));
133 bool is_loadable = wifi_service->IsLoadableFrom(&mock_store);
134 EXPECT_EQ(expectation, is_loadable);
135 bool is_loaded = wifi_service->Load(&mock_store);
136 EXPECT_EQ(expectation, is_loaded);
137
138 if (expectation != is_loadable || expectation != is_loaded) {
139 return false;
140 } else if (!expectation) {
141 return true;
142 } else {
143 return TestStorageSecurityIs(wifi_service, storage_security);
144 }
145 }
146};
147
Chris Masone34af2182011-08-22 11:59:36 -0700148TEST_F(WiFiServiceTest, StorageId) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800149 vector<uint8_t> ssid(5);
Chris Masone34af2182011-08-22 11:59:36 -0700150 ssid.push_back(0xff);
Chris Masone9d779932011-08-25 16:33:41 -0700151
Chris Masone2176a882011-09-14 22:29:15 -0700152 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
153 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -0700154 manager(),
mukesh agrawal6e277772011-09-29 15:04:23 -0700155 wifi(),
Chris Masone9d779932011-08-25 16:33:41 -0700156 ssid,
157 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800158 flimflam::kSecurityNone,
159 false);
Chris Masone9d779932011-08-25 16:33:41 -0700160 string id = wifi_service->GetStorageIdentifier();
Chris Masone34af2182011-08-22 11:59:36 -0700161 for (uint i = 0; i < id.length(); ++i) {
162 EXPECT_TRUE(id[i] == '_' ||
163 isxdigit(id[i]) ||
164 (isalpha(id[i]) && islower(id[i])));
165 }
Paul Stewart22aa71b2011-09-16 12:15:11 -0700166 EXPECT_TRUE(wifi_service->TechnologyIs(Technology::kWifi));
Chris Masone34af2182011-08-22 11:59:36 -0700167 size_t mac_pos = id.find(StringToLowerASCII(string(fake_mac)));
168 EXPECT_NE(mac_pos, string::npos);
169 EXPECT_NE(id.find(string(flimflam::kModeManaged), mac_pos), string::npos);
170}
171
Gaurav Shahda6218a2011-11-11 12:09:33 -0800172// Make sure the passphrase is registered as a write only property
173// by reading and comparing all string properties returned on the store.
174TEST_F(WiFiServiceTest, PassphraseWriteOnly) {
175 vector<uint8_t> ssid(5);
176 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
177 dispatcher(),
178 manager(),
179 wifi(),
180 ssid,
181 flimflam::kModeManaged,
182 flimflam::kSecurityWpa,
183 false);
184 ReadablePropertyConstIterator<string> it =
185 (wifi_service->store()).GetStringPropertiesIter();
186 for( ; !it.AtEnd(); it.Advance())
187 EXPECT_NE(it.Key(), flimflam::kPassphraseProperty);
188}
189
Thieu Lef7709452011-11-15 01:13:19 +0000190// Make sure setting the passphrase via D-Bus Service.SetProperty validates
191// the passphrase.
192TEST_F(WiFiServiceTest, PassphraseSetPropertyValidation) {
193 // We only spot check two password cases here to make sure the
194 // SetProperty code path does validation. We're not going to exhaustively
195 // test for all types of passwords.
196 vector<uint8_t> ssid(5);
197 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
198 dispatcher(),
199 manager(),
200 wifi(),
201 ssid,
202 flimflam::kModeManaged,
203 flimflam::kSecurityWep,
204 false);
205 Error error;
206 EXPECT_TRUE(wifi_service->mutable_store()->SetStringProperty(
207 flimflam::kPassphraseProperty, "0:abcde", &error));
208 EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
209 flimflam::kPassphraseProperty, "invalid", &error));
210 EXPECT_EQ(Error::kInvalidPassphrase, error.type());
211}
212
213TEST_F(WiFiServiceTest, PassphraseSetPropertyOpenNetwork) {
214 vector<uint8_t> ssid(5);
215 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
216 dispatcher(),
217 manager(),
218 wifi(),
219 ssid,
220 flimflam::kModeManaged,
221 flimflam::kSecurityNone,
222 false);
223 Error error;
224 EXPECT_FALSE(wifi_service->mutable_store()->SetStringProperty(
225 flimflam::kPassphraseProperty, "invalid", &error));
226 EXPECT_EQ(Error::kNotSupported, error.type());
227}
228
mukesh agrawald835b202011-10-07 15:26:47 -0700229TEST_F(WiFiServiceTest, NonUTF8SSID) {
230 vector<uint8_t> ssid;
231
232 ssid.push_back(0xff); // not a valid UTF-8 byte-sequence
233 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
234 dispatcher(),
235 manager(),
236 wifi(),
237 ssid,
238 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800239 flimflam::kSecurityNone,
240 false);
mukesh agrawald835b202011-10-07 15:26:47 -0700241 map<string, ::DBus::Variant> properties;
242 // if service doesn't propertly sanitize SSID, this will generate SIGABRT.
243 DBusAdaptor::GetProperties(wifi_service->store(), &properties, NULL);
244}
245
Gaurav Shahda6218a2011-11-11 12:09:33 -0800246MATCHER(WPASecurityArgs, "") {
247 return ContainsKey(arg, wpa_supplicant::kPropertySecurityProtocol) &&
248 ContainsKey(arg, wpa_supplicant::kPropertyPreSharedKey);
249}
250
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700251TEST_F(WiFiServiceTest, ConnectTaskWPA) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800252 vector<uint8_t> ssid(5);
mukesh agrawal6e277772011-09-29 15:04:23 -0700253 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
254 dispatcher(),
255 manager(),
256 wifi(),
257 ssid,
258 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800259 flimflam::kSecurityWpa,
260 false);
mukesh agrawal6e277772011-09-29 15:04:23 -0700261 EXPECT_CALL(*wifi(),
262 ConnectTo(wifi_service.get(), WPASecurityArgs()));
263 wifi_service->ConnectTask();
264}
265
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700266TEST_F(WiFiServiceTest, ConnectTaskRSN) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800267 vector<uint8_t> ssid(5);
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700268 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
269 dispatcher(),
270 manager(),
271 wifi(),
272 ssid,
273 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800274 flimflam::kSecurityRsn,
275 false);
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700276 EXPECT_CALL(*wifi(),
277 ConnectTo(wifi_service.get(), WPASecurityArgs()));
278 wifi_service->ConnectTask();
279}
280
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800281TEST_F(WiFiServiceTest, ConnectTaskPSK) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800282 vector<uint8_t> ssid(5);
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800283 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
284 dispatcher(),
285 manager(),
286 wifi(),
287 ssid,
288 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800289 flimflam::kSecurityPsk,
290 false);
Gaurav Shahf8721ee2011-11-07 09:12:46 -0800291 EXPECT_CALL(*wifi(),
292 ConnectTo(wifi_service.get(), WPASecurityArgs()));
293 wifi_service->ConnectTask();
294}
295
Thieu Lef4cbda92011-11-10 23:41:24 +0000296MATCHER(WEPSecurityArgsKeyIndex0, "") {
297 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
298 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("0")) &&
299 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
300 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
301 reader().get_uint32() == 0);
302}
303
304MATCHER(WEPSecurityArgsKeyIndex1, "") {
305 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
306 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("1")) &&
307 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
308 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
309 reader().get_uint32() == 1);
310}
311
312MATCHER(WEPSecurityArgsKeyIndex2, "") {
313 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
314 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("2")) &&
315 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
316 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
317 reader().get_uint32() == 2);
318}
319
320MATCHER(WEPSecurityArgsKeyIndex3, "") {
321 return ContainsKey(arg, wpa_supplicant::kPropertyAuthAlg) &&
322 ContainsKey(arg, wpa_supplicant::kPropertyWEPKey + std::string("3")) &&
323 ContainsKey(arg, wpa_supplicant::kPropertyWEPTxKeyIndex) &&
324 (arg.find(wpa_supplicant::kPropertyWEPTxKeyIndex)->second.
325 reader().get_uint32() == 3);
326}
327
328TEST_F(WiFiServiceTest, ConnectTaskWEP) {
329 vector<uint8_t> ssid(5);
330 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
331 dispatcher(),
332 manager(),
333 wifi(),
334 ssid,
335 flimflam::kModeManaged,
336 flimflam::kSecurityWep,
337 false);
338 Error error;
339 wifi_service->SetPassphrase("0:abcdefghijklm", &error);
340 EXPECT_CALL(*wifi(),
341 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex0()));
342 wifi_service->ConnectTask();
343
344 wifi_service->SetPassphrase("abcdefghijklm", &error);
345 EXPECT_CALL(*wifi(),
346 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex0()));
347 wifi_service->ConnectTask();
348
349 wifi_service->SetPassphrase("1:abcdefghijklm", &error);
350 EXPECT_CALL(*wifi(),
351 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex1()));
352 wifi_service->ConnectTask();
353
354 wifi_service->SetPassphrase("2:abcdefghijklm", &error);
355 EXPECT_CALL(*wifi(),
356 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex2()));
357 wifi_service->ConnectTask();
358
359 wifi_service->SetPassphrase("3:abcdefghijklm", &error);
360 EXPECT_CALL(*wifi(),
361 ConnectTo(wifi_service.get(), WEPSecurityArgsKeyIndex3()));
362 wifi_service->ConnectTask();
363}
364
Paul Stewartd08f4432011-11-04 07:48:20 -0700365TEST_F(WiFiServiceTest, LoadHidden) {
Gaurav Shahda6218a2011-11-11 12:09:33 -0800366 vector<uint8_t> ssid(5);
Paul Stewartd08f4432011-11-04 07:48:20 -0700367 ssid.push_back(0xff);
368
369 WiFiServiceRefPtr service = new WiFiService(control_interface(),
370 dispatcher(),
371 manager(),
372 wifi(),
373 ssid,
374 flimflam::kModeManaged,
Paul Stewartced6a0b2011-11-08 15:32:04 -0800375 flimflam::kSecurityNone,
376 false);
Paul Stewartd08f4432011-11-04 07:48:20 -0700377 ASSERT_FALSE(service->hidden_ssid_);
378 NiceMock<MockStore> mock_store;
379 const string storage_id = service->GetStorageIdentifier();
380 EXPECT_CALL(mock_store, ContainsGroup(StrEq(storage_id)))
381 .WillRepeatedly(Return(true));
382 EXPECT_CALL(mock_store, GetBool(_, _, _))
383 .WillRepeatedly(Return(false));
384 EXPECT_CALL(mock_store,
385 GetBool(StrEq(storage_id), WiFiService::kStorageHiddenSSID, _))
386 .WillRepeatedly(DoAll(SetArgumentPointee<2>(true), Return(true)));
387 EXPECT_TRUE(service->Load(&mock_store));
388 EXPECT_TRUE(service->hidden_ssid_);
389}
390
391TEST_F(WiFiServiceSecurityTest, WPAMapping) {
392 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityRsn,
393 flimflam::kSecurityPsk));
394 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityWpa,
395 flimflam::kSecurityPsk));
396 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityPsk,
397 flimflam::kSecurityPsk));
398 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityWep,
399 flimflam::kSecurityWep));
400 EXPECT_TRUE(TestStorageMapping(flimflam::kSecurityNone,
401 flimflam::kSecurityNone));
402 // TODO(pstew): 802.1x is in a NOTIMPLEMENTED block in wifi_service.cc
403 // EXPECT_TRUE(TestStorageMapping(flimflam::kSecurity8021x,
404 // flimflam::kSecurity8021x));
405}
406
407TEST_F(WiFiServiceSecurityTest, LoadMapping) {
408 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
409 flimflam::kSecurityPsk,
410 true));
411 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
412 flimflam::kSecurityRsn,
413 true));
414 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityRsn,
415 flimflam::kSecurityWpa,
416 false));
417 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
418 flimflam::kSecurityPsk,
419 true));
420 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
421 flimflam::kSecurityWpa,
422 true));
423 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWpa,
424 flimflam::kSecurityRsn,
425 false));
426 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWep,
427 flimflam::kSecurityWep,
428 true));
429 EXPECT_TRUE(TestLoadMapping(flimflam::kSecurityWep,
430 flimflam::kSecurityPsk,
431 false));
432}
433
Paul Stewarta41e38d2011-11-11 07:47:29 -0800434TEST_F(WiFiServiceTest, ParseStorageIdentifier) {
435 vector<uint8_t> ssid(5);
436 ssid.push_back(0xff);
437
438 WiFiServiceRefPtr service = new WiFiService(control_interface(),
439 dispatcher(),
440 manager(),
441 wifi(),
442 ssid,
443 flimflam::kModeManaged,
444 flimflam::kSecurityNone,
445 false);
446 const string storage_id = service->GetStorageIdentifier();
447 string address;
448 string mode;
449 string security;
450 EXPECT_TRUE(service->ParseStorageIdentifier(storage_id, &address, &mode,
451 &security));
452 EXPECT_EQ(StringToLowerASCII(string(fake_mac)), address);
453 EXPECT_EQ(flimflam::kModeManaged, mode);
454 EXPECT_EQ(flimflam::kSecurityNone, security);
455}
456
mukesh agrawal29c13a12011-11-24 00:09:19 +0000457TEST_F(WiFiServiceTest, Connectable) {
458 // Open network should be connectable.
459 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityNone, NULL));
460
461 // Open network should remain connectable if we try to set a password on it.
462 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityNone, "abcde"));
463
464 // WEP network with passphrase set should be connectable.
465 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityWep, "abcde"));
466
467 // WEP network without passphrase set should NOT be connectable.
468 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWep, NULL));
469
470 // A bad passphrase should not make a WEP network connectable.
471 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWep, "a"));
472
473 // Similar to WEP, for WPA.
474 EXPECT_TRUE(CheckConnectable(flimflam::kSecurityWpa, "abcdefgh"));
475 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWpa, NULL));
476 EXPECT_FALSE(CheckConnectable(flimflam::kSecurityWpa, "a"));
477
478 // Unconfigured 802.1x should NOT be connectable.
479 EXPECT_FALSE(CheckConnectable(flimflam::kSecurity8021x, NULL));
480}
481
mukesh agrawal8a3188d2011-12-01 20:56:44 +0000482TEST_F(WiFiServiceTest, IsAutoConnectable) {
483 vector<uint8_t> ssid(1, 'a');
484 WiFiServiceRefPtr service = new WiFiService(control_interface(),
485 dispatcher(),
486 manager(),
487 wifi(),
488 ssid,
489 flimflam::kModeManaged,
490 flimflam::kSecurityNone,
491 false);
492 EXPECT_CALL(*wifi(), IsIdle())
493 .WillRepeatedly(Return(true));
494 EXPECT_FALSE(service->HasEndpoints());
495 EXPECT_FALSE(service->IsAutoConnectable());
496
497 WiFiEndpointRefPtr endpoint = MakeEndpoint("a", "00:00:00:00:00:01");
498 service->AddEndpoint(endpoint);
499 EXPECT_CALL(*wifi(), IsIdle())
500 .WillRepeatedly(Return(true));
501 EXPECT_TRUE(service->HasEndpoints());
502 EXPECT_TRUE(service->IsAutoConnectable());
503
504 // WiFi only supports connecting to one Service at a time. So, to
505 // avoid disrupting connectivity, we only allow auto-connection to
506 // a WiFiService when the corresponding WiFi is idle.
507 EXPECT_CALL(*wifi(), IsIdle())
508 .WillRepeatedly(Return(false));
509 EXPECT_TRUE(service->HasEndpoints());
510 EXPECT_FALSE(service->IsAutoConnectable());
511}
512
513TEST_F(WiFiServiceTest, AutoConnect) {
514 vector<uint8_t> ssid(1, 'a');
515 WiFiServiceRefPtr service = new WiFiService(control_interface(),
516 dispatcher(),
517 manager(),
518 wifi(),
519 ssid,
520 flimflam::kModeManaged,
521 flimflam::kSecurityNone,
522 false);
523 EXPECT_FALSE(service->IsAutoConnectable());
524 EXPECT_CALL(*wifi(), ConnectTo(_, _))
525 .Times(0);
526 service->AutoConnect();
527
528 WiFiEndpointRefPtr endpoint = MakeEndpoint("a", "00:00:00:00:00:01");
529 service->AddEndpoint(endpoint);
530 EXPECT_CALL(*wifi(), IsIdle())
531 .WillRepeatedly(Return(true));
532 EXPECT_TRUE(service->IsAutoConnectable());
533 EXPECT_CALL(*wifi(), ConnectTo(_, _));
534 service->AutoConnect();
535}
536
Chris Masone34af2182011-08-22 11:59:36 -0700537} // namespace shill