90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
for i in $@; do :; done
 | 
						|
script="$i"
 | 
						|
 | 
						|
escape_regex() {
 | 
						|
	local str="$1"
 | 
						|
	## escape [, ], {, (, \, $, *, . ^, ), }
 | 
						|
	printf '%s\n' "$str" | sed -r -e 's/[][{(\$*.^)}]/\\&/g'
 | 
						|
}
 | 
						|
 | 
						|
run_partfile() {
 | 
						|
	l_cmd="";
 | 
						|
	l_nargs=$#
 | 
						|
 | 
						|
	while [ $# -gt 3 ]
 | 
						|
	do
 | 
						|
		l_cmd="$l_cmd $1"
 | 
						|
		shift
 | 
						|
	done
 | 
						|
 | 
						|
	l_script="$1"
 | 
						|
	shift ## skip the original script.
 | 
						|
	l_partno="$1"
 | 
						|
	shift ## partno
 | 
						|
 | 
						|
	l_partfile="$1"
 | 
						|
	l_cmd="$l_cmd $l_partfile"
 | 
						|
 | 
						|
        ## old greps don't support -o. use sed to mimic it.
 | 
						|
	##l_expected_errinfo=$(grep -n -o -E "##ERROR: .+" "$l_partfile" 2>/dev/null)
 | 
						|
        l_expected_errinfo=$(grep -n -E "##ERROR: .+" "$l_partfile" 2>/dev/null | sed -r -n 's/^([0-9]*):.*(##ERROR: .*)/\1:\2/p')
 | 
						|
	[ -z "$l_expected_errinfo" ] && {
 | 
						|
		echo "ERROR: INVALID TESTER - $l_script($l_partno) contains no ERROR information"
 | 
						|
		return 1
 | 
						|
	}
 | 
						|
 | 
						|
	l_expected_errline=$(echo $l_expected_errinfo | cut -d: -f1)
 | 
						|
	l_xlen=$(echo $l_expected_errline | wc -c)
 | 
						|
	l_xlen=$(expr $l_xlen + 10)
 | 
						|
	l_expected_errmsg=$(echo $l_expected_errinfo | cut -c${l_xlen}-)
 | 
						|
	l_output=`$l_cmd 2>&1`
 | 
						|
	## the regular expression is not escaped properly. the error information must not
 | 
						|
	## include special regex characters to avoid problems.
 | 
						|
	l_expected_errmsg_esc=$(escape_regex "${l_expected_errmsg}")
 | 
						|
	echo "$l_output" | grep -E "ERROR: .+ LINE ${l_expected_errline} .+ FILE ${l_partfile} - ${l_expected_errmsg_esc}" >/dev/null 2>&1 || {
 | 
						|
		echo "ERROR: error not raised at line $l_expected_errline - $l_script($l_partno) - $l_output"
 | 
						|
		return 1
 | 
						|
	}
 | 
						|
 | 
						|
	echo "OK"
 | 
						|
	return 0
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
ever_failed=0
 | 
						|
## [NOTE]
 | 
						|
##   some old mktemp(e.g mktemp 1.5 on rhel 2.1) always required the template. 
 | 
						|
##   these days, newer ones don't need it.
 | 
						|
partfile=`mktemp tmp.XXXXXXXXXX`
 | 
						|
partno=0
 | 
						|
partlines=0
 | 
						|
> "$partfile"
 | 
						|
 | 
						|
## dash behaves differently for read -r.
 | 
						|
## while \n is read in literally by bash or other shells, dash converts it to a new-line
 | 
						|
while IFS= read -r line
 | 
						|
do
 | 
						|
	if [ "$line" = "---" ]
 | 
						|
	then
 | 
						|
		[ $partlines -gt 0 ] && {
 | 
						|
			run_partfile "$@" "$partno" "$partfile" || ever_failed=1
 | 
						|
		}
 | 
						|
		partno=`expr $partno + 1`
 | 
						|
		partlines=0
 | 
						|
		> "$partfile"
 | 
						|
	else
 | 
						|
		echo "$line" >> "$partfile"
 | 
						|
		partlines=`expr $partlines + 1`
 | 
						|
	fi
 | 
						|
done < "$script"
 | 
						|
 | 
						|
[ $partlines -gt 0 ] && {
 | 
						|
	run_partfile "$@" "$partno" "$partfile" || ever_failed=1
 | 
						|
}
 | 
						|
 | 
						|
rm -f "$partfile"
 | 
						|
exit $ever_failed
 | 
						|
 |