1 # This file is part of Autoconf. -*- Autoconf -*-
2 # M4 macros used in building test suites.
4 # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free
5 # Software Foundation, Inc.
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 # As a special exception, the Free Software Foundation gives unlimited
21 # permission to copy, distribute and modify the configure scripts that
22 # are the output of Autoconf. You need not follow the terms of the GNU
23 # General Public License when using or distributing such scripts, even
24 # though portions of the text of Autoconf appear in them. The GNU
25 # General Public License (GPL) does govern all other use of the material
26 # that constitutes the Autoconf program.
28 # Certain portions of the Autoconf source text are designed to be copied
29 # (in certain cases, depending on the input) into the output of
30 # Autoconf. We call these the "data" portions. The rest of the Autoconf
31 # source text consists of comments plus executable code that decides which
32 # of the data portions to output in any given case. We call these
33 # comments and executable code the "non-data" portions. Autoconf never
34 # copies any of the non-data portions into its output.
36 # This special exception to the GPL applies to versions of Autoconf
37 # released by the Free Software Foundation. When you make and
38 # distribute a modified version of Autoconf, you may extend this special
39 # exception to the GPL to apply to your modified version as well, *unless*
40 # your modified version has the potential to copy into its output some
41 # of the text that was the non-data portion of the version that you started
42 # with. (In other words, unless your change moves or copies text from
43 # the non-data portions to the data portions.) If your modification has
44 # such potential, you must delete any notice of this special exception
45 # to the GPL from your modified version.
47 # _m4_divert(DIVERSION-NAME)
48 # --------------------------
49 # Convert a diversion name into its number. Otherwise, return
50 # DIVERSION-NAME which is supposed to be an actual diversion number.
51 # Of course it would be nicer to use m4_case here, instead of zillions
52 # of little macros, but it then takes twice longer to run `autoconf'!
69 # Overall initialization, value of $at_groups_all.
71 # Setup defaults required for option processing.
73 # Option processing. After AT_INIT, user options can be entered here as
74 # cases of a case statement.
76 # Finish up the option processing.
79 # Start printing the help message.
81 # Modes help text. Additional modes can be appended as self-contained
82 # cat'd here-docs as generated by AS_HELP_STRING.
84 # Tuning help text. Additional tuning options can be appended as
85 # self-contained cat'd here-docs as generated by AS_HELP_STRING.
87 # User help can be appended to this as self-contained cat'd here-docs.
89 # Finish up the help texts.
92 # Head of the handling of --version.
94 # Copyright notices for --version.
96 # Tail of the handling of --version.
99 # Output shell initialization for the associative array of banner text.
101 # Like DEFAULTS but run after argument processing for purposes of
102 # optimization. Do anything else that needs to be done to prepare for
103 # tests. Sets up verbose and log file descriptors. Sets and logs PATH.
104 # Declares functions shared among the tests.
106 # The core of the test suite.
109 # The collector for code for each test, the ``normal'' diversion, but
110 # undiverted into other locations before final output.
113 # Contents of each test group. The tests deliberately occur after the
114 # end of the shell script, so that the shell need not spend time parsing
115 # commands it will not execute.
117 m4_define([_m4_divert(DEFAULTS)], 100)
118 m4_define([_m4_divert(PARSE_ARGS_BEGIN)], 200)
119 m4_define([_m4_divert(PARSE_ARGS)], 201)
120 m4_define([_m4_divert(PARSE_ARGS_END)], 202)
121 m4_define([_m4_divert(HELP)], 300)
122 m4_define([_m4_divert(HELP_MODES)], 301)
123 m4_define([_m4_divert(HELP_TUNING)], 302)
124 m4_define([_m4_divert(HELP_OTHER)], 303)
125 m4_define([_m4_divert(HELP_END)], 304)
126 m4_define([_m4_divert(VERSION)], 350)
127 m4_define([_m4_divert(VERSION_NOTICES)], 351)
128 m4_define([_m4_divert(VERSION_END)], 352)
129 m4_define([_m4_divert(BANNERS)], 400)
130 m4_define([_m4_divert(PREPARE_TESTS)], 401)
131 m4_define([_m4_divert(TESTS)], 402)
132 m4_define([_m4_divert(TEST_SCRIPT)], 450)
133 m4_define([_m4_divert(TEST_GROUPS)], 500)
138 # Return the current file sans directory, a colon, and the current
139 # line. Be sure to return a _quoted_ file name, so if, for instance,
140 # the user is lunatic enough to have a file named `dnl' (and I, for
141 # one, love to be brainless and stubborn sometimes), then we return a
144 # Gee, we can't use simply
146 # m4_bpatsubst(__file__, [^.*/\(.*\)], [[\1]])
148 # since then, since `dnl' doesn't match the pattern, it is returned
149 # with once quotation level less, so you lose! And since GNU M4
150 # is one of the biggest junk in the whole universe wrt regexp, don't
151 # even think about using `?' or `\?'. Bah, `*' will do.
152 # Pleeeeeeeease, Gary, provide us with dirname and ERE!
154 # M4 recompiles the regular expression for every m4_bpatsubst, but __file__
155 # rarely changes. Be fast - only compute the dirname when necessary; for
156 # autoconf alone, this shaves off several seconds in building testsuite.
157 m4_define([_AT_LINE_file])
158 m4_define([_AT_LINE_base])
160 [m4_if(m4_defn([_AT_LINE_file]), __file__, [],
161 [m4_do([m4_define([_AT_LINE_file], __file__)],
162 [m4_define([_AT_LINE_base],
163 m4_bpatsubst(__file__, [^.*/\([^/]*\)$],
165 m4_defn([_AT_LINE_base]):__line__])
168 # _AT_NORMALIZE_TEST_GROUP_NUMBER(SHELL-VAR)
169 # ------------------------------------------
170 # Normalize SHELL-VAR so that its value has the same number of digits as
171 # all the other test group numbers.
172 m4_define([_AT_NORMALIZE_TEST_GROUP_NUMBER],
176 '"$at_format"'*) break;;
183 # AT_INIT([TESTSUITE-NAME])
184 # -------------------------
187 [m4_pattern_forbid([^_?AT_])
188 m4_define([AT_TESTSUITE_NAME],
189 m4_defn([AT_PACKAGE_STRING])[ test suite]m4_ifval([$1], [: $1]))
190 m4_define([AT_ordinal], 0)
191 m4_define([AT_banner_ordinal], 0)
192 m4_define([AT_groups_all], [])
193 m4_define([AT_help_all], [])
195 m4_divert_push([DEFAULTS])dnl
197 [Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
199 This test suite is free software; the Free Software Foundation gives
200 unlimited permission to copy, distribute and modify it.])
203 SHELL=${CONFIG_SHELL-/bin/sh}
208 m4_divert_push([BANNERS])dnl
210 # Should we print banners? at_groups is space-separated for entire test,
211 # newline-separated if only a subset of the testsuite is run.
213 *' '*' '* | *"$as_nl"*"$as_nl"* )
214 at_print_banners=: ;;
215 * ) at_print_banners=false ;;
217 # Text for banner N, set to empty once printed.
218 m4_divert_pop([BANNERS])dnl back to DEFAULTS
219 m4_divert_push([PREPARE_TESTS])dnl
221 ## --------------- ##
222 ## Shell functions ##
223 ## --------------- ##
225 # at_func_banner NUMBER
226 # ---------------------
227 # Output banner NUMBER, provided the testsuite is running multiple groups
228 # and this particular banner has not yet been printed.
231 $at_print_banners || return 0
232 eval at_banner_text=\$at_banner_text_$[1]
233 test "x$at_banner_text" = x && return 0
234 eval at_banner_text_$[1]=
235 AS_ECHO(["$as_nl$at_banner_text$as_nl"])
238 # at_func_check_newline COMMAND
239 # -----------------------------
240 # Test if COMMAND includes a newline and, if so, print a message and return
242 at_func_check_newline ()
246 '*) echo 'Not enabling shell tracing (command contains an embedded newline)'
252 # at_func_filter_trace EXIT-CODE
253 # ------------------------------
254 # Split the contents of file "$at_stder1" into the "set -x" trace (on stderr)
255 # and the other lines (on file "$at_stderr"). Return the exit code EXIT-CODE.
256 at_func_filter_trace ()
258 grep '^ *+' "$at_stder1" >&2
259 grep -v '^ *+' "$at_stder1" >"$at_stderr"
263 # at_func_log_failure FILE-LIST
264 # -----------------------------
265 # Copy the files in the list on stdout with a "> " prefix, and exit the shell
266 # with a failure exit code.
267 at_func_log_failure ()
270 do AS_ECHO(["$file:"]); sed 's/^/> /' "$file"; done
271 echo 1 > "$at_status_file"
275 # at_func_check_skip EXIT-CODE
276 # ----------------------------
277 # Check whether EXIT-CODE is the special exit code 77, and if so exit the shell
278 # with that same exit code.
279 at_func_check_skip ()
282 77) echo 77 > "$at_status_file"; exit 77;;
286 # at_func_check_status EXPECTED EXIT-CODE LINE
287 # --------------------------------------------
288 # Check whether EXIT-CODE is the expected exit code, and if so do nothing.
289 # Otherwise, if it is 77 exit the shell with that same exit code; if it is
290 # anything else print an error message and fail the test.
291 at_func_check_status ()
293 dnl This order ensures that we don't `skip' if we are precisely checking
297 77) echo 77 > "$at_status_file"; exit 77;;
298 *) AS_ECHO(["$[3]: exit code was $[2], expected $[1]"])
303 # at_func_diff_devnull FILE
304 # -------------------------
305 # Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless
307 at_func_diff_devnull ()
309 test -s "$[1]" || return 0
310 $at_diff "$at_devnull" "$[1]"
313 # at_func_test NUMBER
314 # -------------------
315 # Parse out test NUMBER from the tail of this file.
318 sed -n '/^@%:@AT_START_'$[1]'$/,/^@%:@AT_STOP_'$[1]'$/p' "$at_myself" \
322 # at_func_create_debugging_script
323 # -------------------------------
324 # Create the debugging script $at_group_dir/run which will reproduce the
325 # current test group.
326 at_func_create_debugging_script ()
330 echo 'test "${ZSH_VERSION+set}" = set dnl
331 && alias -g '\''${1+"$[@]"}'\''='\''"$[@]"'\'''
332 AS_ECHO(["cd '$at_dir'"])
333 AS_ECHO(["exec \${CONFIG_SHELL-$SHELL} $[0] -v -d ]dnl
334 [$at_debug_args $at_group \${1+\"\$[@]\"}"])
337 chmod +x $at_group_dir/run
340 ## ---------------------- ##
341 ## End of shell functions ##
342 ## ---------------------- ##
343 m4_divert_pop([PREPARE_TESTS])dnl back to DEFAULTS
345 # Load the config file.
346 for at_file in atconfig atlocal
348 test -r $at_file || continue
349 . ./$at_file || AS_ERROR([invalid content: $at_file])
352 # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
353 : ${at_top_build_prefix=$at_top_builddir}
355 # atconfig delivers names relative to the directory the test suite is
356 # in, but the groups themselves are run in testsuite-dir/group-dir.
357 if test -n "$at_top_srcdir"; then
359 for at_dir in srcdir top_srcdir top_build_prefix
361 at_val=AS_VAR_GET([at_$at_dir])
363 [[\\/$]]* | ?:[[\\/]]* ) at_prefix= ;;
364 *) at_prefix=../../ ;;
366 AS_VAR_SET([$at_dir], [$at_prefix$at_val])
370 # Not all shells have the 'times' builtin; the subshell is needed to make
371 # sure we discard the 'times: not found' message from the shell.
373 (times) >/dev/null 2>&1 && at_times_p=:
375 # CLI Arguments to pass to the debugging scripts.
379 # Shall we be verbose? ':' means no, empty means yes.
383 # Shall we keep the debug scripts? Must be `:' when the suite is
384 # run by a debug script, so that the script doesn't remove itself.
386 # Display help message?
388 # Display the version message?
395 # The directory we are in.
397 # An absolute reference to this testsuite script.
398 dnl m4-double quote, to preserve []
400 [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;;
401 * ) at_myself=$at_dir/$as_myself ;;
403 # The directory the whole suite works in.
404 # Should be absolute to let the user `cd' at will.
405 at_suite_dir=$at_dir/$as_me.dir
406 # The file containing the suite.
407 at_suite_log=$at_dir/$as_me.log
408 # The file containing the location of the last AT_CHECK.
409 at_check_line_file=$at_suite_dir/at-check-line
410 # The file containing the exit status of the last command.
411 at_status_file=$at_suite_dir/at-status
412 # The files containing the output of the tested commands.
413 at_stdout=$at_suite_dir/at-stdout
414 at_stder1=$at_suite_dir/at-stder1
415 at_stderr=$at_suite_dir/at-stderr
416 # The file containing the function to run a test group.
417 at_test_source=$at_suite_dir/at-test-source
418 # The file containing dates.
419 at_times_file=$at_suite_dir/at-times
420 m4_divert_pop([DEFAULTS])dnl
421 m4_wrap([m4_divert_text([DEFAULTS],
423 # List of the tested programs.
424 at_tested='m4_ifdef([AT_tested],
425 [m4_translit(m4_dquote(m4_defn([AT_tested])), [ ], m4_newline)])'
426 # List of the all the test groups.
427 at_groups_all='AT_groups_all'
428 # As many question marks as there are digits in the last test group number.
429 # Used to normalize the test group numbers so that `ls' lists them in
431 at_format='m4_bpatsubst(m4_defn([AT_ordinal]), [.], [?])'
432 # Description of all the test groups.
433 at_help_all="AS_ESCAPE(m4_dquote(m4_defn([AT_help_all])))"])])dnl
434 m4_divert_push([PARSE_ARGS])dnl
439 # If the previous option needs an argument, assign it.
440 if test -n "$at_prev"; then
441 at_option=$at_prev=$at_option
446 *=*) at_optarg=`expr "x$at_option" : 'x[[^=]]*=\(.*\)'` ;;
450 # Accept the important Cygnus configure options, so we can diagnose typos.
466 test -d "$at_suite_dir" &&
467 find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
468 rm -f -r "$at_suite_dir" "$at_suite_log"
482 at_verbose=; at_quiet=:
486 at_traceon='set -x'; at_traceoff='set +x'
489 [[0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]])
490 at_groups="$at_groups$at_option "
494 [[0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-])
495 at_range_start=`echo $at_option |tr -d X-`
496 at_range=`AS_ECHO([" $at_groups_all "]) | \
497 sed -e 's/^.* \('$at_range_start' \)/\1/'`
498 at_groups="$at_groups$at_range "
501 [-[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]])
502 at_range_end=`echo $at_option |tr -d X-`
503 at_range=`AS_ECHO([" $at_groups_all "]) | \
504 sed -e 's/\( '$at_range_end'\) .*$/\1/'`
505 at_groups="$at_groups$at_range "
508 [[0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9]] | \
509 [[0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9]] | \
510 [[0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
511 [[0-9][0-9][0-9]-[0-9][0-9][0-9]] | \
512 [[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
513 [[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] )
514 at_range_start=`expr $at_option : '\(.*\)-'`
515 at_range_end=`expr $at_option : '.*-\(.*\)'`
516 if test $at_range_start -gt $at_range_end; then
518 at_range_end=$at_range_start
519 at_range_start=$at_tmp
521 at_range=`AS_ECHO([" $at_groups_all "]) | \
522 sed -e 's/^.*\( '$at_range_start' \)/\1/' \
523 -e 's/\( '$at_range_end'\) .*$/\1/'`
524 at_groups="$at_groups$at_range "
532 at_groups_selected=$at_help_all
544 at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
547 # It is on purpose that we match the test group titles too.
548 at_groups_selected=`AS_ECHO(["$at_groups_selected"]) |
549 grep -i $at_invert ["^[1-9][^;]*;.*[; ]$at_keyword[ ;]"]`
551 # Smash the newlines.
552 at_groups_selected=`AS_ECHO(["$at_groups_selected"]) | sed 's/;.*//' |
555 at_groups="$at_groups$at_groups_selected "
557 m4_divert_pop([PARSE_ARGS])dnl
558 dnl Process *=* last to allow for user specified --option=* type arguments.
559 m4_divert_push([PARSE_ARGS_END])dnl
562 at_envvar=`expr "x$at_option" : 'x\([[^=]]*\)='`
563 # Reject names that are not valid shell variable names.
564 expr "x$at_envvar" : "[.*[^_$as_cr_alnum]]" >/dev/null &&
565 AS_ERROR([invalid variable name: $at_envvar])
566 at_value=`AS_ECHO(["$at_optarg"]) | sed "s/'/'\\\\\\\\''/g"`
567 eval "$at_envvar='$at_value'"
569 # Propagate to debug scripts.
570 at_debug_args="$at_debug_args $at_envvar='$at_value'"
573 *) AS_ECHO(["$as_me: invalid option: $at_option"]) >&2
574 AS_ECHO(["Try \`$[0] --help' for more information."]) >&2
580 # Selected test groups.
581 if test -z "$at_groups"; then
582 at_groups=$at_groups_all
584 # Sort the tests, removing duplicates.
585 at_groups=`AS_ECHO(["$at_groups"]) | tr ' ' "$as_nl" | sort -nu`
587 m4_divert_pop([PARSE_ARGS_END])dnl
588 m4_divert_push([HELP])dnl
593 Usage: $[0] [[OPTION]... [VARIABLE=VALUE]... [TESTS]]
595 Run all the tests, or the selected TESTS, given by numeric ranges, and
596 save a detailed log file. Upon failure, create debugging scripts.
598 You should not change environment variables unless explicitly passed
599 as command line arguments. Set \`AUTOTEST_PATH' to select the executables
600 to exercise. Each relative directory is expanded as build and source
601 directories relatively to the top level of this distribution. E.g.,
603 $ $[0] AUTOTEST_PATH=bin
605 possibly amounts into
607 PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
609 m4_divert_pop([HELP])dnl
610 m4_divert_push([HELP_MODES])dnl
614 -h, --help print the help message, then exit
615 -V, --version print version number, then exit
616 -c, --clean remove all the files this test suite might create and exit
617 -l, --list describes all the tests, or the selected TESTS
619 m4_divert_pop([HELP_MODES])dnl
620 m4_divert_push([HELP_TUNING])dnl
623 dnl extra quoting prevents emacs whitespace mode from putting tabs in output
625 -k, --keywords=KEYWORDS
626 [ select the tests matching all the comma-separated KEYWORDS]
627 [ multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD]
628 -e, --errexit abort as soon as a test fails; implies --debug
629 -v, --verbose force more detailed output
630 [ default for debugging scripts]
631 -d, --debug inhibit clean up and top-level logging
632 [ default for debugging scripts]
633 -x, --trace enable tests shell tracing
635 m4_divert_pop([HELP_TUNING])dnl
636 m4_divert_push([HELP_END])dnl
639 Report bugs to <AT_PACKAGE_BUGREPORT>.
647 AT_TESTSUITE_NAME test groups:
649 NUM: FILE-NAME:LINE TEST-GROUP-NAME
653 # Passing at_groups is tricky. We cannot use it to form a literal string
654 # or regexp because of the limitation of AIX awk. And Solaris' awk
655 # doesn't grok more than 99 fields in a record, so we have to use `split'.
656 # at_groups needs to be space-separated for this script to work.
659 at_groups=`AS_ECHO(["$at_groups"]) | tr "$as_nl" ' '` ;;
661 AS_ECHO(["$at_groups$as_nl$at_help_all"]) |
662 awk 'BEGIN { FS = ";" }
664 for (n = split($ 0, a, " "); n; n--) selected[[a[n]]] = 1
668 if (selected[[$ 1]]) {
669 printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
670 if ($ 4) printf " %s\n", $ 4
675 m4_divert_pop([HELP_END])dnl
676 m4_divert_push([VERSION])dnl
677 if $at_version_p; then
678 AS_ECHO(["$as_me (AT_PACKAGE_STRING)"])
680 m4_divert_pop([VERSION])dnl
681 m4_divert_push([VERSION_END])dnl
685 m4_divert_pop([VERSION_END])dnl
686 m4_divert_push([PREPARE_TESTS])dnl
688 # Don't take risks: use only absolute directories in PATH.
690 # For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
692 # For embedded test suites, AUTOTEST_PATH is relative to the top level
693 # of the package. Then expand it into build/src parts, since users
694 # may create executables in both places.
695 AUTOTEST_PATH=`AS_ECHO(["$AUTOTEST_PATH"]) | sed "s|:|$PATH_SEPARATOR|g"`
697 _AS_PATH_WALK([$AUTOTEST_PATH $PATH],
698 [test -n "$at_path" && at_path=$at_path$PATH_SEPARATOR
700 [[\\/]]* | ?:[[\\/]]* )
701 at_path=$at_path$as_dir
704 if test -z "$at_top_build_prefix"; then
705 # Stand-alone test suite.
706 at_path=$at_path$as_dir
708 # Embedded test suite.
709 at_path=$at_path$at_top_build_prefix$as_dir$PATH_SEPARATOR
710 at_path=$at_path$at_top_srcdir/$as_dir
715 # Now build and simplify PATH.
717 # There might be directories that don't exist, but don't redirect
718 # builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
720 _AS_PATH_WALK([$at_path],
721 [as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
722 test -d "$as_dir" || continue
723 case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in
724 *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;;
725 $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;;
726 *) at_new_path=$at_new_path$PATH_SEPARATOR$as_dir ;;
731 # Setting up the FDs.
732 # 5 is the log file. Not to be overwritten if `-d'.
733 m4_define([AS_MESSAGE_LOG_FD], [5])
735 at_suite_log=/dev/null
739 exec AS_MESSAGE_LOG_FD>>"$at_suite_log"
742 AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
744 AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
747 AS_ECHO(["$as_me: command line was:"])
748 AS_ECHO([" \$ $[0] $at_cli_args"])
751 # Try to find a few ChangeLogs in case it might help determining the
752 # exact version. Use the relative dir: if the top dir is a symlink,
753 # find will not follow it (and options to follow the links are not
754 # portable), which would result in no output here. Prune directories
755 # matching the package tarname, since they tend to be leftovers from
756 # `make dist' or `make distcheck' and contain redundant or stale logs.
757 if test -n "$at_top_srcdir"; then
758 AS_BOX([ChangeLogs.])
760 for at_file in `find "$at_top_srcdir" m4_ifdef([AT_PACKAGE_TARNAME],
761 [-name "AT_PACKAGE_TARNAME-*" -prune -o ])-name ChangeLog -print`
763 AS_ECHO(["$as_me: $at_file:"])
764 sed 's/^/| /;10q' $at_file
772 # Contents of the config files.
773 for at_file in atconfig atlocal
775 test -r $at_file || continue
776 AS_ECHO(["$as_me: $at_file:"])
777 sed 's/^/| /' $at_file
781 AS_BOX([Tested programs.])
783 } >&AS_MESSAGE_LOG_FD
785 # Report what programs are being tested.
786 for at_program in : $at_tested
788 test "$at_program" = : && continue
789 _AS_PATH_WALK([$PATH], [test -f "$as_dir/$at_program" && break])
790 if test -f "$as_dir/$at_program"; then
792 AS_ECHO(["$at_srcdir/AT_LINE: $as_dir/$at_program --version"])
793 "$as_dir/$at_program" --version </dev/null
795 } >&AS_MESSAGE_LOG_FD 2>&1
797 AS_ERROR([cannot find $at_program])
802 AS_BOX([Running the tests.])
803 } >&AS_MESSAGE_LOG_FD
806 at_start_time=`date +%s 2>/dev/null`
807 AS_ECHO(["$as_me: starting at: $at_start_date"]) >&AS_MESSAGE_LOG_FD
814 m4_divert_pop([PREPARE_TESTS])dnl
815 m4_divert_push([TESTS])dnl
817 # Create the master directory if it doesn't already exist.
818 test -d "$at_suite_dir" ||
819 mkdir "$at_suite_dir" ||
820 AS_ERROR([cannot create '$at_suite_dir'])
822 # Can we diff with `/dev/null'? DU 5.0 refuses.
823 if diff /dev/null /dev/null >/dev/null 2>&1; then
826 at_devnull=$at_suite_dir/devnull
830 # Use `diff -u' when possible.
831 if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
839 m4_text_box([Driver loop.])
840 for at_group in $at_groups
842 # Be sure to come back to the top test directory.
845 # Clearly separate the test groups when verbose.
846 test $at_group_count != 0 && $at_verbose echo
848 at_group_normalized=$at_group
849 _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
851 # Create a fresh directory for the next test group, and enter.
852 at_group_dir=$at_suite_dir/$at_group_normalized
853 at_group_log=$at_group_dir/$as_me.log
854 if test -d "$at_group_dir"; then
855 find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
856 rm -fr "$at_group_dir" ||
857 AS_WARN([test directory could not be cleaned.])
859 # Be tolerant if the above `rm' was not able to remove the directory.
860 AS_MKDIR_P([$at_group_dir])
863 echo 0 > "$at_status_file"
865 # In verbose mode, append to the log file *and* show on
866 # the standard output; in quiet mode only write to the log
867 if test -z "$at_verbose"; then
868 at_tee_pipe='tee -a "$at_group_log"'
870 at_tee_pipe='cat >> "$at_group_log"'
873 if at_func_test $at_group && . "$at_test_source"; then :; else
874 AS_ECHO(["$as_me: unable to parse test group: $at_group"]) >&2
878 # Be sure to come back to the suite directory, in particular
879 # since below we might `rm' the group directory we are in currently.
882 if test ! -f "$at_check_line_file"; then
883 sed "s/^ */$as_me: warning: /" <<_ATEOF
884 A failure happened in a test group before any test could be
885 run. This means that test suite is improperly designed. Please
886 report this failure to <AT_PACKAGE_BUGREPORT>.
888 AS_ECHO(["$at_setup_line"]) >"$at_check_line_file"
890 at_group_count=`expr 1 + $at_group_count`
891 $at_verbose AS_ECHO_N(["$at_group. $at_setup_line: "])
892 AS_ECHO_N(["$at_group. $at_setup_line: "]) >> "$at_group_log"
893 case $at_xfail:$at_status in
895 at_msg="UNEXPECTED PASS"
896 at_xpass_list="$at_xpass_list $at_group"
897 at_errexit=$at_errexit_p
901 at_pass_list="$at_pass_list $at_group"
905 at_msg='skipped ('`cat "$at_check_line_file"`')'
906 at_skip_list="$at_skip_list $at_group"
910 at_msg='expected failure ('`cat "$at_check_line_file"`')'
911 at_xfail_list="$at_xfail_list $at_group"
915 at_msg='FAILED ('`cat "$at_check_line_file"`')'
916 at_fail_list="$at_fail_list $at_group"
917 at_errexit=$at_errexit_p
920 # Make sure there is a separator even with long titles.
921 AS_ECHO([" $at_msg"])
922 at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
925 # $at_times_file is only available if the group succeeded.
926 # We're not including the group log, so the success message
927 # is written in the global log separately. But we also
928 # write to the group log in case they're using -d.
929 if test -f "$at_times_file"; then
930 at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')'
931 rm -f "$at_times_file"
933 AS_ECHO(["$at_log_msg"]) >> "$at_group_log"
934 AS_ECHO(["$at_log_msg"]) >&AS_MESSAGE_LOG_FD
936 # Cleanup the group directory, unless the user wants the files.
937 if $at_debug_p ; then
938 at_func_create_debugging_script
939 elif test -d "$at_group_dir"; then
940 find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
941 rm -fr "$at_group_dir"
945 # Upon failure, include the log into the testsuite's global
946 # log. The failure message is written in the group log. It
947 # is later included in the global log.
948 AS_ECHO(["$at_log_msg"]) >> "$at_group_log"
950 # Upon failure, keep the group directory for autopsy, and
951 # create the debugging script.
952 at_func_create_debugging_script
958 # Back to the top directory.
961 # Compute the duration of the suite.
963 at_stop_time=`date +%s 2>/dev/null`
964 AS_ECHO(["$as_me: ending at: $at_stop_date"]) >&AS_MESSAGE_LOG_FD
965 case $at_start_time,$at_stop_time in
967 at_duration_s=`expr $at_stop_time - $at_start_time`
968 at_duration_m=`expr $at_duration_s / 60`
969 at_duration_h=`expr $at_duration_m / 60`
970 at_duration_s=`expr $at_duration_s % 60`
971 at_duration_m=`expr $at_duration_m % 60`
972 at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
973 AS_ECHO(["$as_me: test suite duration: $at_duration"]) >&AS_MESSAGE_LOG_FD
977 # Wrap up the test suite with summary statistics.
978 set X $at_skip_list; shift; at_skip_count=$[@%:@]
979 set X $at_fail_list; shift; at_fail_count=$[@%:@]
980 set X $at_xpass_list; shift; at_xpass_count=$[@%:@]
981 set X $at_xfail_list; shift; at_xfail_count=$[@%:@]
983 at_run_count=`expr $at_group_count - $at_skip_count`
984 at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
985 at_total_fail_count=`expr $at_xfail_count + $at_fail_count`
988 AS_BOX([Test results.])
992 AS_BOX([Test results.])
994 } >&AS_MESSAGE_LOG_FD
997 dnl FIXME: this code is as far from i18n-cleanness as man
1000 if test $at_run_count = 1; then
1004 at_result="$at_run_count tests"
1007 if $at_errexit_p && test $at_unexpected_count != 0; then
1008 if test $at_xpass_count = 1; then
1009 at_result="$at_result $at_were run, one passed"
1011 at_result="$at_result $at_were run, one failed"
1013 at_result="$at_result unexpectedly and inhibited subsequent tests."
1015 # Don't you just love exponential explosion of the number of cases?
1016 case $at_xpass_count:$at_fail_count:$at_xfail_count in
1018 0:0:0) at_result="$at_result $at_were successful." ;;
1019 0:0:*) at_result="$at_result behaved as expected." ;;
1021 # Some unexpected failures
1022 0:*:0) at_result="$at_result $at_were run,
1023 $at_fail_count failed unexpectedly." ;;
1025 # Some failures, both expected and unexpected
1026 0:*:1) at_result="$at_result $at_were run,
1027 $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
1028 0:*:*) at_result="$at_result $at_were run,
1029 $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
1031 # No unexpected failures, but some xpasses
1032 *:0:*) at_result="$at_result $at_were run,
1033 $at_xpass_count passed unexpectedly." ;;
1035 # No expected failures, but failures and xpasses
1036 *:1:0) at_result="$at_result $at_were run,
1037 $at_unexpected_count did not behave as expected dnl
1038 ($at_fail_count unexpected failure)." ;;
1039 *:*:0) at_result="$at_result $at_were run,
1040 $at_unexpected_count did not behave as expected dnl
1041 ($at_fail_count unexpected failures)." ;;
1044 *:*:1) at_result="$at_result $at_were run,
1045 $at_xpass_count passed unexpectedly,
1046 $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
1047 *:*:*) at_result="$at_result $at_were run,
1048 $at_xpass_count passed unexpectedly,
1049 $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
1052 if test $at_skip_count = 0 && test $at_run_count -gt 1; then
1053 at_result="All $at_result"
1057 # Now put skips in the mix.
1058 case $at_skip_count in
1060 1) at_result="$at_result
1061 1 test was skipped." ;;
1062 *) at_result="$at_result
1063 $at_skip_count tests were skipped." ;;
1066 if test $at_unexpected_count = 0; then
1068 echo "$at_result" >&AS_MESSAGE_LOG_FD
1070 echo "ERROR: $at_result" >&2
1071 echo "ERROR: $at_result" >&AS_MESSAGE_LOG_FD
1074 AS_BOX([Summary of the failures.])
1076 # Summary of failed and skipped tests.
1077 if test $at_fail_count != 0; then
1078 echo "Failed tests:"
1079 $SHELL "$[0]" $at_fail_list --list
1082 if test $at_skip_count != 0; then
1083 echo "Skipped tests:"
1084 $SHELL "$[0]" $at_skip_list --list
1087 if test $at_xpass_count != 0; then
1088 echo "Unexpected passes:"
1089 $SHELL "$[0]" $at_xpass_list --list
1092 if test $at_fail_count != 0; then
1093 AS_BOX([Detailed failed tests.])
1095 for at_group in $at_fail_list
1097 at_group_normalized=$at_group
1098 _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
1099 cat "$at_suite_dir/$at_group_normalized/$as_me.log"
1104 if test -n "$at_top_srcdir"; then
1105 AS_BOX([${at_top_build_prefix}config.log])
1106 sed 's/^/| /' ${at_top_build_prefix}config.log
1109 } >&AS_MESSAGE_LOG_FD
1111 AS_BOX([$as_me.log was created.])
1114 AS_ECHO(["Please send \`${at_testdir+${at_testdir}/}$as_me.log' ]dnl
1115 [and all information you think might help:
1117 To: <AT_PACKAGE_BUGREPORT>
1118 Subject: @<:@AT_PACKAGE_STRING@:>@ $as_me:dnl
1119 $at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}dnl
1120 $at_xpass_list${at_xpass_list:+ passed unexpectedly}
1122 if test $at_debug_p = false; then
1124 echo 'You may investigate any problem if you feel able to do so, in which'
1125 echo 'case the test suite provides a good starting point. Its output may'
1126 AS_ECHO(["be found below \`${at_testdir+${at_testdir}/}$as_me.dir'."])
1134 m4_text_box([Actual tests.])
1135 m4_divert_pop([TESTS])dnl
1136 dnl End of AT_INIT: divert to KILL, only test groups are to be
1137 dnl output, the rest is ignored. Current diversion is BODY, inherited
1139 m4_divert_pop([BODY])
1140 m4_divert_push([KILL])
1144 # _AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ARGS],[ACTION-IF-GIVEN],
1145 # [ACTION-IF-NOT-GIVEN])
1146 # ---------------------------------------------------------------------------
1147 # Internal implementation of AT_ARG_OPTION & AT_ARG_OPTION_ARG
1148 m4_defun([_AT_ARG_OPTION],
1149 [m4_divert_once([HELP_OTHER],
1154 ])dnl m4_divert_once HELP_OTHER
1155 m4_divert_text([HELP_OTHER],
1159 dnl Turn our options into our desired strings
1160 m4_ifdef([AT_first_option],[m4_undefine([AT_first_option])])dnl
1161 m4_ifdef([AT_case],[m4_undefine([AT_case])])dnl
1162 m4_ifdef([AT_case_no],[m4_undefine([AT_case_no])])dnl
1163 m4_ifdef([AT_case_arg],[m4_undefine([AT_case_arg])])dnl
1164 m4_foreach([AT_option], m4_split(m4_normalize([$1]),[[ \|]+]),
1165 [m4_define_default([AT_first_option],AT_option)dnl
1166 m4_append([AT_case],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option, [ | ])dnl
1167 m4_append([AT_case_no],[--no]AT_option, [ | ])dnl
1168 m4_append([AT_case_arg],
1169 m4_if(m4_len(AT_option),1,[],[-])[-]AT_option[=*], [ | ])dnl
1170 ])dnl m4_foreach AT_option
1171 dnl keep track so we or the user may process ACTION-IF-NOT-GIVEN
1172 m4_divert_once([PARSE_ARGS_BEGIN],
1175 ## Set up package specific options.
1178 m4_divert_text([PARSE_ARGS_BEGIN],
1179 [dnl Provide a default value for options without arguments.
1180 m4_ifvaln([$3],,[at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false])dnl
1181 at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=false
1182 ])dnl m4_divert_text DEFAULTS
1183 m4_ifval([$3],[m4_divert_once([PARSE_ARGS_END],
1186 ## Verify our last option didn't require an argument
1188 AS_IF([test -n "$at_prev"],[AS_ERROR([`$at_prev' requires an argument.])])])])
1189 m4_divert_text([PARSE_ARGS],
1190 [dnl Parse the options and args when necessary.
1193 at_prev=--m4_bpatsubst([AT_first_option], -, _)
1196 at_arg_[]m4_bpatsubst([AT_first_option], -, _)=$at_optarg
1197 at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
1202 at_arg_[]m4_bpatsubst([AT_first_option], -, _)=:
1203 at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
1204 m4_ifval([$4],[$4])dnl
1208 at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false
1209 at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
1210 m4_ifval([$4],[$4])dnl
1211 ;;])dnl m4_ifvaln $3
1212 ])dnl m4_divert_text PARSE_ARGS
1214 [m4_divert_once([PARSE_ARGS_END],
1217 ## Process package specific options when _not_ supplied.
1218 ##])dnl m4_divert_once PARSE_ARGS_END
1219 m4_divert_text([PARSE_ARGS_END],
1221 AS_IF([$at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)],,[$5])dnl
1222 ])dnl m4_divert_text PARSE_ARGS_END
1224 ])dnl _AT_ARG_OPTION
1227 # AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
1228 # ------------------------------------------------------------------------
1229 # Accept a set of OPTIONS with arguments. Add HELP-TEXT to the HELP_OTHER
1232 # Preceding dashes should not be passed into OPTIONS. Users will be required
1233 # to pass `--' before long options and `-' before single character options.
1235 # $at_arg_OPTION will be set to `:' if this option is received, `false' if
1236 # if --noOPTION is received, and `false' by default.
1238 # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
1239 # $at_optarg set to `:' or `false' as appropriate. $at_optarg is actually
1240 # just a copy of $at_arg_OPTION.
1242 # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
1243 # if no option from OPTIONS was found.
1244 m4_defun([AT_ARG_OPTION],[_AT_ARG_OPTION([$1],[$2],,[$3],[$4])])
1247 # AT_ARG_OPTION_ARG(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
1248 # ---------------------------------------------------------------------------
1249 # Accept a set of OPTIONS with arguments, seperated by commas. Add HELP-TEXT
1250 # to the HELP_OTHER diversion.
1252 # Preceding dashes should not be passed into OPTIONS. Users will be required
1253 # to pass `--' before long options and `-' before single character options.
1255 # By default, any argument to these options will be assigned to the shell
1256 # variable $at_arg_OPTION, where OPTION is the first option in OPTIONS with
1257 # any `-' characters replaced with `_'.
1259 # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
1260 # $at_optarg set. $at_optarg is actually just a copy of $at_arg_OPTION.
1262 # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
1263 # if no option from OPTIONS was found.
1264 m4_defun([AT_ARG_OPTION_ARG],[_AT_ARG_OPTION([$1],[$2],1,[$3],[$4])])
1267 # AT_TESTED(PROGRAMS)
1268 # -------------------
1269 # Specify the list of programs exercised by the test suite. Their
1270 # versions are logged, and in the case of embedded test suite, they
1271 # must correspond to the version of the package. PATH should be
1272 # already preset so the proper executable will be selected.
1273 m4_define([AT_TESTED],
1274 [m4_append_uniq_w([AT_tested], [$1])])
1277 # AT_COPYRIGHT(TEXT)
1278 # ------------------
1279 # Emit TEXT, a copyright notice, in the top of the test suite and in
1280 # --version output. Macros in TEXT are evaluated once.
1281 m4_define([AT_COPYRIGHT],
1282 [AS_COPYRIGHT([$1])[]dnl
1283 m4_divert_text([VERSION_NOTICES],
1285 $1])])# AT_COPYRIGHT
1288 # AT_SETUP(DESCRIPTION)
1289 # ---------------------
1290 # Start a group of related tests, all to be executed in the same subshell.
1291 # The group is testing what DESCRIPTION says.
1292 m4_define([AT_SETUP],
1293 [m4_ifdef([AT_keywords], [m4_undefine([AT_keywords])])
1294 m4_define([AT_capture_files], [])
1295 m4_define([AT_line], AT_LINE)
1296 m4_define([AT_xfail], [at_xfail=no])
1297 m4_define([AT_description], m4_expand([$1]))
1298 m4_define([AT_ordinal], m4_incr(AT_ordinal))
1299 m4_append([AT_groups_all], [ ]m4_defn([AT_ordinal]))
1300 m4_divert_push([TEST_GROUPS])dnl
1301 [#AT_START_]AT_ordinal
1302 @%:@ AT_ordinal. m4_defn([AT_line]): m4_defn([AT_description])
1303 at_setup_line='m4_defn([AT_line])'
1304 m4_if(AT_banner_ordinal, [0], [], [at_func_banner AT_banner_ordinal
1306 at_desc="AS_ESCAPE(m4_dquote(m4_defn([AT_description])))"
1307 $at_quiet AS_ECHO_N([m4_format(["%3d: $at_desc%*s"], AT_ordinal,
1308 m4_max(0, m4_eval(47 - m4_qlen(m4_defn([AT_description])))), [])])
1309 m4_divert_push([TEST_SCRIPT])dnl
1313 # AT_XFAIL_IF(SHELL-EXPRESSION)
1314 # -----------------------------
1315 # Set up the test to be expected to fail if SHELL-EXPRESSION evaluates to
1316 # true (exitcode = 0).
1317 m4_define([AT_XFAIL_IF],
1319 dnl Try to limit the amount of conditionals that we emit.
1323 [:], [m4_define([AT_xfail], [at_xfail=yes])],
1324 [true], [m4_define([AT_xfail], [at_xfail=yes])],
1325 [m4_append([AT_xfail], [
1326 $1 && at_xfail=yes])])])
1329 # AT_KEYWORDS(KEYWORDS)
1330 # ---------------------
1331 # Declare a list of keywords associated to the current test group.
1332 # The list is stored in lower case, since the -k option is case-insensitive.
1333 m4_define([AT_KEYWORDS],
1334 [m4_append_uniq_w([AT_keywords], m4_tolower([[$1]]))])
1337 # AT_CAPTURE_FILE(FILE)
1338 # ---------------------
1339 # If the current test group does not behave as expected, save the contents of
1340 # FILE in the test suite log.
1341 m4_define([AT_CAPTURE_FILE],
1342 [m4_append_uniq([AT_capture_files], ["$1"], [ \
1348 # Complete a group of related tests.
1349 m4_define([AT_CLEANUP],
1350 [m4_append([AT_help_all],
1351 m4_defn([AT_ordinal]);m4_defn([AT_line]);m4_defn([AT_description]);dnl
1352 m4_ifdef([AT_keywords], [m4_defn([AT_keywords])]);
1354 m4_divert_pop([TEST_SCRIPT])dnl Back to TEST_GROUPS
1356 echo "# -*- compilation -*-" >> "$at_group_log"
1358 AS_ECHO(["AT_ordinal. m4_defn([AT_line]): testing $1..."])
1360 m4_undivert([TEST_SCRIPT])dnl Insert the code here
1362 $at_times_p && times >"$at_times_file"
1363 ) AS_MESSAGE_LOG_FD>&1 2>&1 | eval $at_tee_pipe
1364 at_status=`cat "$at_status_file"`
1365 [#AT_STOP_]AT_ordinal
1366 m4_divert_pop([TEST_GROUPS])dnl Back to KILL.
1372 # Start a category of related test groups. If multiple groups are executed,
1373 # output TEXT as a banner without any shell expansion, prior to any test
1374 # from the category. If TEXT is empty, no banner is printed.
1375 m4_define([AT_BANNER],
1376 [m4_define([AT_banner_ordinal], m4_incr(AT_banner_ordinal))
1377 m4_divert_text([BANNERS],
1378 [@%:@ Banner AT_banner_ordinal. AT_LINE
1379 @%:@ Category starts at test group m4_incr(AT_ordinal).
1380 at_banner_text_[]AT_banner_ordinal="AS_ESCAPE([$1])"])dnl
1384 # AT_DATA(FILE, CONTENTS)
1385 # -----------------------
1386 # Initialize an input data FILE with given CONTENTS, which should end with
1388 # This macro is not robust to active symbols in CONTENTS *on purpose*.
1389 # If you don't want CONTENTS to be evaluated, quote it twice.
1390 m4_define([AT_DATA],
1396 # AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
1397 # [RUN-IF-FAIL], [RUN-IF-PASS])
1398 # ------------------------------------------------
1399 # Execute a test by performing given shell COMMANDS. These commands
1400 # should normally exit with STATUS, while producing expected STDOUT and
1401 # STDERR contents. Shell metacharacters in STDOUT and STDERR are
1402 # _not_ processed by the shell, but are treated as string literals.
1404 # STATUS, STDOUT, and STDERR are not checked if equal to `ignore'.
1406 # If STDOUT is `expout', then stdout is compared to the content of the file
1407 # `expout'. Likewise for STDERR and `experr'.
1409 # If STDOUT is `stdout', then the stdout is left in the file `stdout',
1410 # likewise for STDERR and `stderr'. Don't do this:
1412 # AT_CHECK([command >out])
1413 # # Some checks on `out'
1417 # AT_CHECK([command], [], [stdout])
1418 # # Some checks on `stdout'
1420 # You might wonder why you can't just use `ignore', then directly use stdout
1421 # and stderr left by the test suite:
1423 # AT_CHECK([command], [], [ignore])
1424 # AT_CHECK([check stdout])
1426 # If the test suite always captured data in the file `stdout', then the
1427 # second command would be trying to read and write from the same file, with
1428 # undefined behavior. Therefore, the test suite actually captures data in
1429 # an internal file of a different name, and only creates `stdout' when
1430 # explicitly requested.
1432 # Any line of stderr starting with leading blanks and a `+' are filtered
1433 # out, since most shells when tracing include subshell traces in stderr.
1434 # This may cause spurious failures when the test suite is run with `-x'.
1436 m4_define([AT_CHECK],
1437 [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6],1)])
1439 # AT_CHECK_NOESCAPE(COMMANDS, [STATUS = 0], STDOUT, STDERR,
1440 # [RUN-IF-FAIL], [RUN-IF-PASS])
1441 # ---------------------------------------------------------
1442 # Like AT_CHECK, but do not AS_ESCAPE shell metacharacters in the STDOUT
1443 # and STDERR arguments before running the comparison.
1444 m4_define([AT_CHECK_NOESCAPE],
1445 [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6])])
1448 # _AT_DECIDE_TRACEABLE(COMMANDS)
1449 # ------------------------------
1450 # Worker for for _AT_CHECK that expands to shell code. If COMMANDS are safe to
1451 # trace with `set -x', the shell code will evaluate to true. Otherwise,
1452 # the shell code will print a message stating an aspect of COMMANDS that makes
1453 # tracing them unsafe, and evaluate to false.
1455 # Tracing COMMANDS is not safe if they contain a command that spans multiple
1456 # lines. When the test suite user passes `-x' or `--trace', the test suite
1457 # precedes every command with a `set -x'. Since most tests expect a specific
1458 # stderr, if only to confirm that it is empty, the test suite filters ^+ from
1459 # the captured stderr before comparing with the expected stderr. If a command
1460 # spans multiple lines, so will its trace, but a `+' only prefixes the first
1461 # line of that trace:
1472 # In a subset of cases, one could filter such extended shell traces from
1473 # stderr. Since test commands spanning several lines are rare, I chose
1474 # instead to simply not trace COMMANDS that could yield multiple trace lines.
1475 # Distinguishing such COMMANDS became the task at hand.
1477 # These features may cause a shell command to span multiple lines:
1479 # (a) A quoted literal newline.
1483 # M4 is a hostile language for the job of parsing COMMANDS to determine whether
1484 # each literal newline is quoted, so we simply disable tracing for all COMMANDS
1485 # that bear literal newlines.
1487 # (b) A command substitution not subject to word splitting.
1489 # var=$(printf 'foo\nbar')
1491 # echo "`printf 'foo\\nbar`"
1492 # One cannot know in general the number of lines a command substitution will
1493 # yield without executing the substituted command. As such, we disable tracing
1494 # for all COMMANDS containing these constructs.
1496 # (c) A parameter expansion not subject to word splitting.
1501 # Parameter expansions appear in COMMANDS with much greater frequency than do
1502 # newlines and command substitutions, so disabling tracing for all such
1503 # COMMANDS would much more substantially devalue `testsuite -x'. To determine
1504 # which parameter expansions yield multiple lines, we escape all ``', `"',
1505 # and `\' in a copy of COMMANDS and expand that string within double quotes
1506 # at runtime. If the result of that expansion contains multiple lines, the
1507 # test suite disables tracing for the command in question.
1509 # This method leads the test suite to expand some parameters that the shell
1510 # itself will never expand due to single-quotes or backslash escapes. This is
1511 # not a problem for `$foo' expansions, which will simply yield the empty string
1512 # or some unrelated value. A `${...}' expansion could actually form invalid
1513 # shell code, however; consider `${=foo}'. Therefore, we disable tracing for
1514 # all COMMANDS containing `${...}'. This affects few COMMANDS.
1516 # This macro falls in a very hot path; the Autoconf test suite expands it 1640
1517 # times as of this writing. To give a sense of the impact of the heuristics I
1518 # just described, the test suite preemptively disables tracing for 31 of those,
1519 # and 268 contain parameter expansions that require runtime evaluation. The
1520 # balance are always safe to trace.
1522 # _AT_CHECK expands COMMANDS, but the Autoconf language does not provide a way
1523 # to safely expand arbitrary COMMANDS in an argument list, so the below tests
1524 # examine COMMANDS unexpanded.
1525 m4_define([_AT_DECIDE_TRACEABLE],
1528 dnl Examine COMMANDS for a reason to never trace COMMANDS.
1529 [m4_pushdef([at_reason],
1530 m4_cond([m4_eval(m4_index([$1], [`]) >= 0)], [1],
1531 [[a `...` command substitution]],
1532 [m4_eval(m4_index([$1], [$(]) >= 0)], [1],
1533 [[a $(...) command substitution]],
1534 [m4_eval(m4_index([$1], [${]) >= 0)], [1],
1535 [[a ${...} parameter expansion]],
1536 [m4_eval(m4_index([$1], m4_newline) >= 0)], [1],
1537 [[an embedded newline]],
1541 m4_ifval(m4_defn([at_reason]),
1542 [{ echo 'Not enabling shell tracing (command contains ]m4_defn([at_reason])[)'
1544 [m4_if(m4_index([$1], [$]), [-1],
1545 dnl We know at build time that tracing COMMANDS is always safe.
1546 [test -n "$at_traceon"],
1547 dnl COMMANDS may contain parameter expansions; expand them at runtime.
1548 [test -n "$at_traceon" \
1549 && at_func_check_newline "AS_ESCAPE([$1], [`\"])"])])[]dnl
1550 m4_popdef([at_reason])])
1553 # AT_DIFF_STDERR/AT_DIFF_STDOUT
1554 # -----------------------------
1555 # These are subroutines of AT_CHECK. Using indirect dispatch is a tad
1556 # faster than using m4_case, and these are called very frequently.
1557 m4_define([AT_DIFF_STDERR(stderr)],
1558 [echo stderr:; tee stderr <"$at_stderr"])
1559 m4_define([AT_DIFF_STDERR(ignore)],
1560 [echo stderr:; cat "$at_stderr"])
1561 m4_define([AT_DIFF_STDERR(experr)],
1562 [$at_diff experr "$at_stderr" || at_failed=:])
1563 m4_define([AT_DIFF_STDERR()],
1564 [at_func_diff_devnull "$at_stderr" || at_failed=:])
1566 m4_define([AT_DIFF_STDOUT(stdout)],
1567 [echo stdout:; tee stdout <"$at_stdout"])
1568 m4_define([AT_DIFF_STDOUT(ignore)],
1569 [echo stdout:; cat "$at_stdout"])
1570 m4_define([AT_DIFF_STDOUT(expout)],
1571 [$at_diff expout "$at_stdout" || at_failed=:])
1572 m4_define([AT_DIFF_STDOUT()],
1573 [at_func_diff_devnull "$at_stdout" || at_failed=:])
1575 # _AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
1576 # [RUN-IF-FAIL], [RUN-IF-PASS], SHELL_ESCAPE_IO)
1577 # ---------------------------------------------------------
1578 # Worker for AT_CHECK & AT_CHECK_NOESCAPE. The final SHELL-ESCAPE-IO
1579 # argument determines whether the STDOUT & STDERR arguments will be escaped or
1583 # Implementation Details
1584 # ----------------------
1585 # Ideally, we would like to run
1587 # ( $at_traceon; COMMANDS >at-stdout 2> at-stderr )
1589 # but we must group COMMANDS as it is not limited to a single command, and
1590 # then the shells will save the traces in at-stderr. So we have to filter
1591 # them out when checking stderr, and we must send them into the test suite's
1592 # stderr to honor -x properly. Since only the first line of the trace of a
1593 # multiline command starts with a `+', and I know of no straightforward way to
1594 # filter out the unadorned trace lines, we disable shell tracing entirely for
1595 # commands that could span multiple lines.
1597 # Limiting COMMANDS to a single command is not good either, since them
1598 # the user herself would use {} or (), and then we face the same problem.
1600 # But then, there is no point in running
1602 # ( $at_traceon { $1 ; } >at-stdout 2>at-stder1 )
1604 # instead of the simpler
1606 # ( $at_traceon; $1 ) >at-stdout 2>at-stder1
1608 m4_define([_AT_CHECK],
1610 AS_ECHO(["$at_srcdir/AT_LINE: AS_ESCAPE([$1])"])
1611 echo AT_LINE >"$at_check_line_file"
1613 if _AT_DECIDE_TRACEABLE([$1]); then
1614 ( $at_traceon; $1 ) >"$at_stdout" 2>"$at_stder1"
1615 at_func_filter_trace $?
1617 ( :; $1 ) >"$at_stdout" 2>"$at_stderr"
1621 m4_ifdef([AT_DIFF_STDERR($4)], [m4_indir([AT_DIFF_STDERR($4)])],
1622 [echo >>"$at_stderr"; AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$4])],[$4])"]) | \
1623 $at_diff - "$at_stderr" || at_failed=:])
1624 m4_ifdef([AT_DIFF_STDOUT($3)], [m4_indir([AT_DIFF_STDOUT($3)])],
1625 [echo >>"$at_stdout"; AS_ECHO(["m4_ifval([$7],[AS_ESCAPE([$3])],[$3])"]) | \
1626 $at_diff - "$at_stdout" || at_failed=:])
1627 m4_if([$2], [ignore], [at_func_check_skip],
1628 [at_func_check_status m4_default([$2], [0])]) dnl
1629 $at_status "$at_srcdir/AT_LINE"
1630 AS_IF($at_failed, [$5], [$6])
1631 $at_failed && at_func_log_failure AT_capture_files