proxy_list_unittest.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
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