2fc6e056fc62818581fddaa40a2540a7863f5a8e
[gcc.git] / contrib / compare_tests
1 #!/bin/sh
2 # This script automatically test the given tool with the tool's test cases,
3 # reporting anything of interest.
4
5 usage()
6 {
7 if [ -n "$1" ] ; then
8 echo "$0: Error: $1" >&2
9 echo >&2
10 fi
11 cat >&2 <<EOUSAGE
12 Usage: $0 [-strict] PREVIOUS CURRENT
13
14 Compare the PREVIOUS and CURRENT test case .sum files, reporting anything of interest.
15
16 If PREVIOUS and CURRENT are directories, find and compare any *.sum files.
17
18 Unless -strict is given, these discrepancies are not counted as errors:
19 missing/extra .sum files when comparing directories
20 tests that failed in PREVIOUS but pass in CURRENT
21 tests that were not in PREVIOUS but appear in CURRENT
22 tests in PREVIOUS that are missing in CURRENT
23
24 Exit with the following values:
25 0 if there is nothing of interest
26 1 if there are errors when comparing single test case files
27 N for the number of errors found when comparing directories
28 EOUSAGE
29 exit 2
30 }
31
32 # Written by Mike Stump <mrs@cygnus.com>
33 # Subdir comparison added by Quentin Neill <quentin.neill@amd.com>
34
35 tool=gxx
36
37 tmp1=/tmp/$tool-testing.$$a
38 tmp2=/tmp/$tool-testing.$$b
39 now_s=/tmp/$tool-testing.$$d
40 before_s=/tmp/$tool-testing.$$e
41 lst1=/tmp/$tool-lst1.$$
42 lst2=/tmp/$tool-lst2.$$
43 lst3=/tmp/$tool-lst3.$$
44 lst4=/tmp/$tool-lst4.$$
45 lst5=/tmp/$tool-lst5.$$
46 sum1=/tmp/$tool-sum1.$$
47 sum2=/tmp/$tool-sum2.$$
48 tmps="$tmp1 $tmp2 $now_s $before_s $lst1 $lst2 $lst3 $lst4 $lst5 $sum1 $sum2"
49
50 [ "$1" = "-strict" ] && strict=$1 && shift
51 [ "$1" = "-?" ] && usage
52 [ "$2" = "" ] && usage "Must specify both PREVIOUS and CURRENT"
53
54 trap "rm -f $tmps" 0 1 2 3 5 9 13 15
55 exit_status=0
56
57 if [ -d "$1" -a -d "$2" ] ; then
58 find "$1" -name '*.sum' >$lst1
59 find "$2" -name '*.sum' >$lst2
60 echo "# Comparing directories"
61 echo "## Dir1=$1: `cat $lst1 | wc -l` sum files"
62 echo "## Dir2=$2: `cat $lst2 | wc -l` sum files"
63 echo
64 # remove leading directory components to compare
65 sed -e "s|^$1[/]*||" $lst1 | sort >$lst3
66 sed -e "s|^$2[/]*||" $lst2 | sort >$lst4
67 comm -23 $lst3 $lst4 >$lst5
68 if [ -s $lst5 ] ; then
69 echo "# Extra sum files in Dir1=$1"
70 sed -e "s|^|< $1/|" $lst5
71 echo
72 [ -n "$strict" ] && exit_status=`expr $exit_status + 1`
73 fi
74 comm -13 $lst3 $lst4 >$lst5
75 if [ -s $lst5 ] ; then
76 echo "# Extra sum files in Dir2=$2"
77 sed -e "s|^|> $2/|" $lst5
78 echo
79 [ -n "$strict" ] && exit_status=`expr $exit_status + 1`
80 fi
81 comm -12 $lst3 $lst4 | sort -u >$lst5
82 if [ ! -s $lst5 ] ; then
83 echo "# No common sum files"
84 exit_status=`expr $exit_status + 1`
85 exit $exit_status
86 fi
87 cmnsums=`cat $lst5 | wc -l`
88 echo "# Comparing $cmnsums common sum files"
89 ( for fname in `cat $lst5`; do cat $1/$fname; done ) >$sum1
90 ( for fname in `cat $lst5`; do cat $2/$fname; done ) >$sum2
91 echo "## ${CONFIG_SHELL-/bin/sh} $0 $strict $sum1 $sum2"
92 ${CONFIG_SHELL-/bin/sh} $0 $strict $sum1 $sum2
93 ret=$?
94 if [ $ret -ne 0 ]; then
95 exit_status=`expr $exit_status + 1`
96 echo "## Differences found: $fname"
97 fi
98 if [ $exit_status -ne 0 ]; then
99 echo "# $exit_status differences in $cmnsums common sum files found"
100 else
101 echo "# No differences found in $cmnsums common sum files"
102 fi
103 exit $exit_status
104 elif [ -d "$1" -o -d "$2" ] ; then
105 usage "Must specify either two directories or two files"
106 fi
107
108 sed 's/^XFAIL/FAIL/; s/^XPASS/PASS/' < "$1" | awk '/^Running target / {target = $3} { if (target != "unix") { sub(/: /, "&"target": " ); }; print $0; }' >$tmp1
109 sed 's/^XFAIL/FAIL/; s/^XPASS/PASS/' < "$2" | awk '/^Running target / {target = $3} { if (target != "unix") { sub(/: /, "&"target": " ); }; print $0; }' >$tmp2
110
111 before=$tmp1
112 now=$tmp2
113
114
115 if sort -k 2 </dev/null >/dev/null 2>&1; then
116 skip1='-k 2'
117 else
118 skip1='+1'
119 fi
120
121 sort -t ':' $skip1 "$now" > "$now_s"
122 sort -t ':' $skip1 "$before" > "$before_s"
123
124 grep '^FAIL:' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
125 grep '^PASS' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -12 $tmp1 - >$tmp2
126
127 grep -s . $tmp2 >/dev/null
128 if [ $? = 0 ]; then
129 echo "Tests that now fail, but worked before:"
130 echo
131 cat $tmp2
132 echo
133 exit_status=1
134 fi
135
136 grep '^PASS' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
137 grep '^FAIL' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -12 $tmp1 - >$tmp2
138
139 grep -s . $tmp2 >/dev/null
140 if [ $? = 0 ]; then
141 echo "Tests that now work, but didn't before:"
142 echo
143 cat $tmp2
144 [ -n "$strict" ] && echo "Strict test fails" && exit_status=1
145 echo
146 fi
147
148 grep '^FAIL' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
149 grep '^[PF]A[SI][SL]' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -23 $tmp1 - >$tmp2
150
151 grep -s . $tmp2 >/dev/null
152 if [ $? = 0 ]; then
153 echo "New tests that FAIL:"
154 echo
155 cat $tmp2
156 echo
157 exit_status=1
158 fi
159
160 grep '^PASS' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
161 grep '^[PF]A[SI][SL]' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -23 $tmp1 - >$tmp2
162
163 grep -s . $tmp2 >/dev/null
164 if [ $? = 0 ]; then
165 echo "New tests that PASS:"
166 echo
167 cat $tmp2
168 [ -n "$strict" ] && echo "Strict test fails" && exit_status=1
169 echo
170 fi
171
172 grep '^[PF]A[SI][SL]' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
173 grep '^PASS' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -13 $tmp1 - >$tmp2
174
175 grep -s . $tmp2 >/dev/null
176 if [ $? = 0 ]; then
177 echo "Old tests that passed, that have disappeared: (Eeek!)"
178 echo
179 cat $tmp2
180 [ -n "$strict" ] && echo "Strict test fails" && exit_status=1
181 echo
182 fi
183
184 grep '^[PF]A[SI][SL]' "$now_s" | sed 's/^[^:]*:[ ]//' >$tmp1
185 grep '^FAIL' "$before_s" | sed 's/^[^:]*:[ ]//' | comm -13 $tmp1 - >$tmp2
186
187 grep -s . $tmp2 >/dev/null
188 if [ $? = 0 ]; then
189 echo "Old tests that failed, that have disappeared: (Eeek!)"
190 echo
191 cat $tmp2
192 [ -n "$strict" ] && echo "Strict test fails" && exit_status=1
193 echo
194 fi
195
196 exit $exit_status