blob: a3f3bdd391845703b0232765f303ea108033709d [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 ProxyFactory::set_factory(&proxy_factory_);
128 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
129 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700130
131 virtual void SetUp() {
132 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
133 wifi_->set_dhcp_provider(&dhcp_provider_);
134 }
135
136 virtual void TearDown() {
mukesh agrawal31950242011-07-14 11:53:38 -0700137 // must Stop WiFi instance, to clear its list of services.
138 // otherwise, the WiFi instance will not be deleted. (because
139 // services reference a WiFi instance, creating a cycle.)
140 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700141 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700142 }
143
mukesh agrawal31950242011-07-14 11:53:38 -0700144 protected:
145 class TestProxyFactory : public ProxyFactory {
146 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700147 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700148
149 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700150 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700151 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700152 }
153
154 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700155 const WiFiRefPtr &/*wifi*/,
156 const DBus::Path &/*object_path*/,
157 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700158 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700159 }
160
161 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700162 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700163 };
164
165 const WiFi::EndpointMap &GetEndpointMap() {
166 return wifi_->endpoint_by_bssid_;
167 }
168 const WiFi::ServiceMap &GetServiceMap() {
169 return wifi_->service_by_private_id_;
170 }
171 // note: the tests need the proxies referenced by WiFi (not the
172 // proxies instantiated by WiFiMainTest), to ensure that WiFi
173 // sets up its proxies correctly.
174 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
175 return wifi_->supplicant_process_proxy_.get();
176 }
177 SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
178 return wifi_->supplicant_interface_proxy_.get();
179 }
mukesh agrawal32399322011-09-01 10:53:43 -0700180 void InitiateConnect(WiFiService *service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700181 map<string, ::DBus::Variant> params;
182 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700183 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700184 bool IsLinkUp() {
185 return wifi_->link_up_;
186 }
mukesh agrawal31950242011-07-14 11:53:38 -0700187 void ReportBSS(const ::DBus::Path &bss_path,
188 const string &ssid,
189 const string &bssid,
190 int16_t signal_strength,
191 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700192 void ReportLinkUp() {
193 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
194 }
mukesh agrawal31950242011-07-14 11:53:38 -0700195 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700196 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700197 }
198 void StartWiFi() {
199 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700200 }
201 void StopWiFi() {
202 wifi_->Stop();
203 }
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700204 void GetOpenService(const char *service_type,
205 const char *ssid,
206 const char *mode,
207 Error &result) {
208 return GetService(service_type, ssid, mode, NULL, NULL, result);
209 }
210 void GetService(const char *service_type,
211 const char *ssid,
212 const char *mode,
213 const char *security,
214 const char *passphrase,
215 Error &result) {
216 map<string, ::DBus::Variant> args;
217 Error e;
218 KeyValueStore args_kv;
219
220 // in general, we want to avoid D-Bus specific code for any RPCs
221 // that come in via adaptors. we make an exception here, because
222 // calls to GetWifiService are rerouted from the Manager object to
223 // the Wifi class.
224 if (service_type != NULL)
225 args[flimflam::kTypeProperty].writer().append_string(service_type);
226 if (ssid != NULL)
227 args[flimflam::kSSIDProperty].writer().append_string(ssid);
228 if (mode != NULL)
229 args[flimflam::kModeProperty].writer().append_string(mode);
230 if (security != NULL)
231 args[flimflam::kSecurityProperty].writer().append_string(security);
232 if (passphrase != NULL)
233 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
234
235 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
236 wifi_->GetService(args_kv, &result);
237 }
mukesh agrawal32399322011-09-01 10:53:43 -0700238 MockManager *manager() {
239 return &manager_;
240 }
241 const WiFiConstRefPtr wifi() const {
242 return wifi_;
243 }
244
245 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700246 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700247
248 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700249 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700250 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700251 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700252 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700253
254 // protected fields interspersed between private fields, due to
255 // initialization order
256 protected:
257 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700258 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700259 static const char kNetworkModeAdHoc[];
260 static const char kNetworkModeInfrastructure[];
261
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700262 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
263 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700264 MockDHCPProvider dhcp_provider_;
265 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700266
267 private:
268 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700269};
270
271const char WiFiMainTest::kDeviceName[] = "wlan0";
Chris Masone626719f2011-08-18 16:58:48 -0700272const char WiFiMainTest::kDeviceAddress[] = "00:01:02:03:04:05";
mukesh agrawal31950242011-07-14 11:53:38 -0700273const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
274const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
275
276void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
277 const string &ssid,
278 const string &bssid,
279 int16_t signal_strength,
280 const char *mode) {
281 map<string, ::DBus::Variant> bss_properties;
282
283 {
284 DBus::MessageIter writer(bss_properties["SSID"].writer());
285 writer << vector<uint8_t>(ssid.begin(), ssid.end());
286 }
287 {
288 string bssid_nosep;
289 vector<uint8_t> bssid_bytes;
290 RemoveChars(bssid, ":", &bssid_nosep);
291 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
292
293 DBus::MessageIter writer(bss_properties["BSSID"].writer());
294 writer << bssid_bytes;
295 }
296 bss_properties["Signal"].writer().append_int16(signal_strength);
297 bss_properties["Mode"].writer().append_string(mode);
298 wifi_->BSSAdded(bss_path, bss_properties);
299}
300
301TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
302 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
303 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
304
305 StartWiFi();
306 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
307 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
308}
309
310TEST_F(WiFiMainTest, CleanStart) {
311 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
312 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
313 .Times(AnyNumber())
314 .WillRepeatedly(Throw(
315 DBus::Error(
316 "fi.w1.wpa_supplicant1.InterfaceUnknown",
317 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
318 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
319 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700320 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700321}
322
323TEST_F(WiFiMainTest, Restart) {
324 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
325 .Times(AnyNumber())
326 .WillRepeatedly(Throw(
327 DBus::Error(
328 "fi.w1.wpa_supplicant1.InterfaceExists",
329 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
330 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
331 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
332 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700333 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700334}
335
336TEST_F(WiFiMainTest, StartClearsState) {
337 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
338 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
339 StartWiFi();
340}
341
342TEST_F(WiFiMainTest, ScanResults) {
343 StartWiFi();
344 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
345 ReportBSS(
346 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
347 ReportBSS(
348 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
349 ReportBSS(
350 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
351 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
352 EXPECT_EQ(5, GetEndpointMap().size());
353}
354
355TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
356 StartWiFi();
357 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
358 ReportBSS(
359 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
360 ReportBSS(
361 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
362 ReportBSS(
363 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
364 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
365 EXPECT_EQ(3, GetEndpointMap().size());
366 ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000"));
367 EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second->
368 signal_strength());
369}
370
371TEST_F(WiFiMainTest, ScanCompleted) {
372 StartWiFi();
373 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
374 ReportBSS(
375 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
376 ReportBSS(
377 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
mukesh agrawal32399322011-09-01 10:53:43 -0700378 EXPECT_CALL(*manager(), RegisterService(_))
379 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700380 ReportScanDone();
381 EXPECT_EQ(3, GetServiceMap().size());
382}
383
384TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700385 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
386 *supplicant_interface_proxy_;
387
mukesh agrawal31950242011-07-14 11:53:38 -0700388 StartWiFi();
389 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
390 ReportScanDone();
391
392 {
393 InSequence s;
394 DBus::Path fake_path("/fake/path");
mukesh agrawal32399322011-09-01 10:53:43 -0700395 WiFiService *service(GetServiceMap().begin()->second);
mukesh agrawal31950242011-07-14 11:53:38 -0700396
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700397 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700398 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700399 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700400 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700401 EXPECT_EQ(static_cast<Service *>(service),
402 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700403 }
404}
405
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700406TEST_F(WiFiMainTest, LinkEvent) {
407 EXPECT_FALSE(IsLinkUp());
408 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
409 WillOnce(Return(dhcp_config_));
410 ReportLinkUp();
411}
412
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700413TEST_F(WiFiMainTest, Stop) {
414 {
415 InSequence s;
416
417 StartWiFi();
418 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
419 ReportScanDone();
420 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
421 WillOnce(Return(dhcp_config_));
422 ReportLinkUp();
423 }
424
425 {
426 EXPECT_CALL(*manager(), DeregisterService(_));
427 StopWiFi();
428 }
429}
430
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700431TEST_F(WiFiMainTest, GetWifiServiceOpen) {
432 Error e;
433 GetOpenService("wifi", "an_ssid", "managed", e);
434 EXPECT_TRUE(e.IsSuccess());
435}
436
437TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
438 Error e;
439 GetOpenService(NULL, "an_ssid", "managed", e);
440 EXPECT_EQ(Error::kInvalidArguments, e.type());
441 EXPECT_EQ("must specify service type", e.message());
442}
443
444TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
445 Error e;
446 GetOpenService("wifi", NULL, "managed", e);
447 EXPECT_EQ(Error::kInvalidArguments, e.type());
448 EXPECT_EQ("must specify SSID", e.message());
449}
450
451TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
452 Error e;
453 GetOpenService(
454 "wifi", "123456789012345678901234567890123", "managed", e);
455 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
456 EXPECT_EQ("SSID is too long", e.message());
457}
458
459TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
460 Error e;
461 GetOpenService("wifi", "", "managed", e);
462 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
463 EXPECT_EQ("SSID is too short", e.message());
464}
465
466TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
467 Error e;
468 GetOpenService("wifi", "an_ssid", "ad-hoc", e);
469 EXPECT_EQ(Error::kNotSupported, e.type());
470 EXPECT_EQ("service mode is unsupported", e.message());
471}
472
473TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
474 Error e;
475 GetOpenService("wifi", "an_ssid", NULL, e);
476 EXPECT_TRUE(e.IsSuccess());
477}
478
479TEST_F(WiFiMainTest, GetWifiServiceRSN) {
480 Error e;
481 GetService("wifi", "an_ssid", "managed", "rsn", "secure password", e);
482 EXPECT_TRUE(e.IsSuccess());
483}
484
485TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
486 Error e;
487 GetService("wifi", "an_ssid", "managed", "rsn", NULL, e);
488 EXPECT_EQ(Error::kInvalidArguments, e.type());
489 EXPECT_EQ("must specify passphrase", e.message());
490}
491
492TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
493 Error e;
494 GetService("wifi", "an_ssid", "managed", "rot-13", NULL, e);
495 EXPECT_EQ(Error::kNotSupported, e.type());
496 EXPECT_EQ("security mode is unsupported", e.message());
497}
498
499TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
500 Error e;
501 GetService("wifi", "an_ssid", "managed", "wep", NULL, e);
502 EXPECT_EQ(Error::kInvalidArguments, e.type());
503 EXPECT_EQ("must specify passphrase", e.message());
504}
505
506TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
507 Error e;
508 GetService("wifi", "an_ssid", "managed", "wep", "", e);
509 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
510}
511
512TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
513 Error e;
514 GetService("wifi", "an_ssid", "managed", "wep", "abcde", e);
515 EXPECT_TRUE(e.IsSuccess());
516}
517
518TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
519 Error e;
520 GetService("wifi", "an_ssid", "managed", "wep", "abcdefghijklm", e);
521 EXPECT_TRUE(e.IsSuccess());
522}
523
524TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
525 Error e;
526 GetService("wifi", "an_ssid", "managed", "wep", "0:abcdefghijklm", e);
527 EXPECT_TRUE(e.IsSuccess());
528}
529
530TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
531 Error e;
532 GetService("wifi", "an_ssid", "managed", "wep", "0102030405", e);
533 EXPECT_TRUE(e.IsSuccess());
534}
535
536TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
537 Error e;
538 GetService("wifi", "an_ssid", "managed", "wep", "O102030405", e);
539 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
540}
541
542TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
543 Error e;
544 GetService("wifi", "an_ssid", "managed", "wep", "1:O102030405", e);
545 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
546}
547
548TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
549 Error e;
550 GetService("wifi", "an_ssid", "managed", "wep", "1:0xO102030405", e);
551 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
552}
553
554TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
555 Error e;
556 GetService("wifi", "an_ssid", "managed", "wep", "0xO102030405", e);
557 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
558}
559
560TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
561 Error e;
562 GetService("wifi", "an_ssid", "managed", "wep",
563 "0102030405060708090a0b0c0d", e);
564 EXPECT_TRUE(e.IsSuccess());
565}
566
567TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
568 Error e;
569 GetService("wifi", "an_ssid", "managed", "wep",
570 "0102030405060708090A0B0C0D", e);
571 EXPECT_TRUE(e.IsSuccess());
572}
573
574TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
575 Error e;
576 GetService("wifi", "an_ssid", "managed", "wep",
577 "0:0102030405060708090a0b0c0d", e);
578 EXPECT_TRUE(e.IsSuccess());
579}
580
581TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
582 Error e;
583 GetService("wifi", "an_ssid", "managed", "wep",
584 "0:0x0102030405060708090a0b0c0d", e);
585 EXPECT_TRUE(e.IsSuccess());
586}
587
mukesh agrawal8ede0522011-10-03 14:57:44 -0700588class WiFiGetServiceSuccessTest : public WiFiMainTest {};
589class WiFiGetServiceFailureTest : public WiFiMainTest {};
590
591TEST_P(WiFiGetServiceSuccessTest, Passphrase) {
592 Error e;
593 GetService("wifi", "an_ssid", "managed", "wpa", GetParam().c_str(), e);
594 EXPECT_TRUE(e.IsSuccess());
595}
596
597TEST_P(WiFiGetServiceFailureTest, Passphrase) {
598 Error e;
599 GetService("wifi", "an_ssid", "managed", "wpa", GetParam().c_str(), e);
600 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
601}
602
603INSTANTIATE_TEST_CASE_P(
604 WiFiGetServiceSuccessTestInstance,
605 WiFiGetServiceSuccessTest,
606 Values(
607 string(IEEE_80211::kWPAAsciiMinLen, 'Z'),
608 string(IEEE_80211::kWPAAsciiMaxLen, 'Z'),
609 // subtle: invalid length for hex key, but valid as ascii passphrase
610 string(IEEE_80211::kWPAHexLen-1, '1'),
611 string(IEEE_80211::kWPAHexLen, '1')));
612
613INSTANTIATE_TEST_CASE_P(
614 WiFiGetServiceFailureTestInstance,
615 WiFiGetServiceFailureTest,
616 Values(
617 string(IEEE_80211::kWPAAsciiMinLen-1, 'Z'),
618 string(IEEE_80211::kWPAAsciiMaxLen+1, 'Z'),
619 string(IEEE_80211::kWPAHexLen+1, '1')));
620
Chris Masone853b81b2011-06-24 14:11:41 -0700621} // namespace shill