Jelajahi Sumber

LibTest: Move Crash testing facility from crash.cpp to LibTest

Brian Gianforcaro 4 tahun lalu
induk
melakukan
4c0d3f47e1

+ 1 - 0
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)

+ 63 - 0
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));
+    }
+}
+
+}

+ 37 - 0
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;
+};
+
+}

+ 1 - 0
Userland/Utilities/CMakeLists.txt

@@ -22,6 +22,7 @@ target_link_libraries(checksum LibCrypto)
 target_link_libraries(chres LibGUI)
 target_link_libraries(cksum LibCrypto)
 target_link_libraries(copy LibGUI)
+target_link_libraries(crash LibTest)
 target_link_libraries(disasm LibX86)
 target_link_libraries(expr LibRegex)
 target_link_libraries(functrace LibDebug LibX86)

+ 3 - 65
Userland/Utilities/crash.cpp

@@ -9,6 +9,7 @@
 #include <AK/String.h>
 #include <Kernel/IO.h>
 #include <LibCore/ArgsParser.h>
+#include <LibTest/CrashTest.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/mman.h>
@@ -16,72 +17,9 @@
 #include <syscall.h>
 #include <unistd.h>
 
-#pragma GCC optimize("O0")
-
-class Crash {
-public:
-    enum class RunType {
-        UsingChildProcess,
-        UsingCurrentProcess,
-    };
-
-    enum class Failure {
-        DidNotCrash,
-        UnexpectedError,
-    };
-
-    Crash(String test_type, Function<Crash::Failure()> crash_function)
-        : m_type(test_type)
-        , m_crash_function(move(crash_function))
-    {
-    }
+using Test::Crash;
 
-    void run(RunType run_type)
-    {
-        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));
-        }
-    }
-
-private:
-    String m_type;
-    Function<Crash::Failure()> m_crash_function;
-};
+#pragma GCC optimize("O0")
 
 int main(int argc, char** argv)
 {