Skip to content

Commit 71d3112

Browse files
authored
Merge pull request #4999 from Guozhanxin/signal_tc
[utestcase] add signal testcases.
2 parents 233b90a + 3890778 commit 71d3112

File tree

4 files changed

+208
-0
lines changed

4 files changed

+208
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
CONFIG_UTEST_SEMAPHORE_TC=y
22
CONFIG_UTEST_EVENT_TC=y
33
CONFIG_UTEST_MESSAGEQUEUE_TC=y
4+
CONFIG_UTEST_SIGNAL_TC=y
45
# dependencies
56
CONFIG_RT_USING_SEMAPHORE=y
67
CONFIG_RT_USING_EVENT=y
78
CONFIG_RT_USING_MESSAGEQUEUE=y
9+
CONFIG_RT_USING_SIGNALS=y

examples/utest/testcases/kernel/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,8 @@ config UTEST_MESSAGEQUEUE_TC
2727
bool "message queue test"
2828
default n
2929

30+
config UTEST_SIGNAL_TC
31+
bool "signal test"
32+
default n
33+
3034
endmenu

examples/utest/testcases/kernel/SConscript

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ if GetDepend(['UTEST_TIMER_TC']):
2323
if GetDepend(['UTEST_MESSAGEQUEUE_TC']):
2424
src += ['messagequeue_tc.c']
2525

26+
if GetDepend(['UTEST_SIGNAL_TC']):
27+
src += ['signal_tc.c']
28+
2629
CPPPATH = [cwd]
2730

2831
group = DefineGroup('utestcases', src, depend = [], CPPPATH = CPPPATH)
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
/*
2+
* Copyright (c) 2006-2021, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2021-08-12 flybreak the first version
9+
*
10+
* case 1:rt_signal_install, install all available signal
11+
* case 2:rt_signal_install, install illegal signal
12+
* case 3:rt_signal_mask/unmask, one thread self, install and unmask, then kill, should received.
13+
* case 4:rt_signal_mask/unmask, one thread self, install and unmask and mask, then kill, should can't received.
14+
* case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received.
15+
* case 6:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: sleep 2s then kill, should can't received.
16+
* case 7:rt_signal_kill, kill legal thread, return 0;
17+
* case 8:rt_signal_kill, kill illegal thread, return failed (unused);
18+
* case 9:rt_signal_kill, kill illegal signo, return -RT_EINVAL;
19+
*
20+
*/
21+
22+
#include <rtthread.h>
23+
#include "utest.h"
24+
25+
int recive_sig = 0;
26+
27+
void sig_handle_default(int signo)
28+
{
29+
recive_sig = signo;
30+
}
31+
32+
static void rt_signal_install_test(void)
33+
{
34+
int signo;
35+
rt_sighandler_t result;
36+
37+
/* case 1:rt_signal_install, install all available signal. */
38+
for (signo = 0; signo < RT_SIG_MAX; signo++)
39+
{
40+
result = rt_signal_install(signo, sig_handle_default);
41+
uassert_true(result != SIG_ERR);
42+
}
43+
/* case 2:rt_signal_install, install illegal signal. */
44+
result = rt_signal_install(signo, sig_handle_default);
45+
uassert_true(result == SIG_ERR);
46+
47+
return;
48+
}
49+
50+
static void rt_signal_mask_test(void)
51+
{
52+
int signo;
53+
rt_sighandler_t result;
54+
55+
/* case 3:rt_signal_mask/unmask, one thread self, install and unmask, then kill, should received. */
56+
for (signo = 0; signo < RT_SIG_MAX; signo++)
57+
{
58+
recive_sig = -1;
59+
result = rt_signal_install(signo, sig_handle_default);
60+
uassert_true(result != SIG_ERR);
61+
rt_signal_unmask(signo);
62+
uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
63+
rt_thread_mdelay(1);
64+
uassert_int_equal(recive_sig, signo);
65+
}
66+
67+
return;
68+
}
69+
70+
static void rt_signal_unmask_test(void)
71+
{
72+
int signo;
73+
rt_sighandler_t result;
74+
75+
/* case 4:rt_signal_mask/unmask, one thread self, install and unmask and mask, then kill, should can't received. */
76+
for (signo = 0; signo < RT_SIG_MAX; signo++)
77+
{
78+
recive_sig = -1;
79+
result = rt_signal_install(signo, sig_handle_default);
80+
uassert_true(result != SIG_ERR);
81+
rt_signal_unmask(signo);
82+
rt_signal_mask(signo);
83+
uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
84+
rt_thread_mdelay(1);
85+
uassert_int_not_equal(recive_sig, signo);
86+
}
87+
88+
return;
89+
}
90+
91+
static void rt_signal_kill_test(void)
92+
{
93+
int signo;
94+
rt_sighandler_t result;
95+
96+
/* case 7:rt_signal_kill, kill legal thread, return 0; */
97+
for (signo = 0; signo < RT_SIG_MAX; signo++)
98+
{
99+
recive_sig = -1;
100+
result = rt_signal_install(signo, sig_handle_default);
101+
uassert_true(result != SIG_ERR);
102+
rt_signal_unmask(signo);
103+
uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
104+
rt_thread_mdelay(1);
105+
uassert_int_equal(recive_sig, signo);
106+
}
107+
/* case 8:rt_signal_kill, kill illegal thread, return failed; */
108+
// uassert_true(rt_thread_kill((rt_thread_t)-1, signo) == -RT_ERROR);
109+
110+
/* case 9:rt_signal_kill, kill illegal signo, return -RT_EINVAL; */
111+
uassert_true(rt_thread_kill(rt_thread_self(), -1) == -RT_EINVAL);
112+
113+
return;
114+
}
115+
116+
void rt_signal_wait_thread(void *parm)
117+
{
118+
sigset_t selectset;
119+
siginfo_t recive_si;
120+
121+
rt_signal_install(SIGUSR1, sig_handle_default);
122+
rt_signal_unmask(SIGUSR1);
123+
124+
sigemptyset(&selectset);
125+
sigaddset(&selectset, SIGUSR1);
126+
127+
/* case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received. */
128+
if (rt_signal_wait(&selectset, &recive_si, RT_TICK_PER_SECOND) != RT_EOK)
129+
{
130+
return;
131+
}
132+
133+
recive_sig = recive_si.si_signo;
134+
}
135+
136+
static void rt_signal_wait_test(void)
137+
{
138+
rt_thread_t t1;
139+
140+
recive_sig = -1;
141+
t1 = rt_thread_create("sig_t1", rt_signal_wait_thread, 0, 4096, 14, 10);
142+
if (t1)
143+
{
144+
rt_thread_startup(t1);
145+
}
146+
147+
rt_thread_mdelay(1);
148+
/* case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received. */
149+
uassert_int_equal(rt_thread_kill(t1, SIGUSR1), RT_EOK);
150+
rt_thread_mdelay(1);
151+
uassert_int_equal(recive_sig, SIGUSR1);
152+
153+
return;
154+
}
155+
156+
static void rt_signal_wait_test2(void)
157+
{
158+
rt_thread_t t1;
159+
160+
recive_sig = -1;
161+
t1 = rt_thread_create("sig_t1", rt_signal_wait_thread, 0, 4096, 14, 10);
162+
if (t1)
163+
{
164+
rt_thread_startup(t1);
165+
}
166+
167+
/* case 6:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: sleep 2s then kill, should can't received. */
168+
rt_thread_mdelay(2000);
169+
uassert_int_equal(rt_thread_kill(t1, SIGUSR1), RT_EOK);
170+
rt_thread_mdelay(1);
171+
uassert_int_not_equal(recive_sig, SIGUSR1);
172+
173+
return;
174+
}
175+
176+
static rt_err_t utest_tc_init(void)
177+
{
178+
return RT_EOK;
179+
}
180+
181+
static rt_err_t utest_tc_cleanup(void)
182+
{
183+
return RT_EOK;
184+
}
185+
186+
static void testcase(void)
187+
{
188+
#ifdef RT_USING_HEAP
189+
UTEST_UNIT_RUN(rt_signal_install_test);
190+
UTEST_UNIT_RUN(rt_signal_mask_test);
191+
UTEST_UNIT_RUN(rt_signal_unmask_test);
192+
UTEST_UNIT_RUN(rt_signal_kill_test);
193+
UTEST_UNIT_RUN(rt_signal_wait_test);
194+
UTEST_UNIT_RUN(rt_signal_wait_test2);
195+
#endif /* RT_USING_HEAP */
196+
}
197+
UTEST_TC_EXPORT(testcase, "testcases.kernel.signal_tc", utest_tc_init, utest_tc_cleanup, 1000);
198+
199+
/*********************** end of file ****************************/

0 commit comments

Comments
 (0)