1 divert(-1) -*- Autoconf -*-
2 # `m4' macros used in building test suites.
3 # Copyright (C) 2000 Free Software Foundation, Inc.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2, or (at your option)
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 # This script is part of Autotest. Unlimited permission to copy,
21 # distribute and modify the testing scripts that are the output of
22 # that Autotest script is given. You need not follow the terms of the
23 # GNU General Public License when using or distributing such scripts,
24 # even though portions of the text of Autotest appear in them. The
25 # GNU General Public License (GPL) does govern all other use of the
26 # material that constitutes the Autotest.
28 # Certain portions of the Autotest source text are designed to be
29 # copied (in certain cases, depending on the input) into the output of
30 # Autotest. We call these the "data" portions. The rest of the
31 # Autotest source text consists of comments plus executable code that
32 # decides which of the data portions to output in any given case. We
33 # call these comments and executable code the "non-data" portions.
34 # Autotest never copies any of the non-data portions into its output.
36 # This special exception to the GPL applies to versions of Autotest
37 # released by the Free Software Foundation. When you make and
38 # distribute a modified version of Autotest, you may extend this
39 # special exception to the GPL to apply to your modified version as
40 # well, *unless* your modified version has the potential to copy into
41 # its output some of the text that was the non-data portion of the
42 # version that you started with. (In other words, unless your change
43 # moves or copies text from the non-data portions to the data
44 # portions.) If your modification has such potential, you must delete
45 # any notice of this special exception to the GPL from your modified
51 define([AT_DEFINE], defn([define]))
52 define([AT_EVAL], defn([eval]))
53 define([AT_FORMAT], defn([format]))
54 define([AT_INCLUDE], defn([include]))
55 define([AT_SHIFT], defn([shift]))
56 define([AT_UNDEFINE], defn([undefine]))
66 # AT_CASE(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
67 # -----------------------------------------------------------
82 # All the values are optional, and the macro is robust to active
83 # symbols properly quoted.
89 [AT_CASE([$1], AT_SHIFT(AT_SHIFT(AT_SHIFT($@))))])])
93 # 0 - overall initialization; for each test group: skipping and cleanups;
94 # 1 - for each test group: proper code, to reinsert between cleanups;
95 # 2 - overall wrap up: generation of debugging scripts and statistics.
100 # Return the current file sans directory, a colon, and the current line.
102 [patsubst(__file__, ^.*/\(.*\), \1):__line__])
107 # Begin testing suite, using PROGRAM to check version. The search path
108 # should be already preset so the proper executable will be selected.
110 [AT_DEFINE(AT_ordinal, 0)
114 at_stop_on_error=false;
115 # Shall we save and check stdout and stderr?
119 # -s sets to false, and -v to true
122 at_usage="Usage: $[0] [OPTION]...
124 -e Abort the full suite and inhibit normal clean up if a test fails
125 -n Do not redirect stdout and stderr and do not test their contents
126 -s Inhibit verbosity while generating or executing debugging scripts
127 -v Force more detailed output, default for debugging scripts unless -s
128 -x Have the shell to trace command execution; also implies option -n"
133 while test $[#] -gt 0; do
135 --help) echo "$at_usage"; exit 0 ;;
136 --version) echo "$[0] ($at_package) $at_version"; exit 0 ;;
137 -e) at_stop_on_error=:;;
138 -n) at_check_stds=false;;
139 -s) at_verbose=false; at_silent=1;;
140 -v) at_verbose=:; at_silent=;;
141 -x) at_traceon='set -vx'; at_traceoff='set +vx'; at_check_stds=false;;
142 *) echo 1>&2 "Try \`$[0] --help' for more information."; exit 1 ;;
148 # To check whether a test succeeded or not, we compare an expected
149 # output with a reference. In the testing suite, we just need `cmp'
150 # but in debugging scripts, we want more information, so we prefer
151 # `diff -u'. Nonetheless we will use `diff' only, because in DOS
152 # environments, `diff' considers that two files are equal included
153 # when there are only differences on the coding of new lines. `cmp'
156 # Finally, not all the `diff' support `-u', and some, like Tru64, even
157 # refuse to `diff' /dev/null.
160 if diff -u empty empty >/dev/null 2>&1; then
168 # Each generated debugging script, containing a single test group, cleans
169 # up files at the beginning only, not at the end. This is so we can repeat
170 # the script many times and browse left over files. To cope with such left
171 # over files, the full test suite cleans up both before and after test groups.
174 if $1 --version | grep "$at_package.*$at_version" >/dev/null; then
175 at_banner="Testing suite for $at_package, version $at_version"
176 at_dashes=`echo $at_banner | sed s/./=/g`
181 echo '======================================================='
182 echo 'ERROR: Not using the proper version, no tests performed'
183 echo '======================================================='
187 # Remove any debugging script resulting from a previous run.
194 # Wrap up the testing suite with summary statistics.
196 rm -f at-check-line at-setup-line
198 if test -z "$at_failed_list"; then
199 if test "$at_ignore_count" = 0; then
200 at_banner="All $at_test_count tests were successful"
202 at_banner="All $at_test_count tests were successful ($at_ignore_count ignored)"
206 echo $at_n "Writing \`debug-NN.sh' scripts, NN =$at_c"
207 for at_group in $at_failed_list; do
208 echo $at_n " $at_group$at_c"
210 sed -n '/^[#] Snippet (1/,/^[#] Snippet )1/p' atconfig
211 sed -n '/^[#] Snippet (2/,/^[#] Snippet )2/p' atconfig
212 sed -n "/^[#] Snippet (3/,/^[#] Snippet )3/p" $[0]
213 test -z "$at_silent" && echo 'at_verbose=:'
214 sed -n "/^[#] Snippet (4/,/^[#] Snippet )4/p" $[0]
215 sed -n "/^[#] Snippet (c$at_group(/,/^[#] Snippet )c$at_group)/p" $[0]
217 '/^[#] Snippet (d'$at_group'(/,/^[#] Snippet )d'$at_group')/p' $[0] \
218 | sed -n '2s/^[#] //p'`
219 echo 'if $at_verbose; then'
220 echo ' at_banner="$[0]: '$at_desc'"'
221 echo ' at_dashes=`echo $at_banner | sed s/./=/g`'
223 echo ' echo "$at_dashes"'
224 echo ' echo "$at_banner"'
225 echo ' echo "$at_dashes"'
228 sed -n "/^[#] Snippet (d$at_group(/,/^[#] Snippet )d$at_group)/p" $[0]
229 sed -n "/^[#] Snippet (s$at_group(/,/^[#] Snippet )s$at_group)/p" $[0]
231 ) | grep -v '^[#] Snippet' > debug-$at_group.sh
232 chmod +x debug-$at_group.sh
233 at_fail_count=`expr $at_fail_count + 1`
236 if $at_stop_on_error; then
237 at_banner='ERROR: One of the tests failed, inhibiting subsequent tests'
239 at_banner="ERROR: Suite unsuccessful, $at_fail_count of $at_test_count tests failed"
242 at_dashes=`echo $at_banner | sed s/./=/g`
248 if test -n "$at_failed_list"; then
249 if test -z "$at_silent"; then
251 echo 'When reporting failed tests to maintainers, do not merely list test'
252 echo 'numbers, as the numbering changes between releases and pretests.'
253 echo 'Be careful to give at least all the information you got about them.'
254 echo 'You may investigate any problem if you feel able to do so, in which'
255 echo 'case the generated debugging scripts provide good starting points.'
256 echo "Go on and modify them at will. \`./debug-NN --help' gives usage"
257 echo 'information. Now, failed tests will be executed again, verbosely.'
258 for at_group in $at_failed_list; do
271 # AT_SETUP(DESCRIPTION)
272 # ---------------------
273 # Start a group of related tests, all to be executed in the same subshell.
274 # The group is testing what DESCRIPTION says.
275 AT_DEFINE([AT_SETUP],
276 [AT_DEFINE([AT_ordinal], AT_EVAL(AT_ordinal + 1))
277 pushdef([AT_group_description], [$1])
278 pushdef([AT_data_files], )
279 pushdef([AT_data_expout], )
280 pushdef([AT_data_experr], )
281 if $at_stop_on_error && test -n "$at_failed_list"; then :; else
283 echo AT_LINE > at-check-line
284 echo AT_LINE > at-setup-line
286 echo 'testing AT_group_description'
290 echo "AT_ordinal. $srcdir/AT_LINE..."
292 echo $at_n "substr(AT_ordinal. $srcdir/AT_LINE , 0, 30)[]$at_c"
294 if test -z "$at_skip_mode"; then
296 [#] Snippet (d[]AT_ordinal[](
297 [#] Testing AT_group_description
298 [#] Snippet )d[]AT_ordinal[])
299 [#] Snippet (s[]AT_ordinal[](
300 [#] starting from `AT_LINE'.
307 # Complete a group of related tests, recursively remove those FILES
308 # created within the test. There is no need to list stdout, stderr,
309 # nor files created with AT_DATA.
310 AT_DEFINE([AT_CLEANUP],
312 [[#] Snippet )s[]AT_ordinal[])
316 echo $at_n " AT_ordinal. $srcdir/`cat at-setup-line`: $at_c"
320 77) echo "ignored near \``cat at-check-line`'"
321 at_ignore_count=`expr $at_ignore_count + 1`
323 *) echo "FAILED near \``cat at-check-line`'"
324 at_failed_list="$at_failed_list AT_ordinal"
328 echo 'ignored (skipped)'
329 at_ignore_count=`expr $at_ignore_count + 1`
331 at_test_count=AT_ordinal
332 if $at_stop_on_error && test -n "$at_failed_list"; then :; else
334 [#] Snippet (c[]AT_ordinal[](
336 rm ifelse([AT_data_files$1], , [-f], [-rf[]AT_data_files[]ifelse($1, , , [ $1])]) stdout stderr[]AT_data_expout[]AT_data_experr
337 [#] Snippet )c[]AT_ordinal[])
339 rm ifelse([AT_data_files$1], , [-f], [-rf[]AT_data_files[]ifelse($1, , , [ $1])]) stdout stderr[]AT_data_expout[]AT_data_experr
342 popdef([AT_data_experr])
343 popdef([AT_data_expout])
344 popdef([AT_data_files])
345 popdef([AT_group_description])[]dnl
349 # AT_DATA(FILE, CONTENTS)
350 # -----------------------
351 # Initialize an input data FILE with given CONTENTS, which should end with
353 # This macro is not robust to active symbols in CONTENTS *on purpose*.
354 # If you don't want CONTENT to be evaluated, quote it twice.
356 [AT_DEFINE([AT_data_files], AT_data_files[ ]$1)
362 # AT_CHECK(COMMANDS, [STATUS], STDOUT, STDERR)
363 # --------------------------------------------
364 # Execute a test by performing given shell COMMANDS. These commands
365 # should normally exit with STATUS, while producing expected STDOUT and
366 # STDERR contents. The special word `expout' for STDOUT means that file
367 # `expout' contents has been set to the expected stdout. The special word
368 # `experr' for STDERR means that file `experr' contents has been set to
369 # the expected stderr.
370 # STATUS is not checked if it is empty.
371 # STDOUT and STDERR can be the special value `ignore', in which case
372 # their content is not checked.
373 AT_DEFINE([AT_CHECK],
375 $at_verbose && echo "$srcdir/AT_LINE: patsubst([$1], [\([\"`$]\)], \\\1)"
376 echo AT_LINE > at-check-line
377 $at_check_stds && exec 5>&1 6>&2 1>stdout 2>stderr
382 if test $at_status != $2; then
383 $at_verbose && echo "Exit code was $at_status, expected $2" >&6
384 dnl Maybe there was an important message to read before it died.
385 $at_verbose && $at_check_stds && cat stderr >&6
386 dnl Preserve exit code 77.
387 test $at_status = 77 && exit 77
392 if $at_check_stds; then
393 dnl Restore stdout to fd1 and stderr to fd2.
395 dnl If not verbose, neutralize the output of diff.
396 $at_verbose || exec 1>/dev/null 2>/dev/null
399 ignore, [$at_verbose && cat stderr;:],
400 experr, [AT_DEFINE([AT_data_experr], [ experr])dnl
401 $at_diff experr stderr || at_failed=:],
402 [], [$at_diff empty stderr || at_failed=:],
403 [echo $at_n "patsubst([$4], [\([\"`$]\)], \\\1)$at_c" | $at_diff - stderr || at_failed=:])
405 ignore, [$at_verbose && cat stdout;:],
406 expout, [AT_DEFINE([AT_data_expout], [ expout])dnl
407 $at_diff expout stdout || at_failed=:],
408 [], [$at_diff empty stdout || at_failed=:],
409 [echo $at_n "patsubst([$3], [\([\"`$]\)], \\\1)$at_c" | $at_diff - stdout || at_failed=:])