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.
4
5#include "net/proxy/proxy_config_service_win.h"
6
7#include "net/base/net_errors.h"
8#include "net/proxy/proxy_config.h"
9#include "net/proxy/proxy_config_service_common_unittest.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace net {
13
14TEST(ProxyConfigServiceWinTest, SetFromIEConfig) {
15  // Like WINHTTP_CURRENT_USER_IE_PROXY_CONFIG, but with const strings.
16  struct IEProxyConfig {
17    BOOL auto_detect;
18    const wchar_t* auto_config_url;
19    const wchar_t* proxy;
20    const wchar_t* proxy_bypass;
21  };
22  const struct {
23    // Input.
24    IEProxyConfig ie_config;
25
26    // Expected outputs (fields of the ProxyConfig).
27    bool auto_detect;
28    GURL pac_url;
29    ProxyRulesExpectation proxy_rules;
30    const char* proxy_bypass_list;  // newline separated
31  } tests[] = {
32    // Auto detect.
33    {
34      { // Input.
35        TRUE,  // fAutoDetect
36        NULL,  // lpszAutoConfigUrl
37        NULL,  // lpszProxy
38        NULL,  // lpszProxyBypass
39      },
40
41      // Expected result.
42      true,                       // auto_detect
43      GURL(),                     // pac_url
44      ProxyRulesExpectation::Empty(),
45    },
46
47    // Valid PAC url
48    {
49      { // Input.
50        FALSE,                    // fAutoDetect
51        L"http://wpad/wpad.dat",  // lpszAutoConfigUrl
52        NULL,                     // lpszProxy
53        NULL,                     // lpszProxy_bypass
54      },
55
56      // Expected result.
57      false,                         // auto_detect
58      GURL("http://wpad/wpad.dat"),  // pac_url
59      ProxyRulesExpectation::Empty(),
60    },
61
62    // Invalid PAC url string.
63    {
64      { // Input.
65        FALSE,        // fAutoDetect
66        L"wpad.dat",  // lpszAutoConfigUrl
67        NULL,         // lpszProxy
68        NULL,         // lpszProxy_bypass
69      },
70
71      // Expected result.
72      false,                      // auto_detect
73      GURL(),                     // pac_url
74      ProxyRulesExpectation::Empty(),
75    },
76
77    // Single-host in proxy list.
78    {
79      { // Input.
80        FALSE,              // fAutoDetect
81        NULL,               // lpszAutoConfigUrl
82        L"www.google.com",  // lpszProxy
83        NULL,               // lpszProxy_bypass
84      },
85
86      // Expected result.
87      false,                                   // auto_detect
88      GURL(),                                  // pac_url
89      ProxyRulesExpectation::Single(
90          "www.google.com:80",  // single proxy
91          ""),                  // bypass rules
92    },
93
94    // Per-scheme proxy rules.
95    {
96      { // Input.
97        FALSE,                                            // fAutoDetect
98        NULL,                                             // lpszAutoConfigUrl
99        L"http=www.google.com:80;https=www.foo.com:110",  // lpszProxy
100        NULL,                                             // lpszProxy_bypass
101      },
102
103      // Expected result.
104      false,                                   // auto_detect
105      GURL(),                                  // pac_url
106      ProxyRulesExpectation::PerScheme(
107          "www.google.com:80",  // http
108          "www.foo.com:110",   // https
109          "",                  // ftp
110          ""),                 // bypass rules
111    },
112
113    // SOCKS proxy configuration.
114    {
115      { // Input.
116        FALSE,                                            // fAutoDetect
117        NULL,                                             // lpszAutoConfigUrl
118        L"http=www.google.com:80;https=www.foo.com:110;"
119        L"ftp=ftpproxy:20;socks=foopy:130",               // lpszProxy
120        NULL,                                             // lpszProxy_bypass
121      },
122
123      // Expected result.
124      // Note that "socks" is interprted as meaning "socks4", since that is how
125      // Internet Explorer applies the settings. For more details on this
126      // policy, see:
127      // http://code.google.com/p/chromium/issues/detail?id=55912#c2
128      false,                                   // auto_detect
129      GURL(),                                  // pac_url
130      ProxyRulesExpectation::PerSchemeWithSocks(
131          "www.google.com:80",   // http
132          "www.foo.com:110",     // https
133          "ftpproxy:20",         // ftp
134          "socks4://foopy:130",  // socks
135          ""),                   // bypass rules
136    },
137
138    // Bypass local names.
139    {
140      { // Input.
141        TRUE,            // fAutoDetect
142        NULL,            // lpszAutoConfigUrl
143        NULL,            // lpszProxy
144        L"<local>",      // lpszProxy_bypass
145      },
146
147      true,                       // auto_detect
148      GURL(),                     // pac_url
149      ProxyRulesExpectation::EmptyWithBypass("<local>"),
150    },
151
152    // Bypass "google.com" and local names, using semicolon as delimiter
153    // (ignoring white space).
154    {
155      { // Input.
156        TRUE,                         // fAutoDetect
157        NULL,                         // lpszAutoConfigUrl
158        NULL,                         // lpszProxy
159        L"<local> ; google.com",      // lpszProxy_bypass
160      },
161
162      // Expected result.
163      true,                       // auto_detect
164      GURL(),                     // pac_url
165      ProxyRulesExpectation::EmptyWithBypass("<local>,google.com"),
166    },
167
168    // Bypass "foo.com" and "google.com", using lines as delimiter.
169    {
170      { // Input.
171        TRUE,                      // fAutoDetect
172        NULL,                      // lpszAutoConfigUrl
173        NULL,                      // lpszProxy
174        L"foo.com\r\ngoogle.com",  // lpszProxy_bypass
175      },
176
177      // Expected result.
178      true,                       // auto_detect
179      GURL(),                     // pac_url
180      ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
181    },
182
183    // Bypass "foo.com" and "google.com", using commas as delimiter.
184    {
185      { // Input.
186        TRUE,                      // fAutoDetect
187        NULL,                      // lpszAutoConfigUrl
188        NULL,                      // lpszProxy
189        L"foo.com, google.com",    // lpszProxy_bypass
190      },
191
192      // Expected result.
193      true,                       // auto_detect
194      GURL(),                     // pac_url
195      ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
196    },
197  };
198
199  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
200    WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config = {
201        tests[i].ie_config.auto_detect,
202        const_cast<wchar_t*>(tests[i].ie_config.auto_config_url),
203        const_cast<wchar_t*>(tests[i].ie_config.proxy),
204        const_cast<wchar_t*>(tests[i].ie_config.proxy_bypass)};
205    ProxyConfig config;
206    ProxyConfigServiceWin::SetFromIEConfig(&config, ie_config);
207
208    EXPECT_EQ(tests[i].auto_detect, config.auto_detect());
209    EXPECT_EQ(tests[i].pac_url, config.pac_url());
210    EXPECT_TRUE(tests[i].proxy_rules.Matches(config.proxy_rules()));
211    EXPECT_EQ(PROXY_CONFIG_SOURCE_SYSTEM, config.source());
212  }
213}
214
215}  // namespace net
216