Serenity Operating System
at master 151 lines 2.6 kB view raw
1/* 2 * Copyright (c) 2021, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibTest/TestCase.h> 8#include <setjmp.h> 9#include <signal.h> 10#include <string.h> 11 12TEST_CASE(setjmp) 13{ 14 jmp_buf env; 15 int volatile set = 1; 16 17 if (setjmp(env)) { 18 EXPECT_EQ(set, 0); 19 return; 20 } 21 22 EXPECT_EQ(set, 1); 23 set = 0; 24 longjmp(env, 1); 25 26 VERIFY_NOT_REACHED(); 27} 28 29TEST_CASE(setjmp_zero) 30{ 31 jmp_buf env; 32 int volatile set = 1; 33 34 switch (setjmp(env)) { 35 case 0: 36 EXPECT_EQ(set, 1); 37 set = 0; 38 longjmp(env, 0); 39 VERIFY_NOT_REACHED(); 40 41 case 1: 42 EXPECT_EQ(set, 0); 43 break; 44 45 default: 46 VERIFY_NOT_REACHED(); 47 }; 48} 49 50TEST_CASE(setjmp_value) 51{ 52 jmp_buf env; 53 int volatile set = 1; 54 55 switch (setjmp(env)) { 56 case 0: 57 EXPECT_EQ(set, 1); 58 set = 0; 59 longjmp(env, 0x789ABCDE); 60 VERIFY_NOT_REACHED(); 61 62 case 0x789ABCDE: 63 EXPECT_EQ(set, 0); 64 break; 65 66 default: 67 VERIFY_NOT_REACHED(); 68 }; 69} 70 71TEST_CASE(sigsetjmp) 72{ 73 sigjmp_buf env; 74 int volatile set = 1; 75 76 if (sigsetjmp(env, 0)) { 77 EXPECT_EQ(set, 0); 78 return; 79 } 80 81 EXPECT_EQ(set, 1); 82 set = 0; 83 siglongjmp(env, 1); 84 85 VERIFY_NOT_REACHED(); 86} 87 88TEST_CASE(sigsetjmp_zero) 89{ 90 sigjmp_buf env; 91 int volatile set = 1; 92 93 switch (sigsetjmp(env, 0)) { 94 case 0: 95 EXPECT_EQ(set, 1); 96 set = 0; 97 siglongjmp(env, 0); 98 VERIFY_NOT_REACHED(); 99 100 case 1: 101 EXPECT_EQ(set, 0); 102 break; 103 104 default: 105 VERIFY_NOT_REACHED(); 106 }; 107} 108 109TEST_CASE(sigsetjmp_value) 110{ 111 sigjmp_buf env; 112 int volatile set = 1; 113 114 switch (sigsetjmp(env, 0)) { 115 case 0: 116 EXPECT_EQ(set, 1); 117 set = 0; 118 siglongjmp(env, 0x789ABCDE); 119 VERIFY_NOT_REACHED(); 120 121 case 0x789ABCDE: 122 EXPECT_EQ(set, 0); 123 break; 124 125 default: 126 VERIFY_NOT_REACHED(); 127 }; 128} 129 130TEST_CASE(sigsetjmp_signal_mask) 131{ 132 sigjmp_buf env; 133 134 sigset_t alternative_sigset; 135 sigfillset(&alternative_sigset); 136 137 sigset_t initial_sigset; 138 sigprocmask(SIG_SETMASK, nullptr, &initial_sigset); 139 140 EXPECT_NE(memcmp(&alternative_sigset, &initial_sigset, sizeof(sigset_t)), 0); 141 142 if (sigsetjmp(env, 1)) { 143 sigprocmask(SIG_SETMASK, nullptr, &alternative_sigset); 144 EXPECT_EQ(memcmp(&alternative_sigset, &initial_sigset, sizeof(sigset_t)), 0); 145 return; 146 } 147 148 sigprocmask(SIG_SETMASK, &alternative_sigset, nullptr); 149 siglongjmp(env, 1); 150 VERIFY_NOT_REACHED(); 151}