#ifndef NET_WEBSOCKETS_WEBSOCKET_TEST_UTIL_H_
#define NET_WEBSOCKETS_WEBSOCKET_TEST_UTIL_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "net/http/http_basic_state.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_stream_parser.h"
#include "net/socket/client_socket_handle.h"
#include "net/third_party/quiche/src/quiche/common/http/http_header_block.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_test_util.h"
#include "net/websockets/websocket_event_interface.h"
#include "net/websockets/websocket_handshake_stream_create_helper.h"
#include "net/websockets/websocket_stream.h"
namespace url {
class Origin;
}
namespace net {
class AuthChallengeInfo;
class AuthCredentials;
class HttpResponseHeaders;
class IPEndPoint;
class MockClientSocketFactory;
class SSLInfo;
class SequencedSocketData;
class URLRequest;
class URLRequestContextBuilder;
class WebSocketBasicHandshakeStream;
class WebSocketHttp2HandshakeStream;
class WebSocketHttp3HandshakeStream;
struct SSLSocketDataProvider;
struct WebSocketHandshakeRequestInfo;
struct WebSocketHandshakeResponseInfo;
using WebSocketExtraHeaders = std::vector<std::pair<std::string, std::string>>;
class LinearCongruentialGenerator {
public:
explicit LinearCongruentialGenerator(uint32_t seed);
uint32_t Generate();
private:
uint64_t current_;
};
std::string WebSocketExtraHeadersToString(const WebSocketExtraHeaders& headers);
HttpRequestHeaders WebSocketExtraHeadersToHttpRequestHeaders(
const WebSocketExtraHeaders& headers);
std::string WebSocketStandardRequest(
const std::string& path,
const std::string& host,
const url::Origin& origin,
const WebSocketExtraHeaders& send_additional_request_headers,
const WebSocketExtraHeaders& extra_headers);
std::string WebSocketStandardRequestWithCookies(
const std::string& path,
const std::string& host,
const url::Origin& origin,
const WebSocketExtraHeaders& cookies,
const WebSocketExtraHeaders& send_additional_request_headers,
const WebSocketExtraHeaders& extra_headers);
std::string WebSocketStandardResponse(const std::string& extra_headers);
HttpRequestHeaders WebSocketCommonTestHeaders();
quiche::HttpHeaderBlock WebSocketHttp2Request(
const std::string& path,
const std::string& authority,
const std::string& origin,
const WebSocketExtraHeaders& extra_headers);
quiche::HttpHeaderBlock WebSocketHttp2Response(
const WebSocketExtraHeaders& extra_headers);
class WebSocketMockClientSocketFactoryMaker {
public:
WebSocketMockClientSocketFactoryMaker();
WebSocketMockClientSocketFactoryMaker(
const WebSocketMockClientSocketFactoryMaker&) = delete;
WebSocketMockClientSocketFactoryMaker& operator=(
const WebSocketMockClientSocketFactoryMaker&) = delete;
~WebSocketMockClientSocketFactoryMaker();
void SetExpectations(const std::string& expect_written,
const std::string& return_to_read);
void AddRawExpectations(std::unique_ptr<SequencedSocketData> socket_data);
void AddSSLSocketDataProvider(
std::unique_ptr<SSLSocketDataProvider> ssl_socket_data);
MockClientSocketFactory* factory();
private:
struct Detail;
std::unique_ptr<Detail> detail_;
};
struct WebSocketTestURLRequestContextHost {
public:
WebSocketTestURLRequestContextHost();
WebSocketTestURLRequestContextHost(
const WebSocketTestURLRequestContextHost&) = delete;
WebSocketTestURLRequestContextHost& operator=(
const WebSocketTestURLRequestContextHost&) = delete;
~WebSocketTestURLRequestContextHost();
void SetExpectations(const std::string& expect_written,
const std::string& return_to_read) {
maker_.SetExpectations(expect_written, return_to_read);
}
void AddRawExpectations(std::unique_ptr<SequencedSocketData> socket_data);
void AddSSLSocketDataProvider(
std::unique_ptr<SSLSocketDataProvider> ssl_socket_data);
void SetProxyConfig(const std::string& proxy_rules);
URLRequestContext* GetURLRequestContext();
const TestNetworkDelegate& network_delegate() const {
return *static_cast<TestNetworkDelegate*>(
url_request_context_->network_delegate());
}
private:
WebSocketMockClientSocketFactoryMaker maker_;
std::unique_ptr<URLRequestContextBuilder> url_request_context_builder_;
std::unique_ptr<URLRequestContext> url_request_context_;
TestNetworkDelegate network_delegate_;
};
class DummyConnectDelegate : public WebSocketStream::ConnectDelegate {
public:
DummyConnectDelegate() = default;
~DummyConnectDelegate() override = default;
int OnURLRequestConnected(URLRequest* request,
const TransportInfo& info,
CompletionOnceCallback callback) override;
void OnCreateRequest(URLRequest* url_request) override {}
void OnSuccess(
std::unique_ptr<WebSocketStream> stream,
std::unique_ptr<WebSocketHandshakeResponseInfo> response) override {}
void OnFailure(const std::string& message,
int net_error,
std::optional<int> response_code) override {}
void OnStartOpeningHandshake(
std::unique_ptr<WebSocketHandshakeRequestInfo> request) override {}
void OnSSLCertificateError(
std::unique_ptr<WebSocketEventInterface::SSLErrorCallbacks>
ssl_error_callbacks,
int net_error,
const SSLInfo& ssl_info,
bool fatal) override {}
int OnAuthRequired(const AuthChallengeInfo& auth_info,
scoped_refptr<HttpResponseHeaders> response_headers,
const IPEndPoint& remote_endpoint,
base::OnceCallback<void(const AuthCredentials*)> callback,
std::optional<AuthCredentials>* credentials) override;
};
class TestWebSocketStreamRequestAPI : public WebSocketStreamRequestAPI {
public:
TestWebSocketStreamRequestAPI() = default;
~TestWebSocketStreamRequestAPI() override = default;
void OnBasicHandshakeStreamCreated(
WebSocketBasicHandshakeStream* handshake_stream) override;
void OnHttp2HandshakeStreamCreated(
WebSocketHttp2HandshakeStream* handshake_stream) override;
void OnHttp3HandshakeStreamCreated(
WebSocketHttp3HandshakeStream* handshake_stream) override;
void OnFailure(const std::string& message,
int net_error,
std::optional<int> response_code) override {}
};
class TestWebSocketHandshakeStreamCreateHelper
: public WebSocketHandshakeStreamCreateHelper {
public:
TestWebSocketHandshakeStreamCreateHelper()
: WebSocketHandshakeStreamCreateHelper(&connect_delegate_,
{},
&request_) {}
TestWebSocketHandshakeStreamCreateHelper(
const TestWebSocketHandshakeStreamCreateHelper&) = delete;
TestWebSocketHandshakeStreamCreateHelper& operator=(
const TestWebSocketHandshakeStreamCreateHelper&) = delete;
~TestWebSocketHandshakeStreamCreateHelper() override = default;
private:
DummyConnectDelegate connect_delegate_;
TestWebSocketStreamRequestAPI request_;
};
}
#endif