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