xref: /aosp_15_r20/external/cronet/net/quic/quic_session_pool_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_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