ash: add all hush parsing tests to ast tests

All pass.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-24 02:49:56 +02:00
parent 0675b03de4
commit e34dbc4fdc
49 changed files with 331 additions and 4 deletions

View File

@ -0,0 +1 @@
OK

View File

@ -0,0 +1,4 @@
if test $# = 0; then
exec "$THIS_SH" "$0" arg
fi
echo OK

View File

@ -0,0 +1,7 @@
{abc}
{
}
./brace1.tests: line 4: {cmd: not found
./brace1.tests: line 5: {: not found
./brace1.tests: line 6: {: not found
Done: 127

View File

@ -0,0 +1,7 @@
echo {abc}
echo {
echo }
{cmd
""{
{""
echo Done: $?

View File

@ -0,0 +1,3 @@
{q,w}
{q,w}
Done

View File

@ -0,0 +1,5 @@
v='{q,w}'
# Should not brace-expand v value
echo $v
echo "$v"
echo Done

View File

@ -0,0 +1,2 @@
Nothing:
String: #should-be-echoed

View File

@ -0,0 +1,2 @@
echo Nothing: #should-not-be-echoed
echo String: ""#should-be-echoed

View File

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

View File

@ -0,0 +1,18 @@
# bug was that we treated <newline> as ';' in this line:
true || echo foo |
echo BAD1 | cat
# variation on the same theme
true || echo foo |
# comment
echo BAD2 | cat
# variation on the same theme
true || echo foo |
echo BAD3 | cat
# this should error out, but currently works in hush:
#true || echo foo |;
echo Done:$?

View File

@ -0,0 +1,4 @@
\
a\b
\\
c\\d

View File

@ -0,0 +1,6 @@
test "$CONFIG_FEATURE_FANCY_ECHO" = "y" || exit 77
echo "\\"
echo a"\\"b
echo '\\'
echo c'\\'d

View File

@ -0,0 +1,4 @@
*?[a]*
a*?[a]*b
*?[a]*
c*?[a]*d

View File

@ -0,0 +1,4 @@
echo "*?[a]*"
echo a"*?[a]*"b
echo '*?[a]*'
echo c'*?[a]*'d

View File

@ -0,0 +1,23 @@
v: a \ b \\ c \\\ d \\\\ e
v: a \ b \\ c \\\ d \\\\ e
Unquoted:
.a.
.\.
.b.
.\\.
.c.
.\\\.
.d.
.\\\\.
.e.
Quoted:
.a.
.\.
.b.
.\\.
.c.
.\\\.
.d.
.\\\\.
.e.
done

View File

@ -0,0 +1,10 @@
test "$CONFIG_FEATURE_FANCY_ECHO" = "y" || exit 77
v='a \ b \\ c \\\ d \\\\ e'
echo v: $v
echo v: "$v"
echo Unquoted:
for a in $v; do echo .$a.; done
echo Quoted:
for a in $v; do echo ".$a."; done
echo done

View File

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

View File

@ -0,0 +1,6 @@
i\
f tr\
ue; th\
en echo "O\
k"; fi; echo "\
End"

View File

@ -0,0 +1,9 @@
a\nb\nc\n
a
b
c
a\nb\nc\n
a
b
c
Done

View File

@ -0,0 +1,7 @@
v="a\nb\nc\n"
echo "$v"
printf "$v"
v='a\nb\nc\n'
echo "$v"
printf "$v"
echo Done

View File

@ -0,0 +1 @@
word} }

View File

@ -0,0 +1 @@
{ echo word} }; }

View File

@ -0,0 +1,2 @@
got TERM
Done: 0

View File

@ -0,0 +1,3 @@
# Bug was in handling of "}&" without space
{ trap "echo got TERM" TERM; sleep 2; }& sleep 1; kill $!; wait
echo Done: $?

View File

@ -0,0 +1,11 @@
Semicolons after } can be omitted 1:
foo
bar
Semicolons after } can be omitted 2:
foo
bar
Semicolons after fi can be omitted:
foo
bar
baz
Done:0

View File

@ -0,0 +1,10 @@
echo "Semicolons after } can be omitted 1:"
if { echo foo; } then { echo bar; } fi
echo "Semicolons after } can be omitted 2:"
while { echo foo; } do { echo bar; break; } done
echo "Semicolons after fi can be omitted:"
while if echo foo; then echo bar; fi do echo baz; break; done
echo Done:$?

View File

@ -0,0 +1,36 @@
! printing !
0
1
1
0
0
0
!
a
b
c
! 1
a 1
b 1
c 1
! 1
a 1
b 1
c 1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
Done

View File

@ -0,0 +1,19 @@
echo ! printing !
! false
echo $?
! true
echo $?
if ! false; then false; echo $?; fi
echo $?
if ! false; then ! false; echo $?; fi
echo $?
PRINTF=`which printf`
for a in ! a b c; do echo $a; done
for a in ! a b c; do ! printf "$a "; echo $?; done
test x"$PRINTF" = x"" && exit 1
for a in ! a b c; do ! "$PRINTF" "$a "; echo $?; done
for a in ! a b c; do ! printf "$a " | false; echo $?; done
for a in ! a b c; do ! printf "$a " | true; echo $?; done
for a in ! a b c; do ! { printf "$a " | false; }; echo $?; done
for a in ! a b c; do ! { printf "$a " | true; }; echo $?; done
echo Done

View File

@ -0,0 +1 @@
HELLO

View File

@ -0,0 +1,2 @@
# next line has no EOL!
echo HELLO

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,7 @@
# last line has no EOL!
if true
then
echo 1
else
echo 2
fi

View File

@ -0,0 +1 @@
./noeol3.tests: line 2: syntax error: unterminated quoted string

View File

@ -0,0 +1,2 @@
# last line has no EOL!
echo "unterminated

View File

@ -0,0 +1,3 @@
TESTzzBEST
TEST$(echo zz)BEST
TEST'BEST

View File

@ -0,0 +1,3 @@
echo "TEST`echo zz;echo;echo`BEST"
echo "TEST`echo '$(echo zz)'`BEST"
echo "TEST`echo "'"`BEST"

View File

@ -0,0 +1 @@
'1'

View File

@ -0,0 +1,2 @@
a=1
echo "'$a'"

View File

@ -0,0 +1 @@
>1

View File

@ -0,0 +1,2 @@
a=1
echo ">$a"

View File

@ -0,0 +1,12 @@
Testing: in ""
..
Testing: in ''
..
Testing: in $empty
Testing: in $empty""
..
Testing: in $empty''
..
Testing: in "$empty"
..
Finished

View File

@ -0,0 +1,21 @@
empty=''
echo 'Testing: in ""'
for a in ""; do echo ".$a."; done
echo 'Testing: in '"''"
for a in ''; do echo ".$a."; done
echo 'Testing: in $empty'
for a in $empty; do echo ".$a."; done
echo 'Testing: in $empty""'
for a in $empty""; do echo ".$a."; done
echo 'Testing: in $empty'"''"
for a in $empty''; do echo ".$a."; done
echo 'Testing: in "$empty"'
for a in "$empty"; do echo ".$a."; done
echo Finished

View File

@ -0,0 +1 @@
a b

View File

@ -0,0 +1,2 @@
a_b='a b'
echo "$a_b"

View File

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

View File

@ -0,0 +1,8 @@
if test $# = 0; then
exec "$THIS_SH" "$0" 1 abc 'd e f'
fi
for a in "$*"; do echo ".$a."; done
for a in "$@"; do echo ".$a."; done
for a in "-$*-"; do echo ".$a."; done
for a in "-$@-"; do echo ".$a."; done

View File

@ -0,0 +1,8 @@
Should be printed
Would not be printed by bash
Would not be printed by bash
Would not be printed by bash
Should be printed
Empty:
Empty:
Empty:

View File

@ -0,0 +1,19 @@
if test $# != 0; then
exec "$THIS_SH" "$0"
fi
# No params!
for a in "$*"; do echo Should be printed; done
for a in "$@"; do echo Should not be printed; done
# Yes, believe it or not, bash is mesmerized by "$@" and stops
# treating "" as "this word cannot be expanded to nothing,
# but must be at least null string". Now it can be expanded to nothing.
for a in "$@"""; do echo Would not be printed by bash; done
for a in """$@"; do echo Would not be printed by bash; done
for a in """$@"''"$@"''; do echo Would not be printed by bash; done
for a in ""; do echo Should be printed; done
# Bug 207: "$@" expands to nothing, and we erroneously glob "%s\n" twice:
printf 'Empty:%s\n' "$@"
printf "Empty:%s\n" "$@"
printf "Empty:%s\\n" "$@"

View File

@ -2,10 +2,24 @@
TOPDIR=`pwd`
test -x ash || {
echo "No ./ash - creating a link to ../../busybox"
ln -s ../../busybox ash
}
if test ! -x ash; then
if test ! -x ../../busybox; then
echo "Can't run tests. Put ash binary into this directory (`pwd`)"
exit 1
fi
echo "No ./ash - creating a link to ../../busybox"
ln -s ../../busybox ash
fi
if test ! -f .config; then
if test ! -f ../../.config; then
echo "Missing .config file"
exit 1
fi
cp ../../.config . || exit 1
fi
eval $(sed -e '/^#/d' -e '/^$/d' -e 's:^:export :' .config)
test -x printenv || gcc -O2 -o printenv printenv.c || exit $?
test -x recho || gcc -O2 -o recho recho.c || exit $?
test -x zecho || gcc -O2 -o zecho zecho.c || exit $?