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