// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #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/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 url namespace content::test { // Mock UDP Socket for Direct Sockets browsertests. class MockUDPSocket : public network::TestUDPSocket { … }; class MockRestrictedUDPSocket : public network::TestRestrictedUDPSocket { … }; // Mock Network Context for Direct Sockets browsertests. class MockNetworkContext : public network::TestNetworkContextWithHostResolver { … }; // A wrapper class that allows running javascript asynchronously. // // * RunScript(...) returns a unique pointer to // base::test::TestFuture<std::string>. Call // Get(...) on the future pointer to wait for // the script to complete. // * Note that the observer expects exactly one message per script // invocation: // DCHECK(...) will fire if more than one message arrives. // * Can be reused. The following sketch is totally valid: // // IN_PROC_BROWSER_TEST_F(MyTestFixture, MyTest) { // auto runner = // std::make_unique<AsyncJsRunner>(shell()->web_contents()); // // const std::string script_template = "return $1;"; // // const std::string script_a = JsReplace(script_template, "MessageA"); // auto future_a = runner->RunScript(WrapAsync(script_a)); // EXPECT_EQ(future_a->Get(), "\"MessageA\""); // // const std::string script_b = JsReplace(script_template, "MessageB"); // auto future_b = runner->RunScript(WrapAsync(script_b)); // EXPECT_EQ(future_b->Get(), "\"MessageB\""); // } // // Make sure to pass async functions to RunScript(...) (see WrapAsync(...) // below). class AsyncJsRunner : public WebContentsObserver { … }; std::string WrapAsync(const std::string& script); // Mock ContentBrowserClient that enableds direct sockets via permissions policy // for isolated apps. class IsolatedWebAppContentBrowserClient : public ContentBrowserTestContentBrowserClient { … }; } // namespace content::test #endif // CONTENT_BROWSER_DIRECT_SOCKETS_DIRECT_SOCKETS_TEST_UTILS_H_