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
|