aboutsummaryrefslogtreecommitdiff
path: root/test/TestRunner.sh
blob: bb20728578c1caca44d2ad1db4afd69ff92f8c2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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