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