1 // Copyright (c) 2010 The Chromium 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 "base/basictypes.h"
6 #include "net/proxy/proxy_server.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 // Test the creation of ProxyServer using ProxyServer::FromURI, which parses
10 // inputs of the form [<scheme>"://"]<host>[":"<port>]. Verify that each part
11 // was labelled correctly, and the accessors all give the right data.
TEST(ProxyServerTest,FromURI)12 TEST(ProxyServerTest, FromURI) {
13 const struct {
14 const char* input_uri;
15 const char* expected_uri;
16 net::ProxyServer::Scheme expected_scheme;
17 const char* expected_host;
18 int expected_port;
19 const char* expected_pac_string;
20 } tests[] = {
21 // HTTP proxy URIs:
22 {
23 "foopy:10", // No scheme.
24 "foopy:10",
25 net::ProxyServer::SCHEME_HTTP,
26 "foopy",
27 10,
28 "PROXY foopy:10"
29 },
30 {
31 "http://foopy", // No port.
32 "foopy:80",
33 net::ProxyServer::SCHEME_HTTP,
34 "foopy",
35 80,
36 "PROXY foopy:80"
37 },
38 {
39 "http://foopy:10",
40 "foopy:10",
41 net::ProxyServer::SCHEME_HTTP,
42 "foopy",
43 10,
44 "PROXY foopy:10"
45 },
46
47 // IPv6 HTTP proxy URIs:
48 {
49 "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:10", // No scheme.
50 "[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:10",
51 net::ProxyServer::SCHEME_HTTP,
52 "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210",
53 10,
54 "PROXY [FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:10"
55 },
56 {
57 "http://[3ffe:2a00:100:7031::1]", // No port.
58 "[3ffe:2a00:100:7031::1]:80",
59 net::ProxyServer::SCHEME_HTTP,
60 "3ffe:2a00:100:7031::1",
61 80,
62 "PROXY [3ffe:2a00:100:7031::1]:80"
63 },
64 {
65 "http://[::192.9.5.5]",
66 "[::192.9.5.5]:80",
67 net::ProxyServer::SCHEME_HTTP,
68 "::192.9.5.5",
69 80,
70 "PROXY [::192.9.5.5]:80"
71 },
72 {
73 "http://[::FFFF:129.144.52.38]:80",
74 "[::FFFF:129.144.52.38]:80",
75 net::ProxyServer::SCHEME_HTTP,
76 "::FFFF:129.144.52.38",
77 80,
78 "PROXY [::FFFF:129.144.52.38]:80"
79 },
80
81 // SOCKS4 proxy URIs:
82 {
83 "socks4://foopy", // No port.
84 "socks4://foopy:1080",
85 net::ProxyServer::SCHEME_SOCKS4,
86 "foopy",
87 1080,
88 "SOCKS foopy:1080"
89 },
90 {
91 "socks4://foopy:10",
92 "socks4://foopy:10",
93 net::ProxyServer::SCHEME_SOCKS4,
94 "foopy",
95 10,
96 "SOCKS foopy:10"
97 },
98
99 // SOCKS5 proxy URIs
100 {
101 "socks5://foopy", // No port.
102 "socks5://foopy:1080",
103 net::ProxyServer::SCHEME_SOCKS5,
104 "foopy",
105 1080,
106 "SOCKS5 foopy:1080"
107 },
108 {
109 "socks5://foopy:10",
110 "socks5://foopy:10",
111 net::ProxyServer::SCHEME_SOCKS5,
112 "foopy",
113 10,
114 "SOCKS5 foopy:10"
115 },
116
117 // SOCKS proxy URIs (should default to SOCKS5)
118 {
119 "socks://foopy", // No port.
120 "socks5://foopy:1080",
121 net::ProxyServer::SCHEME_SOCKS5,
122 "foopy",
123 1080,
124 "SOCKS5 foopy:1080"
125 },
126 {
127 "socks://foopy:10",
128 "socks5://foopy:10",
129 net::ProxyServer::SCHEME_SOCKS5,
130 "foopy",
131 10,
132 "SOCKS5 foopy:10"
133 },
134
135 // HTTPS proxy URIs:
136 {
137 "https://foopy", // No port
138 "https://foopy:443",
139 net::ProxyServer::SCHEME_HTTPS,
140 "foopy",
141 443,
142 "HTTPS foopy:443"
143 },
144 {
145 "https://foopy:10", // Non-standard port
146 "https://foopy:10",
147 net::ProxyServer::SCHEME_HTTPS,
148 "foopy",
149 10,
150 "HTTPS foopy:10"
151 },
152 {
153 "https://1.2.3.4:10", // IP Address
154 "https://1.2.3.4:10",
155 net::ProxyServer::SCHEME_HTTPS,
156 "1.2.3.4",
157 10,
158 "HTTPS 1.2.3.4:10"
159 },
160 };
161
162 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
163 net::ProxyServer uri =
164 net::ProxyServer::FromURI(tests[i].input_uri,
165 net::ProxyServer::SCHEME_HTTP);
166 EXPECT_TRUE(uri.is_valid());
167 EXPECT_FALSE(uri.is_direct());
168 EXPECT_EQ(tests[i].expected_uri, uri.ToURI());
169 EXPECT_EQ(tests[i].expected_scheme, uri.scheme());
170 EXPECT_EQ(tests[i].expected_host, uri.host_port_pair().host());
171 EXPECT_EQ(tests[i].expected_port, uri.host_port_pair().port());
172 EXPECT_EQ(tests[i].expected_pac_string, uri.ToPacString());
173 }
174 }
175
TEST(ProxyServerTest,DefaultConstructor)176 TEST(ProxyServerTest, DefaultConstructor) {
177 net::ProxyServer proxy_server;
178 EXPECT_FALSE(proxy_server.is_valid());
179 }
180
181 // Test parsing of the special URI form "direct://". Analagous to the "DIRECT"
182 // entry in a PAC result.
TEST(ProxyServerTest,Direct)183 TEST(ProxyServerTest, Direct) {
184 net::ProxyServer uri =
185 net::ProxyServer::FromURI("direct://", net::ProxyServer::SCHEME_HTTP);
186 EXPECT_TRUE(uri.is_valid());
187 EXPECT_TRUE(uri.is_direct());
188 EXPECT_EQ("direct://", uri.ToURI());
189 EXPECT_EQ("DIRECT", uri.ToPacString());
190 }
191
192 // Test parsing some invalid inputs.
TEST(ProxyServerTest,Invalid)193 TEST(ProxyServerTest, Invalid) {
194 const char* tests[] = {
195 "",
196 " ",
197 "dddf:", // not a valid port
198 "dddd:d", // not a valid port
199 "http://", // not a valid host/port.
200 "direct://xyz", // direct is not allowed a host/port.
201 "http:/", // ambiguous, but will fail because of bad port.
202 "http:", // ambiguous, but will fail because of bad port.
203 };
204
205 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
206 net::ProxyServer uri =
207 net::ProxyServer::FromURI(tests[i], net::ProxyServer::SCHEME_HTTP);
208 EXPECT_FALSE(uri.is_valid());
209 EXPECT_FALSE(uri.is_direct());
210 EXPECT_FALSE(uri.is_http());
211 EXPECT_FALSE(uri.is_socks());
212 }
213 }
214
215 // Test that LWS (SP | HT) is disregarded from the ends.
TEST(ProxyServerTest,Whitespace)216 TEST(ProxyServerTest, Whitespace) {
217 const char* tests[] = {
218 " foopy:80",
219 "foopy:80 \t",
220 " \tfoopy:80 ",
221 };
222
223 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
224 net::ProxyServer uri =
225 net::ProxyServer::FromURI(tests[i], net::ProxyServer::SCHEME_HTTP);
226 EXPECT_EQ("foopy:80", uri.ToURI());
227 }
228 }
229
230 // Test parsing a ProxyServer from a PAC representation.
TEST(ProxyServerTest,FromPACString)231 TEST(ProxyServerTest, FromPACString) {
232 const struct {
233 const char* input_pac;
234 const char* expected_uri;
235 } tests[] = {
236 {
237 "PROXY foopy:10",
238 "foopy:10",
239 },
240 {
241 " PROXY foopy:10 ",
242 "foopy:10",
243 },
244 {
245 "pRoXy foopy:10",
246 "foopy:10",
247 },
248 {
249 "PROXY foopy", // No port.
250 "foopy:80",
251 },
252 {
253 "socks foopy",
254 "socks4://foopy:1080",
255 },
256 {
257 "socks4 foopy",
258 "socks4://foopy:1080",
259 },
260 {
261 "socks5 foopy",
262 "socks5://foopy:1080",
263 },
264 {
265 "socks5 foopy:11",
266 "socks5://foopy:11",
267 },
268 {
269 " direct ",
270 "direct://",
271 },
272 {
273 "https foopy",
274 "https://foopy:443",
275 },
276 {
277 "https foopy:10",
278 "https://foopy:10",
279 },
280 };
281
282 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
283 net::ProxyServer uri = net::ProxyServer::FromPacString(tests[i].input_pac);
284 EXPECT_TRUE(uri.is_valid());
285 EXPECT_EQ(tests[i].expected_uri, uri.ToURI());
286 }
287 }
288
289 // Test parsing a ProxyServer from an invalid PAC representation.
TEST(ProxyServerTest,FromPACStringInvalid)290 TEST(ProxyServerTest, FromPACStringInvalid) {
291 const char* tests[] = {
292 "PROXY", // missing host/port.
293 "HTTPS", // missing host/port.
294 "SOCKS", // missing host/port.
295 "DIRECT foopy:10", // direct cannot have host/port.
296 };
297
298 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
299 net::ProxyServer uri = net::ProxyServer::FromPacString(tests[i]);
300 EXPECT_FALSE(uri.is_valid());
301 }
302 }
303
TEST(ProxyServerTest,ComparatorAndEquality)304 TEST(ProxyServerTest, ComparatorAndEquality) {
305 struct {
306 // Inputs.
307 const char* server1;
308 const char* server2;
309
310 // Expectation.
311 // -1 means server1 is less than server2
312 // 0 means server1 equals server2
313 // 1 means server1 is greater than server2
314 int expected_comparison;
315 } tests[] = {
316 { // Equal.
317 "foo:11",
318 "http://foo:11",
319 0
320 },
321 { // Port is different.
322 "foo:333",
323 "foo:444",
324 -1
325 },
326 { // Host is different.
327 "foo:33",
328 "bar:33",
329 1
330 },
331 { // Scheme is different.
332 "socks4://foo:33",
333 "http://foo:33",
334 1
335 },
336 };
337
338 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
339 // Parse the expected inputs to ProxyServer instances.
340 const net::ProxyServer server1 =
341 net::ProxyServer::FromURI(
342 tests[i].server1, net::ProxyServer::SCHEME_HTTP);
343
344 const net::ProxyServer server2 =
345 net::ProxyServer::FromURI(
346 tests[i].server2, net::ProxyServer::SCHEME_HTTP);
347
348 switch (tests[i].expected_comparison) {
349 case -1:
350 EXPECT_TRUE(server1 < server2);
351 EXPECT_FALSE(server2 < server1);
352 EXPECT_FALSE(server2 == server1);
353 break;
354 case 0:
355 EXPECT_FALSE(server1 < server2);
356 EXPECT_FALSE(server2 < server1);
357 EXPECT_TRUE(server2 == server1);
358 break;
359 case 1:
360 EXPECT_FALSE(server1 < server2);
361 EXPECT_TRUE(server2 < server1);
362 EXPECT_FALSE(server2 == server1);
363 break;
364 default:
365 FAIL() << "Invalid expectation. Can be only -1, 0, 1";
366 }
367 }
368 }
369