• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_QUIC_QUIC_PROXY_CLIENT_SOCKET_TEST_BASE_H_
6 #define NET_QUIC_QUIC_PROXY_CLIENT_SOCKET_TEST_BASE_H_
7 
8 #include <memory>
9 #include <vector>
10 
11 #include "base/memory/ptr_util.h"
12 #include "base/memory/raw_ptr.h"
13 #include "base/run_loop.h"
14 #include "base/test/metrics/histogram_tester.h"
15 #include "base/time/default_tick_clock.h"
16 #include "mock_quic_data.h"
17 #include "net/base/test_proxy_delegate.h"
18 #include "net/dns/mock_host_resolver.h"
19 #include "net/http/http_auth_cache.h"
20 #include "net/http/http_auth_handler_factory.h"
21 #include "net/http/transport_security_state.h"
22 #include "net/log/net_log.h"
23 #include "net/log/test_net_log.h"
24 #include "net/log/test_net_log_util.h"
25 #include "net/quic/address_utils.h"
26 #include "net/quic/crypto/proof_verifier_chromium.h"
27 #include "net/quic/mock_crypto_client_stream_factory.h"
28 #include "net/quic/mock_quic_data.h"
29 #include "net/quic/quic_chromium_alarm_factory.h"
30 #include "net/quic/quic_chromium_client_session.h"
31 #include "net/quic/quic_chromium_connection_helper.h"
32 #include "net/quic/quic_chromium_packet_writer.h"
33 #include "net/quic/quic_http_utils.h"
34 #include "net/quic/quic_proxy_client_socket.h"
35 #include "net/quic/quic_server_info.h"
36 #include "net/quic/quic_session_key.h"
37 #include "net/quic/quic_session_pool.h"
38 #include "net/quic/quic_test_packet_maker.h"
39 #include "net/quic/test_quic_crypto_client_config_handle.h"
40 #include "net/quic/test_task_runner.h"
41 #include "net/socket/socket_tag.h"
42 #include "net/socket/socket_test_util.h"
43 #include "net/ssl/ssl_config_service_defaults.h"
44 #include "net/test/test_data_directory.h"
45 #include "net/test/test_with_task_environment.h"
46 #include "net/third_party/quiche/src/quiche/common/http/http_header_block.h"
47 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
48 #include "net/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils.h"
49 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_clock.h"
50 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_connection_id_generator.h"
51 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
52 #include "net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_test_utils.h"
53 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h"
54 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
55 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
56 #include "url/gurl.h"
57 #include "url/scheme_host_port.h"
58 #include "url/url_constants.h"
59 
60 namespace {
61 
62 inline constexpr char kOriginHost[] = "www.google.com";
63 inline constexpr int kOriginPort = 443;
64 inline constexpr char kProxyUrl[] = "https://myproxy:6121/";
65 inline constexpr char kProxyHost[] = "myproxy";
66 inline constexpr int kProxyPort = 6121;
67 inline constexpr char kUserAgent[] = "Mozilla/1.0";
68 inline constexpr char kRedirectUrl[] = "https://example.com/";
69 
70 inline constexpr char kMsg1[] = "\0hello!\xff";
71 inline constexpr int kLen1 = 8;
72 inline constexpr char kMsg2[] = "\0a2345678\0";
73 inline constexpr int kLen2 = 10;
74 inline constexpr char kMsg3[] = "bye!";
75 inline constexpr int kLen3 = 4;
76 inline constexpr char kMsg33[] = "bye!bye!";
77 inline constexpr int kLen33 = kLen3 + kLen3;
78 inline constexpr char kMsg333[] = "bye!bye!bye!";
79 inline constexpr int kLen333 = kLen3 + kLen3 + kLen3;
80 
81 inline constexpr char kDatagramPayload[] = "youveGotMail";
82 inline constexpr int kDatagramLen = 12;
83 
84 static inline constexpr int k0ByteConnectionId = 0;
85 static inline constexpr int k8ByteConnectionId = 8;
86 
87 inline constexpr char kTestHeaderName[] = "Foo";
88 // Note: `kTestQuicHeaderName` should be a lowercase version of
89 // `kTestHeaderName`.
90 inline constexpr char kTestQuicHeaderName[] = "foo";
91 
92 }  // anonymous namespace
93 
94 namespace net {
95 
96 class QuicProxyClientSocketTestBase
97     : public ::testing::TestWithParam<quic::ParsedQuicVersion>,
98       public WithTaskEnvironment {
99  public:
100   QuicProxyClientSocketTestBase();
101   QuicProxyClientSocketTestBase(const QuicProxyClientSocketTestBase&) = delete;
102   QuicProxyClientSocketTestBase& operator=(
103       const QuicProxyClientSocketTestBase&) = delete;
104 
105   ~QuicProxyClientSocketTestBase() override;
106 
107   static size_t GetStreamFrameDataLengthFromPacketLength(
108       quic::QuicByteCount packet_length,
109       quic::ParsedQuicVersion version,
110       bool include_version,
111       bool include_diversification_nonce,
112       int connection_id_length,
113       quic::QuicPacketNumberLength packet_number_length,
114       quic::QuicStreamOffset offset);
115 
SetUp()116   void SetUp() override {}
117 
118   void TearDown() override = 0;
119 
120   void InitializeSession();
121 
122   virtual void InitializeClientSocket() = 0;
123 
124   virtual void PopulateConnectRequestIR(
125       quiche::HttpHeaderBlock* block,
126       std::optional<const HttpRequestHeaders> extra_headers) = 0;
127 
128   std::unique_ptr<quic::QuicReceivedPacket> ConstructSettingsPacket(
129       uint64_t packet_number);
130 
131   std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndRstOnlyPacket(
132       uint64_t packet_number,
133       quic::QuicRstStreamErrorCode error_code,
134       uint64_t largest_received,
135       uint64_t smallest_received);
136 
137   std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndRstPacket(
138       uint64_t packet_number,
139       quic::QuicRstStreamErrorCode error_code,
140       uint64_t largest_received,
141       uint64_t smallest_received);
142 
143   std::unique_ptr<quic::QuicReceivedPacket> ConstructRstPacket(
144       uint64_t packet_number,
145       quic::QuicRstStreamErrorCode error_code);
146 
147   std::unique_ptr<quic::QuicReceivedPacket> ConstructConnectRequestPacket(
148       uint64_t packet_number,
149       std::optional<const HttpRequestHeaders> extra_headers = std::nullopt,
150       RequestPriority request_priority = LOWEST);
151 
152   std::unique_ptr<quic::QuicReceivedPacket>
153   ConstructConnectRequestPacketWithExtraHeaders(
154       uint64_t packet_number,
155       std::vector<std::pair<std::string, std::string>> extra_headers,
156       RequestPriority request_priority = LOWEST);
157 
158   std::unique_ptr<quic::QuicReceivedPacket> ConstructConnectAuthRequestPacket(
159       uint64_t packet_number);
160 
161   std::unique_ptr<quic::QuicReceivedPacket> ConstructDataPacket(
162       uint64_t packet_number,
163       std::string_view data);
164 
165   std::unique_ptr<quic::QuicReceivedPacket> ConstructDatagramPacket(
166       uint64_t packet_number,
167       std::string_view data);
168 
169   std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndDataPacket(
170       uint64_t packet_number,
171       uint64_t largest_received,
172       uint64_t smallest_received,
173       std::string_view data);
174 
175   std::unique_ptr<quic::QuicReceivedPacket> ConstructAckAndDatagramPacket(
176       uint64_t packet_number,
177       uint64_t largest_received,
178       uint64_t smallest_received,
179       std::string_view data);
180 
181   std::unique_ptr<quic::QuicReceivedPacket> ConstructAckPacket(
182       uint64_t packet_number,
183       uint64_t largest_received,
184       uint64_t smallest_received);
185 
186   std::unique_ptr<quic::QuicReceivedPacket> ConstructServerRstPacket(
187       uint64_t packet_number,
188       quic::QuicRstStreamErrorCode error_code);
189 
190   std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket(
191       uint64_t packet_number,
192       std::string_view data);
193 
194   std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDatagramPacket(
195       uint64_t packet_number,
196       std::string_view data);
197 
198   std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataFinPacket(
199       uint64_t packet_number,
200       std::string_view data);
201 
202   std::unique_ptr<quic::QuicReceivedPacket> ConstructServerConnectReplyPacket(
203       uint64_t packet_number,
204       bool fin,
205       size_t* header_length = nullptr,
206       std::optional<const HttpRequestHeaders> extra_headers = std::nullopt);
207 
208   std::unique_ptr<quic::QuicReceivedPacket>
209   ConstructServerConnectReplyPacketWithExtraHeaders(
210       uint64_t packet_number,
211       bool fin,
212       std::vector<std::pair<std::string, std::string>> extra_headers);
213 
214   std::unique_ptr<quic::QuicReceivedPacket>
215   ConstructServerConnectAuthReplyPacket(uint64_t packet_number, bool fin);
216 
217   std::unique_ptr<quic::QuicReceivedPacket>
218   ConstructServerConnectRedirectReplyPacket(uint64_t packet_number, bool fin);
219   std::unique_ptr<quic::QuicReceivedPacket>
220   ConstructServerConnectErrorReplyPacket(uint64_t packet_number, bool fin);
221 
222   void ResumeAndRun();
223 
224   virtual void AssertConnectSucceeds() = 0;
225 
226   virtual void AssertConnectFails(int result) = 0;
227 
228   virtual void AssertWriteReturns(const char* data, int len, int rv) = 0;
229 
230   virtual void AssertSyncWriteSucceeds(const char* data, int len) = 0;
231 
232   virtual void AssertSyncReadEquals(const char* data, int len) = 0;
233   virtual void AssertAsyncReadEquals(const char* data, int len) = 0;
234 
235   virtual void AssertReadStarts(const char* data, int len) = 0;
236 
237   virtual void AssertReadReturns(const char* data, int len) = 0;
238 
239   std::string ConstructDataHeader(size_t body_len);
240 
241  protected:
242   static const bool kFin = true;
243   static const bool kIncludeVersion = true;
244   static const bool kIncludeDiversificationNonce = true;
245 
246   RecordingNetLogObserver net_log_observer_;
247   quic::test::QuicFlagSaver saver_;
248   const quic::ParsedQuicVersion version_;
249   const quic::QuicStreamId client_data_stream_id1_;
250 
251   // order of destruction of these members matter
252   quic::MockClock clock_;
253   test::MockQuicData mock_quic_data_;
254   std::unique_ptr<QuicChromiumConnectionHelper> helper_;
255   std::unique_ptr<QuicChromiumClientSession> session_;
256   std::unique_ptr<QuicChromiumClientSession::Handle> session_handle_;
257   std::unique_ptr<QuicChromiumClientStream::Handle> stream_handle_;
258   std::unique_ptr<TestProxyDelegate> proxy_delegate_;
259 
260   raw_ptr<quic::test::MockSendAlgorithm> send_algorithm_;
261   scoped_refptr<test::TestTaskRunner> runner_;
262 
263   std::unique_ptr<QuicChromiumAlarmFactory> alarm_factory_;
264   testing::StrictMock<quic::test::MockQuicConnectionVisitor> visitor_;
265   TransportSecurityState transport_security_state_;
266   SSLConfigServiceDefaults ssl_config_service_;
267   quic::QuicCryptoClientConfig crypto_config_;
268 
269   const quic::QuicConnectionId connection_id_;
270   test::QuicTestPacketMaker client_maker_;
271   test::QuicTestPacketMaker server_maker_;
272   IPEndPoint peer_addr_;
273   IPEndPoint local_addr_;
274   quic::test::MockRandom random_generator_{0};
275   ProofVerifyDetailsChromium verify_details_;
276   MockCryptoClientStreamFactory crypto_client_stream_factory_;
277   quic::test::MockConnectionIdGenerator connection_id_generator_;
278 
279   ProxyChain proxy_chain_ = ProxyChain::ForIpProtection(
280       {{ProxyServer::SCHEME_QUIC, HostPortPair("proxy.example.com", 443)}});
281 
282   std::string user_agent_;
283   url::SchemeHostPort proxy_endpoint_;
284   url::SchemeHostPort destination_endpoint_;
285   HttpAuthCache http_auth_cache_;
286   std::unique_ptr<MockHostResolverBase> host_resolver_;
287   std::unique_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory_;
288 
289   TestCompletionCallback read_callback_;
290   scoped_refptr<IOBuffer> read_buf_;
291 
292   TestCompletionCallback write_callback_;
293 
294   quic::test::NoopQpackStreamSenderDelegate noop_qpack_stream_sender_delegate_;
295 
296   base::HistogramTester histogram_tester_;
297 };
298 }  // namespace net
299 
300 #endif  // NET_QUIC_QUIC_PROXY_CLIENT_SOCKET_TEST_BASE_H_
301