diff --git a/Ladybird/Headless/Application.cpp b/Ladybird/Headless/Application.cpp index 90bdcaac323..767ee5c1643 100644 --- a/Ladybird/Headless/Application.cpp +++ b/Ladybird/Headless/Application.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -20,6 +21,12 @@ Application::Application(Badge, Main::Arguments&) { } +Application::~Application() +{ + for (auto& fixture : Fixture::all()) + fixture->teardown(); +} + void Application::create_platform_arguments(Core::ArgsParser& args_parser) { args_parser.add_option(screenshot_timeout, "Take a screenshot after [n] seconds (default: 1)", "screenshot", 's', "n"); @@ -72,6 +79,19 @@ ErrorOr Application::launch_services() return {}; } +ErrorOr Application::launch_test_fixtures() +{ + Fixture::initialize_fixtures(); + + // FIXME: Add option to only run specific fixtures from command line by name + // And an option to not run any fixtures at all + for (auto& fixture : Fixture::all()) { + if (auto result = fixture->setup(); result.is_error()) + return result; + } + return {}; +} + HeadlessWebView& Application::create_web_view(Core::AnonymousBuffer theme, Gfx::IntSize window_size) { auto web_view = HeadlessWebView::create(move(theme), window_size); diff --git a/Ladybird/Headless/Application.h b/Ladybird/Headless/Application.h index 88ca79ef14c..4126d130154 100644 --- a/Ladybird/Headless/Application.h +++ b/Ladybird/Headless/Application.h @@ -24,6 +24,8 @@ class Application : public WebView::Application { WEB_VIEW_APPLICATION(Application) public: + ~Application(); + static Application& the() { return static_cast(WebView::Application::the()); @@ -33,6 +35,7 @@ public: virtual void create_platform_options(WebView::ChromeOptions&, WebView::WebContentOptions&) override; ErrorOr launch_services(); + ErrorOr launch_test_fixtures(); static Requests::RequestClient& request_client() { return *the().m_request_client; } static ImageDecoderClient::Client& image_decoder_client() { return *the().m_image_decoder_client; } diff --git a/Ladybird/Headless/CMakeLists.txt b/Ladybird/Headless/CMakeLists.txt index b9c1fb4b53e..46328f96d5e 100644 --- a/Ladybird/Headless/CMakeLists.txt +++ b/Ladybird/Headless/CMakeLists.txt @@ -1,6 +1,7 @@ set(SOURCES ${LADYBIRD_SOURCES} Application.cpp + Fixture.cpp HeadlessWebView.cpp Test.cpp main.cpp diff --git a/Ladybird/Headless/Fixture.cpp b/Ladybird/Headless/Fixture.cpp new file mode 100644 index 00000000000..6ac31230f77 --- /dev/null +++ b/Ladybird/Headless/Fixture.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Ladybird { + +// Key function for Fixture +Fixture::~Fixture() = default; + +Optional Fixture::lookup(StringView name) +{ + for (auto& fixture : all()) { + if (fixture->name() == name) + return *fixture; + } + return {}; +} + +Vector>& Fixture::all() +{ + static Vector> fixtures; + return fixtures; +} + +void Fixture::initialize_fixtures() +{ +} + +} diff --git a/Ladybird/Headless/Fixture.h b/Ladybird/Headless/Fixture.h new file mode 100644 index 00000000000..79c29b322fc --- /dev/null +++ b/Ladybird/Headless/Fixture.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Ladybird { + +class Fixture { +public: + virtual ~Fixture(); + + virtual ErrorOr setup() = 0; + + void teardown() + { + if (is_running()) + teardown_impl(); + } + + virtual StringView name() const = 0; + virtual bool is_running() const { return false; } + + static void initialize_fixtures(); + static Optional lookup(StringView name); + static Vector>& all(); + +protected: + virtual void teardown_impl() = 0; +}; + +} diff --git a/Ladybird/Headless/main.cpp b/Ladybird/Headless/main.cpp index ce4fd7c2179..6af23627f96 100644 --- a/Ladybird/Headless/main.cpp +++ b/Ladybird/Headless/main.cpp @@ -76,6 +76,7 @@ ErrorOr serenity_main(Main::Arguments arguments) if (!app->test_root_path.is_empty()) { app->test_root_path = LexicalPath::absolute_path(TRY(FileSystem::current_working_directory()), app->test_root_path); + TRY(app->launch_test_fixtures()); TRY(Ladybird::run_tests(theme, window_size)); return 0;