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