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