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