1 // Copyright (c) 2012 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.
5 #include "net/proxy/proxy_config.h"
6 #include "net/proxy/proxy_config_service_common_unittest.h"
7 #include "net/proxy/proxy_info.h"
8 #include "testing/gtest/include/gtest/gtest.h"
13 void ExpectProxyServerEquals(const char* expectation
,
14 const ProxyServer
& proxy_server
) {
15 if (expectation
== NULL
) {
16 EXPECT_FALSE(proxy_server
.is_valid());
18 EXPECT_EQ(expectation
, proxy_server
.ToURI());
22 TEST(ProxyConfigTest
, Equals
) {
23 // Test |ProxyConfig::auto_detect|.
26 config1
.set_auto_detect(true);
29 config2
.set_auto_detect(false);
31 EXPECT_FALSE(config1
.Equals(config2
));
32 EXPECT_FALSE(config2
.Equals(config1
));
34 config2
.set_auto_detect(true);
36 EXPECT_TRUE(config1
.Equals(config2
));
37 EXPECT_TRUE(config2
.Equals(config1
));
39 // Test |ProxyConfig::pac_url|.
41 config2
.set_pac_url(GURL("http://wpad/wpad.dat"));
43 EXPECT_FALSE(config1
.Equals(config2
));
44 EXPECT_FALSE(config2
.Equals(config1
));
46 config1
.set_pac_url(GURL("http://wpad/wpad.dat"));
48 EXPECT_TRUE(config1
.Equals(config2
));
49 EXPECT_TRUE(config2
.Equals(config1
));
51 // Test |ProxyConfig::proxy_rules|.
53 config2
.proxy_rules().type
= ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY
;
54 config2
.proxy_rules().single_proxy
=
55 ProxyServer::FromURI("myproxy:80", ProxyServer::SCHEME_HTTP
);
57 EXPECT_FALSE(config1
.Equals(config2
));
58 EXPECT_FALSE(config2
.Equals(config1
));
60 config1
.proxy_rules().type
= ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY
;
61 config1
.proxy_rules().single_proxy
=
62 ProxyServer::FromURI("myproxy:100", ProxyServer::SCHEME_HTTP
);
64 EXPECT_FALSE(config1
.Equals(config2
));
65 EXPECT_FALSE(config2
.Equals(config1
));
67 config1
.proxy_rules().single_proxy
=
68 ProxyServer::FromURI("myproxy", ProxyServer::SCHEME_HTTP
);
70 EXPECT_TRUE(config1
.Equals(config2
));
71 EXPECT_TRUE(config2
.Equals(config1
));
73 // Test |ProxyConfig::bypass_rules|.
75 config2
.proxy_rules().bypass_rules
.AddRuleFromString("*.google.com");
77 EXPECT_FALSE(config1
.Equals(config2
));
78 EXPECT_FALSE(config2
.Equals(config1
));
80 config1
.proxy_rules().bypass_rules
.AddRuleFromString("*.google.com");
82 EXPECT_TRUE(config1
.Equals(config2
));
83 EXPECT_TRUE(config2
.Equals(config1
));
85 // Test |ProxyConfig::proxy_rules.reverse_bypass|.
87 config2
.proxy_rules().reverse_bypass
= true;
89 EXPECT_FALSE(config1
.Equals(config2
));
90 EXPECT_FALSE(config2
.Equals(config1
));
92 config1
.proxy_rules().reverse_bypass
= true;
94 EXPECT_TRUE(config1
.Equals(config2
));
95 EXPECT_TRUE(config2
.Equals(config1
));
98 TEST(ProxyConfigTest
, ParseProxyRules
) {
100 const char* proxy_rules
;
102 ProxyConfig::ProxyRules::Type type
;
103 const char* single_proxy
;
104 const char* proxy_for_http
;
105 const char* proxy_for_https
;
106 const char* proxy_for_ftp
;
107 const char* fallback_proxy
;
109 // One HTTP proxy for all schemes.
113 ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY
,
121 // Only specify a proxy server for "http://" urls.
125 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
133 // Specify an HTTP proxy for "ftp://" and a SOCKS proxy for "https://" urls.
135 "ftp=ftp-proxy ; https=socks4://foopy",
137 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
140 "socks4://foopy:1080",
145 // Give a scheme-specific proxy as well as a non-scheme specific.
146 // The first entry "foopy" takes precedance marking this list as
147 // TYPE_SINGLE_PROXY.
149 "foopy ; ftp=ftp-proxy",
151 ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY
,
159 // Give a scheme-specific proxy as well as a non-scheme specific.
160 // The first entry "ftp=ftp-proxy" takes precedance marking this list as
161 // TYPE_PROXY_PER_SCHEME.
163 "ftp=ftp-proxy ; foopy",
165 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
173 // Include duplicate entries -- last one wins.
175 "ftp=ftp1 ; ftp=ftp2 ; ftp=ftp3",
177 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
185 // Only SOCKS proxy present, others being blank.
189 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
194 "socks4://foopy:1080",
197 // SOCKS proxy present along with other proxies too
199 "http=httpproxy ; https=httpsproxy ; ftp=ftpproxy ; socks=foopy ",
201 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
206 "socks4://foopy:1080",
209 // SOCKS proxy (with modifier) present along with some proxies
212 "http=httpproxy ; https=httpsproxy ; socks=socks5://foopy ",
214 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
219 "socks5://foopy:1080",
222 // Include unsupported schemes -- they are discarded.
224 "crazy=foopy ; foo=bar ; https=myhttpsproxy",
226 ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME
,
237 for (size_t i
= 0; i
< ARRAYSIZE_UNSAFE(tests
); ++i
) {
238 config
.proxy_rules().ParseFromString(tests
[i
].proxy_rules
);
240 EXPECT_EQ(tests
[i
].type
, config
.proxy_rules().type
);
241 ExpectProxyServerEquals(tests
[i
].single_proxy
,
242 config
.proxy_rules().single_proxy
);
243 ExpectProxyServerEquals(tests
[i
].proxy_for_http
,
244 config
.proxy_rules().proxy_for_http
);
245 ExpectProxyServerEquals(tests
[i
].proxy_for_https
,
246 config
.proxy_rules().proxy_for_https
);
247 ExpectProxyServerEquals(tests
[i
].proxy_for_ftp
,
248 config
.proxy_rules().proxy_for_ftp
);
249 ExpectProxyServerEquals(tests
[i
].fallback_proxy
,
250 config
.proxy_rules().fallback_proxy
);
254 TEST(ProxyConfigTest
, ProxyRulesSetBypassFlag
) {
255 // Test whether the did_bypass_proxy() flag is set in proxy info correctly.
256 ProxyConfig::ProxyRules rules
;
259 rules
.ParseFromString("http=httpproxy:80");
260 rules
.bypass_rules
.AddRuleFromString(".com");
262 rules
.Apply(GURL("http://example.com"), &result
);
263 EXPECT_TRUE(result
.is_direct_only());
264 EXPECT_TRUE(result
.did_bypass_proxy());
266 rules
.Apply(GURL("http://example.org"), &result
);
267 EXPECT_FALSE(result
.is_direct());
268 EXPECT_FALSE(result
.did_bypass_proxy());
270 // Try with reversed bypass rules.
271 rules
.reverse_bypass
= true;
273 rules
.Apply(GURL("http://example.org"), &result
);
274 EXPECT_TRUE(result
.is_direct_only());
275 EXPECT_TRUE(result
.did_bypass_proxy());
277 rules
.Apply(GURL("http://example.com"), &result
);
278 EXPECT_FALSE(result
.is_direct());
279 EXPECT_FALSE(result
.did_bypass_proxy());