blob: f939e907d95021fbb51f704218632bf31c2c2de3 [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
Eric Shienbrood3e20a232012-02-16 11:35:56 -050012#include <base/stl_util.h>
mukesh agrawal6e277772011-09-29 15:04:23 -070013#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) {
mukesh agrawale1d90e92012-02-15 17:36:08 -080096 return WiFiEndpoint::MakeOpenEndpoint(
97 proxy_factory, wifi, ssid, bssid, 0, 0);
mukesh agrawalb20776f2012-02-10 16:00:36 -080098 }
99
100 scoped_refptr<MockWiFi> wifi() { return wifi_; }
101
102 private:
103 scoped_refptr<MockWiFi> wifi_;
mukesh agrawal6e277772011-09-29 15:04:23 -0700104};
105
106TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAP) {
107 set<WiFiEndpoint::KeyManagement> parsed_methods;
108 WiFiEndpoint::ParseKeyManagementMethods(
109 make_key_management_args(make_string_vector1("something-eap")),
110 &parsed_methods);
111 EXPECT_TRUE(
112 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
113 EXPECT_FALSE(
114 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
115}
116
117TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsPSK) {
118 set<WiFiEndpoint::KeyManagement> parsed_methods;
119 WiFiEndpoint::ParseKeyManagementMethods(
120 make_key_management_args(make_string_vector1("something-psk")),
121 &parsed_methods);
122 EXPECT_TRUE(
123 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
124 EXPECT_FALSE(
125 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
126}
127
128TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK) {
129 set<WiFiEndpoint::KeyManagement> parsed_methods;
130 WiFiEndpoint::ParseKeyManagementMethods(
131 make_key_management_args(
132 make_string_vector2("something-eap", "something-psk")),
133 &parsed_methods);
134 EXPECT_TRUE(
135 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagement802_1x));
136 EXPECT_TRUE(
137 ContainsKey(parsed_methods, WiFiEndpoint::kKeyManagementPSK));
138}
139
140TEST_F(WiFiEndpointTest, ParseSecurityRSN802_1x) {
141 EXPECT_STREQ(flimflam::kSecurity8021x,
142 ParseSecurity(make_security_args("RSN", "something-eap")));
143}
144
145TEST_F(WiFiEndpointTest, ParseSecurityWPA802_1x) {
146 EXPECT_STREQ(flimflam::kSecurity8021x,
147 ParseSecurity(make_security_args("WPA", "something-eap")));
148}
149
150TEST_F(WiFiEndpointTest, ParseSecurityRSNPSK) {
151 EXPECT_STREQ(flimflam::kSecurityRsn,
152 ParseSecurity(make_security_args("RSN", "something-psk")));
153}
154
155TEST_F(WiFiEndpointTest, ParseSecurityWPAPSK) {
156 EXPECT_STREQ(flimflam::kSecurityWpa,
157 ParseSecurity(make_security_args("WPA", "something-psk")));
158}
159
160TEST_F(WiFiEndpointTest, ParseSecurityWEP) {
161 map<string, ::DBus::Variant> top_params;
162 top_params[wpa_supplicant::kPropertyPrivacy].writer().append_bool(true);
163 EXPECT_STREQ(flimflam::kSecurityWep, ParseSecurity(top_params));
164}
165
166TEST_F(WiFiEndpointTest, ParseSecurityNone) {
167 map<string, ::DBus::Variant> top_params;
168 EXPECT_STREQ(flimflam::kSecurityNone, ParseSecurity(top_params));
169}
170
mukesh agrawal16bc1b82012-02-09 18:38:26 -0800171TEST_F(WiFiEndpointTest, SSIDWithNull) {
172 WiFiEndpointRefPtr endpoint =
mukesh agrawalb20776f2012-02-10 16:00:36 -0800173 MakeOpenEndpoint(NULL, NULL, string(1, 0), "00:00:00:00:00:01");
mukesh agrawal16bc1b82012-02-09 18:38:26 -0800174 EXPECT_EQ("?", endpoint->ssid_string());
175}
176
Thieu Le1df7f4e2012-02-10 15:21:45 -0800177TEST_F(WiFiEndpointTest, DeterminePhyMode) {
178 {
179 map<string, ::DBus::Variant> properties;
180 vector<uint8_t> ies;
181 AddIE(IEEE_80211::kElemIdErp, &ies);
182 ::DBus::MessageIter writer =
183 properties[wpa_supplicant::kBSSPropertyIEs].writer();
184 writer << ies;
185 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
186 WiFiEndpoint::DeterminePhyMode(properties, 2400));
187 }
188 {
189 map<string, ::DBus::Variant> properties;
190 vector<uint8_t> ies;
191 AddIE(IEEE_80211::kElemIdHTCap, &ies);
192 ::DBus::MessageIter writer =
193 properties[wpa_supplicant::kBSSPropertyIEs].writer();
194 writer << ies;
195 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
196 WiFiEndpoint::DeterminePhyMode(properties, 2400));
197 }
198 {
199 map<string, ::DBus::Variant> properties;
200 vector<uint8_t> ies;
201 AddIE(IEEE_80211::kElemIdHTInfo, &ies);
202 ::DBus::MessageIter writer =
203 properties[wpa_supplicant::kBSSPropertyIEs].writer();
204 writer << ies;
205 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
206 WiFiEndpoint::DeterminePhyMode(properties, 2400));
207 }
208 {
209 map<string, ::DBus::Variant> properties;
210 vector<uint8_t> ies;
211 AddIE(IEEE_80211::kElemIdErp, &ies);
212 AddIE(IEEE_80211::kElemIdHTCap, &ies);
213 ::DBus::MessageIter writer =
214 properties[wpa_supplicant::kBSSPropertyIEs].writer();
215 writer << ies;
216 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11n,
217 WiFiEndpoint::DeterminePhyMode(properties, 2400));
218 }
219 {
220 map<string, ::DBus::Variant> properties;
221 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11a,
222 WiFiEndpoint::DeterminePhyMode(properties, 3200));
223 }
224 {
225 map<string, ::DBus::Variant> properties;
226 vector<uint32_t> rates(1, 22000000);
227 ::DBus::MessageIter writer =
228 properties[wpa_supplicant::kBSSPropertyRates].writer();
229 writer << rates;
230 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11b,
231 WiFiEndpoint::DeterminePhyMode(properties, 2400));
232 }
233 {
234 map<string, ::DBus::Variant> properties;
235 vector<uint32_t> rates(1, 54000000);
236 ::DBus::MessageIter writer =
237 properties[wpa_supplicant::kBSSPropertyRates].writer();
238 writer << rates;
239 EXPECT_EQ(Metrics::kWiFiNetworkPhyMode11g,
240 WiFiEndpoint::DeterminePhyMode(properties, 2400));
241 }
242}
243
mukesh agrawalb20776f2012-02-10 16:00:36 -0800244TEST_F(WiFiEndpointTest, PropertiesChanged) {
245 WiFiEndpointRefPtr endpoint =
246 MakeOpenEndpoint(NULL, wifi(), "ssid", "00:00:00:00:00:01");
247 map<string, ::DBus::Variant> changed_properties;
248 ::DBus::MessageIter writer;
249 int16_t signal_strength = 10;
250
251 EXPECT_NE(signal_strength, endpoint->signal_strength());
252 writer =
253 changed_properties[wpa_supplicant::kBSSPropertySignal].writer();
254 writer << signal_strength;
255
256 EXPECT_CALL(*wifi(), NotifyEndpointChanged(_));
257 endpoint->PropertiesChanged(changed_properties);
258 EXPECT_EQ(signal_strength, endpoint->signal_strength());
259}
260
mukesh agrawal6e277772011-09-29 15:04:23 -0700261} // namespace shill