// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/proxy/proxy_config_service_win.h"
#include "net/base/net_errors.h"
#include "net/proxy/proxy_config.h"
#include "net/proxy/proxy_config_service_common_unittest.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
TEST(ProxyConfigServiceWinTest, SetFromIEConfig) {
const struct {
// Input.
WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config;
// Expected outputs (fields of the ProxyConfig).
bool auto_detect;
GURL pac_url;
ProxyRulesExpectation proxy_rules;
const char* proxy_bypass_list; // newline separated
} tests[] = {
// Auto detect.
{
{ // Input.
TRUE, // fAutoDetect
NULL, // lpszAutoConfigUrl
NULL, // lpszProxy
NULL, // lpszProxyBypass
},
// Expected result.
true, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::Empty(),
},
// Valid PAC url
{
{ // Input.
FALSE, // fAutoDetect
L"http://wpad/wpad.dat", // lpszAutoConfigUrl
NULL, // lpszProxy
NULL, // lpszProxy_bypass
},
// Expected result.
false, // auto_detect
GURL("http://wpad/wpad.dat"), // pac_url
ProxyRulesExpectation::Empty(),
},
// Invalid PAC url string.
{
{ // Input.
FALSE, // fAutoDetect
L"wpad.dat", // lpszAutoConfigUrl
NULL, // lpszProxy
NULL, // lpszProxy_bypass
},
// Expected result.
false, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::Empty(),
},
// Single-host in proxy list.
{
{ // Input.
FALSE, // fAutoDetect
NULL, // lpszAutoConfigUrl
L"www.google.com", // lpszProxy
NULL, // lpszProxy_bypass
},
// Expected result.
false, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::Single(
"www.google.com:80", // single proxy
""), // bypass rules
},
// Per-scheme proxy rules.
{
{ // Input.
FALSE, // fAutoDetect
NULL, // lpszAutoConfigUrl
L"http=www.google.com:80;https=www.foo.com:110", // lpszProxy
NULL, // lpszProxy_bypass
},
// Expected result.
false, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::PerScheme(
"www.google.com:80", // http
"www.foo.com:110", // https
"", // ftp
""), // bypass rules
},
// SOCKS proxy configuration.
{
{ // Input.
FALSE, // fAutoDetect
NULL, // lpszAutoConfigUrl
L"http=www.google.com:80;https=www.foo.com:110;"
L"ftp=ftpproxy:20;socks=foopy:130", // lpszProxy
NULL, // lpszProxy_bypass
},
// Expected result.
// Note that "socks" is interprted as meaning "socks4", since that is how
// Internet Explorer applies the settings. For more details on this
// policy, see:
// http://code.google.com/p/chromium/issues/detail?id=55912#c2
false, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::PerSchemeWithSocks(
"www.google.com:80", // http
"www.foo.com:110", // https
"ftpproxy:20", // ftp
"socks4://foopy:130", // socks
""), // bypass rules
},
// Bypass local names.
{
{ // Input.
TRUE, // fAutoDetect
NULL, // lpszAutoConfigUrl
NULL, // lpszProxy
L"<local>", // lpszProxy_bypass
},
true, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::EmptyWithBypass("<local>"),
},
// Bypass "google.com" and local names, using semicolon as delimiter
// (ignoring white space).
{
{ // Input.
TRUE, // fAutoDetect
NULL, // lpszAutoConfigUrl
NULL, // lpszProxy
L"<local> ; google.com", // lpszProxy_bypass
},
// Expected result.
true, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::EmptyWithBypass("<local>,google.com"),
},
// Bypass "foo.com" and "google.com", using lines as delimiter.
{
{ // Input.
TRUE, // fAutoDetect
NULL, // lpszAutoConfigUrl
NULL, // lpszProxy
L"foo.com\r\ngoogle.com", // lpszProxy_bypass
},
// Expected result.
true, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
},
// Bypass "foo.com" and "google.com", using commas as delimiter.
{
{ // Input.
TRUE, // fAutoDetect
NULL, // lpszAutoConfigUrl
NULL, // lpszProxy
L"foo.com, google.com", // lpszProxy_bypass
},
// Expected result.
true, // auto_detect
GURL(), // pac_url
ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
},
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
ProxyConfig config;
ProxyConfigServiceWin::SetFromIEConfig(&config, tests[i].ie_config);
EXPECT_EQ(tests[i].auto_detect, config.auto_detect());
EXPECT_EQ(tests[i].pac_url, config.pac_url());
EXPECT_TRUE(tests[i].proxy_rules.Matches(config.proxy_rules()));
}
}
} // namespace net