15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_win.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config_service_common_unittest.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyConfigServiceWinTest, SetFromIEConfig) { 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Like WINHTTP_CURRENT_USER_IE_PROXY_CONFIG, but with const strings. 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) struct IEProxyConfig { 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) BOOL auto_detect; 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const wchar_t* auto_config_url; 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const wchar_t* proxy; 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const wchar_t* proxy_bypass; 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Input. 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IEProxyConfig ie_config; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected outputs (fields of the ProxyConfig). 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool auto_detect; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL pac_url; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation proxy_rules; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* proxy_bypass_list; // newline separated 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Auto detect. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE, // fAutoDetect 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxyBypass 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, // auto_detect 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::Empty(), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid PAC url 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, // fAutoDetect 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"http://wpad/wpad.dat", // lpszAutoConfigUrl 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy_bypass 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // auto_detect 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://wpad/wpad.dat"), // pac_url 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::Empty(), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid PAC url string. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, // fAutoDetect 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"wpad.dat", // lpszAutoConfigUrl 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy_bypass 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // auto_detect 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::Empty(), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Single-host in proxy list. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, // fAutoDetect 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"www.google.com", // lpszProxy 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy_bypass 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // auto_detect 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::Single( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.google.com:80", // single proxy 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ""), // bypass rules 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per-scheme proxy rules. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, // fAutoDetect 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"http=www.google.com:80;https=www.foo.com:110", // lpszProxy 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy_bypass 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // auto_detect 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::PerScheme( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.google.com:80", // http 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.foo.com:110", // https 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", // ftp 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ""), // bypass rules 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SOCKS proxy configuration. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, // fAutoDetect 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"http=www.google.com:80;https=www.foo.com:110;" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"ftp=ftpproxy:20;socks=foopy:130", // lpszProxy 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy_bypass 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that "socks" is interprted as meaning "socks4", since that is how 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internet Explorer applies the settings. For more details on this 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // policy, see: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=55912#c2 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // auto_detect 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::PerSchemeWithSocks( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.google.com:80", // http 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www.foo.com:110", // https 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ftpproxy:20", // ftp 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "socks4://foopy:130", // socks 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ""), // bypass rules 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bypass local names. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE, // fAutoDetect 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"<local>", // lpszProxy_bypass 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, // auto_detect 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::EmptyWithBypass("<local>"), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bypass "google.com" and local names, using semicolon as delimiter 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (ignoring white space). 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE, // fAutoDetect 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"<local> ; google.com", // lpszProxy_bypass 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, // auto_detect 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::EmptyWithBypass("<local>,google.com"), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bypass "foo.com" and "google.com", using lines as delimiter. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE, // fAutoDetect 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.com\r\ngoogle.com", // lpszProxy_bypass 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, // auto_detect 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bypass "foo.com" and "google.com", using commas as delimiter. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { // Input. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRUE, // fAutoDetect 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszAutoConfigUrl 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, // lpszProxy 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"foo.com, google.com", // lpszProxy_bypass 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected result. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, // auto_detect 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(), // pac_url 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WINHTTP_CURRENT_USER_IE_PROXY_CONFIG ie_config = { 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tests[i].ie_config.auto_detect, 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const_cast<wchar_t*>(tests[i].ie_config.auto_config_url), 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const_cast<wchar_t*>(tests[i].ie_config.proxy), 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const_cast<wchar_t*>(tests[i].ie_config.proxy_bypass)}; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ProxyConfigServiceWin::SetFromIEConfig(&config, ie_config); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].auto_detect, config.auto_detect()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].pac_url, config.pac_url()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tests[i].proxy_rules.Matches(config.proxy_rules())); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(PROXY_CONFIG_SOURCE_SYSTEM, config.source()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 216