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