blob: 9c8c4e7a8404e0b08c4fa1fa6c21d4c787514dc7 [file] [log] [blame]
Chris Masone34af2182011-08-22 11:59:36 -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_service.h"
6
mukesh agrawald835b202011-10-07 15:26:47 -07007#include <map>
Chris Masone34af2182011-08-22 11:59:36 -07008#include <string>
9#include <vector>
10
11#include <base/string_util.h>
12#include <chromeos/dbus/service_constants.h>
13#include <gmock/gmock.h>
14#include <gtest/gtest.h>
15
16#include "shill/manager.h"
17#include "shill/mock_adaptors.h"
18#include "shill/mock_control.h"
19#include "shill/mock_service.h"
20#include "shill/mock_store.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070021#include "shill/mock_wifi.h"
Chris Masone34af2182011-08-22 11:59:36 -070022#include "shill/property_store_unittest.h"
23#include "shill/shill_event.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070024#include "shill/wpa_supplicant.h"
Chris Masone34af2182011-08-22 11:59:36 -070025
mukesh agrawald835b202011-10-07 15:26:47 -070026using std::map;
Chris Masone34af2182011-08-22 11:59:36 -070027using std::string;
28using std::vector;
29
30namespace shill {
mukesh agrawal6e277772011-09-29 15:04:23 -070031using ::testing::NiceMock;
Chris Masone34af2182011-08-22 11:59:36 -070032
33class WiFiServiceTest : public PropertyStoreTest {
34 public:
mukesh agrawal6e277772011-09-29 15:04:23 -070035 WiFiServiceTest() : wifi_(
36 new NiceMock<MockWiFi>(
37 control_interface(),
38 dispatcher(),
39 manager(),
40 "wifi",
41 fake_mac,
42 0)) {}
Chris Masone34af2182011-08-22 11:59:36 -070043 virtual ~WiFiServiceTest() {}
mukesh agrawal6e277772011-09-29 15:04:23 -070044
45 protected:
46 static const char fake_mac[];
47 scoped_refptr<MockWiFi> wifi() { return wifi_; }
48
49 private:
50 scoped_refptr<MockWiFi> wifi_;
Chris Masone34af2182011-08-22 11:59:36 -070051};
52
mukesh agrawal6e277772011-09-29 15:04:23 -070053// static
54const char WiFiServiceTest::fake_mac[] = "AaBBcCDDeeFF";
55
56MATCHER(WPASecurityArgs, "") {
57 return ContainsKey(arg, wpa_supplicant::kPropertySecurityProtocol) &&
58 ContainsKey(arg, wpa_supplicant::kPropertyPreSharedKey);
59}
60
Chris Masone34af2182011-08-22 11:59:36 -070061TEST_F(WiFiServiceTest, StorageId) {
62 vector<uint8_t> ssid(5, 0);
63 ssid.push_back(0xff);
Chris Masone9d779932011-08-25 16:33:41 -070064
Chris Masone2176a882011-09-14 22:29:15 -070065 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
66 dispatcher(),
Chris Masone9d779932011-08-25 16:33:41 -070067 manager(),
mukesh agrawal6e277772011-09-29 15:04:23 -070068 wifi(),
Chris Masone9d779932011-08-25 16:33:41 -070069 ssid,
70 flimflam::kModeManaged,
71 "none");
72 string id = wifi_service->GetStorageIdentifier();
Chris Masone34af2182011-08-22 11:59:36 -070073 for (uint i = 0; i < id.length(); ++i) {
74 EXPECT_TRUE(id[i] == '_' ||
75 isxdigit(id[i]) ||
76 (isalpha(id[i]) && islower(id[i])));
77 }
Paul Stewart22aa71b2011-09-16 12:15:11 -070078 EXPECT_TRUE(wifi_service->TechnologyIs(Technology::kWifi));
Chris Masone34af2182011-08-22 11:59:36 -070079 size_t mac_pos = id.find(StringToLowerASCII(string(fake_mac)));
80 EXPECT_NE(mac_pos, string::npos);
81 EXPECT_NE(id.find(string(flimflam::kModeManaged), mac_pos), string::npos);
82}
83
mukesh agrawald835b202011-10-07 15:26:47 -070084TEST_F(WiFiServiceTest, NonUTF8SSID) {
85 vector<uint8_t> ssid;
86
87 ssid.push_back(0xff); // not a valid UTF-8 byte-sequence
88 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
89 dispatcher(),
90 manager(),
91 wifi(),
92 ssid,
93 flimflam::kModeManaged,
94 "none");
95 map<string, ::DBus::Variant> properties;
96 // if service doesn't propertly sanitize SSID, this will generate SIGABRT.
97 DBusAdaptor::GetProperties(wifi_service->store(), &properties, NULL);
98}
99
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700100TEST_F(WiFiServiceTest, ConnectTaskWPA) {
mukesh agrawal6e277772011-09-29 15:04:23 -0700101 vector<uint8_t> ssid(5, 0);
102 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
103 dispatcher(),
104 manager(),
105 wifi(),
106 ssid,
107 flimflam::kModeManaged,
108 flimflam::kSecurityWpa);
109 EXPECT_CALL(*wifi(),
110 ConnectTo(wifi_service.get(), WPASecurityArgs()));
111 wifi_service->ConnectTask();
112}
113
mukesh agrawalf2fd7452011-10-03 16:38:47 -0700114TEST_F(WiFiServiceTest, ConnectTaskRSN) {
115 vector<uint8_t> ssid(5, 0);
116 WiFiServiceRefPtr wifi_service = new WiFiService(control_interface(),
117 dispatcher(),
118 manager(),
119 wifi(),
120 ssid,
121 flimflam::kModeManaged,
122 flimflam::kSecurityRsn);
123 EXPECT_CALL(*wifi(),
124 ConnectTo(wifi_service.get(), WPASecurityArgs()));
125 wifi_service->ConnectTask();
126}
127
Chris Masone34af2182011-08-22 11:59:36 -0700128} // namespace shill