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