diff options
author | Ed Schouten <ed@FreeBSD.org> | 2009-06-02 17:58:47 +0000 |
---|---|---|
committer | Ed Schouten <ed@FreeBSD.org> | 2009-06-02 17:58:47 +0000 |
commit | ec2b103c267a06a66e926f62cd96767b280f5cf5 (patch) | |
tree | ce7d964cbb5e39695b71481698f10cb099c23d4a /test/TestRunner.sh | |
download | src-ec2b103c267a06a66e926f62cd96767b280f5cf5.tar.gz src-ec2b103c267a06a66e926f62cd96767b280f5cf5.zip |
Notes
Diffstat (limited to 'test/TestRunner.sh')
-rwxr-xr-x | test/TestRunner.sh | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/test/TestRunner.sh b/test/TestRunner.sh new file mode 100755 index 000000000000..bb20728578c1 --- /dev/null +++ b/test/TestRunner.sh @@ -0,0 +1,134 @@ +#!/bin/sh +# +# TestRunner.sh - This script is used to run arbitrary unit tests. Unit +# tests must contain the command used to run them in the input file, starting +# immediately after a "RUN:" string. +# +# This runner recognizes and replaces the following strings in the command: +# +# %s - Replaced with the input name of the program, or the program to +# execute, as appropriate. +# %S - Replaced with the directory where the input file resides +# %prcontext - prcontext.tcl script +# %t - temporary file name (derived from testcase name) +# + +FILENAME=$1 +TESTNAME=$1 +SUBST=$1 +FILEDIR=`dirname $TESTNAME` + +OUTPUT=Output/$1.out + +# create the output directory if it does not already exist +mkdir -p `dirname $OUTPUT` > /dev/null 2>&1 + +if test $# != 1; then + # If more than one parameter is passed in, there must be three parameters: + # The filename to read from (already processed), the command used to execute, + # and the file to output to. + SUBST=$2 + OUTPUT=$3 + TESTNAME=$3 +fi + +ulimit -t 40 + +# Verify the script contains a run line. +grep -q 'RUN:' $FILENAME || ( + echo "******************** TEST '$TESTNAME' HAS NO RUN LINE! ********************" + exit 1 +) + +# Run under valgrind if the VG environment variable has been set. +CLANG=$CLANG +if [ ! -n "$CLANG" ]; then + CLANG="clang" +fi + +# Resolve the path, and Make sure $CLANG actually exists; otherwise +# ensuing failures are non-obvious. +CLANG=$(which "$CLANG") +if [ -z $CLANG ]; then + echo "Couldn't find 'clang' program, try setting CLANG in your environment" + exit 1 +fi + +if [ -n "$VG" ]; then + rm -f $OUTPUT.vg + CLANG="valgrind --leak-check=full --quiet --log-file=$OUTPUT.vg $CLANG" +fi + +# Assuming $CLANG is correct, use it to derive clang-cc. We expect to +# be looking in a build directory, so just add '-cc'. +CLANGCC=$CLANGCC +if [ ! -n "$CLANGCC" ]; then + CLANGCC="$CLANG-cc" +fi + +# Try to sanity check $CLANGCC too +CLANGCC=$(which "$CLANGCC") +# If that failed, ask clang. +if [ -z "$CLANGCC" ]; then + CLANGCC=$($CLANG -print-prog-name=clang-cc) +fi +if [ -z "$CLANGCC" ]; then + echo "Couldn't find 'clang-cc' program, make sure clang is found in your build directory" + exit 1 +fi + +SCRIPT=$OUTPUT.script +TEMPOUTPUT=$OUTPUT.tmp +grep 'RUN:' $FILENAME | \ + sed -e "s|^.*RUN:\(.*\)$|\1|g" \ + -e "s| clang | $CLANG |g" \ + -e "s| clang-cc | $CLANGCC |g" \ + -e "s|%s|$SUBST|g" \ + -e "s|%S|$FILEDIR|g" \ + -e "s|%prcontext|prcontext.tcl|g" \ + -e "s|%t|$TEMPOUTPUT|g" > $SCRIPT + +IS_XFAIL=0 +if (grep -q XFAIL $FILENAME); then + IS_XFAIL=1 + printf "XFAILED '$TESTNAME': " + grep XFAIL $FILENAME +fi + +/bin/sh $SCRIPT > $OUTPUT 2>&1 +SCRIPT_STATUS=$? + +if [ -n "$VG" ]; then + [ ! -s $OUTPUT.vg ] + VG_STATUS=$? +else + VG_STATUS=0 +fi + +if [ $IS_XFAIL -ne 0 ]; then + if [ $SCRIPT_STATUS -ne 0 ]; then + SCRIPT_STATUS=0 + else + SCRIPT_STATUS=1 + fi +fi + +if [ $SCRIPT_STATUS -ne 0 -o $VG_STATUS -ne 0 ]; then + echo "******************** TEST '$TESTNAME' FAILED! ********************" + echo "Command: " + cat $SCRIPT + if [ $SCRIPT_STATUS -eq 0 ]; then + echo "Output:" + elif [ $IS_XFAIL -ne 0 ]; then + echo "Incorrect Output (Expected Failure):" + else + echo "Incorrect Output:" + fi + cat $OUTPUT + if [ $VG_STATUS -ne 0 ]; then + echo "Valgrind Output:" + cat $OUTPUT.vg + fi + echo "******************** TEST '$TESTNAME' FAILED! ********************" + exit 1 +fi |