xref: /freebsd/bin/timeout/tests/timeout_test.sh (revision 245f2abf94889d3fd69360c4f49532074ff25fbf)
1# SPDX-License-Identifier: BSD-2-Clause
2# Copyright (c) 2014 Baptiste Daroussin <bapt@FreeBSD.org>
3
4atf_test_case nominal
5nominal_head()
6{
7	atf_set "descr" "Basic tests on timeout(1) utility"
8}
9
10nominal_body()
11{
12	atf_check \
13		-o empty \
14		-e empty \
15		-s exit:0 \
16		timeout 5 true
17}
18
19atf_test_case time_unit
20time_unit_head()
21{
22	atf_set "descr" "Test parsing the default time unit"
23}
24
25time_unit_body()
26{
27	atf_check \
28		-o empty \
29		-e empty \
30		-s exit:0 \
31		timeout 1d true
32
33	atf_check \
34		-o empty \
35		-e empty \
36		-s exit:0 \
37		timeout 1h true
38
39	atf_check \
40		-o empty \
41		-e empty \
42		-s exit:0 \
43		timeout 1m true
44
45	atf_check \
46		-o empty \
47		-e empty \
48		-s exit:0 \
49		timeout 1s true
50}
51
52atf_test_case no_timeout
53no_timeout_head()
54{
55	atf_set "descr" "Test disabled timeout"
56}
57
58no_timeout_body()
59{
60	atf_check \
61		-o empty \
62		-e empty \
63		-s exit:0 \
64		timeout 0 true
65}
66
67atf_test_case exit_numbers
68exit_numbers_head()
69{
70	atf_set "descr" "Test exit numbers"
71}
72
73exit_numbers_body()
74{
75	atf_check \
76		-o empty \
77		-e empty \
78		-s exit:2 \
79		-x timeout 5 sh -c \'exit 2\'
80
81	atf_check \
82		-o empty \
83		-e empty \
84		-s exit:124 \
85		timeout .1 sleep 1
86
87	# With preserve status exit should be 128 + TERM aka 143
88	atf_check \
89		-o empty \
90		-e empty \
91		-s signal:15 \
92		timeout --preserve-status .1 sleep 10
93
94	atf_check \
95		-o empty \
96		-e empty \
97		-s exit:124 \
98		timeout -s1 -k1 .1 sleep 10
99
100	atf_check \
101		-o empty \
102		-e empty \
103		-s exit:0 \
104		-x sh -c 'trap "" CHLD; exec timeout 10 true'
105}
106
107atf_test_case with_a_child
108with_a_child_head()
109{
110	atf_set "descr" "When starting with a child (coreutils bug#9098)"
111}
112
113with_a_child_body()
114{
115	out=$(sleep .1 & exec timeout .5 sh -c 'sleep 2; echo foo')
116	status=$?
117	test "$out" = "" && test $status = 124 || atf_fail "wrong status $status"
118
119}
120
121atf_test_case invalid_timeout
122invalid_timeout_head()
123{
124	atf_set "descr" "Invalid timeout"
125}
126
127invalid_timeout_body()
128{
129	atf_check \
130		-o empty \
131		-e inline:"timeout: duration is not a number\n" \
132		-s exit:125 \
133		timeout invalid sleep 0
134
135	atf_check \
136		-o empty \
137		-e inline:"timeout: duration is not a number\n" \
138		-s exit:125 \
139		timeout --kill-after=invalid 1 sleep 0
140
141	atf_check \
142		-o empty \
143		-e inline:"timeout: duration unit suffix invalid\n" \
144		-s exit:125 \
145		timeout 42D sleep 0
146
147	atf_check \
148		-o empty \
149		-e inline:"timeout: duration out of range\n" \
150		-s exit:125 \
151		timeout 999999999999999999999999999999999999999999999999999999999999d sleep 0
152
153	atf_check \
154		-o empty \
155		-e inline:"timeout: duration out of range\n" \
156		-s exit:125 \
157		timeout 2.34e+5d sleep 0
158}
159
160atf_test_case invalid_signal
161invalid_signal_head()
162{
163	atf_set "descr" "Invalid signal"
164}
165
166invalid_signal_body()
167{
168	atf_check \
169		-o empty \
170		-e inline:"timeout: invalid signal\n" \
171		-s exit:125 \
172		timeout --signal=invalid 1 sleep 0
173}
174
175atf_test_case invalid_command
176invalid_command_head()
177{
178	atf_set "descr" "Invalid command"
179}
180
181invalid_command_body()
182{
183	atf_check \
184		-o empty \
185		-e inline:"timeout: exec(.): Permission denied\n" \
186		-s exit:126 \
187		timeout 10 .
188}
189
190atf_test_case no_such_command
191no_such_command_head()
192{
193	atf_set "descr" "No such command"
194}
195
196no_such_command_body()
197{
198	atf_check \
199		-o empty \
200		-e inline:"timeout: exec(enoexists): No such file or directory\n" \
201		-s exit:127 \
202		timeout 10 enoexists
203}
204
205atf_init_test_cases()
206{
207	atf_add_test_case nominal
208	atf_add_test_case time_unit
209	atf_add_test_case no_timeout
210	atf_add_test_case exit_numbers
211	atf_add_test_case with_a_child
212	atf_add_test_case invalid_timeout
213	atf_add_test_case invalid_signal
214	atf_add_test_case invalid_command
215	atf_add_test_case no_such_command
216}
217