Serenity Operating System
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}