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