1# error-p.tst: test of error conditions for any POSIX-compliant shell
2
3posix="true"
4
5test_O -d -e n 'syntax error kills non-interactive shell'
6fi
7echo not reached
8__IN__
9
10test_O -d -e n 'syntax error in eval kills non-interactive shell'
11eval fi
12echo not reached
13__IN__
14
15test_o -d 'syntax error in subshell'
16(eval fi; echo not reached)
17[ $? -ne 0 ]
18echo $?
19__IN__
200
21__OUT__
22
23test_o -d 'syntax error spares interactive shell' -i +m
24fi
25echo reached
26__IN__
27reached
28__OUT__
29
30test_O -d -e n 'expansion error kills non-interactive shell'
31unset a
32echo ${a?}
33echo not reached
34__IN__
35
36test_o -d 'expansion error in subshell'
37unset a
38(echo ${a?}; echo not reached)
39[ $? -ne 0 ]
40echo $?
41__IN__
420
43__OUT__
44
45test_o -d 'expansion error spares interactive shell' -i +m
46unset a
47echo ${a?}
48[ $? -ne 0 ]
49echo $?
50__IN__
510
52__OUT__
53
54test_O -d -e 127 'command not found'
55./_no_such_command_
56__IN__
57
58###############################################################################
59
60test_O 'assignment error without command kills non-interactive shell'
61readonly a=a
62a=b
63printf 'not reached\n'
64__IN__
65
66test_o 'assignment error without command in subshell'
67readonly a=a
68(a=b; printf 'not reached\n')
69[ $? -ne 0 ]
70echo $?
71__IN__
720
73__OUT__
74
75test_o 'assignment error without command spares interactive shell' -i +m
76readonly a=a
77a=b
78printf 'reached\n'
79__IN__
80reached
81__OUT__
82
83# $1 = line no.
84# $2 = command name
85test_assign() {
86    testcase "$1" -d \
87	"assignment error on command $2 kills non-interactive shell" \
88	3<<__IN__ 4</dev/null
89readonly a=a
90a=b $2
91printf 'not reached\n'
92__IN__
93}
94
95# $1 = line no.
96# $2 = command name
97test_assign_s() {
98    testcase "$1" -d \
99	"assignment error on command $2 in subshell" \
100	3<<__IN__ 4<<\__OUT__
101readonly a=a
102(a=b $2; echo not reached)
103[ \$? -ne 0 ]
104echo \$?
105__IN__
1060
107__OUT__
108}
109
110# $1 = line no.
111# $2 = command name
112test_assign_i() {
113    testcase "$1" -d \
114	"assignment error on command $2 spares interactive shell" \
115	-i +m 3<<__IN__ 4<<\__OUT__
116readonly a=a
117a=b $2
118printf 'reached\n'
119__IN__
120reached
121__OUT__
122}
123
124test_assign   "$LINENO" :
125test_assign_s "$LINENO" :
126test_assign_i "$LINENO" :
127test_assign   "$LINENO" .
128test_assign_s "$LINENO" .
129test_assign_i "$LINENO" .
130test_assign   "$LINENO" [
131test_assign_s "$LINENO" [
132test_assign_i "$LINENO" [
133test_assign   "$LINENO" alias
134test_assign_s "$LINENO" alias
135test_assign_i "$LINENO" alias
136test_assign   "$LINENO" array
137test_assign_s "$LINENO" array
138test_assign_i "$LINENO" array
139test_assign   "$LINENO" bg
140test_assign_s "$LINENO" bg
141test_assign_i "$LINENO" bg
142test_assign   "$LINENO" bindkey
143test_assign_s "$LINENO" bindkey
144test_assign_i "$LINENO" bindkey
145test_assign   "$LINENO" break
146test_assign_s "$LINENO" break
147test_assign_i "$LINENO" break
148test_assign   "$LINENO" cat # example of external command
149test_assign_s "$LINENO" cat
150test_assign_i "$LINENO" cat
151test_assign   "$LINENO" cd
152test_assign_s "$LINENO" cd
153test_assign_i "$LINENO" cd
154test_assign   "$LINENO" command
155test_assign_s "$LINENO" command
156test_assign_i "$LINENO" command
157test_assign   "$LINENO" complete
158test_assign_s "$LINENO" complete
159test_assign_i "$LINENO" complete
160test_assign   "$LINENO" continue
161test_assign_s "$LINENO" continue
162test_assign_i "$LINENO" continue
163test_assign   "$LINENO" dirs
164test_assign_s "$LINENO" dirs
165test_assign_i "$LINENO" dirs
166test_assign   "$LINENO" disown
167test_assign_s "$LINENO" disown
168test_assign_i "$LINENO" disown
169test_assign   "$LINENO" echo
170test_assign_s "$LINENO" echo
171test_assign_i "$LINENO" echo
172test_assign   "$LINENO" eval
173test_assign_s "$LINENO" eval
174test_assign_i "$LINENO" eval
175test_assign   "$LINENO" exec
176test_assign_s "$LINENO" exec
177test_assign_i "$LINENO" exec
178test_assign   "$LINENO" exit
179test_assign_s "$LINENO" exit
180test_assign_i "$LINENO" exit
181test_assign   "$LINENO" export
182test_assign_s "$LINENO" export
183test_assign_i "$LINENO" export
184test_assign   "$LINENO" false
185test_assign_s "$LINENO" false
186test_assign_i "$LINENO" false
187test_assign   "$LINENO" fc
188test_assign_s "$LINENO" fc
189test_assign_i "$LINENO" fc
190test_assign   "$LINENO" fg
191test_assign_s "$LINENO" fg
192test_assign_i "$LINENO" fg
193test_assign   "$LINENO" getopts
194test_assign_s "$LINENO" getopts
195test_assign_i "$LINENO" getopts
196test_assign   "$LINENO" hash
197test_assign_s "$LINENO" hash
198test_assign_i "$LINENO" hash
199test_assign   "$LINENO" help
200test_assign_s "$LINENO" help
201test_assign_i "$LINENO" help
202test_assign   "$LINENO" history
203test_assign_s "$LINENO" history
204test_assign_i "$LINENO" history
205test_assign   "$LINENO" jobs
206test_assign_s "$LINENO" jobs
207test_assign_i "$LINENO" jobs
208test_assign   "$LINENO" kill
209test_assign_s "$LINENO" kill
210test_assign_i "$LINENO" kill
211test_assign   "$LINENO" popd
212test_assign_s "$LINENO" popd
213test_assign_i "$LINENO" popd
214test_assign   "$LINENO" printf
215test_assign_s "$LINENO" printf
216test_assign_i "$LINENO" printf
217test_assign   "$LINENO" pushd
218test_assign_s "$LINENO" pushd
219test_assign_i "$LINENO" pushd
220test_assign   "$LINENO" pwd
221test_assign_s "$LINENO" pwd
222test_assign_i "$LINENO" pwd
223test_assign   "$LINENO" read
224test_assign_s "$LINENO" read
225test_assign_i "$LINENO" read
226test_assign   "$LINENO" readonly
227test_assign_s "$LINENO" readonly
228test_assign_i "$LINENO" readonly
229test_assign   "$LINENO" return
230test_assign_s "$LINENO" return
231test_assign_i "$LINENO" return
232test_assign   "$LINENO" set
233test_assign_s "$LINENO" set
234test_assign_i "$LINENO" set
235test_assign   "$LINENO" shift
236test_assign_s "$LINENO" shift
237test_assign_i "$LINENO" shift
238test_assign   "$LINENO" suspend
239test_assign_s "$LINENO" suspend
240test_assign_i "$LINENO" suspend
241test_assign   "$LINENO" test
242test_assign_s "$LINENO" test
243test_assign_i "$LINENO" test
244test_assign   "$LINENO" times
245test_assign_s "$LINENO" times
246test_assign_i "$LINENO" times
247test_assign   "$LINENO" trap
248test_assign_s "$LINENO" trap
249test_assign_i "$LINENO" trap
250test_assign   "$LINENO" true
251test_assign_s "$LINENO" true
252test_assign_i "$LINENO" true
253test_assign   "$LINENO" type
254test_assign_s "$LINENO" type
255test_assign_i "$LINENO" type
256test_assign   "$LINENO" typeset
257test_assign_s "$LINENO" typeset
258test_assign_i "$LINENO" typeset
259test_assign   "$LINENO" ulimit
260test_assign_s "$LINENO" ulimit
261test_assign_i "$LINENO" ulimit
262test_assign   "$LINENO" umask
263test_assign_s "$LINENO" umask
264test_assign_i "$LINENO" umask
265test_assign   "$LINENO" unalias
266test_assign_s "$LINENO" unalias
267test_assign_i "$LINENO" unalias
268test_assign   "$LINENO" unset
269test_assign_s "$LINENO" unset
270test_assign_i "$LINENO" unset
271test_assign   "$LINENO" wait
272test_assign_s "$LINENO" wait
273test_assign_i "$LINENO" wait
274test_assign   "$LINENO" ./_no_such_command_
275test_assign_s "$LINENO" ./_no_such_command_
276test_assign_i "$LINENO" ./_no_such_command_
277
278# $1 = line no.
279# $2 = built-in name
280test_special_builtin_redirect() {
281    testcase "$1" -d \
282	"redirection error on special built-in $2 kills non-interactive shell" \
283	3<<__IN__ 4</dev/null
284$2 <_no_such_file_
285printf 'not reached\n'
286__IN__
287}
288
289# $1 = line no.
290# $2 = built-in name
291test_special_builtin_redirect_s() {
292    testcase "$1" -d \
293	"redirection error on special built-in $2 in subshell" \
294	3<<__IN__ 4<<\__OUT__
295($2 <_no_such_file_; echo not reached)
296[ \$? -ne 0 ]
297echo \$?
298__IN__
2990
300__OUT__
301}
302
303# $1 = line no.
304# $2 = built-in name
305test_special_builtin_redirect_i() {
306    testcase "$1" -d \
307	"redirection error on special built-in $2 spares interactive shell" \
308	-i +m 3<<__IN__ 4<<\__OUT__
309$2 <_no_such_file_
310printf 'reached\n'
311__IN__
312reached
313__OUT__
314}
315
316test_special_builtin_redirect   "$LINENO" :
317test_special_builtin_redirect_s "$LINENO" :
318test_special_builtin_redirect_i "$LINENO" :
319test_special_builtin_redirect   "$LINENO" .
320test_special_builtin_redirect_s "$LINENO" .
321test_special_builtin_redirect_i "$LINENO" .
322test_special_builtin_redirect   "$LINENO" break
323test_special_builtin_redirect_s "$LINENO" break
324test_special_builtin_redirect_i "$LINENO" break
325test_special_builtin_redirect   "$LINENO" continue
326test_special_builtin_redirect_s "$LINENO" continue
327test_special_builtin_redirect_i "$LINENO" continue
328test_special_builtin_redirect   "$LINENO" eval
329test_special_builtin_redirect_s "$LINENO" eval
330test_special_builtin_redirect_i "$LINENO" eval
331test_special_builtin_redirect   "$LINENO" exec
332test_special_builtin_redirect_s "$LINENO" exec
333test_special_builtin_redirect_i "$LINENO" exec
334test_special_builtin_redirect   "$LINENO" exit
335test_special_builtin_redirect_s "$LINENO" exit
336test_special_builtin_redirect_i "$LINENO" exit
337test_special_builtin_redirect   "$LINENO" export
338test_special_builtin_redirect_s "$LINENO" export
339test_special_builtin_redirect_i "$LINENO" export
340test_special_builtin_redirect   "$LINENO" readonly
341test_special_builtin_redirect_s "$LINENO" readonly
342test_special_builtin_redirect_i "$LINENO" readonly
343test_special_builtin_redirect   "$LINENO" return
344test_special_builtin_redirect_s "$LINENO" return
345test_special_builtin_redirect_i "$LINENO" return
346test_special_builtin_redirect   "$LINENO" set
347test_special_builtin_redirect_s "$LINENO" set
348test_special_builtin_redirect_i "$LINENO" set
349test_special_builtin_redirect   "$LINENO" shift
350test_special_builtin_redirect_s "$LINENO" shift
351test_special_builtin_redirect_i "$LINENO" shift
352test_special_builtin_redirect   "$LINENO" times
353test_special_builtin_redirect_s "$LINENO" times
354test_special_builtin_redirect_i "$LINENO" times
355test_special_builtin_redirect   "$LINENO" trap
356test_special_builtin_redirect_s "$LINENO" trap
357test_special_builtin_redirect_i "$LINENO" trap
358test_special_builtin_redirect   "$LINENO" unset
359test_special_builtin_redirect_s "$LINENO" unset
360test_special_builtin_redirect_i "$LINENO" unset
361
362test_o 'redirection error on non-special built-in cd spares shell'
363cd <_no_such_file_
364test $? -ne 0 && echo ok
365__IN__
366ok
367__OUT__
368
369test_o 'redirection error on non-existing command spares shell'
370./_no_such_command_ <_no_such_file_
371test $? -ne 0 && echo ok
372__IN__
373ok
374__OUT__
375
376test_o 'redirection error without command spares shell'
377<_no_such_file_
378test $? -ne 0 && echo ok
379__IN__
380ok
381__OUT__
382
383# Command syntax error for special built-ins is not tested here because we can
384# not portably cause syntax error since any syntax can be accepted as an
385# extension.
386
387# vim: set ft=sh ts=8 sts=4 sw=4 noet:
388