1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <sigchain.h>
17 #include <wchar.h>
18 #include <stdlib.h>
19 #include "test.h"
20 #include "functionalext.h"
21 #include "sigchain_util.h"
22
23 static int g_count = 0;
24 /**
25 * @brief the special handler
26 */
sigchain_special_sigint_handler1(int signo,siginfo_t * siginfo,void * ucontext_raw)27 static bool sigchain_special_sigint_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw)
28 {
29 g_count++;
30 EXPECT_EQ("sigchain_add_special_handler_001", signo, SIGINT);
31 return false;
32 }
33
34 /**
35 * @brief the special handler
36 */
sigchain_special_sigint_handler2(int signo,siginfo_t * siginfo,void * ucontext_raw)37 static bool sigchain_special_sigint_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw)
38 {
39 g_count++;
40 EXPECT_EQ("sigchain_add_special_handler_001", signo, SIGINT);
41 return true;
42 }
43
44 /**
45 * @tc.name : sigchain_add_special_handler_001
46 * @tc.desc : The signal is not registered with the kernel, call add_special_signal_handler to add
47 * two special handlers
48 * @tc.level : Level 0
49 */
sigchain_add_special_handler_001()50 static void sigchain_add_special_handler_001()
51 {
52 struct signal_chain_action sigint = {
53 .sca_sigaction = sigchain_special_sigint_handler1,
54 .sca_mask = {},
55 .sca_flags = 0,
56 };
57 add_special_signal_handler(SIGINT, &sigint);
58
59 struct signal_chain_action sigint1 = {
60 .sca_sigaction = sigchain_special_sigint_handler2,
61 .sca_mask = {},
62 .sca_flags = SIGCHAIN_ALLOW_NORETURN,
63 };
64 add_special_signal_handler(SIGINT, &sigint1);
65
66 if (get_sigchain_mask_enable()) {
67 sigset_t set = {0};
68 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGINT};
69 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_001", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
70 }
71
72 raise(SIGINT);
73 EXPECT_EQ("sigchain_add_special_handler_001", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2);
74 }
75
76 /**
77 * @brief the special handler
78 */
sigchain_special_sighup_handler1(int signo,siginfo_t * siginfo,void * ucontext_raw)79 static bool sigchain_special_sighup_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw)
80 {
81 g_count++;
82 EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP);
83 return false;
84 }
85
86 /**
87 * @brief the special handler
88 */
sigchain_special_sighup_handler2(int signo,siginfo_t * siginfo,void * ucontext_raw)89 static bool sigchain_special_sighup_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw)
90 {
91 g_count++;
92 EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP);
93 return false;
94 }
95
96 /**
97 * @brief the signal handler
98 */
signal_sighup_handler(int signo)99 static void signal_sighup_handler(int signo)
100 {
101 g_count++;
102 EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP);
103 }
104
105 /**
106 * @tc.name : sigchain_add_special_handler_002
107 * @tc.desc : The signal is registered with the kernel(Using signal), call
108 * add_special_signal_handler to add two special handlers
109 * @tc.level : Level 0
110 */
sigchain_add_special_handler_002()111 static void sigchain_add_special_handler_002()
112 {
113 g_count = 0;
114 signal(SIGHUP, signal_sighup_handler);
115
116 struct signal_chain_action sighup = {
117 .sca_sigaction = sigchain_special_sighup_handler1,
118 .sca_mask = {},
119 .sca_flags = 0,
120 };
121 add_special_signal_handler(SIGHUP, &sighup);
122
123 struct signal_chain_action sighup1 = {
124 .sca_sigaction = sigchain_special_sighup_handler2,
125 .sca_mask = {},
126 .sca_flags = 0,
127 };
128 add_special_signal_handler(SIGHUP, &sighup1);
129
130 if (get_sigchain_mask_enable()) {
131 sigset_t set = {0};
132 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGHUP};
133 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_002", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
134 }
135 raise(SIGHUP);
136 EXPECT_EQ("sigchain_add_special_handler_002", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3);
137 }
138
139 /**
140 * @brief the special handler
141 */
sigchain_special_sigusr2_handler1(int signo,siginfo_t * siginfo,void * ucontext_raw)142 static bool sigchain_special_sigusr2_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw)
143 {
144 g_count++;
145 EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2);
146 return false;
147 }
148
149 /**
150 * @brief the special handler
151 */
sigchain_special_sigusr2_handler2(int signo,siginfo_t * siginfo,void * ucontext_raw)152 static bool sigchain_special_sigusr2_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw)
153 {
154 g_count++;
155 EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2);
156 return false;
157 }
158
159 /**
160 * @brief the signal handler
161 */
signal_sigusr2_sigaction(int signo)162 static void signal_sigusr2_sigaction(int signo)
163 {
164 g_count++;
165 EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2);
166 }
167
168 /**
169 * @tc.name : sigchain_add_special_handler_003
170 * @tc.desc : The signal is registered with the kernel(Using sigaction), call
171 * add_special_signal_handler to add two special handlers
172 * @tc.level : Level 0
173 */
sigchain_add_special_handler_003()174 static void sigchain_add_special_handler_003()
175 {
176 g_count = 0;
177 struct sigaction sigac = {
178 .sa_handler = signal_sigusr2_sigaction,
179 };
180 sigaction(SIGUSR2, &sigac, NULL);
181
182 struct signal_chain_action sigusr2 = {
183 .sca_sigaction = sigchain_special_sigusr2_handler1,
184 .sca_mask = {},
185 .sca_flags = 0,
186 };
187 add_special_signal_handler(SIGUSR2, &sigusr2);
188
189 struct signal_chain_action sigusr21 = {
190 .sca_sigaction = sigchain_special_sigusr2_handler2,
191 .sca_mask = {},
192 .sca_flags = 0,
193 };
194 add_special_signal_handler(SIGUSR2, &sigusr21);
195
196 if (get_sigchain_mask_enable()) {
197 sigset_t set = {0};
198 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGUSR2};
199 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_003", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
200 }
201 raise(SIGUSR2);
202 EXPECT_EQ("sigchain_add_special_handler_003", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3);
203 }
204
205 /**
206 * @brief the special handler
207 */
sigchain_special_sigterm_handler(int signo,siginfo_t * siginfo,void * ucontext_raw)208 static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void *ucontext_raw)
209 {
210 g_count++;
211 EXPECT_EQ("sigchain_add_special_handler_004", signo, SIGTERM);
212 return true;
213 }
214
215 /**
216 * @tc.name : sigchain_add_special_handler_004
217 * @tc.desc : the signal is not registered with the kernel, call add_special_signal_handler to add
218 * a special handler.
219 * @tc.level : Level 0
220 */
sigchain_add_special_handler_004()221 static void sigchain_add_special_handler_004()
222 {
223 g_count = 0;
224 struct signal_chain_action sigterm = {
225 .sca_sigaction = sigchain_special_sigterm_handler,
226 .sca_mask = {},
227 .sca_flags = 0,
228 };
229 add_special_signal_handler(SIGTERM, &sigterm);
230
231 if (get_sigchain_mask_enable()) {
232 sigset_t set = {0};
233 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGTERM};
234 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_004", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
235 }
236
237 raise(SIGTERM);
238 EXPECT_EQ("sigchain_add_special_handler_004", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1);
239 }
240
241 /**
242 * @brief the special handler
243 */
sigchain_special_64_handler(int signo,siginfo_t * siginfo,void * ucontext_raw)244 static bool sigchain_special_64_handler(int signo, siginfo_t *siginfo, void *ucontext_raw)
245 {
246 EXPECT_EQ("sigchain_add_special_handler_005", signo, SIGCHAIN_SIGNAL_64);
247 g_count++;
248 return false;
249 }
250
251 /**
252 * @brief the signal handler
253 */
signal_64_handler(int signo)254 static void signal_64_handler(int signo)
255 {
256 g_count++;
257 EXPECT_EQ("sigchain_add_special_handler_005", signo, SIGCHAIN_SIGNAL_64);
258 }
259
260 /**
261 * @tc.name : sigchain_add_special_handler_005
262 * @tc.desc : the signal is registered with the kernel(Using signal), call add_special_signal_handler to add
263 * a special handler.
264 * @tc.level : Level 0
265 */
sigchain_add_special_handler_005()266 static void sigchain_add_special_handler_005()
267 {
268 g_count = 0;
269 signal(SIGCHAIN_SIGNAL_64, signal_64_handler);
270
271 struct signal_chain_action sighup = {
272 .sca_sigaction = sigchain_special_64_handler,
273 .sca_mask = {},
274 .sca_flags = 0,
275 };
276 add_special_signal_handler(SIGCHAIN_SIGNAL_64, &sighup);
277
278 if (get_sigchain_mask_enable()) {
279 sigset_t set = {0};
280 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_64};
281 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_005", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
282 }
283 raise(SIGCHAIN_SIGNAL_64);
284 EXPECT_EQ("sigchain_add_special_handler_005", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2);
285 }
286
287 /**
288 * @brief the special handler
289 */
sigchain_special_37_handler(int signo,siginfo_t * siginfo,void * ucontext_raw)290 static bool sigchain_special_37_handler(int signo, siginfo_t *siginfo, void *ucontext_raw)
291 {
292 g_count++;
293 EXPECT_EQ("sigchain_add_special_handler_006", signo, SIGCHAIN_SIGNAL_37);
294 return false;
295 }
296
297 /**
298 * @brief the signal handler
299 */
signal_37_sigaction(int signo)300 static void signal_37_sigaction(int signo)
301 {
302 g_count++;
303 EXPECT_EQ("sigchain_add_special_handler_006", signo, SIGCHAIN_SIGNAL_37);
304 }
305
306 /**
307 * @tc.name : sigchain_add_special_handler_006
308 * @tc.desc : the signal is registered with the kernel(Using sigaction), call add_special_signal_handler
309 * to add a special handler.
310 * @tc.level : Level 0
311 */
sigchain_add_special_handler_006()312 static void sigchain_add_special_handler_006()
313 {
314 g_count = 0;
315 struct sigaction sigac = {
316 .sa_handler = signal_37_sigaction,
317 };
318 sigaction(SIGCHAIN_SIGNAL_37, &sigac, NULL);
319
320 struct signal_chain_action sig37 = {
321 .sca_sigaction = sigchain_special_37_handler,
322 .sca_mask = {},
323 .sca_flags = 0,
324 };
325 add_special_signal_handler(SIGCHAIN_SIGNAL_37, &sig37);
326
327 if (get_sigchain_mask_enable()) {
328 sigset_t set = {0};
329 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_37};
330 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_006", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
331 }
332
333 raise(SIGCHAIN_SIGNAL_37);
334 EXPECT_EQ("sigchain_add_special_handler_006", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2);
335 }
336
337 /**
338 * @brief the special handler
339 */
sigchain_special_43_handler(int signo,siginfo_t * siginfo,void * ucontext_raw)340 static bool sigchain_special_43_handler(int signo, siginfo_t *siginfo, void *ucontext_raw)
341 {
342 g_count++;
343 EXPECT_EQ("sigchain_add_special_handler_007", signo, SIGCHAIN_SIGNAL_43);
344 return true;
345 }
346
347 /**
348 * @brief the signal handler
349 */
signal_43_sigaction(int signo)350 static void signal_43_sigaction(int signo)
351 {
352 g_count++;
353 EXPECT_FALSE("sigchain_add_special_handler_007", true);
354 }
355
356 /**
357 * @tc.name : sigchain_add_special_handler_007
358 * @tc.desc : Multiple signal are registered with the kernel(Using sigaction), sigchain_special_43_handler return
359 * true.
360 * @tc.level : Level 0
361 */
sigchain_add_special_handler_007()362 static void sigchain_add_special_handler_007()
363 {
364 g_count = 0;
365 struct sigaction sigac = {
366 .sa_handler = signal_43_sigaction,
367 };
368 sigaction(SIGCHAIN_SIGNAL_43, &sigac, NULL);
369
370 struct signal_chain_action sig43 = {
371 .sca_sigaction = sigchain_special_43_handler,
372 .sca_mask = {},
373 .sca_flags = 0,
374 };
375 add_special_signal_handler(SIGCHAIN_SIGNAL_43, &sig43);
376
377 if (get_sigchain_mask_enable()) {
378 sigset_t set = {0};
379 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_43};
380 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_007", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
381 }
382
383 raise(SIGCHAIN_SIGNAL_43);
384 EXPECT_EQ("sigchain_add_special_handler_007", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1);
385 }
386
387
388 /**
389 * @brief the special handler
390 */
sigchain_special_45_handler(int signo,siginfo_t * siginfo,void * ucontext_raw)391 static bool sigchain_special_45_handler(int signo, siginfo_t *siginfo, void *ucontext_raw)
392 {
393 g_count++;
394 EXPECT_EQ("sigchain_add_special_handler_008", signo, SIGCHAIN_SIGNAL_45);
395 return false;
396 }
397
398 /**
399 * @brief the signal handler
400 */
signal_45_sigaction(int signo)401 static void signal_45_sigaction(int signo)
402 {
403 g_count++;
404 EXPECT_EQ("sigchain_add_special_handler_008", signo, SIGCHAIN_SIGNAL_45);
405 }
406
407 /**
408 * @tc.name : sigchain_add_special_handler_008
409 * @tc.desc : There is no special handler, add the special at the last of the chains
410 * @tc.level : Level 0
411 */
sigchain_add_special_handler_008()412 static void sigchain_add_special_handler_008()
413 {
414 g_count = 0;
415 struct sigaction sigac = {
416 .sa_handler = signal_45_sigaction,
417 };
418 sigaction(SIGCHAIN_SIGNAL_45, &sigac, NULL);
419
420 struct signal_chain_action sig45 = {
421 .sca_sigaction = sigchain_special_45_handler,
422 .sca_mask = {},
423 .sca_flags = 0,
424 };
425 add_special_handler_at_last(SIGCHAIN_SIGNAL_45, &sig45);
426
427 if (get_sigchain_mask_enable()) {
428 sigset_t set = {0};
429 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_45};
430 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_008", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
431 }
432
433 raise(SIGCHAIN_SIGNAL_45);
434 EXPECT_EQ("sigchain_add_special_handler_008", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2);
435 }
436
437
438 /**
439 * @brief the special handler
440 */
sigchain_special_56_handler1(int signo,siginfo_t * siginfo,void * ucontext_raw)441 static bool sigchain_special_56_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw)
442 {
443 g_count++;
444 EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56);
445 EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2);
446 return false;
447 }
448
449 /**
450 * @brief the special handler
451 */
sigchain_special_56_handler2(int signo,siginfo_t * siginfo,void * ucontext_raw)452 static bool sigchain_special_56_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw)
453 {
454 g_count++;
455 EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56);
456 EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1);
457 return false;
458 }
459
460 /**
461 * @brief the signal handler
462 */
signal_56_sigaction(int signo)463 static void signal_56_sigaction(int signo)
464 {
465 g_count++;
466 EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56);
467 }
468
469 /**
470 * @tc.name : sigchain_add_special_handler_009
471 * @tc.desc : There are one special handler, add the special at the last of the chains
472 * @tc.level : Level 0
473 */
sigchain_add_special_handler_009()474 static void sigchain_add_special_handler_009()
475 {
476 g_count = 0;
477 struct sigaction sigac = {
478 .sa_handler = signal_56_sigaction,
479 };
480 sigaction(SIGCHAIN_SIGNAL_56, &sigac, NULL);
481
482 struct signal_chain_action sig56 = {
483 .sca_sigaction = sigchain_special_56_handler2,
484 .sca_mask = {},
485 .sca_flags = 0,
486 };
487 add_special_signal_handler(SIGCHAIN_SIGNAL_56, &sig56);
488
489 struct signal_chain_action sig561 = {
490 .sca_sigaction = sigchain_special_56_handler1,
491 .sca_mask = {},
492 .sca_flags = 0,
493 };
494 add_special_handler_at_last(SIGCHAIN_SIGNAL_56, &sig561);
495
496 if (get_sigchain_mask_enable()) {
497 sigset_t set = {0};
498 int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_56};
499 SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_009", signo, SIGCHIAN_TEST_SIGNAL_NUM_1);
500 }
501
502 raise(SIGCHAIN_SIGNAL_56);
503 EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3);
504 }
505
main(void)506 int main(void)
507 {
508 sigchain_add_special_handler_001();
509 sigchain_add_special_handler_002();
510 sigchain_add_special_handler_003();
511 sigchain_add_special_handler_004();
512 sigchain_add_special_handler_005();
513 sigchain_add_special_handler_006();
514 sigchain_add_special_handler_007();
515 sigchain_add_special_handler_008();
516 sigchain_add_special_handler_009();
517 return t_status;
518 }