diff --git a/Userland/test-js.cpp b/Userland/test-js.cpp index f3821d4c97f..dcc63996916 100644 --- a/Userland/test-js.cpp +++ b/Userland/test-js.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -145,6 +146,21 @@ JS_DEFINE_NATIVE_FUNCTION(TestRunnerGlobalObject::is_strict_mode) return JS::Value(interpreter.in_strict_mode()); } +static void cleanup_and_exit() +{ + // Clear the taskbar progress. +#ifdef __serenity__ + fprintf(stderr, "\033]9;-1;\033\\"); +#endif + exit(1); +} + +static void handle_sigabrt(int) +{ + dbg() << "test-js: SIGABRT received, cleaning up."; + cleanup_and_exit(); +} + static double get_time_in_ms() { struct timeval tv1; @@ -208,7 +224,7 @@ static Result, ParserError> parse_file(const String& auto result = file->open(Core::IODevice::ReadOnly); if (!result) { printf("Failed to open the following file: \"%s\"\n", file_path.characters()); - exit(1); + cleanup_and_exit(); } auto contents = file->read_all(); @@ -249,7 +265,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) printf("Unable to parse test-common.js\n"); printf("%s\n", result.error().error.to_string().characters()); printf("%s\n", result.error().hint.characters()); - exit(1); + cleanup_and_exit();; } m_test_program = result.value(); } @@ -264,7 +280,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) auto test_json = get_test_results(*interpreter); if (!test_json.has_value()) { printf("Received malformed JSON from test \"%s\"\n", test_path.characters()); - exit(1); + cleanup_and_exit(); } JSFileResult file_result { test_path.substring(m_test_root.length() + 1, test_path.length() - m_test_root.length() - 1) }; @@ -540,6 +556,16 @@ int main(int argc, char** argv) { bool print_times = false; + struct sigaction act; + memset(&act, 0, sizeof(act)); + act.sa_flags = SA_NOCLDWAIT; + act.sa_handler = handle_sigabrt; + int rc = sigaction(SIGABRT, &act, nullptr); + if (rc < 0) { + perror("sigaction"); + return 1; + } + Core::ArgsParser args_parser; args_parser.add_option(print_times, "Show duration of each test", "show-time", 't'); args_parser.parse(argc, argv); diff --git a/Userland/test-web.cpp b/Userland/test-web.cpp index a83ce8ace14..6a27b7fbe2b 100644 --- a/Userland/test-web.cpp +++ b/Userland/test-web.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #define TOP_LEVEL_TEST_NAME "__$$TOP_LEVEL$$__" @@ -164,6 +165,21 @@ private: RefPtr m_web_test_common; }; +static void cleanup_and_exit() +{ + // Clear the taskbar progress. +#ifdef __serenity__ + fprintf(stderr, "\033]9;-1;\033\\"); +#endif + exit(1); +} + +static void handle_sigabrt(int) +{ + dbg() << "test-web: SIGABRT received, cleaning up."; + cleanup_and_exit(); +} + static double get_time_in_ms() { struct timeval tv1; @@ -210,7 +226,7 @@ void TestRunner::run() g_on_page_change = [this](auto& page_to_load) { if (!page_to_load.is_valid()) { printf("Invalid page URL (%s) on page change", page_to_load.to_string().characters()); - exit(1); + cleanup_and_exit(); } ASSERT(m_page_view->document()); @@ -228,7 +244,7 @@ void TestRunner::run() }, [page_to_load](auto error) { printf("Failed to load test page: %s (%s)", page_to_load.to_string().characters(), error.characters()); - exit(1); + cleanup_and_exit(); }); }; @@ -253,7 +269,7 @@ static Result, ParserError> parse_file(const String& auto result = file->open(Core::IODevice::ReadOnly); if (!result) { printf("Failed to open the following file: \"%s\"\n", file_path.characters()); - exit(1); + cleanup_and_exit(); } auto contents = file->read_all(); @@ -293,7 +309,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) auto result = parse_file(String::format("%s/test-common.js", m_js_test_root.characters())); if (result.is_error()) { printf("Unable to parse %s/test-common.js", m_js_test_root.characters()); - exit(1); + cleanup_and_exit(); } m_js_test_common = result.value(); } @@ -302,7 +318,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) auto result = parse_file(String::format("%s/test-common.js", m_web_test_root.characters())); if (result.is_error()) { printf("Unable to parse %s/test-common.js", m_web_test_root.characters()); - exit(1); + cleanup_and_exit(); } m_web_test_common = result.value(); } @@ -317,7 +333,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) auto page_to_load = URL(old_interpreter.get_variable("__PageToLoad__", old_interpreter.global_object()).as_string().string()); if (!page_to_load.is_valid()) { printf("Invalid page URL for %s", test_path.characters()); - exit(1); + cleanup_and_exit(); } JSFileResult file_result; @@ -356,7 +372,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) auto test_json = get_test_results(new_interpreter); if (!test_json.has_value()) { printf("Received malformed JSON from test \"%s\"\n", test_path.characters()); - exit(1); + cleanup_and_exit(); } file_result = { test_path.substring(m_web_test_root.length() + 1, test_path.length() - m_web_test_root.length() - 1) }; @@ -418,7 +434,7 @@ JSFileResult TestRunner::run_file_test(const String& test_path) }, [page_to_load](auto error) { printf("Failed to load test page: %s (%s)", page_to_load.to_string().characters(), error.characters()); - exit(1); + cleanup_and_exit(); }); return file_result; @@ -633,6 +649,16 @@ int main(int argc, char** argv) bool print_times = false; bool show_window = false; + struct sigaction act; + memset(&act, 0, sizeof(act)); + act.sa_flags = SA_NOCLDWAIT; + act.sa_handler = handle_sigabrt; + int rc = sigaction(SIGABRT, &act, nullptr); + if (rc < 0) { + perror("sigaction"); + return 1; + } + Core::ArgsParser args_parser; args_parser.add_option(print_times, "Show duration of each test", "show-time", 't'); args_parser.add_option(show_window, "Show window while running tests", "window", 'w');