浏览代码

Tests: Test setjmp/sigsetjmp LibC functions

Since there are no real users of these functions in Serenity's
userland and this is my third attempt at this... This time, the great
LibTest test suite will make sure that I do it right!
Jean-Baptiste Boric 3 年之前
父节点
当前提交
c97f7ea23b
共有 2 个文件被更改,包括 152 次插入0 次删除
  1. 1 0
      Tests/LibC/CMakeLists.txt
  2. 151 0
      Tests/LibC/TestLibCSetjmp.cpp

+ 1 - 0
Tests/LibC/CMakeLists.txt

@@ -6,6 +6,7 @@ set(TEST_SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCExec.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCExec.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCDirEnt.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCDirEnt.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCInodeWatcher.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCInodeWatcher.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCSetjmp.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCString.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestLibCString.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestStackSmash.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestStackSmash.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestIo.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/TestIo.cpp

+ 151 - 0
Tests/LibC/TestLibCSetjmp.cpp

@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2021, the SerenityOS developers.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibTest/TestCase.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+
+TEST_CASE(setjmp)
+{
+    jmp_buf env;
+    volatile int set = 1;
+
+    if (setjmp(env)) {
+        EXPECT_EQ(set, 0);
+        return;
+    }
+
+    EXPECT_EQ(set, 1);
+    set = 0;
+    longjmp(env, 1);
+
+    VERIFY_NOT_REACHED();
+}
+
+TEST_CASE(setjmp_zero)
+{
+    jmp_buf env;
+    volatile int set = 1;
+
+    switch (setjmp(env)) {
+    case 0:
+        EXPECT_EQ(set, 1);
+        set = 0;
+        longjmp(env, 0);
+        VERIFY_NOT_REACHED();
+
+    case 1:
+        EXPECT_EQ(set, 0);
+        break;
+
+    default:
+        VERIFY_NOT_REACHED();
+    };
+}
+
+TEST_CASE(setjmp_value)
+{
+    jmp_buf env;
+    volatile int set = 1;
+
+    switch (setjmp(env)) {
+    case 0:
+        EXPECT_EQ(set, 1);
+        set = 0;
+        longjmp(env, 0x789ABCDE);
+        VERIFY_NOT_REACHED();
+
+    case 0x789ABCDE:
+        EXPECT_EQ(set, 0);
+        break;
+
+    default:
+        VERIFY_NOT_REACHED();
+    };
+}
+
+TEST_CASE(sigsetjmp)
+{
+    sigjmp_buf env;
+    volatile int set = 1;
+
+    if (sigsetjmp(env, 0)) {
+        EXPECT_EQ(set, 0);
+        return;
+    }
+
+    EXPECT_EQ(set, 1);
+    set = 0;
+    siglongjmp(env, 1);
+
+    VERIFY_NOT_REACHED();
+}
+
+TEST_CASE(sigsetjmp_zero)
+{
+    sigjmp_buf env;
+    volatile int set = 1;
+
+    switch (sigsetjmp(env, 0)) {
+    case 0:
+        EXPECT_EQ(set, 1);
+        set = 0;
+        siglongjmp(env, 0);
+        VERIFY_NOT_REACHED();
+
+    case 1:
+        EXPECT_EQ(set, 0);
+        break;
+
+    default:
+        VERIFY_NOT_REACHED();
+    };
+}
+
+TEST_CASE(sigsetjmp_value)
+{
+    sigjmp_buf env;
+    volatile int set = 1;
+
+    switch (sigsetjmp(env, 0)) {
+    case 0:
+        EXPECT_EQ(set, 1);
+        set = 0;
+        siglongjmp(env, 0x789ABCDE);
+        VERIFY_NOT_REACHED();
+
+    case 0x789ABCDE:
+        EXPECT_EQ(set, 0);
+        break;
+
+    default:
+        VERIFY_NOT_REACHED();
+    };
+}
+
+TEST_CASE(sigsetjmp_signal_mask)
+{
+    sigjmp_buf env;
+
+    sigset_t alternative_sigset;
+    sigfillset(&alternative_sigset);
+
+    sigset_t initial_sigset;
+    sigprocmask(SIG_SETMASK, nullptr, &initial_sigset);
+
+    EXPECT_NE(memcmp(&alternative_sigset, &initial_sigset, sizeof(sigset_t)), 0);
+
+    if (sigsetjmp(env, 1)) {
+        sigprocmask(SIG_SETMASK, nullptr, &alternative_sigset);
+        EXPECT_EQ(memcmp(&alternative_sigset, &initial_sigset, sizeof(sigset_t)), 0);
+        return;
+    }
+
+    sigprocmask(SIG_SETMASK, &alternative_sigset, nullptr);
+    siglongjmp(env, 1);
+    VERIFY_NOT_REACHED();
+}