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