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_SESSION_POOL_TEST_BASE_H_ 6 #define NET_QUIC_QUIC_SESSION_POOL_TEST_BASE_H_ 7 8 #include <sys/types.h> 9 10 #include <memory> 11 #include <ostream> 12 #include <set> 13 #include <string> 14 #include <utility> 15 16 #include "base/functional/bind.h" 17 #include "base/functional/callback.h" 18 #include "base/logging.h" 19 #include "base/memory/raw_ptr.h" 20 #include "base/test/scoped_feature_list.h" 21 #include "net/base/features.h" 22 #include "net/base/mock_network_change_notifier.h" 23 #include "net/base/net_error_details.h" 24 #include "net/base/session_usage.h" 25 #include "net/base/test_proxy_delegate.h" 26 #include "net/cert/mock_cert_verifier.h" 27 #include "net/dns/mock_host_resolver.h" 28 #include "net/http/http_stream.h" 29 #include "net/http/transport_security_state.h" 30 #include "net/http/transport_security_state_test_util.h" 31 #include "net/log/net_log.h" 32 #include "net/quic/crypto/proof_verifier_chromium.h" 33 #include "net/quic/mock_crypto_client_stream_factory.h" 34 #include "net/quic/mock_quic_context.h" 35 #include "net/quic/mock_quic_data.h" 36 #include "net/quic/platform/impl/quic_test_flags_utils.h" 37 #include "net/quic/quic_session_pool.h" 38 #include "net/quic/quic_test_packet_maker.h" 39 #include "net/quic/quic_test_packet_printer.h" 40 #include "net/quic/test_task_runner.h" 41 #include "net/socket/datagram_client_socket.h" 42 #include "net/socket/socket_test_util.h" 43 #include "net/ssl/test_ssl_config_service.h" 44 #include "net/test/test_with_task_environment.h" 45 #include "net/third_party/quiche/src/quiche/quic/core/quic_session.h" 46 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" 47 #include "net/url_request/static_http_user_agent_settings.h" 48 49 namespace net::test { 50 51 class QuicSessionPoolTestBase : public WithTaskEnvironment { 52 public: 53 static constexpr char kDefaultServerHostName[] = "www.example.org"; 54 static constexpr char kServer2HostName[] = "mail.example.org"; 55 static constexpr char kServer3HostName[] = "docs.example.org"; 56 static constexpr char kServer4HostName[] = "images.example.org"; 57 static constexpr char kServer5HostName[] = "accounts.example.org"; 58 static constexpr char kProxy1HostName[] = "proxy1.example.org"; 59 static constexpr char kProxy2HostName[] = "proxy2.example.org"; 60 static constexpr char kDifferentHostname[] = "different.example.com"; 61 static constexpr int kDefaultServerPort = 443; 62 static constexpr char kDefaultUrl[] = "https://www.example.org/"; 63 static constexpr char kServer2Url[] = "https://mail.example.org/"; 64 static constexpr char kServer3Url[] = "https://docs.example.org/"; 65 static constexpr char kServer4Url[] = "https://images.example.org/"; 66 static constexpr char kServer5Url[] = "https://images.example.org/"; 67 static constexpr char kProxy1Url[] = "https://proxy1.example.org/"; 68 static constexpr char kProxy2Url[] = "https://proxy2.example.org/"; 69 static constexpr size_t kMinRetryTimeForDefaultNetworkSecs = 1; 70 static constexpr size_t kWaitTimeForNewNetworkSecs = 10; 71 static constexpr uint64_t kConnectUdpContextId = 0; 72 73 protected: 74 explicit QuicSessionPoolTestBase( 75 quic::ParsedQuicVersion version, 76 std::vector<base::test::FeatureRef> enabled_features = {}, 77 std::vector<base::test::FeatureRef> disabled_features = {}); 78 ~QuicSessionPoolTestBase(); 79 80 void Initialize(); 81 82 // Make a NEW_CONNECTION_ID frame available for client such that connection 83 // migration can begin with a new connection ID. A side effect of calling 84 // this function is that ACK_FRAME that should have been sent for the first 85 // packet read might be skipped in the unit test. If the order of ACKing is 86 // important for a test, use QuicTestPacketMaker::MakeNewConnectionIdPacket 87 // instead. 88 void MaybeMakeNewConnectionIdAvailableToSession( 89 const quic::QuicConnectionId& new_cid, 90 quic::QuicSession* session, 91 uint64_t sequence_number = 1u); 92 93 // Helper for building requests and invoking `QuicSessionRequest::Request`. 94 // This `Request` method has lots of arguments, most of which are always at 95 // their default values, so this helper supports specifying only the 96 // non-default arguments relevant to a specific test. 97 struct RequestBuilder { 98 RequestBuilder(QuicSessionPoolTestBase* test, QuicSessionPool* pool); 99 explicit RequestBuilder(QuicSessionPoolTestBase* test); 100 ~RequestBuilder(); 101 102 RequestBuilder(const RequestBuilder&) = delete; 103 RequestBuilder& operator=(const RequestBuilder&) = delete; 104 105 // Call the request's `Request` method with the parameters in the builder. 106 // The builder becomes invalid after this call. 107 int CallRequest(); 108 109 // Arguments to request.Request(). 110 url::SchemeHostPort destination{url::kHttpsScheme, kDefaultServerHostName, 111 kDefaultServerPort}; 112 quic::ParsedQuicVersion quic_version; 113 ProxyChain proxy_chain = ProxyChain::Direct(); 114 std::optional<NetworkTrafficAnnotationTag> proxy_annotation_tag = 115 TRAFFIC_ANNOTATION_FOR_TESTS; 116 raw_ptr<HttpUserAgentSettings> http_user_agent_settings = nullptr; 117 SessionUsage session_usage = SessionUsage::kDestination; 118 PrivacyMode privacy_mode = PRIVACY_MODE_DISABLED; 119 RequestPriority priority = DEFAULT_PRIORITY; 120 SocketTag socket_tag; 121 NetworkAnonymizationKey network_anonymization_key; 122 SecureDnsPolicy secure_dns_policy = SecureDnsPolicy::kAllow; 123 bool require_dns_https_alpn = false; 124 int cert_verify_flags = 0; 125 GURL url = GURL(kDefaultUrl); 126 NetLogWithSource net_log; 127 NetErrorDetails net_error_details; 128 CompletionOnceCallback failed_on_default_network_callback; 129 CompletionOnceCallback callback; 130 131 // The resulting request. 132 QuicSessionRequest request; 133 }; 134 135 std::unique_ptr<HttpStream> CreateStream(QuicSessionRequest* request); 136 137 bool HasActiveSession( 138 const url::SchemeHostPort& scheme_host_port, 139 const NetworkAnonymizationKey& network_anonymization_key = 140 NetworkAnonymizationKey(), 141 const ProxyChain& proxy_chain = ProxyChain::Direct(), 142 SessionUsage session_usage = SessionUsage::kDestination, 143 bool require_dns_https_alpn = false); 144 bool HasActiveJob(const url::SchemeHostPort& scheme_host_port, 145 const PrivacyMode privacy_mode, 146 bool require_dns_https_alpn = false); 147 148 // Get the pending, not activated session, if there is only one session alive. 149 QuicChromiumClientSession* GetPendingSession( 150 const url::SchemeHostPort& scheme_host_port); 151 QuicChromiumClientSession* GetActiveSession( 152 const url::SchemeHostPort& scheme_host_port, 153 const NetworkAnonymizationKey& network_anonymization_key = 154 NetworkAnonymizationKey(), 155 const ProxyChain& proxy_chain = ProxyChain::Direct(), 156 SessionUsage session_usage = SessionUsage::kDestination, 157 bool require_dns_https_alpn = false); 158 159 int GetSourcePortForNewSessionAndGoAway( 160 const url::SchemeHostPort& destination); 161 int GetSourcePortForNewSessionInner(const url::SchemeHostPort& destination, 162 bool goaway_received); 163 164 static ProofVerifyDetailsChromium DefaultProofVerifyDetails(); 165 166 void NotifyIPAddressChanged(); 167 168 std::unique_ptr<quic::QuicEncryptedPacket> 169 ConstructServerConnectionClosePacket(uint64_t num); 170 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket( 171 uint64_t packet_number, 172 quic::QuicRstStreamErrorCode error_code); 173 std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket( 174 uint64_t packet_number, 175 quic::QuicStreamId stream_id, 176 bool fin); 177 std::unique_ptr<quic::QuicEncryptedPacket> ConstructConnectUdpRequestPacket( 178 uint64_t packet_number, 179 quic::QuicStreamId stream_id, 180 std::string authority, 181 std::string path, 182 bool fin); 183 std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientH3DatagramPacket( 184 uint64_t packet_number, 185 uint64_t quarter_stream_id, 186 uint64_t context_id, 187 std::unique_ptr<quic::QuicEncryptedPacket> inner); 188 std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket( 189 uint64_t packet_number, 190 quic::QuicStreamId stream_id, 191 bool fin); 192 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(); 193 std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket( 194 uint64_t packet_number); 195 std::unique_ptr<quic::QuicEncryptedPacket> ConstructServerSettingsPacket( 196 uint64_t packet_number); 197 198 std::string ConstructDataHeader(size_t body_len); 199 200 std::unique_ptr<quic::QuicEncryptedPacket> ConstructServerDataPacket( 201 uint64_t packet_number, 202 quic::QuicStreamId stream_id, 203 bool fin, 204 std::string_view data); 205 206 quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) const; 207 quic::QuicStreamId GetQpackDecoderStreamId() const; 208 std::string StreamCancellationQpackDecoderInstruction(int n) const; 209 std::string StreamCancellationQpackDecoderInstruction( 210 int n, 211 bool create_stream) const; 212 quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n); 213 214 void OnFailedOnDefaultNetwork(int rv); 215 216 const quic::QuicConnectionId kNewCID = quic::test::TestConnectionId(12345678); 217 const url::SchemeHostPort kDefaultDestination{ 218 url::kHttpsScheme, kDefaultServerHostName, kDefaultServerPort}; 219 220 quic::test::QuicFlagSaver flags_; // Save/restore all QUIC flag values. 221 std::unique_ptr<MockHostResolverBase> host_resolver_; 222 TestSSLConfigService ssl_config_service_{SSLContextConfig()}; 223 std::unique_ptr<MockClientSocketFactory> socket_factory_; 224 MockCryptoClientStreamFactory crypto_client_stream_factory_; 225 MockQuicContext context_; 226 const quic::ParsedQuicVersion version_; 227 QuicTestPacketMaker client_maker_; 228 QuicTestPacketMaker server_maker_; 229 std::unique_ptr<HttpServerProperties> http_server_properties_; 230 std::unique_ptr<MockCertVerifier> cert_verifier_; 231 TransportSecurityState transport_security_state_; 232 std::unique_ptr<TestProxyDelegate> proxy_delegate_; 233 std::unique_ptr<ScopedMockNetworkChangeNotifier> 234 scoped_mock_network_change_notifier_; 235 std::unique_ptr<QuicSessionPool> factory_; 236 237 NetLogWithSource net_log_; 238 TestCompletionCallback callback_; 239 const CompletionRepeatingCallback failed_on_default_network_callback_; 240 bool failed_on_default_network_ = false; 241 NetErrorDetails net_error_details_; 242 StaticHttpUserAgentSettings http_user_agent_settings_ = {"test-lang", 243 "test-ua"}; 244 245 raw_ptr<QuicParams> quic_params_; 246 base::test::ScopedFeatureList scoped_feature_list_; 247 }; 248 249 } // namespace net::test 250 251 #endif // NET_QUIC_QUIC_SESSION_POOL_TEST_BASE_H_ 252