blob: f732e1605a05afc4b4f257451763ba3830597795 [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 agrawal7a4e4002011-09-06 11:26:05 -070025#include "shill/key_value_store.h"
Chris Masone853b81b2011-06-24 14:11:41 -070026#include "shill/manager.h"
Chris Masone853b81b2011-06-24 14:11:41 -070027#include "shill/mock_device.h"
mukesh agrawalf2f68a52011-09-01 12:15:48 -070028#include "shill/mock_dhcp_config.h"
29#include "shill/mock_dhcp_provider.h"
Chris Masone2ae797d2011-08-23 20:41:00 -070030#include "shill/mock_manager.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070031#include "shill/mock_rtnl_handler.h"
mukesh agrawal31950242011-07-14 11:53:38 -070032#include "shill/mock_supplicant_interface_proxy.h"
33#include "shill/mock_supplicant_process_proxy.h"
mukesh agrawaldc42bb32011-07-28 10:40:26 -070034#include "shill/nice_mock_control.h"
Chris Masone853b81b2011-06-24 14:11:41 -070035#include "shill/property_store_unittest.h"
mukesh agrawal31950242011-07-14 11:53:38 -070036#include "shill/proxy_factory.h"
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -070037#include "shill/shill_event.h"
mukesh agrawal31950242011-07-14 11:53:38 -070038#include "shill/wifi_endpoint.h"
39#include "shill/wifi.h"
mukesh agrawal32399322011-09-01 10:53:43 -070040#include "shill/wifi_service.h"
Chris Masone853b81b2011-06-24 14:11:41 -070041
42using std::map;
43using std::string;
44using std::vector;
45using ::testing::_;
mukesh agrawal31950242011-07-14 11:53:38 -070046using ::testing::AnyNumber;
47using ::testing::DefaultValue;
48using ::testing::InSequence;
mukesh agrawaldc42bb32011-07-28 10:40:26 -070049using ::testing::NiceMock;
Chris Masone853b81b2011-06-24 14:11:41 -070050using ::testing::Return;
51using ::testing::Test;
mukesh agrawal31950242011-07-14 11:53:38 -070052using ::testing::Throw;
Chris Masone853b81b2011-06-24 14:11:41 -070053
54namespace shill {
55
mukesh agrawal31950242011-07-14 11:53:38 -070056class WiFiPropertyTest : public PropertyStoreTest {
Chris Masone853b81b2011-06-24 14:11:41 -070057 public:
mukesh agrawal31950242011-07-14 11:53:38 -070058 WiFiPropertyTest()
Chris Masone2176a882011-09-14 22:29:15 -070059 : device_(new WiFi(control_interface(), NULL, NULL, "wifi", "", 0)) {
Chris Masone853b81b2011-06-24 14:11:41 -070060 }
mukesh agrawal31950242011-07-14 11:53:38 -070061 virtual ~WiFiPropertyTest() {}
Chris Masone853b81b2011-06-24 14:11:41 -070062
63 protected:
64 DeviceRefPtr device_;
65};
66
mukesh agrawal31950242011-07-14 11:53:38 -070067TEST_F(WiFiPropertyTest, Contains) {
mukesh agrawalde29fa82011-09-16 16:16:36 -070068 EXPECT_TRUE(device_->store().Contains(flimflam::kNameProperty));
69 EXPECT_FALSE(device_->store().Contains(""));
Chris Masone853b81b2011-06-24 14:11:41 -070070}
71
mukesh agrawal31950242011-07-14 11:53:38 -070072TEST_F(WiFiPropertyTest, Dispatch) {
Chris Masonea8a2c252011-06-27 22:16:30 -070073 {
74 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070075 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070076 flimflam::kBgscanMethodProperty,
77 PropertyStoreTest::kStringV,
78 &error));
79 }
80 {
81 ::DBus::Error error;
82 EXPECT_TRUE(DBusAdaptor::DispatchOnType(
mukesh agrawalde29fa82011-09-16 16:16:36 -070083 device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070084 flimflam::kBgscanSignalThresholdProperty,
85 PropertyStoreTest::kInt32V,
86 &error));
87 }
88 {
89 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070090 EXPECT_TRUE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070091 flimflam::kScanIntervalProperty,
92 PropertyStoreTest::kUint16V,
93 &error));
94 }
Chris Masone853b81b2011-06-24 14:11:41 -070095 // Ensure that an attempt to write a R/O property returns InvalidArgs error.
Chris Masonea8a2c252011-06-27 22:16:30 -070096 {
97 ::DBus::Error error;
mukesh agrawalde29fa82011-09-16 16:16:36 -070098 EXPECT_FALSE(DBusAdaptor::DispatchOnType(device_->mutable_store(),
Chris Masonea8a2c252011-06-27 22:16:30 -070099 flimflam::kScanningProperty,
100 PropertyStoreTest::kBoolV,
101 &error));
Chris Masone9d779932011-08-25 16:33:41 -0700102 EXPECT_EQ(invalid_args(), error.name());
Chris Masonea8a2c252011-06-27 22:16:30 -0700103 }
Chris Masone853b81b2011-06-24 14:11:41 -0700104}
105
mukesh agrawal31950242011-07-14 11:53:38 -0700106class WiFiMainTest : public Test {
107 public:
108 WiFiMainTest()
109 : manager_(&control_interface_, NULL, NULL),
Chris Masone626719f2011-08-18 16:58:48 -0700110 wifi_(new WiFi(&control_interface_,
mukesh agrawal32399322011-09-01 10:53:43 -0700111 &dispatcher_,
Chris Masone626719f2011-08-18 16:58:48 -0700112 &manager_,
113 kDeviceName,
114 kDeviceAddress,
115 0)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700116 supplicant_process_proxy_(new NiceMock<MockSupplicantProcessProxy>()),
117 supplicant_interface_proxy_(
118 new NiceMock<MockSupplicantInterfaceProxy>(wifi_)),
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700119 dhcp_config_(new MockDHCPConfig(&control_interface_,
120 &dispatcher_,
121 &dhcp_provider_,
122 kDeviceName,
123 &glib_)),
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700124 proxy_factory_(this) {
mukesh agrawal31950242011-07-14 11:53:38 -0700125 ProxyFactory::set_factory(&proxy_factory_);
126 ::testing::DefaultValue< ::DBus::Path>::Set("/default/path");
127 }
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700128
129 virtual void SetUp() {
130 static_cast<Device *>(wifi_)->rtnl_handler_ = &rtnl_handler_;
131 wifi_->set_dhcp_provider(&dhcp_provider_);
132 }
133
134 virtual void TearDown() {
mukesh agrawal31950242011-07-14 11:53:38 -0700135 // must Stop WiFi instance, to clear its list of services.
136 // otherwise, the WiFi instance will not be deleted. (because
137 // services reference a WiFi instance, creating a cycle.)
138 wifi_->Stop();
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700139 wifi_->set_dhcp_provider(NULL);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700140 }
141
mukesh agrawal31950242011-07-14 11:53:38 -0700142 protected:
143 class TestProxyFactory : public ProxyFactory {
144 public:
Paul Stewart7355ce12011-09-02 10:47:01 -0700145 explicit TestProxyFactory(WiFiMainTest *test) : test_(test) {}
mukesh agrawal31950242011-07-14 11:53:38 -0700146
147 virtual SupplicantProcessProxyInterface *CreateSupplicantProcessProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700148 const char */*dbus_path*/, const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700149 return test_->supplicant_process_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700150 }
151
152 virtual SupplicantInterfaceProxyInterface *CreateSupplicantInterfaceProxy(
mukesh agrawal1830fa12011-09-26 14:31:40 -0700153 const WiFiRefPtr &/*wifi*/,
154 const DBus::Path &/*object_path*/,
155 const char */*dbus_addr*/) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700156 return test_->supplicant_interface_proxy_.release();
mukesh agrawal31950242011-07-14 11:53:38 -0700157 }
158
159 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700160 WiFiMainTest *test_;
mukesh agrawal31950242011-07-14 11:53:38 -0700161 };
162
163 const WiFi::EndpointMap &GetEndpointMap() {
164 return wifi_->endpoint_by_bssid_;
165 }
166 const WiFi::ServiceMap &GetServiceMap() {
167 return wifi_->service_by_private_id_;
168 }
169 // note: the tests need the proxies referenced by WiFi (not the
170 // proxies instantiated by WiFiMainTest), to ensure that WiFi
171 // sets up its proxies correctly.
172 SupplicantProcessProxyInterface *GetSupplicantProcessProxy() {
173 return wifi_->supplicant_process_proxy_.get();
174 }
175 SupplicantInterfaceProxyInterface *GetSupplicantInterfaceProxy() {
176 return wifi_->supplicant_interface_proxy_.get();
177 }
mukesh agrawal32399322011-09-01 10:53:43 -0700178 void InitiateConnect(WiFiService *service) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700179 map<string, ::DBus::Variant> params;
180 wifi_->ConnectTo(service, params);
mukesh agrawal31950242011-07-14 11:53:38 -0700181 }
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700182 bool IsLinkUp() {
183 return wifi_->link_up_;
184 }
mukesh agrawal31950242011-07-14 11:53:38 -0700185 void ReportBSS(const ::DBus::Path &bss_path,
186 const string &ssid,
187 const string &bssid,
188 int16_t signal_strength,
189 const char *mode);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700190 void ReportLinkUp() {
191 wifi_->LinkEvent(IFF_LOWER_UP, IFF_LOWER_UP);
192 }
mukesh agrawal31950242011-07-14 11:53:38 -0700193 void ReportScanDone() {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700194 wifi_->ScanDoneTask();
mukesh agrawal31950242011-07-14 11:53:38 -0700195 }
196 void StartWiFi() {
197 wifi_->Start();
mukesh agrawal31950242011-07-14 11:53:38 -0700198 }
199 void StopWiFi() {
200 wifi_->Stop();
201 }
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700202 void GetOpenService(const char *service_type,
203 const char *ssid,
204 const char *mode,
205 Error &result) {
206 return GetService(service_type, ssid, mode, NULL, NULL, result);
207 }
208 void GetService(const char *service_type,
209 const char *ssid,
210 const char *mode,
211 const char *security,
212 const char *passphrase,
213 Error &result) {
214 map<string, ::DBus::Variant> args;
215 Error e;
216 KeyValueStore args_kv;
217
218 // in general, we want to avoid D-Bus specific code for any RPCs
219 // that come in via adaptors. we make an exception here, because
220 // calls to GetWifiService are rerouted from the Manager object to
221 // the Wifi class.
222 if (service_type != NULL)
223 args[flimflam::kTypeProperty].writer().append_string(service_type);
224 if (ssid != NULL)
225 args[flimflam::kSSIDProperty].writer().append_string(ssid);
226 if (mode != NULL)
227 args[flimflam::kModeProperty].writer().append_string(mode);
228 if (security != NULL)
229 args[flimflam::kSecurityProperty].writer().append_string(security);
230 if (passphrase != NULL)
231 args[flimflam::kPassphraseProperty].writer().append_string(passphrase);
232
233 DBusAdaptor::ArgsToKeyValueStore(args, &args_kv, &e);
234 wifi_->GetService(args_kv, &result);
235 }
mukesh agrawal32399322011-09-01 10:53:43 -0700236 MockManager *manager() {
237 return &manager_;
238 }
239 const WiFiConstRefPtr wifi() const {
240 return wifi_;
241 }
242
243 EventDispatcher dispatcher_;
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700244 NiceMock<MockRTNLHandler> rtnl_handler_;
mukesh agrawal31950242011-07-14 11:53:38 -0700245
246 private:
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700247 NiceMockControl control_interface_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700248 MockGLib glib_;
Chris Masone2ae797d2011-08-23 20:41:00 -0700249 MockManager manager_;
mukesh agrawal31950242011-07-14 11:53:38 -0700250 WiFiRefPtr wifi_;
mukesh agrawal31950242011-07-14 11:53:38 -0700251
252 // protected fields interspersed between private fields, due to
253 // initialization order
254 protected:
255 static const char kDeviceName[];
Chris Masone626719f2011-08-18 16:58:48 -0700256 static const char kDeviceAddress[];
mukesh agrawal31950242011-07-14 11:53:38 -0700257 static const char kNetworkModeAdHoc[];
258 static const char kNetworkModeInfrastructure[];
259
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700260 scoped_ptr<MockSupplicantProcessProxy> supplicant_process_proxy_;
261 scoped_ptr<MockSupplicantInterfaceProxy> supplicant_interface_proxy_;
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700262 MockDHCPProvider dhcp_provider_;
263 scoped_refptr<MockDHCPConfig> dhcp_config_;
mukesh agrawal31950242011-07-14 11:53:38 -0700264
265 private:
266 TestProxyFactory proxy_factory_;
mukesh agrawal31950242011-07-14 11:53:38 -0700267};
268
269const char WiFiMainTest::kDeviceName[] = "wlan0";
Chris Masone626719f2011-08-18 16:58:48 -0700270const char WiFiMainTest::kDeviceAddress[] = "00:01:02:03:04:05";
mukesh agrawal31950242011-07-14 11:53:38 -0700271const char WiFiMainTest::kNetworkModeAdHoc[] = "ad-hoc";
272const char WiFiMainTest::kNetworkModeInfrastructure[] = "infrastructure";
273
274void WiFiMainTest::ReportBSS(const ::DBus::Path &bss_path,
275 const string &ssid,
276 const string &bssid,
277 int16_t signal_strength,
278 const char *mode) {
279 map<string, ::DBus::Variant> bss_properties;
280
281 {
282 DBus::MessageIter writer(bss_properties["SSID"].writer());
283 writer << vector<uint8_t>(ssid.begin(), ssid.end());
284 }
285 {
286 string bssid_nosep;
287 vector<uint8_t> bssid_bytes;
288 RemoveChars(bssid, ":", &bssid_nosep);
289 base::HexStringToBytes(bssid_nosep, &bssid_bytes);
290
291 DBus::MessageIter writer(bss_properties["BSSID"].writer());
292 writer << bssid_bytes;
293 }
294 bss_properties["Signal"].writer().append_int16(signal_strength);
295 bss_properties["Mode"].writer().append_string(mode);
296 wifi_->BSSAdded(bss_path, bss_properties);
297}
298
299TEST_F(WiFiMainTest, ProxiesSetUpDuringStart) {
300 EXPECT_TRUE(GetSupplicantProcessProxy() == NULL);
301 EXPECT_TRUE(GetSupplicantInterfaceProxy() == NULL);
302
303 StartWiFi();
304 EXPECT_FALSE(GetSupplicantProcessProxy() == NULL);
305 EXPECT_FALSE(GetSupplicantInterfaceProxy() == NULL);
306}
307
308TEST_F(WiFiMainTest, CleanStart) {
309 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_));
310 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_))
311 .Times(AnyNumber())
312 .WillRepeatedly(Throw(
313 DBus::Error(
314 "fi.w1.wpa_supplicant1.InterfaceUnknown",
315 "test threw fi.w1.wpa_supplicant1.InterfaceUnknown")));
316 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
317 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700318 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700319}
320
321TEST_F(WiFiMainTest, Restart) {
322 EXPECT_CALL(*supplicant_process_proxy_, CreateInterface(_))
323 .Times(AnyNumber())
324 .WillRepeatedly(Throw(
325 DBus::Error(
326 "fi.w1.wpa_supplicant1.InterfaceExists",
327 "test thew fi.w1.wpa_supplicant1.InterfaceExists")));
328 EXPECT_CALL(*supplicant_process_proxy_, GetInterface(_));
329 EXPECT_CALL(*supplicant_interface_proxy_, Scan(_));
330 StartWiFi();
mukesh agrawal32399322011-09-01 10:53:43 -0700331 dispatcher_.DispatchPendingEvents();
mukesh agrawal31950242011-07-14 11:53:38 -0700332}
333
334TEST_F(WiFiMainTest, StartClearsState) {
335 EXPECT_CALL(*supplicant_interface_proxy_, RemoveAllNetworks());
336 EXPECT_CALL(*supplicant_interface_proxy_, FlushBSS(_));
337 StartWiFi();
338}
339
340TEST_F(WiFiMainTest, ScanResults) {
341 StartWiFi();
342 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
343 ReportBSS(
344 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
345 ReportBSS(
346 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
347 ReportBSS(
348 "bss3", "ssid3", "00:00:00:00:00:03", 3, kNetworkModeInfrastructure);
349 ReportBSS("bss4", "ssid4", "00:00:00:00:00:04", 4, kNetworkModeAdHoc);
350 EXPECT_EQ(5, GetEndpointMap().size());
351}
352
353TEST_F(WiFiMainTest, ScanResultsWithUpdates) {
354 StartWiFi();
355 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
356 ReportBSS(
357 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
358 ReportBSS(
359 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
360 ReportBSS(
361 "bss1", "ssid1", "00:00:00:00:00:01", 3, kNetworkModeInfrastructure);
362 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 4, kNetworkModeAdHoc);
363 EXPECT_EQ(3, GetEndpointMap().size());
364 ASSERT_TRUE(ContainsKey(GetEndpointMap(), "000000000000"));
365 EXPECT_EQ(4, GetEndpointMap().find("000000000000")->second->
366 signal_strength());
367}
368
369TEST_F(WiFiMainTest, ScanCompleted) {
370 StartWiFi();
371 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
372 ReportBSS(
373 "bss1", "ssid1", "00:00:00:00:00:01", 1, kNetworkModeInfrastructure);
374 ReportBSS(
375 "bss2", "ssid2", "00:00:00:00:00:02", 2, kNetworkModeInfrastructure);
mukesh agrawal32399322011-09-01 10:53:43 -0700376 EXPECT_CALL(*manager(), RegisterService(_))
377 .Times(3);
mukesh agrawal31950242011-07-14 11:53:38 -0700378 ReportScanDone();
379 EXPECT_EQ(3, GetServiceMap().size());
380}
381
382TEST_F(WiFiMainTest, Connect) {
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700383 MockSupplicantInterfaceProxy &supplicant_interface_proxy =
384 *supplicant_interface_proxy_;
385
mukesh agrawal31950242011-07-14 11:53:38 -0700386 StartWiFi();
387 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
388 ReportScanDone();
389
390 {
391 InSequence s;
392 DBus::Path fake_path("/fake/path");
mukesh agrawal32399322011-09-01 10:53:43 -0700393 WiFiService *service(GetServiceMap().begin()->second);
mukesh agrawal31950242011-07-14 11:53:38 -0700394
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700395 EXPECT_CALL(supplicant_interface_proxy, AddNetwork(_))
mukesh agrawal31950242011-07-14 11:53:38 -0700396 .WillOnce(Return(fake_path));
mukesh agrawaldc42bb32011-07-28 10:40:26 -0700397 EXPECT_CALL(supplicant_interface_proxy, SelectNetwork(fake_path));
mukesh agrawal32399322011-09-01 10:53:43 -0700398 InitiateConnect(service);
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700399 EXPECT_EQ(static_cast<Service *>(service),
400 wifi()->selected_service_.get());
mukesh agrawal31950242011-07-14 11:53:38 -0700401 }
402}
403
mukesh agrawalf2f68a52011-09-01 12:15:48 -0700404TEST_F(WiFiMainTest, LinkEvent) {
405 EXPECT_FALSE(IsLinkUp());
406 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
407 WillOnce(Return(dhcp_config_));
408 ReportLinkUp();
409}
410
mukesh agrawal5c4dd0b2011-09-14 13:53:14 -0700411TEST_F(WiFiMainTest, Stop) {
412 {
413 InSequence s;
414
415 StartWiFi();
416 ReportBSS("bss0", "ssid0", "00:00:00:00:00:00", 0, kNetworkModeAdHoc);
417 ReportScanDone();
418 EXPECT_CALL(dhcp_provider_, CreateConfig(_)).
419 WillOnce(Return(dhcp_config_));
420 ReportLinkUp();
421 }
422
423 {
424 EXPECT_CALL(*manager(), DeregisterService(_));
425 StopWiFi();
426 }
427}
428
mukesh agrawal7a4e4002011-09-06 11:26:05 -0700429TEST_F(WiFiMainTest, GetWifiServiceOpen) {
430 Error e;
431 GetOpenService("wifi", "an_ssid", "managed", e);
432 EXPECT_TRUE(e.IsSuccess());
433}
434
435TEST_F(WiFiMainTest, GetWifiServiceOpenNoType) {
436 Error e;
437 GetOpenService(NULL, "an_ssid", "managed", e);
438 EXPECT_EQ(Error::kInvalidArguments, e.type());
439 EXPECT_EQ("must specify service type", e.message());
440}
441
442TEST_F(WiFiMainTest, GetWifiServiceOpenNoSSID) {
443 Error e;
444 GetOpenService("wifi", NULL, "managed", e);
445 EXPECT_EQ(Error::kInvalidArguments, e.type());
446 EXPECT_EQ("must specify SSID", e.message());
447}
448
449TEST_F(WiFiMainTest, GetWifiServiceOpenLongSSID) {
450 Error e;
451 GetOpenService(
452 "wifi", "123456789012345678901234567890123", "managed", e);
453 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
454 EXPECT_EQ("SSID is too long", e.message());
455}
456
457TEST_F(WiFiMainTest, GetWifiServiceOpenShortSSID) {
458 Error e;
459 GetOpenService("wifi", "", "managed", e);
460 EXPECT_EQ(Error::kInvalidNetworkName, e.type());
461 EXPECT_EQ("SSID is too short", e.message());
462}
463
464TEST_F(WiFiMainTest, GetWifiServiceOpenBadMode) {
465 Error e;
466 GetOpenService("wifi", "an_ssid", "ad-hoc", e);
467 EXPECT_EQ(Error::kNotSupported, e.type());
468 EXPECT_EQ("service mode is unsupported", e.message());
469}
470
471TEST_F(WiFiMainTest, GetWifiServiceOpenNoMode) {
472 Error e;
473 GetOpenService("wifi", "an_ssid", NULL, e);
474 EXPECT_TRUE(e.IsSuccess());
475}
476
477TEST_F(WiFiMainTest, GetWifiServiceRSN) {
478 Error e;
479 GetService("wifi", "an_ssid", "managed", "rsn", "secure password", e);
480 EXPECT_TRUE(e.IsSuccess());
481}
482
483TEST_F(WiFiMainTest, GetWifiServiceRSNNoPassword) {
484 Error e;
485 GetService("wifi", "an_ssid", "managed", "rsn", NULL, e);
486 EXPECT_EQ(Error::kInvalidArguments, e.type());
487 EXPECT_EQ("must specify passphrase", e.message());
488}
489
490TEST_F(WiFiMainTest, GetWifiServiceBadSecurity) {
491 Error e;
492 GetService("wifi", "an_ssid", "managed", "rot-13", NULL, e);
493 EXPECT_EQ(Error::kNotSupported, e.type());
494 EXPECT_EQ("security mode is unsupported", e.message());
495}
496
497TEST_F(WiFiMainTest, GetWifiServiceWEPNoPassword) {
498 Error e;
499 GetService("wifi", "an_ssid", "managed", "wep", NULL, e);
500 EXPECT_EQ(Error::kInvalidArguments, e.type());
501 EXPECT_EQ("must specify passphrase", e.message());
502}
503
504TEST_F(WiFiMainTest, GetWifiServiceWEPEmptyPassword) {
505 Error e;
506 GetService("wifi", "an_ssid", "managed", "wep", "", e);
507 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
508}
509
510TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCII) {
511 Error e;
512 GetService("wifi", "an_ssid", "managed", "wep", "abcde", e);
513 EXPECT_TRUE(e.IsSuccess());
514}
515
516TEST_F(WiFiMainTest, GetWifiServiceWEP104ASCII) {
517 Error e;
518 GetService("wifi", "an_ssid", "managed", "wep", "abcdefghijklm", e);
519 EXPECT_TRUE(e.IsSuccess());
520}
521
522TEST_F(WiFiMainTest, GetWifiServiceWEP40ASCIIWithKeyIndex) {
523 Error e;
524 GetService("wifi", "an_ssid", "managed", "wep", "0:abcdefghijklm", e);
525 EXPECT_TRUE(e.IsSuccess());
526}
527
528TEST_F(WiFiMainTest, GetWifiServiceWEP40Hex) {
529 Error e;
530 GetService("wifi", "an_ssid", "managed", "wep", "0102030405", e);
531 EXPECT_TRUE(e.IsSuccess());
532}
533
534TEST_F(WiFiMainTest, GetWifiServiceWEP40HexBadPassphrase) {
535 Error e;
536 GetService("wifi", "an_ssid", "managed", "wep", "O102030405", e);
537 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
538}
539
540TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexBadPassphrase) {
541 Error e;
542 GetService("wifi", "an_ssid", "managed", "wep", "1:O102030405", e);
543 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
544}
545
546TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithKeyIndexAndBaseBadPassphrase) {
547 Error e;
548 GetService("wifi", "an_ssid", "managed", "wep", "1:0xO102030405", e);
549 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
550}
551
552TEST_F(WiFiMainTest, GetWifiServiceWEP40HexWithBaseBadPassphrase) {
553 Error e;
554 GetService("wifi", "an_ssid", "managed", "wep", "0xO102030405", e);
555 EXPECT_EQ(Error::kInvalidPassphrase, e.type());
556}
557
558TEST_F(WiFiMainTest, GetWifiServiceWEP104Hex) {
559 Error e;
560 GetService("wifi", "an_ssid", "managed", "wep",
561 "0102030405060708090a0b0c0d", e);
562 EXPECT_TRUE(e.IsSuccess());
563}
564
565TEST_F(WiFiMainTest, GetWifiServiceWEP104HexUppercase) {
566 Error e;
567 GetService("wifi", "an_ssid", "managed", "wep",
568 "0102030405060708090A0B0C0D", e);
569 EXPECT_TRUE(e.IsSuccess());
570}
571
572TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndex) {
573 Error e;
574 GetService("wifi", "an_ssid", "managed", "wep",
575 "0:0102030405060708090a0b0c0d", e);
576 EXPECT_TRUE(e.IsSuccess());
577}
578
579TEST_F(WiFiMainTest, GetWifiServiceWEP104HexWithKeyIndexAndBase) {
580 Error e;
581 GetService("wifi", "an_ssid", "managed", "wep",
582 "0:0x0102030405060708090a0b0c0d", e);
583 EXPECT_TRUE(e.IsSuccess());
584}
585
Chris Masone853b81b2011-06-24 14:11:41 -0700586} // namespace shill