blob: 556b966bbc485e84537bf0d0b2d94537a4b894a6 [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>
mukesh agrawalb20776f2012-02-10 16:00:36 -080014#include <gmock/gmock.h>
mukesh agrawal6e277772011-09-29 15:04:23 -070015#include <gtest/gtest.h>
16
Thieu Le1df7f4e2012-02-10 15:21:45 -080017#include "shill/ieee80211.h"
mukesh agrawalb20776f2012-02-10 16:00:36 -080018#include "shill/mock_wifi.h"
19#include "shill/property_store_unittest.h"
mukesh agrawal16bc1b82012-02-09 18:38:26 -080020#include "shill/refptr_types.h"
mukesh agrawal6e277772011-09-29 15:04:23 -070021#include "shill/wpa_supplicant.h"
22
23using std::map;
24using std::set;
25using std::string;
26using std::vector;
mukesh agrawalb20776f2012-02-10 16:00:36 -080027using ::testing::_;
28using ::testing::NiceMock;
mukesh agrawal6e277772011-09-29 15:04:23 -070029
30namespace shill {
31
mukesh agrawalb20776f2012-02-10 16:00:36 -080032class WiFiEndpointTest : public PropertyStoreTest {
mukesh agrawal6e277772011-09-29 15:04:23 -070033 public:
mukesh agrawalb20776f2012-02-10 16:00:36 -080034 WiFiEndpointTest() : wifi_(
35 new NiceMock<MockWiFi>(
36 control_interface(),
37 dispatcher(),
38 metrics(),
39 manager(),
40 "wifi",
41 "aabbccddeeff", // fake mac
42 0)) {}
mukesh agrawal6e277772011-09-29 15:04:23 -070043 virtual ~WiFiEndpointTest() {}
44
45 protected:
46 vector<string> make_string_vector1(const string &str1) {
47 vector<string> strvec;
48 strvec.push_back(str1);
49 return strvec;
50 }
51
52 vector<string> make_string_vector2(const string &str1, const string &str2) {
53 vector<string> strvec;
54 strvec.push_back(str1);
55 strvec.push_back(str2);
56 return strvec;
57 }
58
59 map<string, ::DBus::Variant> make_key_management_args(
60 vector<string> key_management_method_strings) {
61 map<string, ::DBus::Variant> args;
62 ::DBus::MessageIter writer;
63 writer =
64 args[wpa_supplicant::kSecurityMethodPropertyKeyManagement].writer();
65 writer << key_management_method_strings;
66 return args;
67 }
68
69 map<string, ::DBus::Variant> make_security_args(
70 const string &security_protocol,
71 const string &key_management_method) {
72 map<string, ::DBus::Variant> args;
73 ::DBus::MessageIter writer;
74 writer = args[security_protocol].writer();
75 writer <<
76 make_key_management_args(make_string_vector1(key_management_method));
77 return args;
78 }
79
80 const char *ParseSecurity(
81 const map<string, ::DBus::Variant> &properties) {
82 return WiFiEndpoint::ParseSecurity(properties);
83 }
Thieu Le1df7f4e2012-02-10 15:21:45 -080084
85 void AddIE(uint8_t type, vector<uint8_t> *ies) {
86 ies->push_back(type); // type
87 ies->push_back(4); // length
88 ies->insert(ies->end(), 3, 0); // OUI
89 ies->push_back(0); // data
90 }
mukesh agrawalb20776f2012-02-10 16:00:36 -080091
92 WiFiEndpoint *MakeOpenEndpoint(ProxyFactory *proxy_factory,
93 const WiFiRefPtr &wifi,
94 const std::string &ssid,
95 const std::string &bssid) {
96 return WiFiEndpoint::MakeOpenEndpoint(proxy_factory, wifi, ssid, bssid);
97 }
98
99 scoped_refptr<MockWiFi> wifi() { return wifi_; }
100
101 private:
102 scoped_refptr<MockWiFi> wifi_;
mukesh agrawal6e277772011-09-29 15:04:23 -0700103};
104
105TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAP) {
106 set<WiFiEndpoint::KeyManagement> parsed_methods;
107 WiFiEndpoint::ParseKeyManagementMethods(
108 make_key_management_args(make_string_vector1("something-eap")),
109 &parsed_methods);
110 EXPECT_TRUE(
111 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
112 EXPECT_FALSE(
113 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
114}
115
116TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsPSK) {
117 set<WiFiEndpoint::KeyManagement> parsed_methods;
118 WiFiEndpoint::ParseKeyManagementMethods(
119 make_key_management_args(make_string_vector1("something-psk")),
120 &parsed_methods);
121 EXPECT_TRUE(
122 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
123 EXPECT_FALSE(
124 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
125}
126
127TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK) {
128 set<WiFiEndpoint::KeyManagement> parsed_methods;
129 WiFiEndpoint::ParseKeyManagementMethods(
130 make_key_management_args(
131 make_string_vector2("something-eap", "something-psk")),
132 &parsed_methods);
133 EXPECT_TRUE(
134 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
135 EXPECT_TRUE(
136 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
137}
138
139TEST_F(WiFiEndpointTest, ParseSecurityRSN802_1x) {
140 EXPECT_STREQ(flimflam::kSecurity8021x,
141 ParseSecurity(make_security_args("RSN", "something-eap")));
142}
143
144TEST_F(WiFiEndpointTest, ParseSecurityWPA802_1x) {
145 EXPECT_STREQ(flimflam::kSecurity8021x,
146 ParseSecurity(make_security_args("WPA", "something-eap")));
147}
148
149TEST_F(WiFiEndpointTest, ParseSecurityRSNPSK) {
150 EXPECT_STREQ(flimflam::kSecurityRsn,
151 ParseSecurity(make_security_args("RSN", "something-psk")));
152}
153
154TEST_F(WiFiEndpointTest, ParseSecurityWPAPSK) {
155 EXPECT_STREQ(flimflam::kSecurityWpa,
156 ParseSecurity(make_security_args("WPA", "something-psk")));
157}
158
159TEST_F(WiFiEndpointTest, ParseSecurityWEP) {
160 map<string, ::DBus::Variant> top_params;
161 top_params[wpa_supplicant::kPropertyPrivacy].writer().append_bool(true);
162 EXPECT_STREQ(flimflam::kSecurityWep, ParseSecurity(top_params));
163}
164
165TEST_F(WiFiEndpointTest, ParseSecurityNone) {
166 map<string, ::DBus::Variant> top_params;
167 EXPECT_STREQ(flimflam::kSecurityNone, ParseSecurity(top_params));
168}
169
mukesh agrawal16bc1b82012-02-09 18:38:26 -0800170TEST_F(WiFiEndpointTest, SSIDWithNull) {
171 WiFiEndpointRefPtr endpoint =
mukesh agrawalb20776f2012-02-10 16:00:36 -0800172 MakeOpenEndpoint(NULL, NULL, string(1, 0), "00:00:00:00:00:01");
mukesh agrawal16bc1b82012-02-09 18:38:26 -0800173 EXPECT_EQ("?", endpoint->ssid_string());
174}
175
Thieu Le1df7f4e2012-02-10 15:21:45 -0800176TEST_F(WiFiEndpointTest, DeterminePhyMode) {
177 {
178 map<string, ::DBus::Variant> properties;
179 vector<uint8_t> ies;
180 AddIE(IEEE_80211::kElemIdErp, &ies);
181 ::DBus::MessageIter writer =
182 properties[wpa_supplicant::kBSSPropertyIEs].writer();
183 writer << ies;
184 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
185 WiFiEndpoint::DeterminePhyMode(properties, 2400));
186 }
187 {
188 map<string, ::DBus::Variant> properties;
189 vector<uint8_t> ies;
190 AddIE(IEEE_80211::kElemIdHTCap, &ies);
191 ::DBus::MessageIter writer =
192 properties[wpa_supplicant::kBSSPropertyIEs].writer();
193 writer << ies;
194 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
195 WiFiEndpoint::DeterminePhyMode(properties, 2400));
196 }
197 {
198 map<string, ::DBus::Variant> properties;
199 vector<uint8_t> ies;
200 AddIE(IEEE_80211::kElemIdHTInfo, &ies);
201 ::DBus::MessageIter writer =
202 properties[wpa_supplicant::kBSSPropertyIEs].writer();
203 writer << ies;
204 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
205 WiFiEndpoint::DeterminePhyMode(properties, 2400));
206 }
207 {
208 map<string, ::DBus::Variant> properties;
209 vector<uint8_t> ies;
210 AddIE(IEEE_80211::kElemIdErp, &ies);
211 AddIE(IEEE_80211::kElemIdHTCap, &ies);
212 ::DBus::MessageIter writer =
213 properties[wpa_supplicant::kBSSPropertyIEs].writer();
214 writer << ies;
215 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
216 WiFiEndpoint::DeterminePhyMode(properties, 2400));
217 }
218 {
219 map<string, ::DBus::Variant> properties;
220 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11a,
221 WiFiEndpoint::DeterminePhyMode(properties, 3200));
222 }
223 {
224 map<string, ::DBus::Variant> properties;
225 vector<uint32_t> rates(1, 22000000);
226 ::DBus::MessageIter writer =
227 properties[wpa_supplicant::kBSSPropertyRates].writer();
228 writer << rates;
229 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11b,
230 WiFiEndpoint::DeterminePhyMode(properties, 2400));
231 }
232 {
233 map<string, ::DBus::Variant> properties;
234 vector<uint32_t> rates(1, 54000000);
235 ::DBus::MessageIter writer =
236 properties[wpa_supplicant::kBSSPropertyRates].writer();
237 writer << rates;
238 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
239 WiFiEndpoint::DeterminePhyMode(properties, 2400));
240 }
241}
242
mukesh agrawalb20776f2012-02-10 16:00:36 -0800243TEST_F(WiFiEndpointTest, PropertiesChanged) {
244 WiFiEndpointRefPtr endpoint =
245 MakeOpenEndpoint(NULL, wifi(), "ssid", "00:00:00:00:00:01");
246 map<string, ::DBus::Variant> changed_properties;
247 ::DBus::MessageIter writer;
248 int16_t signal_strength = 10;
249
250 EXPECT_NE(signal_strength, endpoint->signal_strength());
251 writer =
252 changed_properties[wpa_supplicant::kBSSPropertySignal].writer();
253 writer << signal_strength;
254
255 EXPECT_CALL(*wifi(), NotifyEndpointChanged(_));
256 endpoint->PropertiesChanged(changed_properties);
257 EXPECT_EQ(signal_strength, endpoint->signal_strength());
258}
259
mukesh agrawal6e277772011-09-29 15:04:23 -0700260} // namespace shill