xref: /freebsd/bin/pwait/tests/pwait_test.sh (revision af23369a6deaaeb612ab266eb88b8bb8d560c322)
1# $FreeBSD$
2
3atf_test_case basic
4basic_head()
5{
6	atf_set "descr" "Basic tests on pwait(1) utility"
7}
8
9basic_body()
10{
11	sleep 1 &
12	p1=$!
13
14	sleep 5 &
15	p5=$!
16
17	sleep 10 &
18	p10=$!
19
20	atf_check \
21		-o empty \
22		-e empty \
23		-s exit:0 \
24		timeout --preserve-status 15 pwait $p1 $p5 $p10
25
26	atf_check \
27		-o empty \
28		-e inline:"kill: $p1: No such process\n" \
29		-s exit:1 \
30		kill -0 $p1
31
32	atf_check \
33		-o empty \
34		-e inline:"kill: $p5: No such process\n" \
35		-s exit:1 \
36		kill -0 $p5
37
38	atf_check \
39		-o empty \
40		-e inline:"kill: $p10: No such process\n" \
41		-s exit:1 \
42		kill -0 $p10
43
44}
45
46basic_cleanup()
47{
48	kill $p1 $p5 $p10 >/dev/null 2>&1
49	wait $p1 $p5 $p10 >/dev/null 2>&1
50}
51
52atf_test_case time_unit
53time_unit_head()
54{
55	atf_set "descr" "Test parsing the timeout unit and value"
56}
57
58time_unit_body()
59{
60	init=1
61
62	atf_check \
63		-o empty \
64		-e inline:"pwait: timeout unit\n" \
65		-s exit:65 \
66		timeout --preserve-status 2 pwait -t 1d $init
67
68	atf_check \
69		-o empty \
70		-e inline:"pwait: timeout unit\n" \
71		-s exit:65 \
72		timeout --preserve-status 2 pwait -t 1d $init
73
74	atf_check \
75		-o empty \
76		-e inline:"pwait: timeout value\n" \
77		-s exit:65 \
78		timeout --preserve-status 2 pwait -t -1 $init
79
80	atf_check \
81		-o empty \
82		-e inline:"pwait: timeout value\n" \
83		-s exit:65 \
84		timeout --preserve-status 2 pwait -t 100000001 $init
85
86	# These long duration cases are expected to timeout from the
87	# timeout utility rather than pwait -t.
88	atf_check \
89		-o empty \
90		-e empty \
91		-s exit:143 \
92		timeout --preserve-status 2 pwait -t 100000000 $init
93
94	atf_check \
95		-o empty \
96		-e empty \
97		-s exit:143 \
98		timeout --preserve-status 2 pwait -t 1h $init
99
100	atf_check \
101		-o empty \
102		-e empty \
103		-s exit:143 \
104		timeout --preserve-status 2 pwait -t 1.5h $init
105
106	atf_check \
107		-o empty \
108		-e empty \
109		-s exit:143 \
110		timeout --preserve-status 2 pwait -t 1m $init
111
112	atf_check \
113		-o empty \
114		-e empty \
115		-s exit:143 \
116		timeout --preserve-status 2 pwait -t 1.5m $init
117
118	atf_check \
119		-o empty \
120		-e empty \
121		-s exit:143 \
122		timeout --preserve-status 2 pwait -t 0 $init
123
124	# The rest are fast enough that pwait -t is expected to trigger
125	# the timeout.
126	atf_check \
127		-o empty \
128		-e empty \
129		-s exit:124 \
130		timeout --preserve-status 2 pwait -t 1s $init
131
132	atf_check \
133		-o empty \
134		-e empty \
135		-s exit:124 \
136		timeout --preserve-status 2 pwait -t 1.5s $init
137
138	atf_check \
139		-o empty \
140		-e empty \
141		-s exit:124 \
142		timeout --preserve-status 2 pwait -t 1 $init
143
144	atf_check \
145		-o empty \
146		-e empty \
147		-s exit:124 \
148		timeout --preserve-status 2 pwait -t 1.5 $init
149
150	atf_check \
151		-o empty \
152		-e empty \
153		-s exit:124 \
154		timeout --preserve-status 2 pwait -t 0.5 $init
155}
156
157atf_test_case timeout_trigger_timeout
158timeout_trigger_timeout_head()
159{
160	atf_set "descr" "Test that exceeding the timeout is detected"
161}
162
163timeout_trigger_timeout_body()
164{
165	sleep 10 &
166	p10=$!
167
168	atf_check \
169		-o empty \
170		-e empty \
171		-s exit:124 \
172		timeout --preserve-status 6.5 pwait -t 5 $p10
173}
174
175timeout_trigger_timeout_cleanup()
176{
177	kill $p10 >/dev/null 2>&1
178	wait $p10 >/dev/null 2>&1
179}
180
181atf_test_case timeout_no_timeout
182timeout_no_timeout_head()
183{
184	atf_set "descr" "Test that not exceeding the timeout continues to wait"
185}
186
187timeout_no_timeout_body()
188{
189	sleep 10 &
190	p10=$!
191
192	atf_check \
193		-o empty \
194		-e empty \
195		-s exit:0 \
196		timeout --preserve-status 11.5 pwait -t 12 $p10
197}
198
199timeout_no_timeout_cleanup()
200{
201	kill $p10 >/dev/null 2>&1
202	wait $p10 >/dev/null 2>&1
203}
204
205atf_test_case timeout_many
206timeout_many_head()
207{
208	atf_set "descr" "Test timeout on many processes"
209}
210
211timeout_many_body()
212{
213	sleep 1 &
214	p1=$!
215
216	sleep 5 &
217	p5=$!
218
219	sleep 10 &
220	p10=$!
221
222	atf_check \
223		-o empty \
224		-e empty \
225		-s exit:124 \
226		timeout --preserve-status 7.5 pwait -t 6 $p1 $p5 $p10
227}
228
229timeout_many_cleanup()
230{
231	kill $p1 $p5 $p10 >/dev/null 2>&1
232	wait $p1 $p5 $p10 >/dev/null 2>&1
233}
234
235atf_test_case or_flag
236or_flag_head()
237{
238	atf_set "descr" "Test OR flag"
239}
240
241or_flag_body()
242{
243	sleep 2 &
244	p2=$!
245
246	sleep 4 &
247	p4=$!
248
249	sleep 6 &
250	p6=$!
251
252	atf_check \
253		-o inline:"$p2: exited with status 0.\n" \
254		-e empty \
255		-s exit:0 \
256		timeout --preserve-status 15 pwait -o -v $p2 $p4 $p6
257
258	atf_check \
259		-o empty \
260		-e inline:"pwait: $p2: No such process\n" \
261		-s exit:0 \
262		timeout --preserve-status 15 pwait -o $p2 $p4 $p6
263
264	atf_check \
265		-o empty \
266		-e empty \
267		-s exit:0 \
268		timeout --preserve-status 15 pwait -o $p4 $p6
269
270	atf_check \
271		-o empty \
272		-e inline:"pwait: $p4: No such process\n" \
273		-s exit:0 \
274		timeout --preserve-status 15 pwait -o $p4 $p6
275
276	atf_check \
277		-o inline:"$p6: exited with status 0.\n" \
278		-e empty \
279		-s exit:0 \
280		timeout --preserve-status 15 pwait -o -v $p6
281
282	atf_check \
283		-o empty \
284		-e inline:"pwait: $p6: No such process\n" \
285		-s exit:0 \
286		timeout --preserve-status 15 pwait -o $p6
287
288	atf_check \
289		-o empty \
290		-e inline:"kill: $p2: No such process\n" \
291		-s exit:1 \
292		kill -0 $p2
293
294	atf_check \
295		-o empty \
296		-e inline:"kill: $p4: No such process\n" \
297		-s exit:1 \
298		kill -0 $p4
299
300	atf_check \
301		-o empty \
302		-e inline:"kill: $p6: No such process\n" \
303		-s exit:1 \
304		kill -0 $p6
305
306}
307
308or_flag_cleanup()
309{
310	kill $p2 $p4 $p6 >/dev/null 2>&1
311	wait $p2 $p4 $p6 >/dev/null 2>&1
312}
313
314atf_init_test_cases()
315{
316	atf_add_test_case basic
317	atf_add_test_case time_unit
318	atf_add_test_case timeout_trigger_timeout
319	atf_add_test_case timeout_no_timeout
320	atf_add_test_case timeout_many
321	atf_add_test_case or_flag
322}
323