sh testsuite: create hush-redir/* and move files around

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-10-02 17:55:51 +02:00
parent 1b73f8471a
commit c4cf542c57
30 changed files with 143 additions and 0 deletions

View File

@ -0,0 +1,12 @@
Test 0: var:ok
File created:ok
Test 1: var:ok
File created:ok
Test 2: var:ok
File created:ok
Test 3: var:ok
File created:ok
Test 4: var:ok
File created:ok
Test 5: var:ok
File created:ok

View File

@ -0,0 +1,40 @@
rm shell_test_$$ 2>/dev/null
var=bad
>shell_test_$$ var=ok
echo "Test 0: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null
var=bad
var=ok >shell_test_$$
echo "Test 1: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null
var=ok
true | var=bad >shell_test_$$
echo "Test 2: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null
var=bad
{ var=ok >shell_test_$$; }
echo "Test 3: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null
var=ok
{ var=bad >shell_test_$$; } &
# cant use usleep as it isnt standard in $PATH --
# we fail when testing busybox compiled solely as "hush"
wait
echo "Test 4: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null
var=ok
( var=bad >shell_test_$$ )
echo "Test 5: var:$var"
test -f shell_test_$$ && echo "File created:ok"
rm shell_test_$$ 2>/dev/null

View File

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

View File

@ -0,0 +1,12 @@
# Chars above 0x7f are used as special codes.
# 0x81 is CTLESC (see ash.c).
# The bug was that quoting and unquoting of them
# was out of sync for redirect filenames.
>unicode.sh
printf 'echo Ok >uni\x81code\n' >>unicode.sh
printf 'cat uni\x81code\n' >>unicode.sh
printf 'cat uni?code\n' >>unicode.sh
. ./unicode.sh
rm uni*code*
echo Done

View File

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

View File

@ -0,0 +1,15 @@
# Chars above 0x7f are used as special codes.
# 0x81 is CTLESC (see ash.c).
# The bug was that quoting and unquoting of them
# was out of sync for redirect filenames.
# Subcase when redirect filename is specified in a variable.
>unicode.sh
printf 'v=uni\x81code\n' >>unicode.sh
printf 'echo Ok >"$v"\n' >>unicode.sh
printf 'cat uni\x81code\n' >>unicode.sh
printf 'cat uni?code\n' >>unicode.sh
. ./unicode.sh
rm uni*code*
echo Done

View File

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

View File

@ -0,0 +1,4 @@
echo Ok >file.tmp
cat 0<>file.tmp
echo Done:$?
rm file.tmp

View File

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

View File

@ -0,0 +1,11 @@
x="tmp11:tmp22"
# Bug was incorrectly expanding variables in >redir
echo "${x%:*}" >"${x%:*}"
echo tmp1*
rm tmp1*
# Also try unquoted
echo "${x%:*}" >${x%:*}
echo tmp1*
rm tmp1*

View File

@ -0,0 +1 @@
Ok: script fd is not closed

View File

@ -0,0 +1,29 @@
# Builds a " 3>&- 4>&-" string.
# Note: one of these fds is a directory opened to /proc/self/fd
# for globbing. It is unwanted, but I don't know how to filter it out.
find_fds() {
fds=""
for f in /proc/self/fd/*; do
test "$f" = "/proc/self/fd/0" && continue
test "$f" = "/proc/self/fd/1" && continue
test "$f" = "/proc/self/fd/2" && continue
fds="$fds ${f##*/}>&-"
done
}
find_fds
fds1="$fds"
# One of the fds is open to the script body
# Close it while executing something.
eval "find_fds $fds"
# Shell should not lose that fd. Did it?
find_fds
test x"$fds1" = x"$fds" && { echo "Ok: script fd is not closed"; exit 0; }
echo "Bug: script fd is closed"
echo "fds1:$fds1"
echo "fds2:$fds"
exit 1

View File

@ -0,0 +1,3 @@
z1.tmp: 1
z2.tmp: 1
"z1.tmp z2.tmp": TEST 0

View File

@ -0,0 +1,6 @@
v='z1.tmp z2.tmp'
echo TEST >$v
echo 'z1.tmp:' `cat 'z1.tmp' 2>/dev/null; echo $?`
echo 'z2.tmp:' `cat 'z2.tmp' 2>/dev/null; echo $?`
echo '"z1.tmp z2.tmp":' `cat 'z1.tmp z2.tmp' 2>/dev/null; echo $?`
rm z*.tmp