14887Schin# This program runs ksh regression tests
2*8462SApril.Chin@Sun.COM# shtests [ name=value ... ] [ --all | --compile ] [ --time ] [ a.sh b.sh ... ]
34887Schin
44887Schinunset DISPLAY ENV FIGNORE
54887SchinLANG=C
64887SchinLC_ALL=C
7*8462SApril.Chin@Sun.COMcompile=1
8*8462SApril.Chin@Sun.COMscript=1
94887Schintime=1
10*8462SApril.Chin@Sun.COMvmdebug=1
114887Schinwhile	:
124887Schindo	case $1 in
13*8462SApril.Chin@Sun.COM	-a|--a*)compile=2
14*8462SApril.Chin@Sun.COM		script=2
15*8462SApril.Chin@Sun.COM		;;
16*8462SApril.Chin@Sun.COM	-c|--c*)compile=2
17*8462SApril.Chin@Sun.COM		script=
18*8462SApril.Chin@Sun.COM		;;
19*8462SApril.Chin@Sun.COM	-s|--s*)compile=
20*8462SApril.Chin@Sun.COM		script=2
21*8462SApril.Chin@Sun.COM		;;
22*8462SApril.Chin@Sun.COM	-t|--not*)time=
23*8462SApril.Chin@Sun.COM		;;
24*8462SApril.Chin@Sun.COM	-v|--nov*)vmdebug=
25*8462SApril.Chin@Sun.COM		;;
26*8462SApril.Chin@Sun.COM	-*)	echo $0: $1: invalid option >&2
27*8462SApril.Chin@Sun.COM		exit 2
28*8462SApril.Chin@Sun.COM		;;
294887Schin	*=*)	n=${1%%=*}
304887Schin		v=${1#*=}
314887Schin		eval $n=\'$v\'
324887Schin		export $n
334887Schin		;;
344887Schin	*)	break
354887Schin		;;
364887Schin	esac
374887Schin	shift
384887Schindone
39*8462SApril.Chin@Sun.COMif	[[ ! $vmdebug ]]
40*8462SApril.Chin@Sun.COMthen	unset VMDEBUG
41*8462SApril.Chin@Sun.COMelif	[[ ! $VMDEBUG ]]
42*8462SApril.Chin@Sun.COMthen	export VMDEBUG=a
43*8462SApril.Chin@Sun.COMfi
444887Schinexport LANG LC_ALL PATH PWD SHELL
454887SchinPWD=`pwd`
464887SchinSHELL=${SHELL-ksh}
474887Schincase $0 in
484887Schin/*)	d=`dirname $0`;;
494887Schin*/*)	d=$PWD/`dirname $0`;;
504887Schin*)	d=$PWD;;
514887Schinesac
524887Schincase $SHELL in
534887Schin/*)	;;
544887Schin*/*)	SHELL=$d/$SHELL;;
554887Schin*)	SHELL=$(whence $SHELL);;
564887Schinesac
574887SchinPATH=/bin:/usr/bin
584887Schinif	[[ -d /usr/ucb ]]
594887Schinthen	PATH=$PATH:/usr/ucb
604887Schinfi
614887SchinPATH=$PATH:$d
62*8462SApril.Chin@Sun.COMif	[[ $INSTALLROOT && -r $INSTALLROOT/bin/.paths ]]
634887Schinthen	PATH=$INSTALLROOT/bin:$PATH
644887Schinfi
65*8462SApril.Chin@Sun.COMif	[[ $compile ]]
66*8462SApril.Chin@Sun.COMthen	SHCOMP=${SHCOMP:-shcomp}
67*8462SApril.Chin@Sun.COM	if	whence $SHCOMP > /dev/null
68*8462SApril.Chin@Sun.COM	then	tmp=/tmp/ksh-$$
69*8462SApril.Chin@Sun.COM		trap 'rm -rf $tmp' EXIT
70*8462SApril.Chin@Sun.COM		mkdir $tmp || exit
71*8462SApril.Chin@Sun.COM	elif	[[ $compile != 1 ]]
72*8462SApril.Chin@Sun.COM	then	echo $0: --compile: $SHCOMP not found >&2
73*8462SApril.Chin@Sun.COM		exit 1
74*8462SApril.Chin@Sun.COM	else	compile=
75*8462SApril.Chin@Sun.COM	fi
76*8462SApril.Chin@Sun.COMfi
77*8462SApril.Chin@Sun.COMtypeset -A tests
784887Schinfor i in ${*-*.sh}
79*8462SApril.Chin@Sun.COMdo	t=$(grep -c err_exit $i)
80*8462SApril.Chin@Sun.COM	if	(( $t > 2 ))
81*8462SApril.Chin@Sun.COM	then	(( t = $t - 2 ))
824887Schin	fi
83*8462SApril.Chin@Sun.COM	tests[$i]=$t
844887Schin	T=test
854887Schin	if	(( $t != 1 ))
864887Schin	then	T=${T}s
874887Schin	fi
884887Schin	E=error
89*8462SApril.Chin@Sun.COM	if	[[ $script ]]
90*8462SApril.Chin@Sun.COM	then	echo test $i begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
91*8462SApril.Chin@Sun.COM		if	$SHELL $i
92*8462SApril.Chin@Sun.COM		then	echo test $i passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
93*8462SApril.Chin@Sun.COM		else	e=$?
94*8462SApril.Chin@Sun.COM			if	(( e > 256 ))
95*8462SApril.Chin@Sun.COM			then	e=1
96*8462SApril.Chin@Sun.COM				E=signal
97*8462SApril.Chin@Sun.COM			fi
98*8462SApril.Chin@Sun.COM			if	(( $e != 1 ))
99*8462SApril.Chin@Sun.COM			then	E=${E}s
100*8462SApril.Chin@Sun.COM			fi
101*8462SApril.Chin@Sun.COM			echo test $i failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
1024887Schin		fi
1034887Schin	fi
1044887Schindone
105*8462SApril.Chin@Sun.COMif	[[ $compile ]]
106*8462SApril.Chin@Sun.COMthen	for i in ${*-*.sh}
107*8462SApril.Chin@Sun.COM	do	t=${tests[$i]}
108*8462SApril.Chin@Sun.COM		T=test
109*8462SApril.Chin@Sun.COM		if	(( $t != 1 ))
110*8462SApril.Chin@Sun.COM		then	T=${T}s
111*8462SApril.Chin@Sun.COM		fi
112*8462SApril.Chin@Sun.COM		o=${i##*/}
113*8462SApril.Chin@Sun.COM		o=shcomp-${o%.sh}.ksh
114*8462SApril.Chin@Sun.COM		echo test $o begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
115*8462SApril.Chin@Sun.COM		E=error
116*8462SApril.Chin@Sun.COM		if	$SHCOMP $i > $tmp/$o
117*8462SApril.Chin@Sun.COM		then	if	$SHELL $tmp/$o
118*8462SApril.Chin@Sun.COM			then	echo test $o passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
119*8462SApril.Chin@Sun.COM			else	e=$?
120*8462SApril.Chin@Sun.COM				if	(( e > 256 ))
121*8462SApril.Chin@Sun.COM				then	e=1
122*8462SApril.Chin@Sun.COM					E=signal
123*8462SApril.Chin@Sun.COM				fi
124*8462SApril.Chin@Sun.COM				if	(( $e != 1 ))
125*8462SApril.Chin@Sun.COM				then	E=${E}s
126*8462SApril.Chin@Sun.COM				fi
127*8462SApril.Chin@Sun.COM				echo test $o failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
128*8462SApril.Chin@Sun.COM			fi
129*8462SApril.Chin@Sun.COM		else	e=$?
130*8462SApril.Chin@Sun.COM			t=1
131*8462SApril.Chin@Sun.COM			T=test
132*8462SApril.Chin@Sun.COM			echo test $o failed to compile ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T 1 $E ]"
133*8462SApril.Chin@Sun.COM		fi
134*8462SApril.Chin@Sun.COM	done
135*8462SApril.Chin@Sun.COMfi
136