Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/bin/sh More redirect tests, in particular, tests for r...



details:   https://anonhg.NetBSD.org/src/rev/30a4584bc7cb
branches:  trunk
changeset: 345000:30a4584bc7cb
user:      christos <christos%NetBSD.org@localhost>
date:      Mon May 02 01:47:14 2016 +0000

description:
More redirect tests, in particular, tests for redirects to/from
file descriptors outside the 0..9 range, and complex fd
reassignments.  Also test that the shell can cope with the
value of ulimit -n changing (downwards, up is harmless)
(Freom kre@)

diffstat:

 tests/bin/sh/t_redir.sh |  265 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 261 insertions(+), 4 deletions(-)

diffs (298 lines):

diff -r 1ac26f64799a -r 30a4584bc7cb tests/bin/sh/t_redir.sh
--- a/tests/bin/sh/t_redir.sh   Mon May 02 01:46:31 2016 +0000
+++ b/tests/bin/sh/t_redir.sh   Mon May 02 01:47:14 2016 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: t_redir.sh,v 1.5 2016/03/27 14:49:07 christos Exp $
+# $NetBSD: t_redir.sh,v 1.6 2016/05/02 01:47:14 christos Exp $
 #
 # Copyright (c) 2016 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -333,7 +333,78 @@
 }
 fd_redirections_body()
 {
-       # Or it will one day...
+       atf_require_prog /bin/echo
+
+       cat <<- 'DONE' > helper.sh
+               f() {
+                       /bin/echo nothing "$1" >& "$1"
+               }
+               for n
+               do
+                       eval "f $n $n"'> file-$n'
+               done
+       DONE
+       cat <<- 'DONE' > reread.sh
+               f() {
+                       (read -r var; echo "${var}") <&"$1"
+               }
+               for n
+               do
+                       x=$( eval "f $n $n"'< file-$n' )
+                       test "${x}" = "nothing $n" || echo "$n"
+               done
+       DONE
+
+       validate()
+       {
+           for n
+           do
+               test -e "file-$n" || atf_fail "file-$n not created"
+               C=$(cat file-"$n")
+               test "$C" = "nothing $n" ||
+                       atf_fail "file-$n contains '$C' not 'nothing $n'"
+           done
+       }
+
+       atf_check -s exit:0 -e empty -o empty \
+               ${TEST_SH} helper.sh 1 2 3 4 5 6 7 8 9
+       validate 1 2 3 4 5 6 7 8 9
+       atf_check -s exit:0 -e empty -o empty \
+               ${TEST_SH} reread.sh 3 4 5 6 7 8 9
+
+       L=$(ulimit -n)
+       if [ "$L" -ge 30 ]
+       then
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} helper.sh 10 15 19 20 25 29
+               validate 10 15 19 20 25 29
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} reread.sh 10 15 19 20 25 29
+       fi
+       if [ "$L" -ge 100 ]
+       then
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} helper.sh 32 33 49 50 51 63 64 65 77 88 99
+               validate 32 33 49 50 51 63 64 65 77 88 99
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} reread.sh 32 33 49 50 51 63 64 65 77 88 99
+       fi
+       if [ "$L" -ge 500 ]
+       then
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} helper.sh 100 101 199 200 222 333 444 499
+               validate 100 101 199 200 222 333 444 499
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} reread.sh 100 101 199 200 222 333 444 499
+       fi
+       if [ "$L" -gt 1005 ]
+       then
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} helper.sh 1000 1001 1002 1003 1004 1005
+               validate 1000 1001 1002 1003 1004 1005
+               atf_check -s exit:0 -e empty -o empty \
+                       ${TEST_SH} reread.sh 1000 1001 1002 1003 1004 1005
+       fi
 } 
 
 atf_test_case local_redirections
@@ -344,7 +415,61 @@
 }
 local_redirections_body()
 {
-       # Or it will one day...
+       cat <<- 'DONE' > helper.sh
+               for f
+               do
+                       eval "exec $f"'> file-$f'
+               done
+
+               for f
+               do
+                       printf '%s\n' "Hello $f" >&"$f"
+               done
+
+               for f
+               do
+                       eval "exec $f"'>&-'
+               done
+
+               for f
+               do
+                       eval "exec $f"'< file-$f'
+               done
+
+               for f
+               do
+                       exec <& "$f"
+                       read -r var || echo >&2 "No data in file-$f"
+                       read -r x && echo >&2 "Too much data in file-${f}: $x"
+                       test "${var}" = "Hello $f" ||
+                           echo >&2 "file-$f contains '${var}' not 'Hello $f'"
+               done
+       DONE
+
+       atf_check -s exit:0 -o empty -e empty \
+               ${TEST_SH} helper.sh 3 4 5 6 7 8 9
+
+       L=$(ulimit -n)
+       if [ "$L" -ge 30 ]
+       then
+               atf_check -s exit:0 -o empty -e empty \
+                       ${TEST_SH} helper.sh 10 11 13 15 16 19 20 28 29
+       fi
+       if [ "$L" -ge 100 ]
+       then
+               atf_check -s exit:0 -o empty -e empty \
+                       ${TEST_SH} helper.sh 30 31 32 63 64 65 77 88 99
+       fi
+       if [ "$L" -ge 500 ]
+       then
+               atf_check -s exit:0 -o empty -e empty \
+                       ${TEST_SH} helper.sh 100 101 111 199 200 201 222 333 499
+       fi
+       if [ "$L" -ge 1005 ]
+       then
+               atf_check -s exit:0 -o empty -e empty \
+                       ${TEST_SH} helper.sh 1000 1001 1002 1003 1004 1005
+       fi
 }
 
 atf_test_case redir_in_case
@@ -443,7 +568,138 @@
 }
 subshell_redirections_body()
 {
-       # Or will, one day
+       atf_require_prog cat
+
+       LIM=$(ulimit -n)
+
+       cat <<- 'DONE' |
+               exec 6>output-file
+
+               ( printf "hello\n" >&6 )
+
+               exec 8<output-file
+
+               ( read hello <&8 ; test hello = "$hello" || echo >&2 Hello )
+
+               ( printf "bye-bye\n" >&6 )
+
+               ( exec 8<&- )
+               read bye <&8 || echo >&2 "Closed?"
+               echo Bye="$bye"
+       DONE
+       atf_check -s exit:0 -o match:Bye=bye-bye -e empty \
+               ${TEST_SH}
+
+       cat <<- 'DONE' |
+               for arg in one-4 two-24 three-14
+               do
+                       fd=${arg#*-}
+                       file=${arg%-*}
+                       eval "exec ${fd}>${file}"
+               done
+
+               for arg in one-5 two-7 three-19
+               do
+                       fd=${arg#*-}
+                       file=${arg%-*}
+                       eval "exec ${fd}<${file}"
+               done
+
+               (
+                       echo line-1 >&4
+                       echo line-2 >&24
+                       echo line-3 >&14
+                       echo go
+               ) | (
+                       read go
+                       read x <&5
+                       read y <&7
+                       read z <&19
+
+                       printf "%s\n" "${x}" "${y}" "${z}"
+               )
+       DONE
+       atf_check -s exit:0 -o inline:'line-1\nline-2\nline-3\n' \
+               -e empty ${TEST_SH}
+
+       cat <<- 'DONE' |
+               for arg in one-4-5 two-6-7 three-8-9 four-11-10 five-3-12
+               do
+                       ofd=${arg##*-}
+                       file=${arg%-*}
+                       ifd=${file#*-}
+                       file=${file%-*}
+                       eval "exec ${ofd}>${file}"
+                       eval "exec ${ifd}<${file}"
+               done
+
+               ( ( ( echo line-1 >& 13 ) 13>&12 ) 12>&5 ) >stdout 2>errout
+               ( ( ( echo line-2 >& 4) 13>&12 ) 4>&7 ) >>stdout 2>>errout
+               ( ( ( echo line-3 >& 6) 8>&1 6>&11 >&12) 11>&9 >&7 ) >>stdout
+
+               ( ( ( cat <&13 >&12 ) 13<&8 12>&10 ) 10>&1 8<&6 ) 6<&4
+               ( ( ( cat <&4 ) <&4 6<&8 8<&11  )
+                       <&4 4<&6 6<&8 8<&11 ) <&4 4<&6 6<&8 8<&11 11<&3
+               ( ( ( cat <&7 >&1 ) 7<&6 >&10 ) 10>&2 6<&8 ) 2>&1
+       DONE
+       atf_check -s exit:0 -o inline:'line-1\nline-2\nline-3\n' \
+               -e empty ${TEST_SH}
+}
+
+atf_test_case ulimit_redirection_interaction
+ulimit_redirection_interaction_head()
+{
+       atf_set "descr" "Tests interactions between redirect and ulimit -n "
+}
+ulimit_redirection_interaction_body()
+{
+       atf_require_prog ls
+
+       cat <<- 'DONE' > helper.sh
+               oLIM=$(ulimit -n)
+               HRD=$(ulimit -H -n)
+               test "${oLIM}" -lt "${HRD}"  && ulimit -n "${HRD}"
+               LIM=$(ulimit -n)
+
+               FDs=
+               LFD=-1
+               while [ ${LIM} -gt 16 ]
+               do
+                       FD=$(( ${LIM} - 1 ))
+                       if [ "${FD}" -eq "${LFD}" ]; then
+                               echo >&2 "Infinite loop... (busted $(( )) ??)"
+                               exit 1
+                       fi
+                       LFD="${FD}"
+
+                       eval "exec ${FD}"'> /dev/null'
+                       FDs="${FD}${FDs:+ }${FDs}"
+
+                       (
+                               FD=$(( ${LIM} + 1 ))
+                               eval "exec ${FD}"'> /dev/null'
+                               echo "Reached unreachable command"
+                       ) 2>/dev/null && echo >&2 "Opened beyond limit!"
+
+                       (eval 'ls 2>&1 3>&1 4>&1 5>&1 '"${FD}"'>&1') >&"${FD}"
+
+                       LIM=$(( ${LIM} / 2 ))
+                       ulimit -S -n "${LIM}"
+               done
+
+               # Even though ulimit has been reduced, open fds should work
+               for FD in ${FDs}
+               do
+                       echo ${FD} in ${FDs} >&"${FD}" || exit 1
+               done
+
+               ulimit -S -n "${oLIM}"
+
+               # maybe more later...
+
+       DONE
+
+       atf_check -s exit:0 -o empty -e empty ${TEST_SH} helper.sh
 }
 
 atf_init_test_cases() {
@@ -456,4 +712,5 @@
        atf_add_test_case redir_here_doc
        atf_add_test_case redir_in_case
        atf_add_test_case subshell_redirections
+       atf_add_test_case ulimit_redirection_interaction
 }



Home | Main Index | Thread Index | Old Index