xref: /aosp_15_r20/external/cronet/net/websockets/websocket_stream_create_test_base.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2015 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_WEBSOCKETS_WEBSOCKET_STREAM_CREATE_TEST_BASE_H_
6 #define NET_WEBSOCKETS_WEBSOCKET_STREAM_CREATE_TEST_BASE_H_
7 
8 #include <memory>
9 #include <optional>
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 #include "base/functional/callback.h"
15 #include "base/memory/raw_ptr.h"
16 #include "base/run_loop.h"
17 #include "base/timer/timer.h"
18 #include "net/base/auth.h"
19 #include "net/base/net_errors.h"
20 #include "net/socket/socket_test_util.h"
21 #include "net/ssl/ssl_info.h"
22 #include "net/test/test_with_task_environment.h"
23 #include "net/websockets/websocket_event_interface.h"
24 #include "net/websockets/websocket_test_util.h"
25 
26 class GURL;
27 
28 namespace base {
29 class OneShotTimer;
30 }  // namespace base
31 
32 namespace url {
33 class Origin;
34 }  // namespace url
35 
36 namespace net {
37 
38 class HttpRequestHeaders;
39 class HttpResponseHeaders;
40 class IsolationInfo;
41 class SiteForCookies;
42 class URLRequest;
43 class WebSocketStream;
44 class WebSocketStreamRequest;
45 struct WebSocketHandshakeRequestInfo;
46 struct WebSocketHandshakeResponseInfo;
47 
48 class WebSocketStreamCreateTestBase : public WithTaskEnvironment {
49  public:
50   using HeaderKeyValuePair = std::pair<std::string, std::string>;
51 
52   WebSocketStreamCreateTestBase();
53 
54   WebSocketStreamCreateTestBase(const WebSocketStreamCreateTestBase&) = delete;
55   WebSocketStreamCreateTestBase& operator=(
56       const WebSocketStreamCreateTestBase&) = delete;
57 
58   virtual ~WebSocketStreamCreateTestBase();
59 
60   // A wrapper for CreateAndConnectStreamForTesting that knows about our default
61   // parameters.
62   void CreateAndConnectStream(const GURL& socket_url,
63                               const std::vector<std::string>& sub_protocols,
64                               const url::Origin& origin,
65                               const SiteForCookies& site_for_cookies,
66                               bool has_storage_access,
67                               const IsolationInfo& isolation_info,
68                               const HttpRequestHeaders& additional_headers,
69                               std::unique_ptr<base::OneShotTimer> timer);
70 
71   static std::vector<HeaderKeyValuePair> RequestHeadersToVector(
72       const HttpRequestHeaders& headers);
73   static std::vector<HeaderKeyValuePair> ResponseHeadersToVector(
74       const HttpResponseHeaders& headers);
75 
failure_message()76   const std::string& failure_message() const { return failure_message_; }
failure_response_code()77   int failure_response_code() const { return failure_response_code_; }
has_failed()78   bool has_failed() const { return has_failed_; }
79 
80   // Runs |connect_run_loop_|. It will stop when the connection establishes or
81   // fails.
82   void WaitUntilConnectDone();
83 
84   // Runs |run_loop_waiting_for_on_auth_required_| until OnAuthRequired() is
85   // called.
86   void WaitUntilOnAuthRequired();
87 
88   // A simple function to make the tests more readable.
89   std::vector<std::string> NoSubProtocols();
90 
91  protected:
92   WebSocketTestURLRequestContextHost url_request_context_host_;
93   std::unique_ptr<WebSocketStreamRequest> stream_request_;
94   // Only set if the connection succeeded.
95   std::unique_ptr<WebSocketStream> stream_;
96   // Only set if the connection failed.
97   std::string failure_message_;
98   int failure_response_code_ = -1;
99   bool has_failed_ = false;
100   std::unique_ptr<WebSocketHandshakeRequestInfo> request_info_;
101   std::unique_ptr<WebSocketHandshakeResponseInfo> response_info_;
102   std::unique_ptr<WebSocketEventInterface::SSLErrorCallbacks>
103       ssl_error_callbacks_;
104   SSLInfo ssl_info_;
105   bool ssl_fatal_ = false;
106   raw_ptr<URLRequest, AcrossTasksDanglingUntriaged> url_request_ = nullptr;
107   AuthChallengeInfo auth_challenge_info_;
108   base::OnceCallback<void(const AuthCredentials*)> on_auth_required_callback_;
109 
110   // This value will be copied to |*credentials| on OnAuthRequired.
111   std::optional<AuthCredentials> auth_credentials_;
112   // OnAuthRequired returns this value.
113   int on_auth_required_rv_ = OK;
114 
115   base::RunLoop connect_run_loop_;
116 
117   base::RunLoop run_loop_waiting_for_on_auth_required_;
118 
119  private:
120   class TestConnectDelegate;
121 };
122 
123 }  // namespace net
124 
125 #endif  // NET_WEBSOCKETS_WEBSOCKET_STREAM_CREATE_TEST_BASE_H_
126