ash testsuite: add most of hust tests which pass for ash

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2016-10-03 00:06:55 +02:00
parent ce332a23a3
commit a62bc80571
103 changed files with 795 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
a1
a4
b1
b3
b4
b6
c4
c5
c7
c8
ff1
ff3
ft2
ft3
tf2
tf3
tt2
tt4
+34
View File
@@ -0,0 +1,34 @@
false || echo a1
false && echo a2
true || echo a3
true && echo a4
false || echo b1 || echo b2
false || echo b3 && echo b4
false && echo b5 || echo b6
false && echo b7 && echo b8
true || echo c1 || echo c2
true || echo c3 && echo c4
true && echo c5 || echo c6
true && echo c7 && echo c8
false || false || echo ff1
false || false && echo ff2
false && false || echo ff3
false && false && echo ff4
false || true || echo ft1
false || true && echo ft2
false && true || echo ft3
false && true && echo ft4
true || false || echo tf1
true || false && echo tf2
true && false || echo tf3
true && false && echo tf4
true || true || echo tt1
true || true && echo tt2
true && true || echo tt3
true && true && echo tt4
@@ -0,0 +1,9 @@
if1:0
while1:0
until1:0
if2:0
while2:0
until2:0
if3:0
while3:0
until3:0
+42
View File
@@ -0,0 +1,42 @@
# Assignments after some keywords should still work
if a=1 true; then a=1 true; elif a=1 true; then a=1 true; else a=1 true; fi
echo if1:$?
while a=1 true; do a=1 true; break; done
echo while1:$?
until a=1 false; do a=1 true; break; done
echo until1:$?
if a=1 true
then a=1 true
elif a=1 true
then a=1 true
else a=1 true
fi
echo if2:$?
while a=1 true
do a=1 true
break
done
echo while2:$?
until a=1 false
do a=1 true
break
done
echo until2:$?
if
a=1 true; then
a=1 true; elif
a=1 true; then
a=1 true; else
a=1 true; fi
echo if3:$?
while
a=1 true; do
a=1 true; break; done
echo while3:$?
until
a=1 false; do
a=1 true; break; done
echo until3:$?
@@ -0,0 +1,2 @@
Done:0
abc=123
+5
View File
@@ -0,0 +1,5 @@
# This must be interpreted as assignments
a=1 b\
=2 c=3
echo Done:$?
echo abc=$a$b$c
@@ -0,0 +1 @@
Done:0
+3
View File
@@ -0,0 +1,3 @@
# There was a bug where we misinterpreted assignments after 'do':
for i in 1; do eval b=; done
echo Done:$?
+2
View File
@@ -0,0 +1,2 @@
A
OK:0
+2
View File
@@ -0,0 +1,2 @@
while true; do echo A; break; echo B; done
echo OK:$?
+3
View File
@@ -0,0 +1,3 @@
A
AA
OK:0
+6
View File
@@ -0,0 +1,6 @@
while true; do
echo A
while true; do echo AA; break 2; echo BB; done
echo B
done
echo OK:$?
+2
View File
@@ -0,0 +1,2 @@
A
OK:0
+2
View File
@@ -0,0 +1,2 @@
v=break; while true; do echo A; $v; echo B; break; echo C; done
echo OK:$?
+6
View File
@@ -0,0 +1,6 @@
A
AA
TRUE
A
AA
OK:0
+12
View File
@@ -0,0 +1,12 @@
cond=true
while $cond; do
echo A
if test "$cond" = true; then
cond='echo TRUE'
else
cond=false
fi
while true; do echo AA; continue 2; echo BB; done
echo B
done
echo OK:$?
+13
View File
@@ -0,0 +1,13 @@
A
B
0
A:a
B
D
A:b
B
D
A:c
B
D
0
+4
View File
@@ -0,0 +1,4 @@
while true; do echo A; { echo B; break; echo C; }; echo D; done
echo $?
for v in a b c; do echo A:$v; (echo B; break; echo C); echo D; done
echo $?
+2
View File
@@ -0,0 +1,2 @@
VARIABLE=export
OK:0
+6
View File
@@ -0,0 +1,6 @@
# builtins, unlike keywords like "while", can be constructed
# with substitutions
VARIABLE=export
$VARIABLE VARIABLE
env | grep ^VARIABLE
echo OK:$?
+22
View File
@@ -0,0 +1,22 @@
OK_1
OK_1
OK_21
OK_22
OK_23
OK_31
OK_32
OK_41
OK_42
OK_43
OK_44
OK_51
OK_52
OK_53
OK_sub1
OK_sub2
OK_sub3
OK_sub4
OK_sub5
OK_sub6
OK_esac1
Done
+40
View File
@@ -0,0 +1,40 @@
case w in a) echo SKIP;; w) echo OK_1;; w) echo WRONG;; esac
case w in
a) echo SKIP;;
w)echo OK_1 ;;
w)
echo WRONG
;;
esac
t=w
case $t in a) echo SKIP;; w) echo OK_21;; w) echo WRONG;; esac;
case "$t" in a) echo SKIP;; w) echo OK_22;; w) echo WRONG;; esac;
case w in a) echo SKIP;; $t) echo OK_23;; "$t") echo WRONG;; esac;
case '' in a) echo SKIP;; w) echo WRONG;; *) echo OK_31;; esac;
case '' in a) echo SKIP;; '') echo OK_32;; *) echo WRONG;; esac;
case `echo w` in a) echo SKIP;; w) echo OK_41;; w) echo WRONG;; esac;
case "`echo w`" in a) echo SKIP;; w) echo OK_42;; w) echo WRONG;; esac;
case `echo w w` in a) echo SKIP;; w) echo WRONG;; 'w w') echo OK_43;; esac;
case `echo w w` in a) echo SKIP;; w) echo WRONG;; w*) echo OK_44;; esac;
case w in `echo w`) echo OK_51;; `echo WRONG >&2`w) echo WRONG;; esac;
case w in `echo OK_52 >&2`) echo SKIP;; `echo`w) echo OK_53;; esac;
# parsing cases in subshells can easily get messy
case m in m) echo OK_sub1;; esac
case m in (m) echo OK_sub2;; esac
(case m in m) echo OK_sub3;; esac)
(case m in (m) echo OK_sub4;; esac)
(
case m in m) echo OK_sub5;; esac
)
(
case m in (m) echo OK_sub6;; esac
)
(case esac in "esac") echo OK_esac1;; esac)
echo Done
+2
View File
@@ -0,0 +1,2 @@
0
OK: 0
+5
View File
@@ -0,0 +1,5 @@
false
:
echo $?
(while :; do exit; done)
echo OK: $?
+14
View File
@@ -0,0 +1,14 @@
new group
0
1
2
3
4
5
6
new group
new group
0
1
2
3
+21
View File
@@ -0,0 +1,21 @@
echo new group
echo 0; { :; }
echo 1; { : ;}
echo 2; ({ :; })
echo 3; ({ : ;})
echo 4; ( : )
echo 5; ( :; )
echo 6; ( : ;)
# not sure if POSIX requires these, but bash accepts them ...
#echo 7; {( : )}
#echo 8; {( :; )}
#echo 9; {( : ;)}
echo new group
#echo 0; {(:);}
echo new group
echo 0; (:)
echo 1; (:;)
echo 2; (:);
echo 3; (:;);
+8
View File
@@ -0,0 +1,8 @@
A:a
A:b
A:c
OK1
A:a
A:b
A:c
OK2
+4
View File
@@ -0,0 +1,4 @@
for v in a b c; do echo A:$v; continue 666; done
echo OK1
for v in a b c; do echo A:$v; continue 666; done
echo OK2
+1
View File
@@ -0,0 +1 @@
Ok:1
+3
View File
@@ -0,0 +1,3 @@
e=''
(while test $e && exit 1; true; do e=1; continue; done)
echo Ok:$?
+2
View File
@@ -0,0 +1,2 @@
0
0
+3
View File
@@ -0,0 +1,3 @@
# Test that "continue" does affect exitcode (sets to 0)
e=''
while echo $?; test $e && exit; true; do e=1; false; continue; done
+1
View File
@@ -0,0 +1 @@
OK: 0
+3
View File
@@ -0,0 +1,3 @@
false
for a in; do echo "HELLO"; done
echo OK: $?
+4
View File
@@ -0,0 +1,4 @@
PARAM:abc
PARAM:d e
PARAM:123
OK: 0
+6
View File
@@ -0,0 +1,6 @@
if test $# = 0; then
exec "$THIS_SH" $0 abc "d e" 123
fi
false
for v; do echo "PARAM:$v"; done
echo OK: $?
+1
View File
@@ -0,0 +1 @@
Once
+4
View File
@@ -0,0 +1,4 @@
trap "echo Not shown" EXIT
(exit) # must be silent
trap "echo Once; exit" EXIT
{ exit; }
@@ -0,0 +1,8 @@
a
b\c
b\\c
b"c
b'c
b$c
b`true`c
Zero:0
+10
View File
@@ -0,0 +1,10 @@
# UNFIXED BUG.
# commented-out words contain ^C character.
# It's a SPECIAL_VAR_SYMBOL, for now hush does not escape it.
# When it is fixed, update this test.
for a in 'a' 'b\c' 'b\\c' 'b"c' "b'c" 'b$c' 'b`true`c' ### 'b#c'
do
echo $a
done
echo Zero:$?
@@ -0,0 +1,4 @@
do
done
then
OK: 0
+2
View File
@@ -0,0 +1,2 @@
for if in do done then; do echo $if; done
echo OK: $?
@@ -0,0 +1 @@
Ok:0
+2
View File
@@ -0,0 +1,2 @@
if false; then echo Bad; fi
echo Ok:$?
+7
View File
@@ -0,0 +1,7 @@
Ok
Ok
Ok
Ok
Ok
Ok
Done
+12
View File
@@ -0,0 +1,12 @@
(echo \
Ok)
( (echo \
Ok) )
( ( (echo \
Ok) ) )
(echo \Ok)
( (echo \Ok) )
( ( (echo \Ok) ) )
echo Done
+5
View File
@@ -0,0 +1,5 @@
Ok
Ok
Ok
Ok
Done
+5
View File
@@ -0,0 +1,5 @@
echo Not shown | if true; then echo $(echo Ok); fi
echo Not shown | if true; then echo `echo Ok`; fi
echo Not shown | ( if true; then echo $(echo Ok); fi )
echo Not shown | ( if true; then echo `echo Ok`; fi )
echo Done
+2
View File
@@ -0,0 +1,2 @@
Ok
0
+15
View File
@@ -0,0 +1,15 @@
#!/bin/sh
func()
{
while read p; do echo "$p"; done
}
pipe_to_func()
{
# We had a NOMMU bug which caused "echo Ok |" part to be lost
echo Ok | func
}
pipe_to_func | cat
echo $?
+2
View File
@@ -0,0 +1,2 @@
Param1: >-10qwertyuiop<
Done
+5
View File
@@ -0,0 +1,5 @@
if test $# = 0; then
exec "$THIS_SH" $0 -10qwertyuiop
fi
echo "Param1: >$1<"
echo Done
+1
View File
@@ -0,0 +1 @@
0
+1
View File
@@ -0,0 +1 @@
test `(echo $$)` = `echo $$`; echo $?
+40
View File
@@ -0,0 +1,40 @@
Default:
true | true:
0
1
true | false:
1
0
false | true:
0
1
exit 2 | exit 3 | exit 4:
4
0
Pipefail on:
true | true:
0
1
true | false:
1
0
false | true:
1
0
exit 2 | exit 3 | exit 4:
4
0
Pipefail off:
true | true:
0
1
true | false:
1
0
false | true:
0
1
exit 2 | exit 3 | exit 4:
4
0
Done
+45
View File
@@ -0,0 +1,45 @@
echo Default:
echo "true | true:"
true | true; echo $?
! true | true; echo $?
echo "true | false:"
true | false; echo $?
! true | false; echo $?
echo "false | true:"
false | true; echo $?
! false | true; echo $?
echo "exit 2 | exit 3 | exit 4:"
exit 2 | exit 3 | exit 4; echo $?
! exit 2 | exit 3 | exit 4; echo $?
echo Pipefail on:
set -o pipefail
echo "true | true:"
true | true; echo $?
! true | true; echo $?
echo "true | false:"
true | false; echo $?
! true | false; echo $?
echo "false | true:"
false | true; echo $?
! false | true; echo $?
echo "exit 2 | exit 3 | exit 4:"
exit 2 | exit 3 | exit 4; echo $?
! exit 2 | exit 3 | exit 4; echo $?
echo Pipefail off:
set +o pipefail
echo "true | true:"
true | true; echo $?
! true | true; echo $?
echo "true | false:"
true | false; echo $?
! true | false; echo $?
echo "false | true:"
false | true; echo $?
! false | true; echo $?
echo "exit 2 | exit 3 | exit 4:"
exit 2 | exit 3 | exit 4; echo $?
! exit 2 | exit 3 | exit 4; echo $?
echo Done
+4
View File
@@ -0,0 +1,4 @@
read
cat
echo "REPLY=$REPLY"
REPLY=exec <read.tests
+4
View File
@@ -0,0 +1,4 @@
exec <read.tests
read
cat
echo "REPLY=$REPLY"
+1
View File
@@ -0,0 +1 @@
Ok:0
+4
View File
@@ -0,0 +1,4 @@
echo "true && return; echo Should not be printed" >return_sourced
. ./return_sourced
rm return_sourced
echo Ok:$?
+6
View File
@@ -0,0 +1,6 @@
./shift.tests abc d e
./shift.tests d e 123
./shift.tests d e 123
./shift.tests
./shift.tests
./shift.tests
+14
View File
@@ -0,0 +1,14 @@
if test $# = 0; then
exec "$THIS_SH" $0 abc "d e" 123
fi
echo $0 $1 $2
shift
echo $0 $1 $2
shift 999
echo $0 $1 $2
shift 2
echo $0 $1 $2
shift 2
echo $0 $1 $2
shift
echo $0 $1 $2
+1
View File
@@ -0,0 +1 @@
Sending SIGINT to main shell PID
+41
View File
@@ -0,0 +1,41 @@
# What should happen if non-interactive shell gets SIGINT?
(sleep 1; echo Sending SIGINT to main shell PID; exec kill -INT $$) &
# We create a child which exits with 0 even on SIGINT
# (The complex command is necessary only if SIGINT is generated by ^C,
# in this testcase even bare "sleep 2" would do because
# in the testcase we don't send SIGINT *to the child*...)
$THIS_SH -c 'trap "exit 0" SIGINT; sleep 2'
# In one second, we (main shell) get SIGINT here.
# The question is whether we should, or should not, exit.
# bash will not stop here. It will execute next command(s).
# The rationale for this is described here:
# http://www.cons.org/cracauer/sigint.html
#
# Basically, bash will not exit on SIGINT immediately if it waits
# for a child. It will wait for the child to exit.
# If child exits NOT by dying on SIGINT, then bash will not exit.
#
# The idea is that the following script:
# | emacs file.txt
# | more cmds
# User may use ^C to interrupt editor's ops like search. But then
# emacs exits normally. User expects that script doesn't stop.
#
# This is a nice idea, but detecting "did process really exit
# with SIGINT?" is racy. Consider:
# | bash -c 'while true; do /bin/true; done'
# When ^C is pressed while bash waits for /bin/true to exit,
# it may happen that /bin/true exits with exitcode 0 before
# ^C is delivered to it as SIGINT. bash will see SIGINT, then
# it will see that child exited with 0, and bash will NOT EXIT.
# Therefore we do not implement bash behavior.
# I'd say that emacs need to put itself into a separate pgrp
# to isolate shell from getting stray SIGINTs from ^C.
echo Next command after SIGINT was executed
+3
View File
@@ -0,0 +1,3 @@
1
1
Ok
+13
View File
@@ -0,0 +1,13 @@
LANG=en_US.UTF-8
# A combining character U+300
a=`printf "\xcc\x80"`
# Should print 1
echo ${#a}
# A Japanese katakana charachter U+30a3
a=`printf "\xe3\x82\xa3"`
# Should print 1
echo ${#a}
echo Ok
+3
View File
@@ -0,0 +1,3 @@
1
1
Ok:0
+11
View File
@@ -0,0 +1,11 @@
x=1
until test "$x" = 4; do echo $x; x=4; done
# We had a bug in multi-line form
x=1
until test "$x" = 4; do
echo $x
x=4
done
echo Ok:$?
+1
View File
@@ -0,0 +1 @@
OK:0
+2
View File
@@ -0,0 +1,2 @@
while false; do echo NOT SHOWN; done
echo OK:$?
+2
View File
@@ -0,0 +1,2 @@
Hello
OK:0
+2
View File
@@ -0,0 +1,2 @@
while echo Hello; false; do echo NOT SHOWN; done
echo OK:$?
+1
View File
@@ -0,0 +1 @@
Ok:0
+6
View File
@@ -0,0 +1,6 @@
false
while false && echo Not reached; do
echo BUG
break
done
echo Ok:$?
@@ -0,0 +1 @@
OK: 0
+2
View File
@@ -0,0 +1,2 @@
(while true; do exit; done)
echo OK: $?