diff options
author | Brian Gianforcaro <bgianf@serenityos.org> | 2021-05-07 03:43:41 -0700 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-05-08 00:04:10 +0100 |
commit | 4c0d3f47e17ea61d25885bdfe9917957c5d83a84 (patch) | |
tree | ac5331687e88fc5a517c8571e66f02dd087d5646 /Userland/Libraries/LibTest | |
parent | 9720ad3901d6a963f567994f06dc4c8481070424 (diff) | |
download | serenity-4c0d3f47e17ea61d25885bdfe9917957c5d83a84.zip |
LibTest: Move Crash testing facility from crash.cpp to LibTest
Diffstat (limited to 'Userland/Libraries/LibTest')
-rw-r--r-- | Userland/Libraries/LibTest/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibTest/CrashTest.cpp | 63 | ||||
-rw-r--r-- | Userland/Libraries/LibTest/CrashTest.h | 37 |
3 files changed, 101 insertions, 0 deletions
diff --git a/Userland/Libraries/LibTest/CMakeLists.txt b/Userland/Libraries/LibTest/CMakeLists.txt index 7816fdac71..ad5f2bb251 100644 --- a/Userland/Libraries/LibTest/CMakeLists.txt +++ b/Userland/Libraries/LibTest/CMakeLists.txt @@ -2,6 +2,7 @@ serenity_install_sources("Userland/Libraries/LibTest") set(SOURCES TestSuite.cpp + CrashTest.cpp ) serenity_lib(LibTest test) diff --git a/Userland/Libraries/LibTest/CrashTest.cpp b/Userland/Libraries/LibTest/CrashTest.cpp new file mode 100644 index 0000000000..fcdb3ffc6f --- /dev/null +++ b/Userland/Libraries/LibTest/CrashTest.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2019-2020, Shannon Booth <shannon.ml.booth@gmail.com> + * Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <LibTest/CrashTest.h> +#include <sys/wait.h> +#include <unistd.h> + +namespace Test { + +Crash::Crash(String test_type, Function<Crash::Failure()> crash_function) + : m_type(test_type) + , m_crash_function(move(crash_function)) +{ +} + +void Crash::run(RunType run_type = RunType::UsingChildProcess) +{ + printf("\x1B[33mTesting\x1B[0m: \"%s\"\n", m_type.characters()); + + auto run_crash_and_print_if_error = [this]() { + auto failure = m_crash_function(); + + // If we got here something went wrong + printf("\x1B[31mFAIL\x1B[0m: "); + switch (failure) { + case Failure::DidNotCrash: + printf("Did not crash!\n"); + break; + case Failure::UnexpectedError: + printf("Unexpected error!\n"); + break; + default: + VERIFY_NOT_REACHED(); + } + }; + + if (run_type == RunType::UsingCurrentProcess) { + run_crash_and_print_if_error(); + } else { + + // Run the test in a child process so that we do not crash the crash program :^) + pid_t pid = fork(); + if (pid < 0) { + perror("fork"); + VERIFY_NOT_REACHED(); + } else if (pid == 0) { + run_crash_and_print_if_error(); + exit(0); + } + + int status; + waitpid(pid, &status, 0); + if (WIFSIGNALED(status)) + printf("\x1B[32mPASS\x1B[0m: Terminated with signal %d\n", WTERMSIG(status)); + } +} + +} diff --git a/Userland/Libraries/LibTest/CrashTest.h b/Userland/Libraries/LibTest/CrashTest.h new file mode 100644 index 0000000000..40bc7f5727 --- /dev/null +++ b/Userland/Libraries/LibTest/CrashTest.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2019-2020, Shannon Booth <shannon.ml.booth@gmail.com> + * Copyright (c) 2021, Brian Gianforaro <bgianf@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Function.h> +#include <AK/String.h> + +namespace Test { + +class Crash { +public: + enum class RunType { + UsingChildProcess, + UsingCurrentProcess, + }; + + enum class Failure { + DidNotCrash, + UnexpectedError, + }; + + Crash(String test_type, Function<Crash::Failure()> crash_function); + + void run(RunType run_type); + +private: + String m_type; + Function<Crash::Failure()> m_crash_function; +}; + +} |