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