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