#ifndef CONTENT_BROWSER_DIRECT_SOCKETS_DIRECT_SOCKETS_TEST_UTILS_H_
#define CONTENT_BROWSER_DIRECT_SOCKETS_DIRECT_SOCKETS_TEST_UTILS_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <string>
#include <string_view>
#include "base/containers/span.h"
#include "base/functional/callback_forward.h"
#include "base/test/test_future.h"
#include "base/token.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test_content_browser_client.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
#include "services/network/test/test_network_context_with_host_resolver.h"
#include "services/network/test/test_restricted_udp_socket.h"
#include "services/network/test/test_udp_socket.h"
namespace url {
class Origin;
}
namespace content::test {
class MockUDPSocket : public network::TestUDPSocket {
public:
explicit MockUDPSocket(
mojo::PendingRemote<network::mojom::UDPSocketListener> listener);
~MockUDPSocket() override;
void Connect(const net::IPEndPoint& remote_addr,
network::mojom::UDPSocketOptionsPtr socket_options,
ConnectCallback callback) override;
void ReceiveMore(uint32_t) override {}
void Send(base::span<const uint8_t> data,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
SendCallback callback) override;
void MockSend(int32_t result,
const std::optional<base::span<uint8_t>>& data = {});
mojo::Remote<network::mojom::UDPSocketListener>& get_listener() {
return listener_;
}
void SetAdditionalSendCallback(base::OnceClosure additional_send_callback) {
additional_send_callback_ = std::move(additional_send_callback);
}
void SetNextSendResult(int result) { next_send_result_ = result; }
protected:
mojo::Remote<network::mojom::UDPSocketListener> listener_;
std::optional<int> next_send_result_;
SendCallback callback_;
base::OnceClosure additional_send_callback_;
};
class MockRestrictedUDPSocket : public network::TestRestrictedUDPSocket {
public:
MockRestrictedUDPSocket(
std::unique_ptr<network::TestUDPSocket> udp_socket,
mojo::PendingReceiver<network::mojom::RestrictedUDPSocket> receiver);
~MockRestrictedUDPSocket() override;
private:
mojo::Receiver<network::mojom::RestrictedUDPSocket> receiver_;
};
class MockNetworkContext : public network::TestNetworkContextWithHostResolver {
public:
MockNetworkContext();
explicit MockNetworkContext(std::string_view host_mapping_rules);
MockNetworkContext(const MockNetworkContext&) = delete;
MockNetworkContext& operator=(const MockNetworkContext&) = delete;
~MockNetworkContext() override;
void CreateRestrictedUDPSocket(
const net::IPEndPoint& addr,
network::mojom::RestrictedUDPSocketMode mode,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
network::mojom::RestrictedUDPSocketParamsPtr params,
mojo::PendingReceiver<network::mojom::RestrictedUDPSocket> receiver,
mojo::PendingRemote<network::mojom::UDPSocketListener> listener,
bool allow_multicast,
CreateRestrictedUDPSocketCallback callback) override;
MockUDPSocket* get_udp_socket() {
return static_cast<MockUDPSocket*>(restricted_udp_socket_->udp_socket());
}
protected:
virtual std::unique_ptr<MockUDPSocket> CreateMockUDPSocket(
mojo::PendingRemote<network::mojom::UDPSocketListener> listener);
std::unique_ptr<MockRestrictedUDPSocket> restricted_udp_socket_;
};
class AsyncJsRunner : public WebContentsObserver {
public:
explicit AsyncJsRunner(content::WebContents* web_contents);
~AsyncJsRunner() override;
base::test::TestFuture<std::string> RunScript(const std::string& script);
void DomOperationResponse(RenderFrameHost* render_frame_host,
const std::string& json_string) override;
private:
std::string MakeScriptSendResultToDomQueue(const std::string& script) const;
base::OnceCallback<void(std::string)> future_callback_;
base::Token token_;
};
std::string WrapAsync(const std::string& script);
class IsolatedWebAppContentBrowserClient
: public ContentBrowserTestContentBrowserClient {
public:
explicit IsolatedWebAppContentBrowserClient(
const url::Origin& isolated_app_origin);
bool ShouldUrlUseApplicationIsolationLevel(BrowserContext* browser_context,
const GURL& url) override;
std::optional<network::ParsedPermissionsPolicy>
GetPermissionsPolicyForIsolatedWebApp(WebContents* web_contents,
const url::Origin& app_origin) override;
private:
url::Origin isolated_app_origin_;
};
}
#endif