# This program runs ksh regression tests
# shtests [ name=value ... ] [ --all | --compile ] [ --time ] [ a.sh b.sh ... ]
timesensitive='*@(options|sigchld|subshell).sh'
unset DISPLAY ENV FIGNORE HISTFILE
LANG=C
LC_ALL=C
compile=1
script=1
time=1
vmalloc_options=abort
while :
do case $1 in
-a|--a*)compile=2
script=2
;;
-c|--c*)compile=2
script=
;;
-s|--s*)compile=
script=2
;;
-t|--not*)time=
;;
-v|--nov*)vmalloc_options=
;;
-*) echo $0: $1: invalid option >&2
exit 2
;;
*=*) n=${1%%=*}
v=${1#*=}
eval $n=\'$v\'
export $n
;;
*) break
;;
esac
shift
done
if [[ $VMALLOC_OPTIONS ]]
then vmalloc_options=$VMALLOC_OPTIONS
else VMALLOC_OPTIONS=$vmalloc_options
fi
[[ $VMALLOC_OPTIONS ]] || timesensitive=.
export LANG LC_ALL PATH PWD SHELL VMALLOC_OPTIONS
PWD=`pwd`
SHELL=${SHELL-ksh}
case $0 in
/*) d=`dirname $0`;;
*/*) d=$PWD/`dirname $0`;;
*) d=$PWD;;
esac
case $SHELL in
/*) ;;
*/*) SHELL=$d/$SHELL;;
*) SHELL=$(whence $SHELL);;
esac
PATH=/bin:/usr/bin
if [[ -d /usr/ucb ]]
then PATH=$PATH:/usr/ucb
fi
PATH=$PATH:$d
if [[ $INSTALLROOT && -r $INSTALLROOT/bin/.paths ]]
then PATH=$INSTALLROOT/bin:$PATH
fi
if [[ $compile ]]
then SHCOMP=${SHCOMP:-shcomp}
if whence $SHCOMP > /dev/null
then tmp=$(mktemp -dt) || { echo mktemp -dt failed >&2; exit 1; }
trap "cd /; rm -rf $tmp" EXIT
elif [[ $compile != 1 ]]
then echo $0: --compile: $SHCOMP not found >&2
exit 1
else compile=
fi
fi
typeset -A tests
for i in ${*-*.sh}
do if [[ ! -r $i ]]
then echo $0: $i: not found >&2
continue
fi
t=$(grep -c err_exit $i)
if (( $t > 2 ))
then (( t = $t - 2 ))
fi
tests[$i]=$t
T=test
if (( $t != 1 ))
then T=${T}s
fi
E=error
if [[ $script ]]
then echo test $i begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
if [[ $i == $timesensitive ]]
then VMALLOC_OPTIONS=
fi
if $SHELL $i
then echo test $i passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
else e=$?
if (( e > 256 ))
then e=1
E=signal
fi
if (( $e != 1 ))
then E=${E}s
fi
echo test $i failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
fi
if [[ $i == $timesensitive ]]
then VMALLOC_OPTIONS=$vmalloc_options
fi
fi
done
if [[ $compile ]]
then for i in ${*-*.sh}
do if [[ ! -r $i ]]
then continue
fi
t=${tests[$i]}
T=test
if (( $t != 1 ))
then T=${T}s
fi
o=${i##*/}
o=shcomp-${o%.sh}.ksh
echo test $o begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
E=error
if $SHCOMP $i > $tmp/$o
then if [[ $i == $timesensitive ]]
then VMALLOC_OPTIONS=
fi
if $SHELL $tmp/$o
then echo test $o passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
else e=$?
if (( e > 256 ))
then e=1
E=signal
fi
if (( $e != 1 ))
then E=${E}s
fi
echo test $o failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
fi
if [[ $i == $timesensitive ]]
then VMALLOC_OPTIONS=$vmalloc_options
fi
else e=$?
t=1
T=test
echo test $o failed to compile ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T 1 $E ]"
fi
done
fi