xref: /aosp_15_r20/external/cronet/net/base/proxy_server_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <optional>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
10*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_string_util.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace net {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace {
16*6777b538SAndroid Build Coastguard Worker 
TEST(ProxyServerTest,DefaultConstructor)17*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, DefaultConstructor) {
18*6777b538SAndroid Build Coastguard Worker   ProxyServer proxy_server;
19*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(proxy_server.is_valid());
20*6777b538SAndroid Build Coastguard Worker }
21*6777b538SAndroid Build Coastguard Worker 
TEST(ProxyServerTest,FromSchemeHostAndPort)22*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, FromSchemeHostAndPort) {
23*6777b538SAndroid Build Coastguard Worker   const struct {
24*6777b538SAndroid Build Coastguard Worker     const ProxyServer::Scheme input_scheme;
25*6777b538SAndroid Build Coastguard Worker     const char* const input_host;
26*6777b538SAndroid Build Coastguard Worker     const std::optional<uint16_t> input_port;
27*6777b538SAndroid Build Coastguard Worker     const char* const input_port_str;
28*6777b538SAndroid Build Coastguard Worker     const char* const expected_host;
29*6777b538SAndroid Build Coastguard Worker     const uint16_t expected_port;
30*6777b538SAndroid Build Coastguard Worker   } tests[] = {
31*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "foopy", 80, "80", "foopy", 80},
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker       // Non-standard port
34*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "foopy", 10, "10", "foopy", 10},
35*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "foopy", 0, "0", "foopy", 0},
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker       // Hostname canonicalization
38*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "FoOpY", 80, "80", "foopy", 80},
39*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "f\u00fcpy", 80, "80", "xn--fpy-hoa", 80},
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker       // IPv4 literal
42*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "1.2.3.4", 80, "80", "1.2.3.4", 80},
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker       // IPv4 literal canonicalization
45*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "127.1", 80, "80", "127.0.0.1", 80},
46*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "0x7F.0x1", 80, "80", "127.0.0.1", 80},
47*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "0177.01", 80, "80", "127.0.0.1", 80},
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker       // IPv6 literal
50*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "[3ffe:2a00:100:7031::1]", 80, "80",
51*6777b538SAndroid Build Coastguard Worker        "[3ffe:2a00:100:7031::1]", 80},
52*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "3ffe:2a00:100:7031::1", 80, "80",
53*6777b538SAndroid Build Coastguard Worker        "[3ffe:2a00:100:7031::1]", 80},
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker       // IPv6 literal canonicalization
56*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", 80,
57*6777b538SAndroid Build Coastguard Worker        "80", "[fedc:ba98:7654:3210:fedc:ba98:7654:3210]", 80},
58*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "::192.9.5.5", 80, "80", "[::c009:505]", 80},
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker       // Other schemes
61*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTPS, "foopy", 111, "111", "foopy", 111},
62*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_QUIC, "foopy", 111, "111", "foopy", 111},
63*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_SOCKS4, "foopy", 111, "111", "foopy", 111},
64*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_SOCKS5, "foopy", 111, "111", "foopy", 111},
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker       // Default ports
67*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTP, "foopy", std::nullopt, "", "foopy", 80},
68*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_HTTPS, "foopy", std::nullopt, "", "foopy", 443},
69*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_QUIC, "foopy", std::nullopt, "", "foopy", 443},
70*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_SOCKS4, "foopy", std::nullopt, "", "foopy", 1080},
71*6777b538SAndroid Build Coastguard Worker       {ProxyServer::SCHEME_SOCKS5, "foopy", std::nullopt, "", "foopy", 1080},
72*6777b538SAndroid Build Coastguard Worker   };
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < std::size(tests); ++i) {
75*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(base::NumberToString(i) + ": " + tests[i].input_host + ":" +
76*6777b538SAndroid Build Coastguard Worker                  base::NumberToString(tests[i].input_port.value_or(-1)));
77*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(
78*6777b538SAndroid Build Coastguard Worker         tests[i].input_scheme, tests[i].input_host, tests[i].input_port);
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(proxy.is_valid());
81*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(proxy.scheme(), tests[i].input_scheme);
82*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(proxy.GetHost(), tests[i].expected_host);
83*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(proxy.GetPort(), tests[i].expected_port);
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker     auto proxy_from_string_port = ProxyServer::FromSchemeHostAndPort(
86*6777b538SAndroid Build Coastguard Worker         tests[i].input_scheme, tests[i].input_host, tests[i].input_port_str);
87*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy_from_string_port.is_valid());
88*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(proxy, proxy_from_string_port);
89*6777b538SAndroid Build Coastguard Worker   }
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker 
TEST(ProxyServerTest,InvalidHostname)92*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, InvalidHostname) {
93*6777b538SAndroid Build Coastguard Worker   const char* const tests[]{
94*6777b538SAndroid Build Coastguard Worker       "",
95*6777b538SAndroid Build Coastguard Worker       "[]",
96*6777b538SAndroid Build Coastguard Worker       "[foo]",
97*6777b538SAndroid Build Coastguard Worker       "foo:",
98*6777b538SAndroid Build Coastguard Worker       "foo:80",
99*6777b538SAndroid Build Coastguard Worker       ":",
100*6777b538SAndroid Build Coastguard Worker       "http://foo",
101*6777b538SAndroid Build Coastguard Worker       "3ffe:2a00:100:7031::1]",
102*6777b538SAndroid Build Coastguard Worker       "[3ffe:2a00:100:7031::1",
103*6777b538SAndroid Build Coastguard Worker       "foo.80",
104*6777b538SAndroid Build Coastguard Worker   };
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < std::size(tests); ++i) {
107*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(base::NumberToString(i) + ": " + tests[i]);
108*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_HTTP,
109*6777b538SAndroid Build Coastguard Worker                                                     tests[i], 80);
110*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_valid());
111*6777b538SAndroid Build Coastguard Worker   }
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
TEST(ProxyServerTest,InvalidPort)114*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, InvalidPort) {
115*6777b538SAndroid Build Coastguard Worker   const char* const tests[]{
116*6777b538SAndroid Build Coastguard Worker       "-1",
117*6777b538SAndroid Build Coastguard Worker       "65536",
118*6777b538SAndroid Build Coastguard Worker       "foo",
119*6777b538SAndroid Build Coastguard Worker       "0x35",
120*6777b538SAndroid Build Coastguard Worker   };
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < std::size(tests); ++i) {
123*6777b538SAndroid Build Coastguard Worker     SCOPED_TRACE(base::NumberToString(i) + ": " + tests[i]);
124*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_HTTP,
125*6777b538SAndroid Build Coastguard Worker                                                     "foopy", tests[i]);
126*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_valid());
127*6777b538SAndroid Build Coastguard Worker   }
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker 
TEST(ProxyServerTest,ComparatorAndEquality)130*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, ComparatorAndEquality) {
131*6777b538SAndroid Build Coastguard Worker   const struct {
132*6777b538SAndroid Build Coastguard Worker     // Inputs.
133*6777b538SAndroid Build Coastguard Worker     ProxyServer server1;
134*6777b538SAndroid Build Coastguard Worker     ProxyServer server2;
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker     // Expectation.
137*6777b538SAndroid Build Coastguard Worker     //   -1 means server1 is less than server2
138*6777b538SAndroid Build Coastguard Worker     //    0 means server1 equals server2
139*6777b538SAndroid Build Coastguard Worker     //    1 means server1 is greater than server2
140*6777b538SAndroid Build Coastguard Worker     int expected_comparison;
141*6777b538SAndroid Build Coastguard Worker   } kTests[] = {
142*6777b538SAndroid Build Coastguard Worker       {// Equal.
143*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("foo:11", ProxyServer::SCHEME_HTTP),
144*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("http://foo:11", ProxyServer::SCHEME_HTTP), 0},
145*6777b538SAndroid Build Coastguard Worker       {// Port is different.
146*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("foo:333", ProxyServer::SCHEME_HTTP),
147*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("foo:444", ProxyServer::SCHEME_HTTP), -1},
148*6777b538SAndroid Build Coastguard Worker       {// Host is different.
149*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("foo:33", ProxyServer::SCHEME_HTTP),
150*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("bar:33", ProxyServer::SCHEME_HTTP), 1},
151*6777b538SAndroid Build Coastguard Worker       {// Scheme is different.
152*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("socks4://foo:33", ProxyServer::SCHEME_HTTP),
153*6777b538SAndroid Build Coastguard Worker        ProxyUriToProxyServer("http://foo:33", ProxyServer::SCHEME_HTTP), 1},
154*6777b538SAndroid Build Coastguard Worker   };
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker   for (const auto& test : kTests) {
157*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(test.server1.is_valid());
158*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(test.server2.is_valid());
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker     switch (test.expected_comparison) {
161*6777b538SAndroid Build Coastguard Worker       case -1:
162*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(test.server1 < test.server2);
163*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server2 < test.server1);
164*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server2 == test.server1);
165*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server1 == test.server2);
166*6777b538SAndroid Build Coastguard Worker         break;
167*6777b538SAndroid Build Coastguard Worker       case 0:
168*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server1 < test.server2);
169*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server2 < test.server1);
170*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(test.server2 == test.server1);
171*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(test.server1 == test.server2);
172*6777b538SAndroid Build Coastguard Worker         break;
173*6777b538SAndroid Build Coastguard Worker       case 1:
174*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server1 < test.server2);
175*6777b538SAndroid Build Coastguard Worker         EXPECT_TRUE(test.server2 < test.server1);
176*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server2 == test.server1);
177*6777b538SAndroid Build Coastguard Worker         EXPECT_FALSE(test.server1 == test.server2);
178*6777b538SAndroid Build Coastguard Worker         break;
179*6777b538SAndroid Build Coastguard Worker       default:
180*6777b538SAndroid Build Coastguard Worker         FAIL() << "Invalid expectation. Can be only -1, 0, 1";
181*6777b538SAndroid Build Coastguard Worker     }
182*6777b538SAndroid Build Coastguard Worker   }
183*6777b538SAndroid Build Coastguard Worker }
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker // Tests the various "is_*()" methods on ProxyServer.
TEST(ProxyServerTest,Properties)186*6777b538SAndroid Build Coastguard Worker TEST(ProxyServerTest, Properties) {
187*6777b538SAndroid Build Coastguard Worker   // HTTP proxy.
188*6777b538SAndroid Build Coastguard Worker   {
189*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_HTTP,
190*6777b538SAndroid Build Coastguard Worker                                                     "foo", std::nullopt);
191*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(proxy.is_valid());
192*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_http());
193*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_https());
194*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_http_like());
195*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_secure_http_like());
196*6777b538SAndroid Build Coastguard Worker   }
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker   // HTTPS proxy.
199*6777b538SAndroid Build Coastguard Worker   {
200*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_HTTPS,
201*6777b538SAndroid Build Coastguard Worker                                                     "foo", std::nullopt);
202*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(proxy.is_valid());
203*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_http());
204*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_https());
205*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_http_like());
206*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_secure_http_like());
207*6777b538SAndroid Build Coastguard Worker   }
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   // QUIC proxy.
210*6777b538SAndroid Build Coastguard Worker   {
211*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_QUIC,
212*6777b538SAndroid Build Coastguard Worker                                                     "foo", std::nullopt);
213*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(proxy.is_valid());
214*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_http());
215*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_https());
216*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_http_like());
217*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(proxy.is_secure_http_like());
218*6777b538SAndroid Build Coastguard Worker   }
219*6777b538SAndroid Build Coastguard Worker 
220*6777b538SAndroid Build Coastguard Worker   // SOCKS5 proxy.
221*6777b538SAndroid Build Coastguard Worker   {
222*6777b538SAndroid Build Coastguard Worker     auto proxy = ProxyServer::FromSchemeHostAndPort(ProxyServer::SCHEME_SOCKS5,
223*6777b538SAndroid Build Coastguard Worker                                                     "foo", std::nullopt);
224*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(proxy.is_valid());
225*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_http());
226*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_https());
227*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_http_like());
228*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(proxy.is_secure_http_like());
229*6777b538SAndroid Build Coastguard Worker   }
230*6777b538SAndroid Build Coastguard Worker }
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker }  // namespace
233*6777b538SAndroid Build Coastguard Worker 
234*6777b538SAndroid Build Coastguard Worker }  // namespace net
235