xref: /aosp_15_r20/external/cronet/net/websockets/websocket_stream_create_test_base.cc (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 #include "net/websockets/websocket_stream_create_test_base.h"
6 
7 #include <stddef.h>
8 
9 #include <utility>
10 
11 #include "base/functional/callback.h"
12 #include "base/memory/raw_ptr.h"
13 #include "base/memory/scoped_refptr.h"
14 #include "base/timer/timer.h"
15 #include "net/http/http_request_headers.h"
16 #include "net/http/http_response_headers.h"
17 #include "net/log/net_log_with_source.h"
18 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
19 #include "net/websockets/websocket_handshake_request_info.h"
20 #include "net/websockets/websocket_handshake_response_info.h"
21 #include "net/websockets/websocket_stream.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 
24 namespace url {
25 class Origin;
26 }  // namespace url
27 
28 namespace net {
29 class IPEndPoint;
30 class SiteForCookies;
31 
32 using HeaderKeyValuePair = WebSocketStreamCreateTestBase::HeaderKeyValuePair;
33 
34 class WebSocketStreamCreateTestBase::TestConnectDelegate
35     : public WebSocketStream::ConnectDelegate {
36  public:
TestConnectDelegate(WebSocketStreamCreateTestBase * owner,base::OnceClosure done_callback)37   TestConnectDelegate(WebSocketStreamCreateTestBase* owner,
38                       base::OnceClosure done_callback)
39       : owner_(owner), done_callback_(std::move(done_callback)) {}
40 
41   TestConnectDelegate(const TestConnectDelegate&) = delete;
42   TestConnectDelegate& operator=(const TestConnectDelegate&) = delete;
43 
OnCreateRequest(URLRequest * request)44   void OnCreateRequest(URLRequest* request) override {
45     owner_->url_request_ = request;
46   }
47 
OnURLRequestConnected(URLRequest * request,const TransportInfo & info)48   void OnURLRequestConnected(URLRequest* request,
49                              const TransportInfo& info) override {}
50 
OnSuccess(std::unique_ptr<WebSocketStream> stream,std::unique_ptr<WebSocketHandshakeResponseInfo> response)51   void OnSuccess(
52       std::unique_ptr<WebSocketStream> stream,
53       std::unique_ptr<WebSocketHandshakeResponseInfo> response) override {
54     if (owner_->response_info_)
55       ADD_FAILURE();
56     owner_->response_info_ = std::move(response);
57     stream.swap(owner_->stream_);
58     std::move(done_callback_).Run();
59   }
60 
OnFailure(const std::string & message,int net_error,std::optional<int> response_code)61   void OnFailure(const std::string& message,
62                  int net_error,
63                  std::optional<int> response_code) override {
64     owner_->has_failed_ = true;
65     owner_->failure_message_ = message;
66     owner_->failure_response_code_ = response_code.value_or(-1);
67     std::move(done_callback_).Run();
68   }
69 
OnStartOpeningHandshake(std::unique_ptr<WebSocketHandshakeRequestInfo> request)70   void OnStartOpeningHandshake(
71       std::unique_ptr<WebSocketHandshakeRequestInfo> request) override {
72     // Can be called multiple times (in the case of HTTP auth). Last call
73     // wins.
74     owner_->request_info_ = std::move(request);
75   }
76 
OnSSLCertificateError(std::unique_ptr<WebSocketEventInterface::SSLErrorCallbacks> ssl_error_callbacks,int net_error,const SSLInfo & ssl_info,bool fatal)77   void OnSSLCertificateError(
78       std::unique_ptr<WebSocketEventInterface::SSLErrorCallbacks>
79           ssl_error_callbacks,
80       int net_error,
81       const SSLInfo& ssl_info,
82       bool fatal) override {
83     owner_->ssl_error_callbacks_ = std::move(ssl_error_callbacks);
84     owner_->ssl_info_ = ssl_info;
85     owner_->ssl_fatal_ = fatal;
86   }
87 
OnAuthRequired(const AuthChallengeInfo & auth_info,scoped_refptr<HttpResponseHeaders> response_headers,const IPEndPoint & remote_endpoint,base::OnceCallback<void (const AuthCredentials *)> callback,std::optional<AuthCredentials> * credentials)88   int OnAuthRequired(const AuthChallengeInfo& auth_info,
89                      scoped_refptr<HttpResponseHeaders> response_headers,
90                      const IPEndPoint& remote_endpoint,
91                      base::OnceCallback<void(const AuthCredentials*)> callback,
92                      std::optional<AuthCredentials>* credentials) override {
93     owner_->run_loop_waiting_for_on_auth_required_.Quit();
94     owner_->auth_challenge_info_ = auth_info;
95     *credentials = owner_->auth_credentials_;
96     owner_->on_auth_required_callback_ = std::move(callback);
97     return owner_->on_auth_required_rv_;
98   }
99 
100  private:
101   raw_ptr<WebSocketStreamCreateTestBase> owner_;
102   base::OnceClosure done_callback_;
103 };
104 
105 WebSocketStreamCreateTestBase::WebSocketStreamCreateTestBase() = default;
106 
107 WebSocketStreamCreateTestBase::~WebSocketStreamCreateTestBase() = default;
108 
CreateAndConnectStream(const GURL & socket_url,const std::vector<std::string> & sub_protocols,const url::Origin & origin,const SiteForCookies & site_for_cookies,bool has_storage_access,const IsolationInfo & isolation_info,const HttpRequestHeaders & additional_headers,std::unique_ptr<base::OneShotTimer> timer)109 void WebSocketStreamCreateTestBase::CreateAndConnectStream(
110     const GURL& socket_url,
111     const std::vector<std::string>& sub_protocols,
112     const url::Origin& origin,
113     const SiteForCookies& site_for_cookies,
114     bool has_storage_access,
115     const IsolationInfo& isolation_info,
116     const HttpRequestHeaders& additional_headers,
117     std::unique_ptr<base::OneShotTimer> timer) {
118   auto connect_delegate = std::make_unique<TestConnectDelegate>(
119       this, connect_run_loop_.QuitClosure());
120   auto api_delegate = std::make_unique<TestWebSocketStreamRequestAPI>();
121   stream_request_ = WebSocketStream::CreateAndConnectStreamForTesting(
122       socket_url, sub_protocols, origin, site_for_cookies, has_storage_access,
123       isolation_info, additional_headers,
124       url_request_context_host_.GetURLRequestContext(), NetLogWithSource(),
125       TRAFFIC_ANNOTATION_FOR_TESTS, std::move(connect_delegate),
126       timer ? std::move(timer) : std::make_unique<base::OneShotTimer>(),
127       std::move(api_delegate));
128 }
129 
130 std::vector<HeaderKeyValuePair>
RequestHeadersToVector(const HttpRequestHeaders & headers)131 WebSocketStreamCreateTestBase::RequestHeadersToVector(
132     const HttpRequestHeaders& headers) {
133   HttpRequestHeaders::Iterator it(headers);
134   std::vector<HeaderKeyValuePair> result;
135   while (it.GetNext())
136     result.emplace_back(it.name(), it.value());
137   return result;
138 }
139 
140 std::vector<HeaderKeyValuePair>
ResponseHeadersToVector(const HttpResponseHeaders & headers)141 WebSocketStreamCreateTestBase::ResponseHeadersToVector(
142     const HttpResponseHeaders& headers) {
143   size_t iter = 0;
144   std::string name, value;
145   std::vector<HeaderKeyValuePair> result;
146   while (headers.EnumerateHeaderLines(&iter, &name, &value))
147     result.emplace_back(name, value);
148   return result;
149 }
150 
WaitUntilConnectDone()151 void WebSocketStreamCreateTestBase::WaitUntilConnectDone() {
152   connect_run_loop_.Run();
153 }
154 
WaitUntilOnAuthRequired()155 void WebSocketStreamCreateTestBase::WaitUntilOnAuthRequired() {
156   run_loop_waiting_for_on_auth_required_.Run();
157 }
158 
NoSubProtocols()159 std::vector<std::string> WebSocketStreamCreateTestBase::NoSubProtocols() {
160   return std::vector<std::string>();
161 }
162 
163 }  // namespace net
164