1 /*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 #include "it_test_signal.h"
32 #include "signal.h"
33
SigAlrm(int signum)34 static void SigAlrm(int signum)
35 {
36 printf("Alert rings.\n");
37 }
38
TestBlock()39 static int TestBlock()
40 {
41 int sig = SIGALRM;
42 void *ret;
43 int retValue, status;
44
45 int fpid = fork();
46 if (fpid == 0) {
47 sigset(SIGALRM, SigAlrm);
48 int clock = 2;
49 printf("Alarm after %d seconds\n", clock);
50 alarm(clock);
51 for (int i = 0; i < 4; i++) { // 4, Number of cycles
52 printf("time = %d s\n", i);
53 sleep(1);
54 }
55 printf("\n\n");
56
57 printf("Hold the signal\n");
58 retValue = sighold(sig);
59 if (retValue != 0) {
60 exit(retValue);
61 }
62 alarm(clock);
63 for (int i = 0; i < 4; i++) { // 4, Number of cycles
64 printf("time = %d s\n", i);
65 sleep(1);
66 }
67 printf("\n\n");
68
69 printf("Release the signal\n");
70 retValue = sigrelse(sig);
71 if (retValue != 0) {
72 exit(retValue);
73 }
74 alarm(clock);
75 for (int i = 0; i < 4; i++) { // 4, Number of cycles
76 printf("time = %d s\n", i);
77 sleep(1);
78 }
79 printf("\n\n");
80
81 printf("Signal Pause(1)\n");
82 printf("The process sleeps until alter rings (after 2 seconds)\n");
83 alarm(clock);
84 retValue = sigpause(sig);
85 if (retValue != -1) {
86 exit(retValue);
87 }
88 printf("\n\n");
89
90 printf("Signal Pause(2)\n");
91 printf("To test whether pause can release the signal\n");
92 alarm(clock);
93 retValue = sighold(sig);
94 if (retValue != 0) {
95 exit(retValue);
96 }
97 retValue = sigpause(sig);
98 if (retValue != -1) {
99 exit(retValue);
100 }
101 printf("\n\n");
102
103 printf("Ignore the signal\n");
104 retValue = sigignore(sig);
105 if (retValue != 0) {
106 exit(retValue);
107 }
108 alarm(clock);
109 for (int i = 0; i < 4; i++) { // 4, Number of cycles
110 printf("time = %d s\n", i);
111 sleep(1);
112 }
113 printf("\n\n");
114 printf("Test Ends\n");
115
116 exit(0);
117 }
118 retValue = waitpid(fpid, &status, 0);
119 ICUNIT_ASSERT_EQUAL(retValue, fpid, retValue);
120 ICUNIT_ASSERT_EQUAL(WEXITSTATUS(status), 0, WEXITSTATUS(status));
121 return 0;
122 }
123
ItPosixSignal025(void)124 void ItPosixSignal025(void)
125 {
126 TEST_ADD_CASE(__FUNCTION__, TestBlock, TEST_POSIX, TEST_SIGNAL, TEST_LEVEL0, TEST_FUNCTION);
127 }