blob: eeaacced184147114610bc04029134fc70f61877 [file] [log] [blame]
[email protected]db8ff912012-06-12 23:32:511// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]5b45aec02009-03-31 01:03:232// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Lily Houghton582d4622018-01-22 22:43:405#include "net/proxy_resolution/proxy_config.h"
Avi Drissman4365a4782018-12-28 19:26:246#include "base/stl_util.h"
Lily Houghton582d4622018-01-22 22:43:407#include "net/proxy_resolution/proxy_config_service_common_unittest.h"
8#include "net/proxy_resolution/proxy_info.h"
[email protected]5b45aec02009-03-31 01:03:239#include "testing/gtest/include/gtest/gtest.h"
10
[email protected]3dfd29f2009-09-06 00:48:3711namespace net {
[email protected]5b45aec02009-03-31 01:03:2312namespace {
[email protected]3dfd29f2009-09-06 00:48:3713
14void ExpectProxyServerEquals(const char* expectation,
[email protected]2189e092013-03-16 18:02:0215 const ProxyList& proxy_servers) {
Raul Tambre94493c652019-03-11 17:18:3516 if (expectation == nullptr) {
[email protected]2189e092013-03-16 18:02:0217 EXPECT_TRUE(proxy_servers.IsEmpty());
[email protected]5b45aec02009-03-31 01:03:2318 } else {
[email protected]2189e092013-03-16 18:02:0219 EXPECT_EQ(expectation, proxy_servers.ToPacString());
[email protected]5b45aec02009-03-31 01:03:2320 }
21}
[email protected]5b45aec02009-03-31 01:03:2322
23TEST(ProxyConfigTest, Equals) {
24 // Test |ProxyConfig::auto_detect|.
25
[email protected]3dfd29f2009-09-06 00:48:3726 ProxyConfig config1;
[email protected]ed4ed0f2010-02-24 00:20:4827 config1.set_auto_detect(true);
[email protected]5b45aec02009-03-31 01:03:2328
[email protected]3dfd29f2009-09-06 00:48:3729 ProxyConfig config2;
[email protected]ed4ed0f2010-02-24 00:20:4830 config2.set_auto_detect(false);
[email protected]5b45aec02009-03-31 01:03:2331
32 EXPECT_FALSE(config1.Equals(config2));
33 EXPECT_FALSE(config2.Equals(config1));
34
[email protected]ed4ed0f2010-02-24 00:20:4835 config2.set_auto_detect(true);
[email protected]5b45aec02009-03-31 01:03:2336
37 EXPECT_TRUE(config1.Equals(config2));
38 EXPECT_TRUE(config2.Equals(config1));
39
40 // Test |ProxyConfig::pac_url|.
41
[email protected]ed4ed0f2010-02-24 00:20:4842 config2.set_pac_url(GURL("http://wpad/wpad.dat"));
[email protected]5b45aec02009-03-31 01:03:2343
44 EXPECT_FALSE(config1.Equals(config2));
45 EXPECT_FALSE(config2.Equals(config1));
46
[email protected]ed4ed0f2010-02-24 00:20:4847 config1.set_pac_url(GURL("http://wpad/wpad.dat"));
[email protected]5b45aec02009-03-31 01:03:2348
49 EXPECT_TRUE(config1.Equals(config2));
50 EXPECT_TRUE(config2.Equals(config1));
51
52 // Test |ProxyConfig::proxy_rules|.
53
Lily Houghtone6b617e2018-01-19 20:13:0754 config2.proxy_rules().type = ProxyConfig::ProxyRules::Type::PROXY_LIST;
[email protected]2189e092013-03-16 18:02:0255 config2.proxy_rules().single_proxies.SetSingleProxyServer(
56 ProxyServer::FromURI("myproxy:80", ProxyServer::SCHEME_HTTP));
[email protected]5b45aec02009-03-31 01:03:2357
58 EXPECT_FALSE(config1.Equals(config2));
59 EXPECT_FALSE(config2.Equals(config1));
60
Lily Houghtone6b617e2018-01-19 20:13:0761 config1.proxy_rules().type = ProxyConfig::ProxyRules::Type::PROXY_LIST;
[email protected]2189e092013-03-16 18:02:0262 config1.proxy_rules().single_proxies.SetSingleProxyServer(
63 ProxyServer::FromURI("myproxy:100", ProxyServer::SCHEME_HTTP));
[email protected]5b45aec02009-03-31 01:03:2364
65 EXPECT_FALSE(config1.Equals(config2));
66 EXPECT_FALSE(config2.Equals(config1));
67
[email protected]2189e092013-03-16 18:02:0268 config1.proxy_rules().single_proxies.SetSingleProxyServer(
69 ProxyServer::FromURI("myproxy", ProxyServer::SCHEME_HTTP));
[email protected]5b45aec02009-03-31 01:03:2370
71 EXPECT_TRUE(config1.Equals(config2));
72 EXPECT_TRUE(config2.Equals(config1));
73
[email protected]7541206c2010-02-19 20:24:0674 // Test |ProxyConfig::bypass_rules|.
[email protected]5b45aec02009-03-31 01:03:2375
[email protected]ed4ed0f2010-02-24 00:20:4876 config2.proxy_rules().bypass_rules.AddRuleFromString("*.google.com");
[email protected]5b45aec02009-03-31 01:03:2377
78 EXPECT_FALSE(config1.Equals(config2));
79 EXPECT_FALSE(config2.Equals(config1));
80
[email protected]ed4ed0f2010-02-24 00:20:4881 config1.proxy_rules().bypass_rules.AddRuleFromString("*.google.com");
[email protected]5b45aec02009-03-31 01:03:2382
83 EXPECT_TRUE(config1.Equals(config2));
84 EXPECT_TRUE(config2.Equals(config1));
[email protected]a48bf4a2010-06-14 18:24:5385
86 // Test |ProxyConfig::proxy_rules.reverse_bypass|.
87
88 config2.proxy_rules().reverse_bypass = true;
89
90 EXPECT_FALSE(config1.Equals(config2));
91 EXPECT_FALSE(config2.Equals(config1));
92
93 config1.proxy_rules().reverse_bypass = true;
94
95 EXPECT_TRUE(config1.Equals(config2));
96 EXPECT_TRUE(config2.Equals(config1));
[email protected]5b45aec02009-03-31 01:03:2397}
98
99TEST(ProxyConfigTest, ParseProxyRules) {
100 const struct {
101 const char* proxy_rules;
102
[email protected]3dfd29f2009-09-06 00:48:37103 ProxyConfig::ProxyRules::Type type;
[email protected]2189e092013-03-16 18:02:02104 // These will be PAC-stle strings, eg 'PROXY foo.com'
[email protected]5b45aec02009-03-31 01:03:23105 const char* single_proxy;
106 const char* proxy_for_http;
107 const char* proxy_for_https;
108 const char* proxy_for_ftp;
[email protected]2b6ed3dc2010-08-25 06:03:48109 const char* fallback_proxy;
[email protected]5b45aec02009-03-31 01:03:23110 } tests[] = {
Raul Tambre94493c652019-03-11 17:18:35111 // One HTTP proxy for all schemes.
112 {
113 "myproxy:80",
[email protected]5b45aec02009-03-31 01:03:23114
Raul Tambre94493c652019-03-11 17:18:35115 ProxyConfig::ProxyRules::Type::PROXY_LIST,
116 "PROXY myproxy:80",
117 nullptr,
118 nullptr,
119 nullptr,
120 nullptr,
[email protected]87a102b2009-07-14 05:23:30121 },
122
Raul Tambre94493c652019-03-11 17:18:35123 // Multiple HTTP proxies for all schemes.
124 {
125 "myproxy:80,https://myotherproxy",
[email protected]87a102b2009-07-14 05:23:30126
Raul Tambre94493c652019-03-11 17:18:35127 ProxyConfig::ProxyRules::Type::PROXY_LIST,
128 "PROXY myproxy:80;HTTPS myotherproxy:443",
129 nullptr,
130 nullptr,
131 nullptr,
132 nullptr,
[email protected]87a102b2009-07-14 05:23:30133 },
134
Raul Tambre94493c652019-03-11 17:18:35135 // Only specify a proxy server for "http://" urls.
136 {
137 "http=myproxy:80",
[email protected]5b45aec02009-03-31 01:03:23138
Raul Tambre94493c652019-03-11 17:18:35139 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
140 nullptr,
141 "PROXY myproxy:80",
142 nullptr,
143 nullptr,
144 nullptr,
145 },
[email protected]2189e092013-03-16 18:02:02146
Raul Tambre94493c652019-03-11 17:18:35147 // Specify an HTTP proxy for "ftp://" and a SOCKS proxy for "https://"
148 // urls.
149 {
150 "ftp=ftp-proxy ; https=socks4://foopy",
[email protected]2189e092013-03-16 18:02:02151
Raul Tambre94493c652019-03-11 17:18:35152 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
153 nullptr,
154 nullptr,
155 "SOCKS foopy:1080",
156 "PROXY ftp-proxy:80",
157 nullptr,
158 },
[email protected]2189e092013-03-16 18:02:02159
Raul Tambre94493c652019-03-11 17:18:35160 // Give a scheme-specific proxy as well as a non-scheme specific.
161 // The first entry "foopy" takes precedance marking this list as
162 // Type::PROXY_LIST.
163 {
164 "foopy ; ftp=ftp-proxy",
[email protected]2189e092013-03-16 18:02:02165
Raul Tambre94493c652019-03-11 17:18:35166 ProxyConfig::ProxyRules::Type::PROXY_LIST,
167 "PROXY foopy:80",
168 nullptr,
169 nullptr,
170 nullptr,
171 nullptr,
172 },
173
174 // Give a scheme-specific proxy as well as a non-scheme specific.
175 // The first entry "ftp=ftp-proxy" takes precedance marking this list as
176 // Type::PROXY_LIST_PER_SCHEME.
177 {
178 "ftp=ftp-proxy ; foopy",
179
180 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
181 nullptr,
182 nullptr,
183 nullptr,
184 "PROXY ftp-proxy:80",
185 nullptr,
186 },
187
188 // Include a list of entries for a single scheme.
189 {
190 "ftp=ftp1,ftp2,ftp3",
191
192 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
193 nullptr,
194 nullptr,
195 nullptr,
196 "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
197 nullptr,
198 },
199
200 // Include multiple entries for the same scheme -- they accumulate.
201 {
202 "http=http1,http2; http=http3",
203
204 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
205 nullptr,
206 "PROXY http1:80;PROXY http2:80;PROXY http3:80",
207 nullptr,
208 nullptr,
209 nullptr,
210 },
211
212 // Include lists of entries for multiple schemes.
213 {
214 "ftp=ftp1,ftp2,ftp3 ; http=http1,http2; ",
215
216 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
217 nullptr,
218 "PROXY http1:80;PROXY http2:80",
219 nullptr,
220 "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
221 nullptr,
222 },
223
224 // Include non-default proxy schemes.
225 {
226 "http=https://secure_proxy; ftp=socks4://socks_proxy; "
227 "https=socks://foo",
228
229 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
230 nullptr,
231 "HTTPS secure_proxy:443",
232 "SOCKS5 foo:1080",
233 "SOCKS socks_proxy:1080",
234 nullptr,
235 },
236
237 // Only SOCKS proxy present, others being blank.
238 {
239 "socks=foopy",
240
241 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
242 nullptr,
243 nullptr,
244 nullptr,
245 nullptr,
246 "SOCKS foopy:1080",
247 },
248
249 // SOCKS proxy present along with other proxies too
250 {
251 "http=httpproxy ; https=httpsproxy ; ftp=ftpproxy ; socks=foopy ",
252
253 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
254 nullptr,
255 "PROXY httpproxy:80",
256 "PROXY httpsproxy:80",
257 "PROXY ftpproxy:80",
258 "SOCKS foopy:1080",
259 },
260
261 // SOCKS proxy (with modifier) present along with some proxies
262 // (FTP being blank)
263 {
264 "http=httpproxy ; https=httpsproxy ; socks=socks5://foopy ",
265
266 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
267 nullptr,
268 "PROXY httpproxy:80",
269 "PROXY httpsproxy:80",
270 nullptr,
271 "SOCKS5 foopy:1080",
272 },
273
274 // Include unsupported schemes -- they are discarded.
275 {
276 "crazy=foopy ; foo=bar ; https=myhttpsproxy",
277
278 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
279 nullptr,
280 nullptr,
281 "PROXY myhttpsproxy:80",
282 nullptr,
283 nullptr,
284 },
285
286 // direct:// as first option for a scheme.
287 {
288 "http=direct://,myhttpproxy; https=direct://",
289
290 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
291 nullptr,
292 "DIRECT;PROXY myhttpproxy:80",
293 "DIRECT",
294 nullptr,
295 nullptr,
296 },
297
298 // direct:// as a second option for a scheme.
299 {
300 "http=myhttpproxy,direct://",
301
302 ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
303 nullptr,
304 "PROXY myhttpproxy:80;DIRECT",
305 nullptr,
306 nullptr,
307 nullptr,
308 },
[email protected]2189e092013-03-16 18:02:02309
[email protected]5b45aec02009-03-31 01:03:23310 };
311
[email protected]3dfd29f2009-09-06 00:48:37312 ProxyConfig config;
[email protected]5b45aec02009-03-31 01:03:23313
Avi Drissman4365a4782018-12-28 19:26:24314 for (size_t i = 0; i < base::size(tests); ++i) {
[email protected]ed4ed0f2010-02-24 00:20:48315 config.proxy_rules().ParseFromString(tests[i].proxy_rules);
[email protected]5b45aec02009-03-31 01:03:23316
[email protected]ed4ed0f2010-02-24 00:20:48317 EXPECT_EQ(tests[i].type, config.proxy_rules().type);
[email protected]5b45aec02009-03-31 01:03:23318 ExpectProxyServerEquals(tests[i].single_proxy,
[email protected]2189e092013-03-16 18:02:02319 config.proxy_rules().single_proxies);
[email protected]5b45aec02009-03-31 01:03:23320 ExpectProxyServerEquals(tests[i].proxy_for_http,
[email protected]2189e092013-03-16 18:02:02321 config.proxy_rules().proxies_for_http);
[email protected]5b45aec02009-03-31 01:03:23322 ExpectProxyServerEquals(tests[i].proxy_for_https,
[email protected]2189e092013-03-16 18:02:02323 config.proxy_rules().proxies_for_https);
[email protected]5b45aec02009-03-31 01:03:23324 ExpectProxyServerEquals(tests[i].proxy_for_ftp,
[email protected]2189e092013-03-16 18:02:02325 config.proxy_rules().proxies_for_ftp);
[email protected]2b6ed3dc2010-08-25 06:03:48326 ExpectProxyServerEquals(tests[i].fallback_proxy,
[email protected]2189e092013-03-16 18:02:02327 config.proxy_rules().fallback_proxies);
[email protected]5b45aec02009-03-31 01:03:23328 }
329}
[email protected]ab501a6a2009-05-12 15:07:50330
[email protected]db8ff912012-06-12 23:32:51331TEST(ProxyConfigTest, ProxyRulesSetBypassFlag) {
332 // Test whether the did_bypass_proxy() flag is set in proxy info correctly.
333 ProxyConfig::ProxyRules rules;
334 ProxyInfo result;
335
336 rules.ParseFromString("http=httpproxy:80");
337 rules.bypass_rules.AddRuleFromString(".com");
338
339 rules.Apply(GURL("http://example.com"), &result);
340 EXPECT_TRUE(result.is_direct_only());
341 EXPECT_TRUE(result.did_bypass_proxy());
342
343 rules.Apply(GURL("http://example.org"), &result);
344 EXPECT_FALSE(result.is_direct());
345 EXPECT_FALSE(result.did_bypass_proxy());
346
347 // Try with reversed bypass rules.
348 rules.reverse_bypass = true;
349
350 rules.Apply(GURL("http://example.org"), &result);
351 EXPECT_TRUE(result.is_direct_only());
352 EXPECT_TRUE(result.did_bypass_proxy());
353
354 rules.Apply(GURL("http://example.com"), &result);
355 EXPECT_FALSE(result.is_direct());
356 EXPECT_FALSE(result.did_bypass_proxy());
357}
358
riceabec95602014-10-30 05:05:07359static const char kWsUrl[] = "ws://example.com/echo";
360static const char kWssUrl[] = "wss://example.com/echo";
361
362class ProxyConfigWebSocketTest : public ::testing::Test {
363 protected:
364 void ParseFromString(const std::string& rules) {
365 rules_.ParseFromString(rules);
366 }
367 void Apply(const GURL& gurl) { rules_.Apply(gurl, &info_); }
368 std::string ToPacString() const { return info_.ToPacString(); }
369
370 static GURL WsUrl() { return GURL(kWsUrl); }
371 static GURL WssUrl() { return GURL(kWssUrl); }
372
373 ProxyConfig::ProxyRules rules_;
374 ProxyInfo info_;
375};
376
377// If a single proxy is set for all protocols, WebSocket uses it.
378TEST_F(ProxyConfigWebSocketTest, UsesProxy) {
379 ParseFromString("proxy:3128");
380 Apply(WsUrl());
381 EXPECT_EQ("PROXY proxy:3128", ToPacString());
382}
383
384// See RFC6455 Section 4.1. item 3, "_Proxy Usage_".
385TEST_F(ProxyConfigWebSocketTest, PrefersSocks) {
386 ParseFromString(
387 "http=proxy:3128 ; https=sslproxy:3128 ; socks=socksproxy:1080");
388 Apply(WsUrl());
389 EXPECT_EQ("SOCKS socksproxy:1080", ToPacString());
390}
391
392TEST_F(ProxyConfigWebSocketTest, PrefersHttpsToHttp) {
393 ParseFromString("http=proxy:3128 ; https=sslproxy:3128");
394 Apply(WssUrl());
395 EXPECT_EQ("PROXY sslproxy:3128", ToPacString());
396}
397
398TEST_F(ProxyConfigWebSocketTest, PrefersHttpsEvenForWs) {
399 ParseFromString("http=proxy:3128 ; https=sslproxy:3128");
400 Apply(WsUrl());
401 EXPECT_EQ("PROXY sslproxy:3128", ToPacString());
402}
403
404TEST_F(ProxyConfigWebSocketTest, PrefersHttpToDirect) {
405 ParseFromString("http=proxy:3128");
406 Apply(WssUrl());
407 EXPECT_EQ("PROXY proxy:3128", ToPacString());
408}
409
410TEST_F(ProxyConfigWebSocketTest, IgnoresFtpProxy) {
411 ParseFromString("ftp=ftpproxy:3128");
412 Apply(WssUrl());
413 EXPECT_EQ("DIRECT", ToPacString());
414}
415
416TEST_F(ProxyConfigWebSocketTest, ObeysBypassRules) {
417 ParseFromString("http=proxy:3128 ; https=sslproxy:3128");
418 rules_.bypass_rules.AddRuleFromString(".chromium.org");
419 Apply(GURL("wss://codereview.chromium.org/feed"));
420 EXPECT_EQ("DIRECT", ToPacString());
421}
422
423TEST_F(ProxyConfigWebSocketTest, ObeysLocalBypass) {
424 ParseFromString("http=proxy:3128 ; https=sslproxy:3128");
425 rules_.bypass_rules.AddRuleFromString("<local>");
426 Apply(GURL("ws://localhost/feed"));
427 EXPECT_EQ("DIRECT", ToPacString());
428}
429
[email protected]3dfd29f2009-09-06 00:48:37430} // namespace
431} // namespace net