• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }