blob: 1e682c7d9137bf1604175ff74205f572fcfeea95 [file] [log] [blame]
mukesh agrawal16bc1b82012-02-09 18:38:26 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
mukesh agrawal6e277772011-09-29 15:04:23 -07002// 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_endpoint.h"
6
7#include <map>
8#include <set>
9#include <string>
10#include <vector>
11
12#include <base/stl_util-inl.h>
13#include <chromeos/dbus/service_constants.h>
14#include <gtest/gtest.h>
15
Thieu Le1df7f4e2012-02-10 15:21:45 -080016#include "shill/ieee80211.h"
mukesh agrawal16bc1b82012-02-09 18:38:26 -080017#include "shill/refptr_types.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070018#include "shill/wpa_supplicant.h"
19
20using std::map;
21using std::set;
22using std::string;
23using std::vector;
24
25using ::testing::Test;
26
27namespace shill {
28
29class WiFiEndpointTest : public Test {
30 public:
31 WiFiEndpointTest() {}
32 virtual ~WiFiEndpointTest() {}
33
34 protected:
35 vector<string> make_string_vector1(const string &str1) {
36 vector<string> strvec;
37 strvec.push_back(str1);
38 return strvec;
39 }
40
41 vector<string> make_string_vector2(const string &str1, const string &str2) {
42 vector<string> strvec;
43 strvec.push_back(str1);
44 strvec.push_back(str2);
45 return strvec;
46 }
47
48 map<string, ::DBus::Variant> make_key_management_args(
49 vector<string> key_management_method_strings) {
50 map<string, ::DBus::Variant> args;
51 ::DBus::MessageIter writer;
52 writer =
53 args[wpa_supplicant::kSecurityMethodPropertyKeyManagement].writer();
54 writer << key_management_method_strings;
55 return args;
56 }
57
58 map<string, ::DBus::Variant> make_security_args(
59 const string &security_protocol,
60 const string &key_management_method) {
61 map<string, ::DBus::Variant> args;
62 ::DBus::MessageIter writer;
63 writer = args[security_protocol].writer();
64 writer <<
65 make_key_management_args(make_string_vector1(key_management_method));
66 return args;
67 }
68
69 const char *ParseSecurity(
70 const map<string, ::DBus::Variant> &properties) {
71 return WiFiEndpoint::ParseSecurity(properties);
72 }
Thieu Le1df7f4e2012-02-10 15:21:45 -080073
74 void AddIE(uint8_t type, vector<uint8_t> *ies) {
75 ies->push_back(type); // type
76 ies->push_back(4); // length
77 ies->insert(ies->end(), 3, 0); // OUI
78 ies->push_back(0); // data
79 }
mukesh agrawal6e277772011-09-29 15:04:23 -070080};
81
82TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAP) {
83 set<WiFiEndpoint::KeyManagement> parsed_methods;
84 WiFiEndpoint::ParseKeyManagementMethods(
85 make_key_management_args(make_string_vector1("something-eap")),
86 &parsed_methods);
87 EXPECT_TRUE(
88 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
89 EXPECT_FALSE(
90 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
91}
92
93TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsPSK) {
94 set<WiFiEndpoint::KeyManagement> parsed_methods;
95 WiFiEndpoint::ParseKeyManagementMethods(
96 make_key_management_args(make_string_vector1("something-psk")),
97 &parsed_methods);
98 EXPECT_TRUE(
99 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
100 EXPECT_FALSE(
101 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
102}
103
104TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK) {
105 set<WiFiEndpoint::KeyManagement> parsed_methods;
106 WiFiEndpoint::ParseKeyManagementMethods(
107 make_key_management_args(
108 make_string_vector2("something-eap", "something-psk")),
109 &parsed_methods);
110 EXPECT_TRUE(
111 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
112 EXPECT_TRUE(
113 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
114}
115
116TEST_F(WiFiEndpointTest, ParseSecurityRSN802_1x) {
117 EXPECT_STREQ(flimflam::kSecurity8021x,
118 ParseSecurity(make_security_args("RSN", "something-eap")));
119}
120
121TEST_F(WiFiEndpointTest, ParseSecurityWPA802_1x) {
122 EXPECT_STREQ(flimflam::kSecurity8021x,
123 ParseSecurity(make_security_args("WPA", "something-eap")));
124}
125
126TEST_F(WiFiEndpointTest, ParseSecurityRSNPSK) {
127 EXPECT_STREQ(flimflam::kSecurityRsn,
128 ParseSecurity(make_security_args("RSN", "something-psk")));
129}
130
131TEST_F(WiFiEndpointTest, ParseSecurityWPAPSK) {
132 EXPECT_STREQ(flimflam::kSecurityWpa,
133 ParseSecurity(make_security_args("WPA", "something-psk")));
134}
135
136TEST_F(WiFiEndpointTest, ParseSecurityWEP) {
137 map<string, ::DBus::Variant> top_params;
138 top_params[wpa_supplicant::kPropertyPrivacy].writer().append_bool(true);
139 EXPECT_STREQ(flimflam::kSecurityWep, ParseSecurity(top_params));
140}
141
142TEST_F(WiFiEndpointTest, ParseSecurityNone) {
143 map<string, ::DBus::Variant> top_params;
144 EXPECT_STREQ(flimflam::kSecurityNone, ParseSecurity(top_params));
145}
146
mukesh agrawal16bc1b82012-02-09 18:38:26 -0800147TEST_F(WiFiEndpointTest, SSIDWithNull) {
148 WiFiEndpointRefPtr endpoint =
149 WiFiEndpoint::MakeOpenEndpoint(string(1, 0), "00:00:00:00:00:01");
150 EXPECT_EQ("?", endpoint->ssid_string());
151}
152
Thieu Le1df7f4e2012-02-10 15:21:45 -0800153TEST_F(WiFiEndpointTest, DeterminePhyMode) {
154 {
155 map<string, ::DBus::Variant> properties;
156 vector<uint8_t> ies;
157 AddIE(IEEE_80211::kElemIdErp, &ies);
158 ::DBus::MessageIter writer =
159 properties[wpa_supplicant::kBSSPropertyIEs].writer();
160 writer << ies;
161 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
162 WiFiEndpoint::DeterminePhyMode(properties, 2400));
163 }
164 {
165 map<string, ::DBus::Variant> properties;
166 vector<uint8_t> ies;
167 AddIE(IEEE_80211::kElemIdHTCap, &ies);
168 ::DBus::MessageIter writer =
169 properties[wpa_supplicant::kBSSPropertyIEs].writer();
170 writer << ies;
171 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
172 WiFiEndpoint::DeterminePhyMode(properties, 2400));
173 }
174 {
175 map<string, ::DBus::Variant> properties;
176 vector<uint8_t> ies;
177 AddIE(IEEE_80211::kElemIdHTInfo, &ies);
178 ::DBus::MessageIter writer =
179 properties[wpa_supplicant::kBSSPropertyIEs].writer();
180 writer << ies;
181 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
182 WiFiEndpoint::DeterminePhyMode(properties, 2400));
183 }
184 {
185 map<string, ::DBus::Variant> properties;
186 vector<uint8_t> ies;
187 AddIE(IEEE_80211::kElemIdErp, &ies);
188 AddIE(IEEE_80211::kElemIdHTCap, &ies);
189 ::DBus::MessageIter writer =
190 properties[wpa_supplicant::kBSSPropertyIEs].writer();
191 writer << ies;
192 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
193 WiFiEndpoint::DeterminePhyMode(properties, 2400));
194 }
195 {
196 map<string, ::DBus::Variant> properties;
197 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11a,
198 WiFiEndpoint::DeterminePhyMode(properties, 3200));
199 }
200 {
201 map<string, ::DBus::Variant> properties;
202 vector<uint32_t> rates(1, 22000000);
203 ::DBus::MessageIter writer =
204 properties[wpa_supplicant::kBSSPropertyRates].writer();
205 writer << rates;
206 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11b,
207 WiFiEndpoint::DeterminePhyMode(properties, 2400));
208 }
209 {
210 map<string, ::DBus::Variant> properties;
211 vector<uint32_t> rates(1, 54000000);
212 ::DBus::MessageIter writer =
213 properties[wpa_supplicant::kBSSPropertyRates].writer();
214 writer << rates;
215 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
216 WiFiEndpoint::DeterminePhyMode(properties, 2400));
217 }
218}
219
mukesh agrawal6e277772011-09-29 15:04:23 -0700220} // namespace shill