summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibTest
diff options
context:
space:
mode:
authorBrian Gianforcaro <bgianf@serenityos.org>2021-05-07 03:43:41 -0700
committerLinus Groh <mail@linusgroh.de>2021-05-08 00:04:10 +0100
commit4c0d3f47e17ea61d25885bdfe9917957c5d83a84 (patch)
treeac5331687e88fc5a517c8571e66f02dd087d5646 /Userland/Libraries/LibTest
parent9720ad3901d6a963f567994f06dc4c8481070424 (diff)
downloadserenity-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.txt1
-rw-r--r--Userland/Libraries/LibTest/CrashTest.cpp63
-rw-r--r--Userland/Libraries/LibTest/CrashTest.h37
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;
+};
+
+}