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

View File

@ -0,0 +1,3 @@
546ed3f5c81c780d3ab86ada14824237 -
546ed3f5c81c780d3ab86ada14824237 -
End

View File

@ -0,0 +1,9 @@
# This creates 120k heredoc
echo 'cat <<HERE | md5sum' >"$0.tmp"
yes "123456789 123456789 123456789 123456789" | head -3000 >>"$0.tmp"
echo 'HERE' >>"$0.tmp"
yes "123456789 123456789 123456789 123456789" | head -3000 | md5sum
. "$0.tmp"
rm "$0.tmp"
echo End

View File

@ -0,0 +1,18 @@
a1
a4
b1
b3
b4
b6
c4
c5
c7
c8
ff1
ff3
ft2
ft3
tf2
tf3
tt2
tt4

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

View File

@ -0,0 +1,9 @@
if1:0
while1:0
until1:0
if2:0
while2:0
until2:0
if3:0
while3:0
until3:0

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:$?

View File

@ -0,0 +1,2 @@
Done:0
abc=123

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

View File

@ -0,0 +1 @@
Done:0

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:$?

View File

@ -0,0 +1,2 @@
A
OK:0

View File

@ -0,0 +1,2 @@
while true; do echo A; break; echo B; done
echo OK:$?

View File

@ -0,0 +1,3 @@
A
AA
OK:0

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:$?

View File

@ -0,0 +1,2 @@
A
OK:0

View File

@ -0,0 +1,2 @@
v=break; while true; do echo A; $v; echo B; break; echo C; done
echo OK:$?

View File

@ -0,0 +1,6 @@
A
AA
TRUE
A
AA
OK:0

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:$?

View File

@ -0,0 +1,13 @@
A
B
0
A:a
B
D
A:b
B
D
A:c
B
D
0

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 $?

View File

@ -0,0 +1,2 @@
VARIABLE=export
OK:0

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:$?

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

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

View File

@ -0,0 +1,2 @@
0
OK: 0

View File

@ -0,0 +1,5 @@
false
:
echo $?
(while :; do exit; done)
echo OK: $?

View File

@ -0,0 +1,14 @@
new group
0
1
2
3
4
5
6
new group
new group
0
1
2
3

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; (:;);

View File

@ -0,0 +1,8 @@
A:a
A:b
A:c
OK1
A:a
A:b
A:c
OK2

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

View File

@ -0,0 +1 @@
Ok:1

View File

@ -0,0 +1,3 @@
e=''
(while test $e && exit 1; true; do e=1; continue; done)
echo Ok:$?

View File

@ -0,0 +1,2 @@
0
0

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

View File

@ -0,0 +1 @@
OK: 0

View File

@ -0,0 +1,3 @@
false
for a in; do echo "HELLO"; done
echo OK: $?

View File

@ -0,0 +1,4 @@
PARAM:abc
PARAM:d e
PARAM:123
OK: 0

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: $?

View File

@ -0,0 +1 @@
Once

View File

@ -0,0 +1,4 @@
trap "echo Not shown" EXIT
(exit) # must be silent
trap "echo Once; exit" EXIT
{ exit; }

View File

@ -0,0 +1,8 @@
a
b\c
b\\c
b"c
b'c
b$c
b`true`c
Zero:0

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:$?

View File

@ -0,0 +1,4 @@
do
done
then
OK: 0

View File

@ -0,0 +1,2 @@
for if in do done then; do echo $if; done
echo OK: $?

View File

@ -0,0 +1 @@
Ok:0

View File

@ -0,0 +1,2 @@
if false; then echo Bad; fi
echo Ok:$?

View File

@ -0,0 +1,7 @@
Ok
Ok
Ok
Ok
Ok
Ok
Done

View File

@ -0,0 +1,12 @@
(echo \
Ok)
( (echo \
Ok) )
( ( (echo \
Ok) ) )
(echo \Ok)
( (echo \Ok) )
( ( (echo \Ok) ) )
echo Done

View File

@ -0,0 +1,5 @@
Ok
Ok
Ok
Ok
Done

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

View File

@ -0,0 +1,2 @@
Ok
0

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 $?

View File

@ -0,0 +1,2 @@
Param1: >-10qwertyuiop<
Done

View File

@ -0,0 +1,5 @@
if test $# = 0; then
exec "$THIS_SH" $0 -10qwertyuiop
fi
echo "Param1: >$1<"
echo Done

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1 @@
test `(echo $$)` = `echo $$`; echo $?

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

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

View File

@ -0,0 +1,4 @@
read
cat
echo "REPLY=$REPLY"
REPLY=exec <read.tests

View File

@ -0,0 +1,4 @@
exec <read.tests
read
cat
echo "REPLY=$REPLY"

View File

@ -0,0 +1 @@
Ok:0

View File

@ -0,0 +1,4 @@
echo "true && return; echo Should not be printed" >return_sourced
. ./return_sourced
rm return_sourced
echo Ok:$?

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

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

View File

@ -0,0 +1 @@
Sending SIGINT to main shell PID

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

View File

@ -0,0 +1,3 @@
1
1
Ok

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

View File

@ -0,0 +1,3 @@
1
1
Ok:0

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:$?

View File

@ -0,0 +1 @@
OK:0

View File

@ -0,0 +1,2 @@
while false; do echo NOT SHOWN; done
echo OK:$?

View File

@ -0,0 +1,2 @@
Hello
OK:0

View File

@ -0,0 +1,2 @@
while echo Hello; false; do echo NOT SHOWN; done
echo OK:$?

View File

@ -0,0 +1 @@
Ok:0

View File

@ -0,0 +1,6 @@
false
while false && echo Not reached; do
echo BUG
break
done
echo Ok:$?

View File

@ -0,0 +1 @@
OK: 0

View File

@ -0,0 +1,2 @@
(while true; do exit; done)
echo OK: $?

View File

@ -0,0 +1,2 @@
YEAH
0

View File

@ -0,0 +1,4 @@
# make sure we do not corrupt $? across traps
trap "echo YEAH; false" USR1
kill -USR1 $$
echo $?

View File

@ -0,0 +1,3 @@
a b c d e f 1 2 3 4 5 6 7 8 9 0 A B C D E F
a b c d e f 1 2 3 4 5 6 7 8 9 0 A B C D E F
a b c d e f 1 2 3 4 5 6 7 8 9 0 A B C D E F

View File

@ -0,0 +1,5 @@
e=
echo a b c d e f 1 2 3 4 5 6 7 8 9 0 A B C D E F
echo a $e b $e c $e d $e e $e f $e 1 $e 2 $e 3 $e 4 $e 5 $e 6 $e 7 $e 8 $e 9 $e 0 $e A $e B $e C $e D $e E $e F
echo $e a $e b $e c $e d $e e $e f $e 1 $e 2 $e 3 $e 4 $e 5 $e 6 $e 7 $e 8 $e 9 $e 0 $e A $e B $e C $e D $e E $e F

View File

@ -0,0 +1 @@
./glob_and_vars.right ./glob_and_vars.tests

View File

@ -0,0 +1,2 @@
v=.
echo $v/glob_and_vars.[tr]*

View File

@ -0,0 +1,9 @@
0
0
1
Make sure len parsing doesnt break arg count
0 0
4 4
Testing len op
4 3 2 1 0 0
0 3 0

View File

@ -0,0 +1,17 @@
"$THIS_SH" -c 'echo $#'
"$THIS_SH" -c 'echo $#' arg0
"$THIS_SH" -c 'echo $#' arg0 arg1
echo Make sure len parsing doesnt break arg count
set --
echo $# ${#}
set -- aaaa bbb cc d
echo $# ${#}
echo Testing len op
echo ${#1} ${#2} ${#3} ${#4} ${#5} ${#6}
unset e
f=abc
g=
echo ${#e} ${#f} ${#g}

View File

@ -0,0 +1,4 @@
param_glob.tests
param_glob.tests
param_glob.t*
param_glob.t*

View File

@ -0,0 +1,9 @@
if test $# = 0; then
exec "$THIS_SH" "$0" 'param_glob.t*'
echo NOT SHOWN
exit
fi
echo $*
echo $@
echo "$*"
echo "$@"

View File

@ -0,0 +1,7 @@
1=1
2=2
3=3
4=4
5=5
6=6
7=7

View File

@ -0,0 +1,15 @@
if test $# = 0; then
"$THIS_SH" "$0" 1 2 3 4 5 6 7 8 9
exit
fi
echo 1=$1
{ echo 2=$2; }
{ echo 3=$3; } &
# cant use usleep as it isnt standard in $PATH --
# we fail when testing busybox compiled solely as "hush"
wait
( echo 4=$4 )
( echo 5=$5 ) &
wait
true | echo 6=$6 | cat
true | { echo 7=$7; } | cat

View File

@ -0,0 +1,6 @@
.1.
.abc.
.d.
.e.
.f.
.1 abc d e f.

View File

@ -0,0 +1,8 @@
if test $# = 0; then
exec "$THIS_SH" star.tests 1 abc 'd e f'
fi
# 'd e f' should be split into 3 separate args:
for a in $*; do echo ".$a."; done
# must produce .1 abc d e f.
for a in "$*"; do echo ".$a."; done

View File

@ -0,0 +1,5 @@
. .
.abc d e.
.abc d e.
.abc d e.
.abc d e.

View File

@ -0,0 +1,15 @@
if test $# = 0; then
exec "$THIS_SH" "$0" abc "d e"
fi
space=' '
echo .$space.
a=$*
echo .$a.
a=$@
echo .$a.
a="$*"
echo .$a.
a="$@"
echo .$a.

View File

@ -0,0 +1,3 @@
TEST1
TEST2
TEST3

View File

@ -0,0 +1,13 @@
if test $# = 0; then
exec "$THIS_SH" "$0" abc "d e"
fi
echo TEST1 >"$1.out"
echo TEST2 >"$2.out"
# bash says: "$@.out": ambiguous redirect
# ash handles it as if it is '$*' - we do the same
echo TEST3 >"$@.out"
cat abc.out "d e.out" "abc d e.out"
rm abc.out "d e.out" "abc d e.out"

View File

@ -0,0 +1,9 @@
1 a b c
2 a + b c
3 a b c
4 a b c
5 a b c
6 a b + c
7 a b c
8 a b c
9 a b c

View File

@ -0,0 +1,11 @@
b=' b '
e=''
echo 1 a $b c
echo 2 a +$b c
echo 3 a $e$b c
echo 4 a "$e"$b c
echo 5 a ""$b c
echo 6 a $b+ c
echo 7 a $b$e c
echo 8 a $b"$e" c
echo 9 a $b"" c

View File

@ -0,0 +1,6 @@
b=1
b=2
b=3
b=4
b=5
b=6

View File

@ -0,0 +1,7 @@
b=1 env | grep ^b=
true | b=2 env | grep ^b=
a=1 true | b=3 env | grep ^b=
(b=4 env) | grep ^b=
(true | b=5 env) | grep ^b=
(a=1 true | b=6 env) | grep ^b=

Some files were not shown because too many files have changed in this diff Show More