1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 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_list.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/proxy/proxy_server.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test parsing from a PAC string. 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(ProxyListTest, SetFromPacString) { 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* pac_input; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* pac_output; 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Valid inputs: 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY foopy:10", 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "PROXY foopy:10", 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { " DIRECT", // leading space. 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DIRECT", 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY foopy1 ; proxy foopy2;\t DIRECT", 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "PROXY foopy1:80;PROXY foopy2:80;DIRECT", 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "proxy foopy1 ; SOCKS foopy2", 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "PROXY foopy1:80;SOCKS foopy2:1080", 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Try putting DIRECT first. 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "DIRECT ; proxy foopy1 ; DIRECT ; SOCKS5 foopy2;DIRECT ", 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DIRECT;PROXY foopy1:80;DIRECT;SOCKS5 foopy2:1080;DIRECT", 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Try putting DIRECT consecutively. 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "DIRECT ; proxy foopy1:80; DIRECT ; DIRECT", 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DIRECT;PROXY foopy1:80;DIRECT;DIRECT", 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Invalid inputs (parts which aren't understood get 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // silently discarded): 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If the proxy list string parsed to empty, automatically fall-back to 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // DIRECT. 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY-foopy:10", 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DIRECT", 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY", 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DIRECT", 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY foopy1 ; JUNK ; JUNK ; SOCKS5 foopy2 ; ;", 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "PROXY foopy1:80;SOCKS5 foopy2:1080", 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyList list; 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.SetFromPacString(tests[i].pac_input); 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].pac_output, list.ToPacString()); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(list.IsEmpty()); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(ProxyListTest, RemoveProxiesWithoutScheme) { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const struct { 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* pac_input; 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int filter; 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* filtered_pac_output; 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY foopy:10 ; SOCKS5 foopy2 ; SOCKS foopy11 ; PROXY foopy3 ; DIRECT", 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Remove anything that isn't HTTP or DIRECT. 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyServer::SCHEME_DIRECT | ProxyServer::SCHEME_HTTP, 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "PROXY foopy:10;PROXY foopy3:80;DIRECT", 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { "PROXY foopy:10 ; SOCKS5 foopy2", 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Remove anything that isn't HTTP or SOCKS5. 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyServer::SCHEME_DIRECT | ProxyServer::SCHEME_SOCKS4, 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyList list; 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.SetFromPacString(tests[i].pac_input); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.RemoveProxiesWithoutScheme(tests[i].filter); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(tests[i].filtered_pac_output, list.ToPacString()); 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(ProxyListTest, DeprioritizeBadProxies) { 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Retry info that marks a proxy as being bad for a *very* long time (to avoid 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the test depending on the current time.) 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyRetryInfo proxy_retry_info; 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott proxy_retry_info.bad_until = 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::TimeTicks::Now() + base::TimeDelta::FromDays(1); 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Call DeprioritizeBadProxies with an empty map -- should have no effect. 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyList list; 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.SetFromPacString("PROXY foopy1:80;PROXY foopy2:80;PROXY foopy3:80"); 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyRetryInfoMap retry_info_map; 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.DeprioritizeBadProxies(retry_info_map); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("PROXY foopy1:80;PROXY foopy2:80;PROXY foopy3:80", 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.ToPacString()); 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Call DeprioritizeBadProxies with 2 of the three proxies marked as bad. 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // These proxies should be retried last. 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyList list; 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.SetFromPacString("PROXY foopy1:80;PROXY foopy2:80;PROXY foopy3:80"); 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyRetryInfoMap retry_info_map; 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["foopy1:80"] = proxy_retry_info; 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["foopy3:80"] = proxy_retry_info; 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["socks5://localhost:1080"] = proxy_retry_info; 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.DeprioritizeBadProxies(retry_info_map); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("PROXY foopy2:80;PROXY foopy1:80;PROXY foopy3:80", 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.ToPacString()); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Call DeprioritizeBadProxies where ALL of the proxies are marked as bad. 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // This should have no effect on the order. 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyList list; 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.SetFromPacString("PROXY foopy1:80;PROXY foopy2:80;PROXY foopy3:80"); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyRetryInfoMap retry_info_map; 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["foopy1:80"] = proxy_retry_info; 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["foopy2:80"] = proxy_retry_info; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott retry_info_map["foopy3:80"] = proxy_retry_info; 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.DeprioritizeBadProxies(retry_info_map); 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ("PROXY foopy1:80;PROXY foopy2:80;PROXY foopy3:80", 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list.ToPacString()); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namesapce 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 148