blob: 2da6820ffe74cf2991981ae5094c432083db1f3d [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>
13#include <string>
14#include <vector>
15
mukesh agrawaldc42bb32011-07-28 10:40:26 -070016#include <base/memory/scoped_ptr.h>
mukesh agrawal31950242011-07-14 11:53:38 -070017#include <base/string_number_conversions.h>
18#include <base/string_util.h>
Chris Masone853b81b2011-06-24 14:11:41 -070019#include <chromeos/dbus/service_constants.h>
mukesh agrawal1830fa12011-09-26 14:31:40 -070020#include <dbus-c++/dbus.h>
Chris Masone7156c922011-08-23 20:36:21 -070021#include <gmock/gmock.h>
Chris Masone2ae797d2011-08-23 20:41:00 -070022#include <gtest/gtest.h>
Chris Masone853b81b2011-06-24 14:11:41 -070023
24#include "shill/dbus_adaptor.h"
mukesh agrawal8ede0522011-10-03 14:57:44 -070025#include "shill/ieee80211.h"
mukesh agrawal7a4e4002011-09-06 11:26:05 -070026#include "shill/key_value_store.h"
Chris Masone853b81b2011-06-24 14:11:41 -070027#include "shill/manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070028#include "shill/mock_device.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070029#include "shill/mock_dhcp_config.h"
30#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070031#include "shill/mock_manager.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070032#include "shill/mock_rtnl_handler.h"
mukesh agrawal31950242011-07-14 11:53:38 -070033#include "shill/mock_supplicant_interface_proxy.h"
34#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070035#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070036#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070037#include "shill/proxy_factory.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070038#include "shill/shill_event.h"
mukesh agrawal31950242011-07-14 11:53:38 -070039#include "shill/wifi_endpoint.h"
40#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070041#include "shill/wifi_service.h"
Chris Masone853b81b2011-06-24 14:11:41 -070042
43using std::map;
44using std::string;
45using std::vector;
46using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070047using ::testing::AnyNumber;
48using ::testing::DefaultValue;
49using ::testing::InSequence;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070050using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070051using ::testing::Return;
52using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070053using ::testing::Throw;
mukesh agrawal8ede0522011-10-03 14:57:44 -070054using ::testing::Values;
Chris Masone853b81b2011-06-24 14:11:41 -070055
56namespace shill {
57
mukesh agrawal31950242011-07-14 11:53:38 -070058class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070059 public:
mukesh agrawal31950242011-07-14 11:53:38 -070060 WiFiPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070061 : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070062 }
mukesh agrawal31950242011-07-14 11:53:38 -070063 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070064
65 protected:
66 DeviceRefPtr device_;
67};
68
mukesh agrawal31950242011-07-14 11:53:38 -070069TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070070 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
71 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070072}
73
mukesh agrawal31950242011-07-14 11:53:38 -070074TEST_F(WiFiPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070075 {
76 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070077 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070078 flimflam::kBgscanMethodProperty,
79 PropertyStoreTest::kStringV,
80 &error));
81 }
82 {
83 ::DBus::Error error;
84 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070085 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070086 flimflam::kBgscanSignalThresholdProperty,
87 PropertyStoreTest::kInt32V,
88 &error));
89 }
90 {
91 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070092 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070093 flimflam::kScanIntervalProperty,
94 PropertyStoreTest::kUint16V,
95 &error));
96 }
Chris Masone853b81b2011-06-24 14:11:41 -070097 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -070098 {
99 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -0700100 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -0700101 flimflam::kScanningProperty,
102 PropertyStoreTest::kBoolV,
103 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700104 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700105 }
Chris Masone853b81b2011-06-24 14:11:41 -0700106}
107
mukesh agrawal8ede0522011-10-03 14:57:44 -0700108class WiFiMainTest : public ::testing::TestWithParam<string> {
mukesh agrawal31950242011-07-14 11:53:38 -0700109 public:
110 WiFiMainTest()
111 : manager_(&control_interface_, NULL, NULL),
Chris Masone626719f2011-08-18 16:58:48 -0700112 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700113 &dispatcher_,
Chris Masone626719f2011-08-18 16:58:48 -0700114 &manager_,
115 kDeviceName,
116 kDeviceAddress,
117 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700118 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
119 supplicant_interface_proxy_(
120 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700121 dhcp_config_(new MockDHCPConfig(&control_interface_,
122 &dispatcher_,
123 &dhcp_provider_,
124 kDeviceName,
125 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700126 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700127 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
128 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700129
130 virtual void SetUp() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700131 wifi_->proxy_factory_ = &proxy_factory_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700132 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
133 wifi_->set_dhcp_provider(&dhcp_provider_);
134 }
135
136 virtual void TearDown() {
Darin Petkovab565bb2011-10-06 02:55:51 -0700137 wifi_->proxy_factory_ = NULL;
mukesh agrawal31950242011-07-14 11:53:38 -0700138 // must Stop WiFi instance, to clear its list of services.
139 // otherwise, the WiFi instance will not be deleted. (because
140 // services reference a WiFi instance, creating a cycle.)
141 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700142 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700143 }
144
mukesh agrawal31950242011-07-14 11:53:38 -0700145 protected:
146 class TestProxyFactory : public ProxyFactory {
147 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700148 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700149
150 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700151 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700152 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700153 }
154
155 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700156 const WiFiRefPtr &/*wifi*/,
157 const DBus::Path &/*object_path*/,
158 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700159 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700160 }
161
162 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700163 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700164 };
165
166 const WiFi::EndpointMap &GetEndpointMap() {
167 return wifi_->endpoint_by_bssid_;
168 }
169 const WiFi::ServiceMap &GetServiceMap() {
170 return wifi_->service_by_private_id_;
171 }
172 // note: the tests need the proxies referenced by WiFi (not the
173 // proxies instantiated by WiFiMainTest), to ensure that WiFi
174 // sets up its proxies correctly.
175 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
176 return wifi_->supplicant_process_proxy_.get();
177 }
178 SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
179 return wifi_->supplicant_interface_proxy_.get();
180 }
mukesh agrawal32399322011-09-01 10:53:43 -0700181 void InitiateConnect(WiFiService *service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700182 map<string, ::DBus::Variant> params;
183 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700184 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700185 bool IsLinkUp() {
186 return wifi_->link_up_;
187 }
mukesh agrawal31950242011-07-14 11:53:38 -0700188 void ReportBSS(const ::DBus::Path &bss_path,
189 const string &ssid,
190 const string &bssid,
191 int16_t signal_strength,
192 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700193 void ReportLinkUp() {
194 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
195 }
mukesh agrawal31950242011-07-14 11:53:38 -0700196 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700197 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700198 }
199 void StartWiFi() {
200 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700201 }
202 void StopWiFi() {
203 wifi_->Stop();
204 }
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700205 void GetOpenService(const char *service_type,
206 const char *ssid,
207 const char *mode,
208 Error &result) {
209 return GetService(service_type, ssid, mode, NULL, NULL, result);
210 }
211 void GetService(const char *service_type,
212 const char *ssid,
213 const char *mode,
214 const char *security,
215 const char *passphrase,
216 Error &result) {
217 map<string, ::DBus::Variant> args;
218 Error e;
219 KeyValueStore args_kv;
220
221 // in general, we want to avoid D-Bus specific code for any RPCs
222 // that come in via adaptors. we make an exception here, because
223 // calls to GetWifiService are rerouted from the Manager object to
224 // the Wifi class.
225 if (service_type != NULL)
226 args[flimflam::kTypeProperty].writer().append_string(service_type);
227 if (ssid != NULL)
228 args[flimflam::kSSIDProperty].writer().append_string(ssid);
229 if (mode != NULL)
230 args[flimflam::kModeProperty].writer().append_string(mode);
231 if (security != NULL)
232 args[flimflam::kSecurityProperty].writer().append_string(security);
233 if (passphrase != NULL)
234 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
235
236 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
237 wifi_->GetService(args_kv, &result);
238 }
mukesh agrawal32399322011-09-01 10:53:43 -0700239 MockManager *manager() {
240 return &manager_;
241 }
242 const WiFiConstRefPtr wifi() const {
243 return wifi_;
244 }
245
246 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700247 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700248
249 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700250 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700251 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700252 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700253 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700254
255 // protected fields interspersed between private fields, due to
256 // initialization order
257 protected:
258 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700259 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700260 static const char kNetworkModeAdHoc[];
261 static const char kNetworkModeInfrastructure[];
262
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700263 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
264 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700265 MockDHCPProvider dhcp_provider_;
266 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700267
268 private:
269 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700270};
271
272const char WiFiMainTest::kDeviceName[] = "wlan0";
Chris Masone626719f2011-08-18 16:58:48 -0700273const char WiFiMainTest::kDeviceAddress[] = "00:01:02:03:04:05";
mukesh agrawal31950242011-07-14 11:53:38 -0700274const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
275const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
276
277void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
278 const string &ssid,
279 const string &bssid,
280 int16_t signal_strength,
281 const char *mode) {
282 map<string, ::DBus::Variant> bss_properties;
283
284 {
285 DBus::MessageIter writer(bss_properties["SSID"].writer());
286 writer << vector<uint8_t>(ssid.begin(), ssid.end());
287 }
288 {
289 string bssid_nosep;
290 vector<uint8_t> bssid_bytes;
291 RemoveChars(bssid, ":", &bssid_nosep);
292 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
293
294 DBus::MessageIter writer(bss_properties["BSSID"].writer());
295 writer << bssid_bytes;
296 }
297 bss_properties["Signal"].writer().append_int16(signal_strength);
298 bss_properties["Mode"].writer().append_string(mode);
299 wifi_->BSSAdded(bss_path, bss_properties);
300}
301
302TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
303 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
304 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
305
306 StartWiFi();
307 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
308 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
309}
310
311TEST_F(WiFiMainTest, CleanStart) {
312 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
313 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
314 .Times(AnyNumber())
315 .WillRepeatedly(Throw(
316 DBus::Error(
317 "fi.w1.wpa_supplicant1.InterfaceUnknown",
318 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
319 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
320 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700321 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700322}
323
324TEST_F(WiFiMainTest, Restart) {
325 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
326 .Times(AnyNumber())
327 .WillRepeatedly(Throw(
328 DBus::Error(
329 "fi.w1.wpa_supplicant1.InterfaceExists",
330 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
331 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
332 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
333 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700334 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700335}
336
337TEST_F(WiFiMainTest, StartClearsState) {
338 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
339 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
340 StartWiFi();
341}
342
343TEST_F(WiFiMainTest, ScanResults) {
344 StartWiFi();
345 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
346 ReportBSS(
347 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
348 ReportBSS(
349 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
350 ReportBSS(
351 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
352 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
353 EXPECT_EQ(5, GetEndpointMap().size());
354}
355
356TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
357 StartWiFi();
358 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
359 ReportBSS(
360 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
361 ReportBSS(
362 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
363 ReportBSS(
364 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
365 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
366 EXPECT_EQ(3, GetEndpointMap().size());
367 ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000"));
368 EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second->
369 signal_strength());
370}
371
372TEST_F(WiFiMainTest, ScanCompleted) {
373 StartWiFi();
374 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
375 ReportBSS(
376 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
377 ReportBSS(
378 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
mukesh agrawal32399322011-09-01 10:53:43 -0700379 EXPECT_CALL(*manager(), RegisterService(_))
380 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700381 ReportScanDone();
382 EXPECT_EQ(3, GetServiceMap().size());
383}
384
385TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700386 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
387 *supplicant_interface_proxy_;
388
mukesh agrawal31950242011-07-14 11:53:38 -0700389 StartWiFi();
390 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
391 ReportScanDone();
392
393 {
394 InSequence s;
395 DBus::Path fake_path("/fake/path");
mukesh agrawal32399322011-09-01 10:53:43 -0700396 WiFiService *service(GetServiceMap().begin()->second);
mukesh agrawal31950242011-07-14 11:53:38 -0700397
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700398 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700399 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700400 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700401 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700402 EXPECT_EQ(static_cast<Service *>(service),
403 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700404 }
405}
406
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700407TEST_F(WiFiMainTest, LinkEvent) {
408 EXPECT_FALSE(IsLinkUp());
409 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
410 WillOnce(Return(dhcp_config_));
411 ReportLinkUp();
412}
413
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700414TEST_F(WiFiMainTest, Stop) {
415 {
416 InSequence s;
417
418 StartWiFi();
419 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
420 ReportScanDone();
421 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
422 WillOnce(Return(dhcp_config_));
423 ReportLinkUp();
424 }
425
426 {
427 EXPECT_CALL(*manager(), DeregisterService(_));
428 StopWiFi();
429 }
430}
431
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700432TEST_F(WiFiMainTest, GetWifiServiceOpen) {
433 Error e;
434 GetOpenService("wifi", "an_ssid", "managed", e);
435 EXPECT_TRUE(e.IsSuccess());
436}
437
438TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
439 Error e;
440 GetOpenService(NULL, "an_ssid", "managed", e);
441 EXPECT_EQ(Error::kInvalidArguments, e.type());
442 EXPECT_EQ("must specify service type", e.message());
443}
444
445TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
446 Error e;
447 GetOpenService("wifi", NULL, "managed", e);
448 EXPECT_EQ(Error::kInvalidArguments, e.type());
449 EXPECT_EQ("must specify SSID", e.message());
450}
451
452TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
453 Error e;
454 GetOpenService(
455 "wifi", "123456789012345678901234567890123", "managed", e);
456 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
457 EXPECT_EQ("SSID is too long", e.message());
458}
459
460TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
461 Error e;
462 GetOpenService("wifi", "", "managed", e);
463 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
464 EXPECT_EQ("SSID is too short", e.message());
465}
466
467TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
468 Error e;
469 GetOpenService("wifi", "an_ssid", "ad-hoc", e);
470 EXPECT_EQ(Error::kNotSupported, e.type());
471 EXPECT_EQ("service mode is unsupported", e.message());
472}
473
474TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
475 Error e;
476 GetOpenService("wifi", "an_ssid", NULL, e);
477 EXPECT_TRUE(e.IsSuccess());
478}
479
480TEST_F(WiFiMainTest, GetWifiServiceRSN) {
481 Error e;
482 GetService("wifi", "an_ssid", "managed", "rsn", "secure password", e);
483 EXPECT_TRUE(e.IsSuccess());
484}
485
486TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
487 Error e;
488 GetService("wifi", "an_ssid", "managed", "rsn", NULL, e);
489 EXPECT_EQ(Error::kInvalidArguments, e.type());
490 EXPECT_EQ("must specify passphrase", e.message());
491}
492
493TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
494 Error e;
495 GetService("wifi", "an_ssid", "managed", "rot-13", NULL, e);
496 EXPECT_EQ(Error::kNotSupported, e.type());
497 EXPECT_EQ("security mode is unsupported", e.message());
498}
499
500TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
501 Error e;
502 GetService("wifi", "an_ssid", "managed", "wep", NULL, e);
503 EXPECT_EQ(Error::kInvalidArguments, e.type());
504 EXPECT_EQ("must specify passphrase", e.message());
505}
506
507TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
508 Error e;
509 GetService("wifi", "an_ssid", "managed", "wep", "", e);
510 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
511}
512
513TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
514 Error e;
515 GetService("wifi", "an_ssid", "managed", "wep", "abcde", e);
516 EXPECT_TRUE(e.IsSuccess());
517}
518
519TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
520 Error e;
521 GetService("wifi", "an_ssid", "managed", "wep", "abcdefghijklm", e);
522 EXPECT_TRUE(e.IsSuccess());
523}
524
525TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
526 Error e;
527 GetService("wifi", "an_ssid", "managed", "wep", "0:abcdefghijklm", e);
528 EXPECT_TRUE(e.IsSuccess());
529}
530
531TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
532 Error e;
533 GetService("wifi", "an_ssid", "managed", "wep", "0102030405", e);
534 EXPECT_TRUE(e.IsSuccess());
535}
536
537TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
538 Error e;
539 GetService("wifi", "an_ssid", "managed", "wep", "O102030405", e);
540 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
541}
542
543TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
544 Error e;
545 GetService("wifi", "an_ssid", "managed", "wep", "1:O102030405", e);
546 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
547}
548
549TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
550 Error e;
551 GetService("wifi", "an_ssid", "managed", "wep", "1:0xO102030405", e);
552 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
553}
554
555TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
556 Error e;
557 GetService("wifi", "an_ssid", "managed", "wep", "0xO102030405", e);
558 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
559}
560
561TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
562 Error e;
563 GetService("wifi", "an_ssid", "managed", "wep",
564 "0102030405060708090a0b0c0d", e);
565 EXPECT_TRUE(e.IsSuccess());
566}
567
568TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
569 Error e;
570 GetService("wifi", "an_ssid", "managed", "wep",
571 "0102030405060708090A0B0C0D", e);
572 EXPECT_TRUE(e.IsSuccess());
573}
574
575TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
576 Error e;
577 GetService("wifi", "an_ssid", "managed", "wep",
578 "0:0102030405060708090a0b0c0d", e);
579 EXPECT_TRUE(e.IsSuccess());
580}
581
582TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
583 Error e;
584 GetService("wifi", "an_ssid", "managed", "wep",
585 "0:0x0102030405060708090a0b0c0d", e);
586 EXPECT_TRUE(e.IsSuccess());
587}
588
mukesh agrawal8ede0522011-10-03 14:57:44 -0700589class WiFiGetServiceSuccessTest : public WiFiMainTest {};
590class WiFiGetServiceFailureTest : public WiFiMainTest {};
591
592TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
593 Error e;
594 GetService("wifi", "an_ssid", "managed", "wpa", GetParam().c_str(), e);
595 EXPECT_TRUE(e.IsSuccess());
596}
597
598TEST_P(WiFiGetServiceFailureTest, Passphrase) {
599 Error e;
600 GetService("wifi", "an_ssid", "managed", "wpa", GetParam().c_str(), e);
601 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
602}
603
604INSTANTIATE_TEST_CASE_P(
605 WiFiGetServiceSuccessTestInstance,
606 WiFiGetServiceSuccessTest,
607 Values(
608 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
609 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
610 // subtle: invalid length for hex key, but valid as ascii passphrase
611 string(IEEE_80211::kWPAHexLen-1, '1'),
612 string(IEEE_80211::kWPAHexLen, '1')));
613
614INSTANTIATE_TEST_CASE_P(
615 WiFiGetServiceFailureTestInstance,
616 WiFiGetServiceFailureTest,
617 Values(
618 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
619 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
620 string(IEEE_80211::kWPAHexLen+1, '1')));
621
Chris Masone853b81b2011-06-24 14:11:41 -0700622} // namespace shill