make update-copyright
[autoconf.git] / lib / autotest / general.m4
blob794f680ae5fa628a9a8db1ef0b86d63b09bce954
1 # This file is part of Autoconf.                          -*- Autoconf -*-
2 # M4 macros used in building test suites.
3 m4_define([_AT_COPYRIGHT_YEARS], [
4 Copyright (C) 2000-2017, 2020-2022 Free Software Foundation, Inc.
5 ])
7 # This file is part of Autoconf.  This program is free
8 # software; you can redistribute it and/or modify it under the
9 # terms of the GNU General Public License as published by the
10 # Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
18 # Under Section 7 of GPL version 3, you are granted additional
19 # permissions described in the Autoconf Configure Script Exception,
20 # version 3.0, as published by the Free Software Foundation.
22 # You should have received a copy of the GNU General Public License
23 # and a copy of the Autoconf Configure Script Exception along with
24 # this program; see the files COPYINGv3 and COPYING.EXCEPTION
25 # respectively.  If not, see <https://www.gnu.org/licenses/>.
28 # _m4_divert(DIVERSION-NAME)
29 # --------------------------
30 # Convert a diversion name into its number.  Otherwise, return
31 # DIVERSION-NAME which is supposed to be an actual diversion number.
32 # Of course it would be nicer to use m4_case here, instead of zillions
33 # of little macros, but it then takes twice longer to run 'autoconf'!
35 # From M4sugar:
36 #    -1. KILL
37 # 10000. GROW
39 # From M4sh:
40 #    0. BINSH
41 #    1. HEADER-REVISION
42 #    2. HEADER-COMMENT
43 #    3. HEADER-COPYRIGHT
44 #    4. M4SH-SANITIZE
45 #    5. M4SH-INIT
46 # 1000. BODY
48 # Defined below:
49 #  - DEFAULTS
50 #    Overall initialization, value of $at_groups_all.
51 #  - PARSE_ARGS_BEGIN
52 #    Setup defaults required for option processing.
53 #  - PARSE_ARGS
54 #    Option processing.  After AT_INIT, user options can be entered here as
55 #    cases of a case statement.
56 #  - PARSE_ARGS_END
57 #    Finish up the option processing.
59 #  - HELP
60 #    Start printing the help message.
61 #  - HELP_MODES
62 #    Modes help text.  Additional modes can be appended as self-contained
63 #    cat'd here-docs as generated by AS_HELP_STRING.
64 #  - HELP_TUNING_BEGIN
65 #    Tuning help text.  This is for Autotest-provided text.
66 #  - HELP_TUNING
67 #    Additional tuning options' help text can be appended here as
68 #    self-contained cat'd here-docs as generated by AS_HELP_STRING.
69 #  - HELP_OTHER
70 #    User help can be appended to this as self-contained cat'd here-docs.
71 #  - HELP_END
72 #    Finish up the help texts.
74 #  - VERSION
75 #    Head of the handling of --version.
76 #  - VERSION_NOTICES
77 #    Copyright notices for --version.
78 #  - VERSION_END
79 #    Tail of the handling of --version.
81 #  - BANNERS
82 #    Output shell initialization for the associative array of banner text.
83 #  - TESTS_BEGIN
84 #    Like DEFAULTS but run after argument processing for purposes of
85 #    optimization.  Do anything else that needs to be done to prepare for
86 #    tests.  Sets up verbose and log file descriptors.  Sets and logs PATH.
87 #  - PREPARE_TESTS
88 #    Declares functions shared among the tests.  Perform any user
89 #    initialization to be shared among all tests.
90 #  - TESTS
91 #    The core of the test suite.
93 #  - TEST_SCRIPT
94 #    The collector for code for each test, the "normal" diversion, but
95 #    undiverted into other locations before final output.
97 #  - TEST_GROUPS
98 #    Contents of each test group.  The tests deliberately occur after the
99 #    end of the shell script, so that the shell need not spend time parsing
100 #    commands it will not execute.
102 m4_define([_m4_divert(DEFAULTS)],           100)
103 m4_define([_m4_divert(PARSE_ARGS_BEGIN)],   200)
104 m4_define([_m4_divert(PARSE_ARGS)],         201)
105 m4_define([_m4_divert(PARSE_ARGS_END)],     202)
106 m4_define([_m4_divert(HELP)],               300)
107 m4_define([_m4_divert(HELP_MODES)],         301)
108 m4_define([_m4_divert(HELP_TUNING_BEGIN)],  302)
109 m4_define([_m4_divert(HELP_TUNING)],        303)
110 m4_define([_m4_divert(HELP_OTHER)],         304)
111 m4_define([_m4_divert(HELP_END)],           305)
112 m4_define([_m4_divert(VERSION)],            350)
113 m4_define([_m4_divert(VERSION_NOTICES)],    351)
114 m4_define([_m4_divert(VERSION_END)],        352)
115 m4_define([_m4_divert(BANNERS)],            400)
116 m4_define([_m4_divert(TESTS_BEGIN)],        401)
117 m4_define([_m4_divert(PREPARE_TESTS)],      402)
118 m4_define([_m4_divert(TESTS)],              403)
119 m4_define([_m4_divert(TEST_SCRIPT)],        450)
120 m4_define([_m4_divert(TEST_GROUPS)],        500)
123 # AT_LINE
124 # -------
125 # Return the current file sans directory, a colon, and the current
126 # line.  Be sure to return a _quoted_ file name, so if, for instance,
127 # the user is lunatic enough to have a file named 'dnl' (and I, for
128 # one, love to be brainless and stubborn sometimes), then we return a
129 # quoted name.
131 # Gee, we can't use simply
133 #  m4_bpatsubst(__file__, [^.*/\(.*\)], [[\1]])
135 # since then, since 'dnl' doesn't match the pattern, it is returned
136 # with once quotation level less, so you lose!  And since GNU M4
137 # is one of the biggest junk in the whole universe wrt regexp, don't
138 # even think about using '?' or '\?'.  Bah, '*' will do.
139 # Pleeeeeeeease, Gary, provide us with dirname and ERE!
141 # M4 recompiles the regular expression for every m4_bpatsubst, but __file__
142 # rarely changes.  Be fast - only compute the dirname when necessary; for
143 # autoconf alone, this shaves off several seconds in building testsuite.
144 m4_define([_AT_LINE_file])
145 m4_define([_AT_LINE_base])
146 m4_define([AT_LINE],
147 [m4_if(m4_defn([_AT_LINE_file]), __file__, [],
148        [m4_do([m4_define([_AT_LINE_file], __file__)],
149               [m4_define([_AT_LINE_base],
150                          m4_bregexp(/__file__, [/\([^/]*\)$], [[\1]]))])])dnl
151 m4_defn([_AT_LINE_base]):__line__])
153 # _AT_LINE_ESCAPED
154 # ----------------
155 # Same as AT_LINE, but already escaped for the shell.
156 m4_define([_AT_LINE_ESCAPED], ["AS_ESCAPE(m4_dquote(AT_LINE))"])
159 # _AT_NORMALIZE_TEST_GROUP_NUMBER(SHELL-VAR)
160 # ------------------------------------------
161 # Normalize SHELL-VAR so that its value has the same number of digits as
162 # all the other test group numbers.
163 m4_define([_AT_NORMALIZE_TEST_GROUP_NUMBER],
165   eval 'while :; do
166     case $$1 in #(
167     '"$at_format"'*) break;;
168     esac
169     $1=0$$1
170   done'
173 # _AT_DEFINE_INIT(NAME, [DEFINITION])
174 # -----------------------------------
175 # Define macro NAME to die if invoked prior to AT_INIT, and to DEFINITION
176 # after AT_INIT.
177 m4_define([_AT_DEFINE_INIT],
178 [m4_define($@)m4_pushdef([$1], [m4_fatal([$1: missing AT_INIT detected])])dnl
179 m4_append([_AT_DEFINE_INIT_LIST], [[$1]], [,])])
181 # _AT_DEFINE_SETUP(NAME, [DEFINITION])
182 # ------------------------------------
183 # Define macro NAME to die if invoked outside AT_SETUP/AT_CLEANUP, and
184 # to DEFINITION otherwise.
185 m4_define([_AT_DEFINE_SETUP],
186 [m4_define([$1], [m4_ifndef([AT_ingroup],
187  [m4_fatal([$1: missing AT_SETUP detected])])$2])])
190 # AT_INIT([TESTSUITE-NAME])
191 # -------------------------
192 # Begin test suite.
193 m4_define([AT_INIT],
194 [m4_pushdef([AT_INIT], [m4_fatal([$0: invoked multiple times])])]
195 [m4_pattern_forbid([^_?AT_])]
196 [m4_pattern_allow([^_ATEOF$])]
197 [m4_ifndef([AT_PACKAGE_BUGREPORT], [m4_fatal(
198   [$1: AT_PACKAGE_BUGREPORT is missing, consider writing package.m4])])]
199 [m4_define([AT_TESTSUITE_NAME],
200   m4_defn([AT_PACKAGE_STRING])[ test suite]m4_ifval([$1],
201    [m4_expand([: $1])]))]
202 [m4_define([AT_ordinal], 0)]
203 [m4_define([AT_banner_ordinal], 0)]
204 [m4_define([AT_help_all], [])]
205 [m4_map_args([_m4_popdef], _AT_DEFINE_INIT_LIST)]
206 [m4_wrap([_AT_FINISH])]
207 [AS_INIT[]]dnl
208 dnl We don't use m4sh's BODY diversion, but AS_INIT sticks a banner there.
209 dnl This trick removes that banner, since it adds nothing to autotest.
210 [m4_cleardivert([BODY])]dnl
211 [AS_ME_PREPARE[]]dnl
212 [m4_divert_push([DEFAULTS])]dnl
213 [AT_COPYRIGHT(m4_defn([_AT_COPYRIGHT_YEARS]), [
214 m4_copyright_condense])]
215 [AT_COPYRIGHT(
216 [This test suite is free software; the Free Software Foundation gives
217 unlimited permission to copy, distribute and modify it.], [m4_echo])]
218 [AS_PREPARE
220 SHELL=${CONFIG_SHELL-/bin/sh}
222 # How were we run?
223 at_cli_args="$[@]"
225 m4_divert_push([BANNERS])dnl
227 # Should we print banners?  Yes if more than one test is run.
228 case $at_groups in #(
229   *$as_nl* )
230       at_print_banners=: ;; #(
231   * ) at_print_banners=false ;;
232 esac
233 # Text for banner N, set to a single space once printed.
234 m4_divert_pop([BANNERS])dnl back to DEFAULTS
235 m4_divert_push([PREPARE_TESTS])dnl
237 m4_text_box([Autotest shell functions.])
239 AS_FUNCTION_DESCRIBE([at_fn_banner], [NUMBER],
240 [Output banner NUMBER, provided the testsuite is running multiple groups
241 and this particular banner has not yet been printed.])
242 at_fn_banner ()
244   $at_print_banners || return 0
245   eval at_banner_text=\$at_banner_text_$[1]
246   test "x$at_banner_text" = "x " && return 0
247   eval "at_banner_text_$[1]=\" \""
248   if test -z "$at_banner_text"; then
249     $at_first || echo
250   else
251     AS_ECHO(["$as_nl$at_banner_text$as_nl"])
252   fi
253 } # at_fn_banner
255 AS_FUNCTION_DESCRIBE([at_fn_check_prepare_notrace], [REASON LINE],
256 [Perform AT_CHECK preparations for the command at LINE for an
257 untraceable command; REASON is the reason for disabling tracing.])
258 at_fn_check_prepare_notrace ()
260   $at_trace_echo "Not enabling shell tracing (command contains $[1])"
261   AS_ECHO(["$[2]"]) >"$at_check_line_file"
262   at_check_trace=: at_check_filter=:
263   : >"$at_stdout"; : >"$at_stderr"
266 AS_FUNCTION_DESCRIBE([at_fn_check_prepare_trace], [LINE],
267 [Perform AT_CHECK preparations for the command at LINE for a traceable
268 command.])
269 at_fn_check_prepare_trace ()
271   AS_ECHO(["$[1]"]) >"$at_check_line_file"
272   at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace
273   : >"$at_stdout"; : >"$at_stderr"
276 AS_FUNCTION_DESCRIBE([at_fn_check_prepare_dynamic], [COMMAND LINE],
277 [Decide if COMMAND at LINE is traceable at runtime, and call the
278 appropriate preparation function.])
279 at_fn_check_prepare_dynamic ()
281   case $[1] in
282     *$as_nl*)
283       at_fn_check_prepare_notrace 'an embedded newline' "$[2]" ;;
284     *)
285       at_fn_check_prepare_trace "$[2]" ;;
286   esac
289 AS_FUNCTION_DESCRIBE([at_fn_filter_trace], [],
290 [Remove the lines in the file "$at_stderr" generated by "set -x" and print
291 them to stderr.])
292 at_fn_filter_trace ()
294   mv "$at_stderr" "$at_stder1"
295   grep '^ *+' "$at_stder1" >&2
296   grep -v '^ *+' "$at_stder1" >"$at_stderr"
299 AS_FUNCTION_DESCRIBE([at_fn_log_failure], [FILE-LIST],
300 [Copy the files in the list on stdout with a "> " prefix, and exit the shell
301 with a failure exit code.])
302 at_fn_log_failure ()
304   for file
305     do AS_ECHO(["$file:"]); sed 's/^/> /' "$file"; done
306   echo 1 > "$at_status_file"
307   exit 1
310 AS_FUNCTION_DESCRIBE([at_fn_check_skip], [EXIT-CODE LINE],
311 [Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit
312 the test group subshell with that same exit code.  Use LINE in any report
313 about test failure.])
314 at_fn_check_skip ()
316   case $[1] in
317     99) echo 99 > "$at_status_file"; at_failed=:
318         AS_ECHO(["$[2]: hard failure"]); exit 99;;
319     77) echo 77 > "$at_status_file"; exit 77;;
320   esac
323 AS_FUNCTION_DESCRIBE([at_fn_check_status], [EXPECTED EXIT-CODE LINE],
324 [Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing.
325 Otherwise, if it is 77 or 99, exit the test group subshell with that same
326 exit code; if it is anything else print an error message referring to LINE,
327 and fail the test.])
328 at_fn_check_status ()
330 dnl This order ensures that we don't 'skip' if we are precisely checking
331 dnl $? = 77 or $? = 99.
332   case $[2] in
333     $[1] ) ;;
334     77) echo 77 > "$at_status_file"; exit 77;;
335     99) echo 99 > "$at_status_file"; at_failed=:
336         AS_ECHO(["$[3]: hard failure"]); exit 99;;
337     *) AS_ECHO(["$[3]: exit code was $[2], expected $[1]"])
338       at_failed=:;;
339   esac
342 AS_FUNCTION_DESCRIBE([at_fn_diff_devnull], [FILE],
343 [Emit a diff between /dev/null and FILE.  Uses "test -s" to avoid useless
344 diff invocations.])
345 at_fn_diff_devnull ()
347   test -s "$[1]" || return 0
348   $at_diff "$at_devnull" "$[1]"
351 AS_FUNCTION_DESCRIBE([at_fn_test], [NUMBER],
352 [Parse out test NUMBER from the tail of this file.])
353 at_fn_test ()
355   eval at_sed=\$at_sed$[1]
356   sed "$at_sed" "$at_myself" > "$at_test_source"
359 AS_FUNCTION_DESCRIBE([at_fn_create_debugging_script], [],
360 [Create the debugging script $at_group_dir/run which will reproduce the
361 current test group.])
362 at_fn_create_debugging_script ()
364   {
365     echo "#! /bin/sh" &&
366     echo 'test ${ZSH_VERSION+y} dnl
367 && alias -g '\''${1+"$[@]"}'\''='\''"$[@]"'\''' &&
368     AS_ECHO(["cd '$at_dir'"]) &&
369     AS_ECHO(["exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d ]dnl
370 [$at_debug_args $at_group \${1+\"\$[@]\"}"]) &&
371     echo 'exit 1'
372   } >"$at_group_dir/run" &&
373   chmod +x "$at_group_dir/run"
376 m4_text_box([End of autotest shell functions.])
377 m4_divert_pop([PREPARE_TESTS])dnl back to DEFAULTS
379 # Not all shells have the 'times' builtin; the subshell is needed to make
380 # sure we discard the 'times: not found' message from the shell.
381 at_times_p=false
382 (times) >/dev/null 2>&1 && at_times_p=:
384 # CLI Arguments to pass to the debugging scripts.
385 at_debug_args=
386 # -e sets to true
387 at_errexit_p=false
388 # Shall we be verbose?  ':' means no, empty means yes.
389 at_verbose=:
390 at_quiet=
391 # Running several jobs in parallel, 0 means as many as test groups.
392 at_jobs=1
393 at_traceon=:
394 at_trace_echo=:
395 at_check_filter_trace=:
397 # Shall we keep the debug scripts?  Must be ':' when the suite is
398 # run by a debug script, so that the script doesn't remove itself.
399 at_debug_p=false
400 # Display help message?
401 at_help_p=false
402 # Display the version message?
403 at_version_p=false
404 # List test groups?
405 at_list_p=false
406 # --clean
407 at_clean=false
408 # Test groups to run
409 at_groups=
410 # Whether to rerun failed tests.
411 at_recheck=
412 # Whether a write failure occurred
413 at_write_fail=0
415 # The directory we run the suite in.  Default to . if no -C option.
416 at_dir=`pwd`
417 # An absolute reference to this testsuite script.
418 dnl m4-double quote, to preserve []
419 [case $as_myself in
420   [\\/]* | ?:[\\/]* ) at_myself=$as_myself ;;
421   * ) at_myself=$at_dir/$as_myself ;;
422 esac]
423 # Whether -C is in effect.
424 at_change_dir=false
425 m4_divert_pop([DEFAULTS])dnl
426 m4_define([_AT_FINISH],
427 [m4_ifdef([AT_ingroup], [m4_fatal([missing AT_CLEANUP detected])])dnl
428 m4_divert_text([DEFAULTS],
430 # Whether to enable colored test results.
431 at_color=m4_ifdef([AT_color], [AT_color], [no])
432 # As many question marks as there are digits in the last test group number.
433 # Used to normalize the test group numbers so that 'ls' lists them in
434 # numerical order.
435 at_format='m4_bpatsubst(m4_defn([AT_ordinal]), [.], [?])'
436 # Description of all the test groups.
437 at_help_all="AS_ESCAPE(m4_dquote(m4_defn([AT_help_all])))"
438 # List of the all the test groups.
439 at_groups_all=`AS_ECHO(["$at_help_all"]) | sed 's/;.*//'`
441 AS_FUNCTION_DESCRIBE([at_fn_validate_ranges], [NAME...],
442 [Validate and normalize the test group number contained in each
443 variable NAME.  Leading zeroes are treated as decimal.])
444 at_fn_validate_ranges ()
446   for at_grp
447   do
448     eval at_value=\$$at_grp
449     if test $at_value -lt 1 || test $at_value -gt AT_ordinal; then
450       AS_ECHO(["invalid test group: $at_value"]) >&2
451       exit 1
452     fi
453     case $at_value in
454       0*) # We want to treat leading 0 as decimal, like expr and test, but
455           # AS_VAR_ARITH treats it as octal if it uses $(( )).
456           # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the
457           # expr fork, but it is not worth the effort to determine if the
458           # shell supports XSI when the user can just avoid leading 0.
459           eval $at_grp='`expr $at_value + 0`' ;;
460     esac
461   done
462 }])])dnl
463 m4_divert_push([PARSE_ARGS])dnl
465 at_prev=
466 for at_option
468   # If the previous option needs an argument, assign it.
469   if test -n "$at_prev"; then
470     at_option=$at_prev=$at_option
471     at_prev=
472   fi
474   case $at_option in
475   *=?*) at_optarg=`expr "X$at_option" : '[[^=]]*=\(.*\)'` ;;
476   *)    at_optarg= ;;
477   esac
479   case $at_option in
480     --help | -h )
481         at_help_p=:
482         ;;
484     --list | -l )
485         at_list_p=:
486         ;;
488     --version | -V )
489         at_version_p=:
490         ;;
492     --clean | -c )
493         at_clean=:
494         ;;
496     --color )
497         at_color=always
498         ;;
499     --color=* )
500         case $at_optarg in
501         no | never | none) at_color=never ;;
502         auto | tty | if-tty) at_color=auto ;;
503         always | yes | force) at_color=always ;;
504         *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'`
505            AS_ERROR([unrecognized argument to $at_optname: $at_optarg]) ;;
506         esac
507         ;;
509     --debug | -d )
510         at_debug_p=:
511         ;;
513     --errexit | -e )
514         at_debug_p=:
515         at_errexit_p=:
516         ;;
518     --verbose | -v )
519         at_verbose=; at_quiet=:
520         ;;
522     --trace | -x )
523         at_traceon='set -x'
524         at_trace_echo=echo
525         at_check_filter_trace=at_fn_filter_trace
526         ;;
528     [[0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]])
529         at_fn_validate_ranges at_option
530         AS_VAR_APPEND([at_groups], ["$at_option$as_nl"])
531         ;;
533     # Ranges
534     [[0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-])
535         at_range_start=`echo $at_option |tr -d X-`
536         at_fn_validate_ranges at_range_start
537         at_range=`AS_ECHO(["$at_groups_all"]) | \
538           sed -ne '/^'$at_range_start'$/,$p'`
539         AS_VAR_APPEND([at_groups], ["$at_range$as_nl"])
540         ;;
542     [-[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]])
543         at_range_end=`echo $at_option |tr -d X-`
544         at_fn_validate_ranges at_range_end
545         at_range=`AS_ECHO(["$at_groups_all"]) | \
546           sed -ne '1,/^'$at_range_end'$/p'`
547         AS_VAR_APPEND([at_groups], ["$at_range$as_nl"])
548         ;;
550     [[0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9]] | \
551     [[0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9]] | \
552     [[0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
553     [[0-9][0-9][0-9]-[0-9][0-9][0-9]] | \
554     [[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
555     [[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] )
556         at_range_start=`expr $at_option : '\(.*\)-'`
557         at_range_end=`expr $at_option : '.*-\(.*\)'`
558         if test $at_range_start -gt $at_range_end; then
559           at_tmp=$at_range_end
560           at_range_end=$at_range_start
561           at_range_start=$at_tmp
562         fi
563         at_fn_validate_ranges at_range_start at_range_end
564         at_range=`AS_ECHO(["$at_groups_all"]) | \
565           sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'`
566         AS_VAR_APPEND([at_groups], ["$at_range$as_nl"])
567         ;;
569     # Directory selection.
570     --directory | -C )
571         at_prev=--directory
572         ;;
573     --directory=* )
574         at_change_dir=:
575         at_dir=$at_optarg
576         if test x- = "x$at_dir" ; then
577           at_dir=./-
578         fi
579         ;;
581     # Parallel execution.
582     --jobs | -j )
583         at_jobs=0
584         ;;
585     --jobs=* | -j[[0-9]]* )
586         if test -n "$at_optarg"; then
587           at_jobs=$at_optarg
588         else
589           at_jobs=`expr X$at_option : 'X-j\(.*\)'`
590         fi
591         case $at_jobs in *[[!0-9]]*)
592           at_optname=`echo " $at_option" | sed 's/^ //; s/[[0-9=]].*//'`
593           AS_ERROR([non-numeric argument to $at_optname: $at_jobs]) ;;
594         esac
595         ;;
597     # Keywords.
598     --keywords | -k )
599         at_prev=--keywords
600         ;;
601     --keywords=* )
602         at_groups_selected=$at_help_all
603         at_save_IFS=$IFS
604         IFS=,
605         set X $at_optarg
606         shift
607         IFS=$at_save_IFS
608         for at_keyword
609         do
610           at_invert=
611           case $at_keyword in
612           '!'*)
613             at_invert="-v"
614             at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
615             ;;
616           esac
617           # It is on purpose that we match the test group titles too.
618           at_groups_selected=`AS_ECHO(["$at_groups_selected"]) |
619               grep -i $at_invert ["^[1-9][^;]*;.*[; ]$at_keyword[ ;]"]`
620         done
621         # Smash the keywords.
622         at_groups_selected=`AS_ECHO(["$at_groups_selected"]) | sed 's/;.*//'`
623         AS_VAR_APPEND([at_groups], ["$at_groups_selected$as_nl"])
624         ;;
625     --recheck)
626         at_recheck=:
627         ;;
628 m4_divert_pop([PARSE_ARGS])dnl
629 dnl Process *=* last to allow for user specified --option=* type arguments.
630 m4_divert_push([PARSE_ARGS_END])dnl
632     *=*)
633         at_envvar=`expr "x$at_option" : 'x\([[^=]]*\)='`
634         # Reject names that are not valid shell variable names.
635         case $at_envvar in
636           '' | [[0-9]]* | *[[!_$as_cr_alnum]]* )
637             AS_ERROR([invalid variable name: '$at_envvar']) ;;
638         esac
639         at_value=`AS_ECHO(["$at_optarg"]) | sed "s/'/'\\\\\\\\''/g"`
640         # Export now, but save eval for later and for debug scripts.
641         export $at_envvar
642         AS_VAR_APPEND([at_debug_args], [" $at_envvar='$at_value'"])
643         ;;
645      *) AS_ECHO(["$as_me: invalid option: $at_option"]) >&2
646         AS_ECHO(["Try '$[0] --help' for more information."]) >&2
647         exit 1
648         ;;
649   esac
650 done
652 # Verify our last option didn't require an argument
653 AS_IF([test -n "$at_prev"], [AS_ERROR(['$at_prev' requires an argument])])
655 # The file containing the suite.
656 at_suite_log=$at_dir/$as_me.log
658 # Selected test groups.
659 if test -z "$at_groups$at_recheck"; then
660   at_groups=$at_groups_all
661 else
662   if test -n "$at_recheck" && test -r "$at_suite_log"; then
663     at_oldfails=`sed -n ['
664       /^Failed tests:$/,/^Skipped tests:$/{
665         s/^[ ]*\([1-9][0-9]*\):.*/\1/p
666       }
667       /^Unexpected passes:$/,/^## Detailed failed tests/{
668         s/^[ ]*\([1-9][0-9]*\):.*/\1/p
669       }
670       /^## Detailed failed tests/q
671       '] "$at_suite_log"`
672     AS_VAR_APPEND([at_groups], ["$at_oldfails$as_nl"])
673   fi
674   # Sort the tests, removing duplicates.
675   at_groups=`AS_ECHO(["$at_groups"]) | sort -nu | sed '/^$/d'`
678 if test x"$at_color" = xalways \
679    || { test x"$at_color" = xauto && test -t 1; }; then
680   at_red=`printf '\033@<:@0;31m'`
681   at_grn=`printf '\033@<:@0;32m'`
682   at_lgn=`printf '\033@<:@1;32m'`
683   at_blu=`printf '\033@<:@1;34m'`
684   at_std=`printf '\033@<:@m'`
685 else
686   at_red= at_grn= at_lgn= at_blu= at_std=
688 m4_divert_pop([PARSE_ARGS_END])dnl
689 m4_divert_push([HELP])dnl
691 # Help message.
692 if $at_help_p; then
693   cat <<_ATEOF || at_write_fail=1
694 Usage: $[0] [[OPTION]... [VARIABLE=VALUE]... [TESTS]]
696 Run all the tests, or the selected TESTS, given by numeric ranges, and
697 save a detailed log file.  Upon failure, create debugging scripts.
699 Do not change environment variables directly.  Instead, set them via
700 command line arguments.  Set 'AUTOTEST_PATH' to select the executables
701 to exercise.  Each relative directory is expanded as build and source
702 directories relative to the top level of this distribution.
703 E.g., from within the build directory /tmp/foo-1.0, invoking this:
705   $ $[0] AUTOTEST_PATH=bin
707 is equivalent to the following, assuming the source directory is /src/foo-1.0:
709   PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $[0]
710 _ATEOF
711 m4_divert_pop([HELP])dnl
712 m4_divert_push([HELP_MODES])dnl
713 cat <<_ATEOF || at_write_fail=1
715 Operation modes:
716   -h, --help     print the help message, then exit
717   -V, --version  print version number, then exit
718   -c, --clean    remove all the files this test suite might create and exit
719   -l, --list     describes all the tests, or the selected TESTS
720 _ATEOF
721 m4_divert_pop([HELP_MODES])dnl
722 m4_wrap([m4_divert_push([HELP_TUNING_BEGIN])dnl
723 cat <<_ATEOF || at_write_fail=1
725 dnl extra quoting prevents emacs whitespace mode from putting tabs in output
726 Execution tuning:
727   -C, --directory=DIR
728 [                 change to directory DIR before starting]
729       --color[[=never|auto|always]]
730 [                 ]m4_ifdef([AT_color],
731                       [disable colored test results, or enable even without terminal],
732                       [enable colored test results on terminal, or always])
733   -j, --jobs[[=N]]
734 [                 Allow N jobs at once; infinite jobs with no arg (default 1)]
735   -k, --keywords=KEYWORDS
736 [                 select the tests matching all the comma-separated KEYWORDS]
737 [                 multiple '-k' accumulate; prefixed '!' negates a KEYWORD]
738       --recheck  select all tests that failed or passed unexpectedly last time
739   -e, --errexit  abort as soon as a test fails; implies --debug
740   -v, --verbose  force more detailed output
741 [                 default for debugging scripts]
742   -d, --debug    inhibit clean up and top-level logging
743 [                 default for debugging scripts]
744   -x, --trace    enable tests shell tracing
745 _ATEOF
746 m4_divert_pop([HELP_TUNING_BEGIN])])dnl
747 m4_divert_push([HELP_END])dnl
748 cat <<_ATEOF || at_write_fail=1
750 Report bugs to <AT_PACKAGE_BUGREPORT>.dnl
751 m4_ifdef([AT_PACKAGE_NAME],
752 [m4_ifset([AT_PACKAGE_URL], [
753 m4_defn([AT_PACKAGE_NAME]) home page: <AT_PACKAGE_URL>.])dnl
754 m4_if(m4_index(m4_defn([AT_PACKAGE_NAME]), [GNU ]), [0], [
755 General help using GNU software: <https://www.gnu.org/gethelp/>.])])
756 _ATEOF
757   exit $at_write_fail
760 # List of tests.
761 if $at_list_p; then
762   cat <<_ATEOF || at_write_fail=1
763 AT_TESTSUITE_NAME test groups:
765  NUM: FILE-NAME:LINE     TEST-GROUP-NAME
766       KEYWORDS
768 _ATEOF
769   # Pass an empty line as separator between selected groups and help.
770   AS_ECHO(["$at_groups$as_nl$as_nl$at_help_all"]) |
771     awk 'NF == 1 && FS != ";" {
772            selected[[$ 1]] = 1
773            next
774          }
775          /^$/ { FS = ";" }
776          NF > 0 {
777            if (selected[[$ 1]]) {
778              printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
779              if ($ 4) {
780                lmax = 79
781                indent = "     "
782                line = indent
783                len = length (line)
784                n = split ($ 4, a, " ")
785                for (i = 1; i <= n; i++) {
786                  l = length (a[[i]]) + 1
787                  if (i > 1 && len + l > lmax) {
788                    print line
789                    line = indent " " a[[i]]
790                    len = length (line)
791                  } else {
792                    line = line " " a[[i]]
793                    len += l
794                  }
795                }
796                if (n)
797                  print line
798              }
799            }
800          }' || at_write_fail=1
801   exit $at_write_fail
803 m4_divert_pop([HELP_END])dnl
804 m4_divert_push([VERSION])dnl
805 if $at_version_p; then
806   AS_ECHO(["$as_me (AT_PACKAGE_STRING)"]) &&
807   cat <<\_ATEOF || at_write_fail=1
808 m4_divert_pop([VERSION])dnl
809 m4_divert_push([VERSION_END])dnl
810 _ATEOF
811   exit $at_write_fail
813 m4_divert_pop([VERSION_END])dnl
814 m4_divert_push([TESTS_BEGIN])dnl
816 # Take any -C into account.
817 if $at_change_dir ; then
818   test x != "x$at_dir" && cd "$at_dir" \
819     || AS_ERROR([unable to change directory])
820   at_dir=`pwd`
823 # Load the config files for any default variable assignments.
824 for at_file in atconfig atlocal
826   test -r $at_file || continue
827   . ./$at_file || AS_ERROR([invalid content: $at_file])
828 done
830 # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
831 : "${at_top_build_prefix=$at_top_builddir}"
833 # Perform any assignments requested during argument parsing.
834 eval "$at_debug_args"
836 # atconfig delivers names relative to the directory the test suite is
837 # in, but the groups themselves are run in testsuite-dir/group-dir.
838 if test -n "$at_top_srcdir"; then
839   builddir=../..
840   for at_dir_var in srcdir top_srcdir top_build_prefix
841   do
842     AS_VAR_COPY([at_val], [at_$at_dir_var])
843     case $at_val in
844       [[\\/$]]* | ?:[[\\/]]* ) at_prefix= ;;
845       *) at_prefix=../../ ;;
846     esac
847     AS_VAR_SET([$at_dir_var], [$at_prefix$at_val])
848   done
851 m4_text_box([Directory structure.])
853 # This is the set of directories and files used by this script
854 # (non-literals are capitalized):
856 # TESTSUITE         - the testsuite
857 # TESTSUITE.log     - summarizes the complete testsuite run
858 # TESTSUITE.dir/    - created during a run, remains after -d or failed test
859 # + at-groups/      - during a run: status of all groups in run
860 # | + NNN/          - during a run: meta-data about test group NNN
861 # | | + check-line  - location (source file and line) of current AT_CHECK
862 # | | + status      - exit status of current AT_CHECK
863 # | | + stdout      - stdout of current AT_CHECK
864 # | | + stder1      - stderr, including trace
865 # | | + stderr      - stderr, with trace filtered out
866 # | | + test-source - portion of testsuite that defines group
867 # | | + times       - timestamps for computing duration
868 # | | + pass        - created if group passed
869 # | | + xpass       - created if group xpassed
870 # | | + fail        - created if group failed
871 # | | + xfail       - created if group xfailed
872 # | | + skip        - created if group skipped
873 # + at-stop         - during a run: end the run if this file exists
874 # + at-source-lines - during a run: cache of TESTSUITE line numbers for extraction
875 # + 0..NNN/         - created for each group NNN, remains after -d or failed test
876 # | + TESTSUITE.log - summarizes the group results
877 # | + ...           - files created during the group
879 # The directory the whole suite works in.
880 # Should be absolute to let the user 'cd' at will.
881 at_suite_dir=$at_dir/$as_me.dir
882 # The file containing the suite ($at_dir might have changed since earlier).
883 at_suite_log=$at_dir/$as_me.log
884 # The directory containing helper files per test group.
885 at_helper_dir=$at_suite_dir/at-groups
886 # Stop file: if it exists, do not start new jobs.
887 at_stop_file=$at_suite_dir/at-stop
888 # The fifo used for the job dispatcher.
889 at_job_fifo=$at_suite_dir/at-job-fifo
891 if $at_clean; then
892   test -d "$at_suite_dir" &&
893     find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
894   rm -f -r "$at_suite_dir" "$at_suite_log"
895   exit $?
898 # Don't take risks: use only absolute directories in PATH.
900 # For stand-alone test suites (ie. atconfig was not found),
901 # AUTOTEST_PATH is relative to '.'.
903 # For embedded test suites, AUTOTEST_PATH is relative to the top level
904 # of the package.  Then expand it into build/src parts, since users
905 # may create executables in both places.
906 AUTOTEST_PATH=`AS_ECHO(["$AUTOTEST_PATH"]) | sed "s|:|$PATH_SEPARATOR|g"`
907 at_path=
908 _AS_PATH_WALK([$AUTOTEST_PATH $PATH],
909 [test -n "$at_path" && AS_VAR_APPEND([at_path], [$PATH_SEPARATOR])
910 case $as_dir in
911   [[\\/]]* | ?:[[\\/]]* )
912     AS_VAR_APPEND([at_path], ["$as_dir"])
913     ;;
914   * )
915     if test -z "$at_top_build_prefix"; then
916       # Stand-alone test suite.
917       AS_VAR_APPEND([at_path], ["$as_dir"])
918     else
919       # Embedded test suite.
920       AS_VAR_APPEND([at_path], ["$at_top_build_prefix$as_dir$PATH_SEPARATOR"])
921       AS_VAR_APPEND([at_path], ["$at_top_srcdir/$as_dir"])
922     fi
923     ;;
924 esac])
926 # Now build and simplify PATH.
928 # There might be directories that don't exist, but don't redirect
929 # builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
930 at_new_path=
931 _AS_PATH_WALK([$at_path],
932 [test -d "$as_dir" || continue
933 case $as_dir in
934   [[\\/]]* | ?:[[\\/]]* ) ;;
935   * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;;
936 esac
937 case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in
938   *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;;
939   $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;;
940   *) AS_VAR_APPEND([at_new_path], ["$PATH_SEPARATOR$as_dir"]) ;;
941 esac])
942 PATH=$at_new_path
943 export PATH
945 # Setting up the FDs.
946 m4_define([AS_MESSAGE_LOG_FD], [5])
947 dnl The parent needs two fds to the same fifo, otherwise, there is a race
948 dnl where the parent can read the fifo before a child opens it for writing
949 m4_define([AT_JOB_FIFO_IN_FD], [6])
950 m4_define([AT_JOB_FIFO_OUT_FD], [7])
951 [#] AS_MESSAGE_LOG_FD is the log file.  Not to be overwritten if '-d'.
952 if $at_debug_p; then
953   at_suite_log=/dev/null
954 else
955   : >"$at_suite_log"
957 exec AS_MESSAGE_LOG_FD>>"$at_suite_log"
959 # Banners and logs.
960 AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
962   AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
963   echo
965   AS_ECHO(["$as_me: command line was:"])
966   AS_ECHO(["  \$ $[0] $at_cli_args"])
967   echo
969   # If ChangeLog exists, list a few lines in case it might help determining
970   # the exact version.
971   if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then
972     AS_BOX([ChangeLog.])
973     echo
974     sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog"
975     echo
976   fi
978   AS_UNAME
979   echo
981   # Contents of the config files.
982   for at_file in atconfig atlocal
983   do
984     test -r $at_file || continue
985     AS_ECHO(["$as_me: $at_file:"])
986     sed 's/^/| /' $at_file
987     echo
988   done
989 } >&AS_MESSAGE_LOG_FD
991 m4_divert_pop([TESTS_BEGIN])dnl
992 m4_divert_push([TESTS])dnl
994   AS_BOX([Running the tests.])
995 } >&AS_MESSAGE_LOG_FD
997 at_start_date=`date`
998 at_start_time=`date +%s 2>/dev/null`
999 AS_ECHO(["$as_me: starting at: $at_start_date"]) >&AS_MESSAGE_LOG_FD
1001 # Create the master directory if it doesn't already exist.
1002 AS_MKDIR_P(["$at_suite_dir"]) ||
1003   AS_ERROR([cannot create '$at_suite_dir'])
1005 # Can we diff with '/dev/null'?  DU 5.0 refuses.
1006 if diff /dev/null /dev/null >/dev/null 2>&1; then
1007   at_devnull=/dev/null
1008 else
1009   at_devnull=$at_suite_dir/devnull
1010   >"$at_devnull"
1013 # Use 'diff -u' when possible.
1014 if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
1015 then
1016   at_diff='diff -u'
1017 else
1018   at_diff=diff
1021 # Get the last needed group.
1022 for at_group in : $at_groups; do :; done
1024 # Extract the start and end lines of each test group at the tail
1025 # of this file
1026 awk '
1027 BEGIN { FS="\a" }
1028 /^@%:@AT_START_/ {
1029   start = NR
1031 /^@%:@AT_STOP_/ {
1032   test = substr ($ 0, 10)
1033   print "at_sed" test "=\"1," start "d;" (NR-1) "q\""
1034   if (test == "'"$at_group"'") exit
1035 }' "$at_myself" > "$at_suite_dir/at-source-lines" &&
1036 . "$at_suite_dir/at-source-lines" ||
1037   AS_ERROR([cannot create test line number cache])
1038 rm -f "$at_suite_dir/at-source-lines"
1040 # Set number of jobs for '-j'; avoid more jobs than test groups.
1041 set X $at_groups; shift; at_max_jobs=$[@%:@]
1042 if test $at_max_jobs -eq 0; then
1043   at_jobs=1
1045 if test $at_jobs -ne 1 &&
1046    { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then
1047   at_jobs=$at_max_jobs
1050 # If parallel mode, don't output banners, don't split summary lines.
1051 if test $at_jobs -ne 1; then
1052   at_print_banners=false
1053   at_quiet=:
1056 # Set up helper dirs.
1057 rm -rf "$at_helper_dir" &&
1058 mkdir "$at_helper_dir" &&
1059 cd "$at_helper_dir" &&
1060 { test -z "$at_groups" || mkdir $at_groups; } ||
1061 AS_ERROR([testsuite directory setup failed])
1063 # Functions for running a test group.  We leave the actual
1064 # test group execution outside of a shell function in order
1065 # to avoid hitting zsh 4.x exit status bugs.
1067 AS_FUNCTION_DESCRIBE([at_fn_group_prepare], [],
1068 [Prepare for running a test group.])
1069 at_fn_group_prepare ()
1071   # The directory for additional per-group helper files.
1072   at_job_dir=$at_helper_dir/$at_group
1073   # The file containing the location of the last AT_CHECK.
1074   at_check_line_file=$at_job_dir/check-line
1075   # The file containing the exit status of the last command.
1076   at_status_file=$at_job_dir/status
1077   # The files containing the output of the tested commands.
1078   at_stdout=$at_job_dir/stdout
1079   at_stder1=$at_job_dir/stder1
1080   at_stderr=$at_job_dir/stderr
1081   # The file containing the code for a test group.
1082   at_test_source=$at_job_dir/test-source
1083   # The file containing dates.
1084   at_times_file=$at_job_dir/times
1086   # Be sure to come back to the top test directory.
1087   cd "$at_suite_dir"
1089   # Clearly separate the test groups when verbose.
1090   $at_first || $at_verbose echo
1092   at_group_normalized=$at_group
1093   _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
1095   # Create a fresh directory for the next test group, and enter.
1096   # If one already exists, the user may have invoked ./run from
1097   # within that directory; we remove the contents, but not the
1098   # directory itself, so that we aren't pulling the rug out from
1099   # under the shell's notion of the current directory.
1100   at_group_dir=$at_suite_dir/$at_group_normalized
1101   at_group_log=$at_group_dir/$as_me.log
1102   _AS_CLEAN_DIR("$at_group_dir") ||
1103     AS_WARN([test directory for $at_group_normalized could not be cleaned])
1104   # Be tolerant if the above 'rm' was not able to remove the directory.
1105   AS_MKDIR_P(["$at_group_dir"])
1107   echo 0 > "$at_status_file"
1109   # In verbose mode, append to the log file *and* show on
1110   # the standard output; in quiet mode only write to the log.
1111   if test -z "$at_verbose"; then
1112     at_tee_pipe='tee -a "$at_group_log"'
1113   else
1114     at_tee_pipe='cat >> "$at_group_log"'
1115   fi
1118 AS_FUNCTION_DESCRIBE([at_fn_group_banner], [[ORDINAL LINE DESC PAD [BANNER]]],
1119 [Declare the test group ORDINAL, located at LINE with group description
1120 DESC, and residing under BANNER.  Use PAD to align the status column.])
1121 at_fn_group_banner ()
1123   at_setup_line="$[2]"
1124   test -n "$[5]" && at_fn_banner $[5]
1125   at_desc="$[3]"
1126   case $[1] in
1127     [[0-9]])      at_desc_line="  $[1]: ";;
1128     [[0-9][0-9]]) at_desc_line=" $[1]: " ;;
1129     [*])          at_desc_line="$[1]: "  ;;
1130   esac
1131   AS_VAR_APPEND([at_desc_line], ["$[3]$[4]"])
1132   $at_quiet AS_ECHO_N(["$at_desc_line"])
1133   echo "#                             -*- compilation -*-" >> "$at_group_log"
1136 AS_FUNCTION_DESCRIBE([at_fn_group_postprocess], [],
1137 [Perform cleanup after running a test group.])
1138 at_fn_group_postprocess ()
1140   # Be sure to come back to the suite directory, in particular
1141   # since below we might 'rm' the group directory we are in currently.
1142   cd "$at_suite_dir"
1144   if test ! -f "$at_check_line_file"; then
1145     sed "s/^ */$as_me: WARNING: /" <<_ATEOF
1146       A failure happened in a test group before any test could be
1147       run. This means that test suite is improperly designed.  Please
1148       report this failure to <AT_PACKAGE_BUGREPORT>.
1149 _ATEOF
1150     AS_ECHO(["$at_setup_line"]) >"$at_check_line_file"
1151     at_status=99
1152   fi
1153   $at_verbose AS_ECHO_N(["$at_group. $at_setup_line: "])
1154   AS_ECHO_N(["$at_group. $at_setup_line: "]) >> "$at_group_log"
1155   case $at_xfail:$at_status in
1156     yes:0)
1157         at_msg="UNEXPECTED PASS"
1158         at_res=xpass
1159         at_errexit=$at_errexit_p
1160         at_color=$at_red
1161         ;;
1162     no:0)
1163         at_msg="ok"
1164         at_res=pass
1165         at_errexit=false
1166         at_color=$at_grn
1167         ;;
1168     *:77)
1169         at_msg='skipped ('`cat "$at_check_line_file"`')'
1170         at_res=skip
1171         at_errexit=false
1172         at_color=$at_blu
1173         ;;
1174     no:* | *:99)
1175         at_msg='FAILED ('`cat "$at_check_line_file"`')'
1176         at_res=fail
1177         at_errexit=$at_errexit_p
1178         at_color=$at_red
1179         ;;
1180     yes:*)
1181         at_msg='expected failure ('`cat "$at_check_line_file"`')'
1182         at_res=xfail
1183         at_errexit=false
1184         at_color=$at_lgn
1185         ;;
1186   esac
1187   echo "$at_res" > "$at_job_dir/$at_res"
1188   # In parallel mode, output the summary line only afterwards.
1189   if test $at_jobs -ne 1 && test -n "$at_verbose"; then
1190     AS_ECHO(["$at_desc_line $at_color$at_msg$at_std"])
1191   else
1192     # Make sure there is a separator even with long titles.
1193     AS_ECHO([" $at_color$at_msg$at_std"])
1194   fi
1195   at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
1196   case $at_status in
1197     0|77)
1198       # $at_times_file is only available if the group succeeded.
1199       # We're not including the group log, so the success message
1200       # is written in the global log separately.  But we also
1201       # write to the group log in case they're using -d.
1202       if test -f "$at_times_file"; then
1203         at_log_msg="$at_log_msg     ("`sed 1d "$at_times_file"`')'
1204         rm -f "$at_times_file"
1205       fi
1206       AS_ECHO(["$at_log_msg"]) >> "$at_group_log"
1207       AS_ECHO(["$at_log_msg"]) >&AS_MESSAGE_LOG_FD
1209       # Cleanup the group directory, unless the user wants the files
1210       # or the success was unexpected.
1211       if $at_debug_p || test $at_res = xpass; then
1212         at_fn_create_debugging_script
1213         if test $at_res = xpass && $at_errexit; then
1214           echo stop > "$at_stop_file"
1215         fi
1216       else
1217         if test -d "$at_group_dir"; then
1218           find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
1219           rm -fr "$at_group_dir"
1220         fi
1221         rm -f "$at_test_source"
1222       fi
1223       ;;
1224     *)
1225       # Upon failure, include the log into the testsuite's global
1226       # log.  The failure message is written in the group log.  It
1227       # is later included in the global log.
1228       AS_ECHO(["$at_log_msg"]) >> "$at_group_log"
1230       # Upon failure, keep the group directory for autopsy, and create
1231       # the debugging script.  With -e, do not start any further tests.
1232       at_fn_create_debugging_script
1233       if $at_errexit; then
1234         echo stop > "$at_stop_file"
1235       fi
1236       ;;
1237   esac
1241 m4_text_box([Driver loop.])
1243 dnl Catching signals correctly:
1245 dnl The first idea was: trap the signal, send it to all spawned jobs,
1246 dnl then reset the handler and reraise the signal for ourselves.
1247 dnl However, before exiting, ksh will then send the signal to all
1248 dnl process group members, potentially killing the outer testsuite
1249 dnl and/or the 'make' process driving us.
1250 dnl So now the strategy is: trap the signal, send it to all spawned jobs,
1251 dnl then exit the script with the right status.
1253 dnl In order to let the jobs know about the signal, we cannot just send it
1254 dnl to the current process group (kill $SIG 0), for the same reason as above.
1255 dnl Also, it does not reliably stop the suite to send the signal to the
1256 dnl spawned processes, because they might not transport it further
1257 dnl (maybe this can be fixed?).
1259 dnl So what we do is enable shell job control if available, which causes the
1260 dnl shell to start each parallel task as its own shell job, thus as a new
1261 dnl process group leader.  We then send the signal to all new process groups.
1263 dnl Do we have job control?
1264 if (set -m && set +m && set +b) >/dev/null 2>&1; then
1265   set +b
1266   at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=-
1267 else
1268   at_job_control_on=: at_job_control_off=: at_job_group=
1271 for at_signal in 1 2 15; do
1272 dnl This signal handler is not suitable for PIPE: it causes writes.
1273 dnl The code that was interrupted may have the errexit, monitor, or xtrace
1274 dnl flags enabled, so sanitize.
1275   trap 'set +x; set +e
1276         $at_job_control_off
1277         at_signal='"$at_signal"'
1278 dnl Safety belt: even with runaway processes, prevent starting new jobs.
1279         echo stop > "$at_stop_file"
1280 dnl Do not enter this area multiple times, do not kill self prematurely.
1281         trap "" $at_signal
1282 dnl Gather process group IDs of currently running jobs.
1283         at_pgids=
1284         for at_pgid in `jobs -p 2>/dev/null`; do
1285           at_pgids="$at_pgids $at_job_group$at_pgid"
1286         done
1287 dnl Ignore 'kill' errors, as some jobs may have finished in the meantime.
1288         test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null
1289 dnl wait until all jobs have exited.
1290         wait
1291 dnl Status output.  Do this after waiting for the jobs, for ordered output.
1292 dnl Avoid scribbling onto the end of a possibly incomplete line.
1293         if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then
1294           echo >&2
1295         fi
1296         at_signame=`kill -l $at_signal 2>&1 || echo $at_signal`
1297         set x $at_signame
1298         test $# -gt 2 && at_signame=$at_signal
1299         AS_WARN([caught signal $at_signame, bailing out])
1300 dnl Do not reinstall the default handler here and reraise the signal to
1301 dnl let the default handler do its job, see the note about ksh above.
1302 dnl     trap - $at_signal
1303 dnl     kill -$at_signal $$
1304 dnl Instead, exit with appropriate status.
1305         AS_VAR_ARITH([exit_status], [128 + $at_signal])
1306         AS_EXIT([$exit_status])' $at_signal
1307 done
1309 rm -f "$at_stop_file"
1310 at_first=:
1312 if test $at_jobs -ne 1 &&
1313      rm -f "$at_job_fifo" &&
1314      test -n "$at_job_group" &&
1315      ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null
1316 then
1317   # FIFO job dispatcher.
1319 dnl Since we use job control, we need to propagate TSTP.
1320 dnl This handler need not be used for serial execution.
1321 dnl Again, we should stop all processes in the job groups, otherwise
1322 dnl the stopping will not be effective while one test group is running.
1323 dnl Apparently ksh does not honor the TSTP trap.
1324 dnl As a safety measure, not use the same variable names as in the
1325 dnl termination handlers above, one might get called during execution
1326 dnl of the other.
1327   trap 'at_pids=
1328         for at_pid in `jobs -p`; do
1329           at_pids="$at_pids $at_job_group$at_pid"
1330         done
1331 dnl Send it to all spawned jobs, ignoring those finished meanwhile.
1332         if test -n "$at_pids"; then
1333 dnl Unfortunately, ksh93 fork-bombs when we send TSTP, so send STOP
1334 dnl if this might be ksh (STOP prevents possible TSTP handlers inside
1335 dnl AT_CHECKs from running).  Then stop ourselves.
1336           at_sig=TSTP
1337           test ${TMOUT+y} && at_sig=STOP
1338           kill -$at_sig $at_pids 2>/dev/null
1339         fi
1340         kill -STOP $$
1341 dnl We got a CONT, so let's go again.  Passing this to all processes
1342 dnl in the groups is necessary (because we stopped them), but it may
1343 dnl cause changed test semantics; e.g., a sleep will be interrupted.
1344         test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP
1346   echo
1347   # Turn jobs into a list of numbers, starting from 1.
1348   at_joblist=`AS_ECHO(["$at_groups"]) | sed -n 1,${at_jobs}p`
1350   set X $at_joblist
1351   shift
1352   for at_group in $at_groups; do
1353 dnl Enable job control only for spawning the test group:
1354 dnl Let the jobs to run in separate process groups, but
1355 dnl avoid all the status output by the shell.
1356     $at_job_control_on 2>/dev/null
1357     (
1358       # Start one test group.
1359       $at_job_control_off
1360 dnl First child must open the fifo to avoid blocking parent; all other
1361 dnl children inherit it already opened from the parent.
1362       if $at_first; then
1363         exec AT_JOB_FIFO_OUT_FD>"$at_job_fifo"
1364       else
1365 dnl Children do not need parent's copy of fifo.
1366         exec AT_JOB_FIFO_IN_FD<&-
1367       fi
1368 dnl When a child receives PIPE, be sure to write back the token,
1369 dnl so the master does not hang waiting for it.
1370 dnl errexit and xtrace should not be set in this shell instance,
1371 dnl except as debug measures.  However, shells such as dash may
1372 dnl optimize away the _AT_CHECK subshell, so normalize here.
1373       trap 'set +x; set +e
1374 dnl Ignore PIPE signals that stem from writing back the token.
1375             trap "" PIPE
1376             echo stop > "$at_stop_file"
1377             echo >&AT_JOB_FIFO_OUT_FD
1378 dnl Do not reraise the default PIPE handler.
1379 dnl It wreaks havoc with ksh, see above.
1380 dnl         trap - 13
1381 dnl         kill -13 $$
1382             AS_EXIT([141])' PIPE
1383       at_fn_group_prepare
1384       if cd "$at_group_dir" &&
1385          at_fn_test $at_group &&
1386          . "$at_test_source"
1387       then :; else
1388         AS_WARN([unable to parse test group: $at_group])
1389         at_failed=:
1390       fi
1391       at_fn_group_postprocess
1392       echo >&AT_JOB_FIFO_OUT_FD
1393     ) &
1394     $at_job_control_off
1395     if $at_first; then
1396       at_first=false
1397       exec AT_JOB_FIFO_IN_FD<"$at_job_fifo" AT_JOB_FIFO_OUT_FD>"$at_job_fifo"
1398     fi
1399     shift # Consume one token.
1400     if test $[@%:@] -gt 0; then :; else
1401       read at_token <&AT_JOB_FIFO_IN_FD || break
1402       set x $[*]
1403     fi
1404     test -f "$at_stop_file" && break
1405   done
1406   exec AT_JOB_FIFO_OUT_FD>&-
1407   # Read back the remaining ($at_jobs - 1) tokens.
1408   set X $at_joblist
1409   shift
1410   if test $[@%:@] -gt 0; then
1411     shift
1412     for at_job
1413     do
1414       read at_token
1415     done <&AT_JOB_FIFO_IN_FD
1416   fi
1417   exec AT_JOB_FIFO_IN_FD<&-
1418   wait
1419 else
1420   # Run serially, avoid forks and other potential surprises.
1421   for at_group in $at_groups; do
1422     at_fn_group_prepare
1423     if cd "$at_group_dir" &&
1424        at_fn_test $at_group &&
1425        . "$at_test_source"; then :; else
1426       AS_WARN([unable to parse test group: $at_group])
1427       at_failed=:
1428     fi
1429     at_fn_group_postprocess
1430     test -f "$at_stop_file" && break
1431     at_first=false
1432   done
1435 # Wrap up the test suite with summary statistics.
1436 cd "$at_helper_dir"
1438 # Use ?..???? when the list must remain sorted, the faster * otherwise.
1439 at_pass_list=`for f in */pass; do echo $f; done | sed '/\*/d; s,/pass,,'`
1440 at_skip_list=`for f in */skip; do echo $f; done | sed '/\*/d; s,/skip,,'`
1441 at_xfail_list=`for f in */xfail; do echo $f; done | sed '/\*/d; s,/xfail,,'`
1442 at_xpass_list=`for f in ?/xpass ??/xpass ???/xpass ????/xpass; do
1443                  echo $f; done | sed '/?/d; s,/xpass,,'`
1444 at_fail_list=`for f in ?/fail ??/fail ???/fail ????/fail; do
1445                 echo $f; done | sed '/?/d; s,/fail,,'`
1447 set X $at_pass_list $at_xpass_list $at_xfail_list $at_fail_list $at_skip_list
1448 shift; at_group_count=$[@%:@]
1449 set X $at_xpass_list; shift; at_xpass_count=$[@%:@]; at_xpass_list=$[*]
1450 set X $at_xfail_list; shift; at_xfail_count=$[@%:@]
1451 set X $at_fail_list; shift; at_fail_count=$[@%:@]; at_fail_list=$[*]
1452 set X $at_skip_list; shift; at_skip_count=$[@%:@]
1454 AS_VAR_ARITH([at_run_count], [$at_group_count - $at_skip_count])
1455 AS_VAR_ARITH([at_unexpected_count], [$at_xpass_count + $at_fail_count])
1456 AS_VAR_ARITH([at_total_fail_count], [$at_xfail_count + $at_fail_count])
1458 # Back to the top directory.
1459 cd "$at_dir"
1460 rm -rf "$at_helper_dir"
1462 # Compute the duration of the suite.
1463 at_stop_date=`date`
1464 at_stop_time=`date +%s 2>/dev/null`
1465 AS_ECHO(["$as_me: ending at: $at_stop_date"]) >&AS_MESSAGE_LOG_FD
1466 case $at_start_time,$at_stop_time in
1467   [[0-9]*,[0-9]*])
1468     AS_VAR_ARITH([at_duration_s], [$at_stop_time - $at_start_time])
1469     AS_VAR_ARITH([at_duration_m], [$at_duration_s / 60])
1470     AS_VAR_ARITH([at_duration_h], [$at_duration_m / 60])
1471     AS_VAR_ARITH([at_duration_s], [$at_duration_s % 60])
1472     AS_VAR_ARITH([at_duration_m], [$at_duration_m % 60])
1473     at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
1474     AS_ECHO(["$as_me: test suite duration: $at_duration"]) >&AS_MESSAGE_LOG_FD
1475     ;;
1476 esac
1478 echo
1479 AS_BOX([Test results.])
1480 echo
1482   echo
1483   AS_BOX([Test results.])
1484   echo
1485 } >&AS_MESSAGE_LOG_FD
1488 dnl FIXME: this code is as far from i18n-cleanness as man
1489 dnl could imagine...
1491 if test $at_run_count = 1; then
1492   at_result="1 test"
1493   at_were=was
1494 else
1495   at_result="$at_run_count tests"
1496   at_were=were
1498 if $at_errexit_p && test $at_unexpected_count != 0; then
1499   if test $at_xpass_count = 1; then
1500     at_result="$at_result $at_were run, one passed"
1501   else
1502     at_result="$at_result $at_were run, one failed"
1503   fi
1504   at_result="$at_result unexpectedly and inhibited subsequent tests."
1505   at_color=$at_red
1506 else
1507   # Don't you just love exponential explosion of the number of cases?
1508   at_color=$at_red
1509   case $at_xpass_count:$at_fail_count:$at_xfail_count in
1510     # So far, so good.
1511     0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;;
1512     0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;;
1514     # Some unexpected failures
1515     0:*:0) at_result="$at_result $at_were run,
1516 $at_fail_count failed unexpectedly." ;;
1518     # Some failures, both expected and unexpected
1519     0:*:1) at_result="$at_result $at_were run,
1520 $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
1521     0:*:*) at_result="$at_result $at_were run,
1522 $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
1524     # No unexpected failures, but some xpasses
1525     *:0:*) at_result="$at_result $at_were run,
1526 $at_xpass_count passed unexpectedly." ;;
1528     # No expected failures, but failures and xpasses
1529     *:1:0) at_result="$at_result $at_were run,
1530 $at_unexpected_count did not behave as expected dnl
1531 ($at_fail_count unexpected failure)." ;;
1532     *:*:0) at_result="$at_result $at_were run,
1533 $at_unexpected_count did not behave as expected dnl
1534 ($at_fail_count unexpected failures)." ;;
1536     # All of them.
1537     *:*:1) at_result="$at_result $at_were run,
1538 $at_xpass_count passed unexpectedly,
1539 $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
1540     *:*:*) at_result="$at_result $at_were run,
1541 $at_xpass_count passed unexpectedly,
1542 $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
1543   esac
1545   if test $at_skip_count = 0 && test $at_run_count -gt 1; then
1546     at_result="All $at_result"
1547   fi
1550 # Now put skips in the mix.
1551 case $at_skip_count in
1552   0) ;;
1553   1) at_result="$at_result
1554 1 test was skipped." ;;
1555   *) at_result="$at_result
1556 $at_skip_count tests were skipped." ;;
1557 esac
1559 if test $at_unexpected_count = 0; then
1560   echo "$at_color$at_result$at_std"
1561   echo "$at_result" >&AS_MESSAGE_LOG_FD
1562 else
1563   echo "${at_color}ERROR: $at_result$at_std" >&2
1564   echo "ERROR: $at_result" >&AS_MESSAGE_LOG_FD
1565   {
1566     echo
1567     AS_BOX([Summary of the failures.])
1569     # Summary of failed and skipped tests.
1570     if test $at_fail_count != 0; then
1571       echo "Failed tests:"
1572       $SHELL "$at_myself" $at_fail_list --list
1573       echo
1574     fi
1575     if test $at_skip_count != 0; then
1576       echo "Skipped tests:"
1577       $SHELL "$at_myself" $at_skip_list --list
1578       echo
1579     fi
1580     if test $at_xpass_count != 0; then
1581       echo "Unexpected passes:"
1582       $SHELL "$at_myself" $at_xpass_list --list
1583       echo
1584     fi
1585     if test $at_fail_count != 0; then
1586       AS_BOX([Detailed failed tests.])
1587       echo
1588       for at_group in $at_fail_list
1589       do
1590         at_group_normalized=$at_group
1591         _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
1592         cat "$at_suite_dir/$at_group_normalized/$as_me.log"
1593         echo
1594       done
1595       echo
1596     fi
1597     if test -n "$at_top_srcdir"; then
1598       AS_BOX([${at_top_build_prefix}config.log])
1599       sed 's/^/| /' ${at_top_build_prefix}config.log
1600       echo
1601     fi
1602   } >&AS_MESSAGE_LOG_FD
1604   AS_BOX([$as_me.log was created.])
1606   echo
1607   if $at_debug_p; then
1608     at_msg='per-test log files'
1609   else
1610     at_msg="'${at_testdir+${at_testdir}/}$as_me.log'"
1611   fi
1612   at_msg1a=${at_xpass_list:+', '}
1613   at_msg1=$at_fail_list${at_fail_list:+" failed$at_msg1a"}
1614   at_msg2=$at_xpass_list${at_xpass_list:+" passed unexpectedly"}
1616   AS_ECHO(["Please send $at_msg and all information you think might help:
1618    To: <AT_PACKAGE_BUGREPORT>
1619    Subject: @<:@AT_PACKAGE_STRING@:>@ $as_me: dnl
1620 $at_msg1$at_msg2
1622 You may investigate any problem if you feel able to do so, in which
1623 case the test suite provides a good starting point.  Its output may
1624 be found below '${at_testdir+${at_testdir}/}$as_me.dir'.
1626   exit 1
1629 exit 0
1631 m4_text_box([Actual tests.])
1632 m4_divert_pop([TESTS])dnl
1633 dnl End of AT_INIT: divert to KILL, only test groups are to be
1634 dnl output, the rest is ignored.  Current diversion is BODY, inherited
1635 dnl from M4sh.
1636 m4_divert([KILL])
1637 ])# AT_INIT
1640 # _AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ARGS],[ACTION-IF-GIVEN],
1641 #                [ACTION-IF-NOT-GIVEN])
1642 # ----------------------------------------------------------
1643 # Internal implementation of AT_ARG_OPTION & AT_ARG_OPTION_ARG
1644 m4_defun([_AT_ARG_OPTION],
1645 [m4_divert_once([HELP_OTHER],
1646 [cat <<_ATEOF || at_write_fail=1
1648 Other options:
1649 _ATEOF
1650 ])dnl m4_divert_once HELP_OTHER
1651 m4_divert_text([HELP_OTHER],
1652 [cat <<_ATEOF || at_write_fail=1
1654 _ATEOF])dnl
1655 dnl Turn our options into our desired strings
1656 m4_ifdef([AT_first_option],[m4_undefine([AT_first_option])])dnl
1657 m4_ifdef([AT_case],[m4_undefine([AT_case])])dnl
1658 m4_ifdef([AT_case_no],[m4_undefine([AT_case_no])])dnl
1659 m4_ifdef([AT_case_arg],[m4_undefine([AT_case_arg])])dnl
1660 m4_foreach([AT_option], m4_split(m4_normalize([$1]),[[ \|]+]),
1661 [m4_define_default([AT_first_option],AT_option)dnl
1662 m4_define_default([AT_first_option_tr],
1663                   [m4_bpatsubst(m4_defn([AT_first_option]), -, [_])])dnl
1664 m4_append([AT_case],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option, [ | ])dnl
1665 m4_append([AT_case_no],[--no-]AT_option, [ | ])dnl
1666 m4_append([AT_case_arg],
1667           m4_if(m4_len(AT_option),1,[],[-])[-]AT_option[=*], [ | ])dnl
1668 ])dnl m4_foreach AT_option
1669 dnl keep track so we or the user may process ACTION-IF-NOT-GIVEN
1670 m4_divert_once([PARSE_ARGS_BEGIN],
1673 ## Set up package specific options.
1675 ])dnl
1676 m4_divert_text([PARSE_ARGS_BEGIN],
1677 [dnl Provide a default value for options without arguments.
1678 m4_ifvaln([$3],,[at_arg_[]AT_first_option_tr=false])dnl
1679 at_arg_given_[]AT_first_option_tr=false
1680 ])dnl m4_divert_text DEFAULTS
1681 m4_divert_text([PARSE_ARGS],
1682 [dnl Parse the options and args when necessary.
1683 m4_ifvaln([$3],
1684 [    AT_case )
1685         at_prev=--AT_first_option_tr
1686         ;;
1687     AT_case_arg )
1688         at_arg_[]AT_first_option_tr=$at_optarg
1689         at_arg_given_[]AT_first_option_tr=:
1690         $4
1691         ;;],
1692 [    AT_case )
1693         at_optarg=:
1694         at_arg_[]AT_first_option_tr=:
1695         at_arg_given_[]AT_first_option_tr=:
1696         m4_ifval([$4],[$4])[]dnl
1697         ;;
1698     AT_case_no )
1699         at_optarg=false
1700         at_arg_[]AT_first_option_tr=false
1701         at_arg_given_[]AT_first_option_tr=:
1702         m4_ifval([$4],[$4])[]dnl
1703         ;;])dnl m4_ifvaln $3
1704 ])dnl m4_divert_text PARSE_ARGS
1705 m4_ifvaln([$5],
1706 [m4_divert_once([PARSE_ARGS_END],
1709 ## Process package specific options when _not_ supplied.
1710 ##])dnl m4_divert_once PARSE_ARGS_END
1711 m4_divert_text([PARSE_ARGS_END],
1713 AS_IF([$at_arg_given_[]AT_first_option_tr],,[$5])dnl
1714 ])dnl m4_divert_text PARSE_ARGS_END
1715 ])dnl m4_ifvaln $5
1716 ])dnl _AT_ARG_OPTION
1719 # AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
1720 # ------------------------------------------------------------------------
1721 # Accept a list of space-separated OPTIONS, all aliases of the first one.
1722 # Add HELP-TEXT to the HELP_OTHER diversion.
1724 # Leading dashes should not be passed in OPTIONS.  Users will be required
1725 # to pass '--' before long options and '-' before single character options.
1727 # $at_arg_OPTION will be set to ':' if this option is received, 'false' if
1728 # if --no-OPTION is received, and 'false' by default.
1730 # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered; here,
1731 # $at_optarg will be set to ':' or 'false' as appropriate.  $at_optarg is
1732 # actually just a copy of $at_arg_OPTION.
1734 # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete and
1735 # if no option from OPTIONS was used.
1736 m4_defun([AT_ARG_OPTION],[_AT_ARG_OPTION([$1],[$2],,[$3],[$4])])
1739 # AT_ARG_OPTION_ARG(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
1740 # ----------------------------------------------------------------------------
1741 # Accept a set of space-separated OPTIONS with arguments, all aliases of the
1742 # first one.  Add HELP-TEXT to the HELP_OTHER diversion.
1744 # Leading dashes should not be passed in OPTIONS.  Users will be required
1745 # to pass '--' before long options and '-' before single character options.
1747 # By default, any argument to these options will be assigned to the shell
1748 # variable $at_arg_OPTION, where OPTION is the first option in OPTIONS with
1749 # any '-' characters replaced with '_'.
1751 # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered; here,
1752 # $at_optarg will be set to the option argument.  $at_optarg is actually just
1753 # a copy of $at_arg_OPTION.
1755 # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
1756 # and if no option from OPTIONS was used.
1757 m4_defun([AT_ARG_OPTION_ARG],[_AT_ARG_OPTION([$1],[$2],1,[$3],[$4])])
1760 # AT_TESTED(PROGRAMS)
1761 # -------------------
1762 # Specify the list of programs exercised by the test suite.  Their
1763 # versions are logged, and in the case of embedded test suite, they
1764 # must correspond to the version of the package.  PATH should be
1765 # already preset so the proper executable will be selected.
1766 m4_defun([AT_TESTED],
1767 [m4_require([_AT_TESTED])]dnl
1768 [m4_foreach_w([AT_test], [$1],
1769   [m4_append_uniq([AT_tested], "m4_defn([AT_test])", [ ])])])
1771 m4_defun([_AT_TESTED],
1772 [m4_wrap([m4_divert_text([DEFAULTS],
1773 [# List of the tested programs.
1774 at_tested='m4_translit(m4_dquote(m4_defn([AT_tested])), [ ], m4_newline)'
1775 ])]dnl
1776 [m4_divert_text([PREPARE_TESTS],
1778   AS_BOX([Tested programs.])
1779   echo
1780 } >&AS_MESSAGE_LOG_FD
1782 # Report what programs are being tested.
1783 for at_program in : `eval echo $at_tested`
1785   AS_CASE([$at_program],
1786     [:], [continue],
1787     [[[\\/]* | ?:[\\/]*]], [at_program_=$at_program],
1788     [_AS_PATH_WALK([$PATH], [test -f "$as_dir$at_program" && break])
1789     at_program_=$as_dir$at_program])
1791   if test -f "$at_program_"; then
1792     {
1793       AS_ECHO(["$at_srcdir/AT_LINE: $at_program_ --version"])
1794       "$at_program_" --version </dev/null
1795       echo
1796     } >&AS_MESSAGE_LOG_FD 2>&1
1797   else
1798     AS_ERROR([cannot find $at_program])
1799   fi
1800 done
1801 ])])])
1804 # AT_PREPARE_TESTS(SHELL-CODE)
1805 # ----------------------------
1806 # Execute @var{shell-code} in the main testsuite process,
1807 # after initializing the test suite and processing command-line options,
1808 # but before running any tests.
1809 m4_define([AT_PREPARE_TESTS],
1810 [m4_divert_once([PREPARE_TESTS],
1811 [m4_text_box([Prepare for this testsuite.])
1812 ])]dnl
1813 [m4_divert_text([PREPARE_TESTS], [$1])])
1816 # AT_PREPARE_EACH_TEST([SHELL-CODE])
1817 # ----------------------------------
1818 # Execute @var{shell-code} in each test group's subshell,
1819 # at the point of the AT_SETUP that starts each test group.
1820 m4_define([AT_PREPARE_EACH_TEST],
1821 [m4_append([AT_prepare_each_test], [$1], [
1822 ])])
1825 # AT_TEST_HELPER_FN(NAME, ARGS, DESCRIPTION, CODE)
1826 # ------------------------------------------------
1827 # Define a shell function that will be available to the code for each test
1828 # group.  Its name will be ath_fn_NAME, and its body will be CODE.
1830 # Implementation note: you might think this would use AT_PREPARE_EACH_TEST,
1831 # but shell functions defined in AT_PREPARE_TESTS *are* (currently) available
1832 # to test group subshells, and this way the code is only emitted once, not
1833 # once for each test group.
1834 m4_define([AT_TEST_HELPER_FN],
1835 [AS_LITERAL_WORD_IF([$1], [],
1836   [m4_fatal([invalid shell function name "$1"])])]dnl
1837 [m4_ifdef([ATH_fn_$1_defined],
1838   [m4_fatal([helper function "$1" defined twice])])]dnl
1839 [m4_define([ATH_fn_$1_defined])]dnl
1840 [AT_PREPARE_TESTS([
1841 AS_FUNCTION_DESCRIBE([ath_fn_$1], [$2], [$3])
1842 ath_fn_$1 ()
1844   $4
1846 ])])
1849 # AT_COPYRIGHT(TEXT, [FILTER = m4_newline])
1850 # -----------------------------------------
1851 # Emit TEXT, a copyright notice, in the top of the test suite and in
1852 # --version output.  Macros in TEXT are evaluated once.  Process
1853 # the --version output through FILTER (m4_newline, m4_do, and
1854 # m4_copyright_condense are common filters).
1855 m4_define([AT_COPYRIGHT],
1856 [AS_COPYRIGHT([$1])[]]dnl
1857 [m4_divert_text([VERSION_NOTICES],
1858 [m4_default([$2], [m4_newline])([$1])])])# AT_COPYRIGHT
1861 # AT_COLOR_TESTS
1862 # --------------
1863 # Enable colored test results if standard error is connected to a terminal.
1864 m4_define([AT_COLOR_TESTS],
1865 [m4_define([AT_color], [auto])])
1867 # AT_SETUP(DESCRIPTION)
1868 # ---------------------
1869 # Start a group of related tests, all to be executed in the same subshell.
1870 # The group is testing what DESCRIPTION says.
1871 _AT_DEFINE_INIT([AT_SETUP],
1872 [m4_ifdef([AT_ingroup], [m4_fatal([$0: nested AT_SETUP detected])],
1873   [m4_define([AT_ingroup], [AS_ECHO(["$at_setup_line"]) >"$at_check_line_file"
1874 ])])
1875 m4_ifdef([AT_keywords], [m4_undefine([AT_keywords])])
1876 m4_define([AT_capture_files], [])
1877 m4_define([AT_line], AT_LINE)
1878 m4_define([AT_xfail], [at_xfail=no])
1879 m4_define([AT_description], m4_expand([$1]))
1880 m4_define([AT_ordinal], m4_incr(AT_ordinal))
1881 m4_divert_push([TEST_GROUPS])dnl
1882 [#AT_START_]AT_ordinal
1883 at_fn_group_banner AT_ordinal 'm4_defn([AT_line])' \
1884   "AS_ESCAPE(m4_dquote(m4_defn([AT_description])))" m4_format(["%*s"],
1885   m4_max(0, m4_eval(47 - m4_qlen(m4_defn([AT_description])))), [])m4_if(
1886   AT_banner_ordinal, [0], [], [ AT_banner_ordinal])
1887 m4_ifset([AT_prepare_each_test], [AT_prepare_each_test
1888 ])dnl
1889 m4_divert_push([TEST_SCRIPT])dnl
1893 # AT_FAIL_IF(SHELL-EXPRESSION)
1894 # ----------------------------
1895 # Make the test die with hard failure if SHELL-EXPRESSION evaluates to
1896 # true (exitcode = 0).
1897 _AT_DEFINE_SETUP([AT_FAIL_IF],
1898 [dnl
1899 dnl Try to limit the amount of conditionals that we emit.
1900 m4_case([$1],
1901       [], [],
1902       [false], [],
1903       [:], [_AT_CHECK_EXIT([], [99])],
1904       [true], [_AT_CHECK_EXIT([], [99])],
1905       [_AT_CHECK_EXIT([$1], [99])])])
1908 # AT_SKIP_IF(SHELL-EXPRESSION)
1909 # ----------------------------
1910 # Skip the rest of the group if SHELL-EXPRESSION evaluates to true
1911 # (exitcode = 0).
1912 _AT_DEFINE_SETUP([AT_SKIP_IF],
1913 [dnl
1914 dnl Try to limit the amount of conditionals that we emit.
1915 m4_case([$1],
1916       [], [],
1917       [false], [],
1918       [:], [_AT_CHECK_EXIT([], [77])],
1919       [true], [_AT_CHECK_EXIT([], [77])],
1920       [_AT_CHECK_EXIT([$1], [77])])])
1923 # AT_XFAIL_IF(SHELL-EXPRESSION)
1924 # -----------------------------
1925 # Set up the test to be expected to fail if SHELL-EXPRESSION evaluates to
1926 # true (exitcode = 0).
1927 _AT_DEFINE_SETUP([AT_XFAIL_IF],
1928 [dnl
1929 dnl Try to limit the amount of conditionals that we emit.
1930 m4_case([$1],
1931       [], [],
1932       [false], [],
1933       [:], [m4_define([AT_xfail], [at_xfail=yes])],
1934       [true], [m4_define([AT_xfail], [at_xfail=yes])],
1935       [m4_append([AT_xfail], [
1936       $1 && at_xfail=yes])])])
1939 # AT_KEYWORDS(KEYWORDS)
1940 # ---------------------
1941 # Declare a list of keywords associated to the current test group.
1942 # Since the -k option is case-insensitive, the list is stored in lower case
1943 # to avoid duplicates that differ only by case.
1944 _AT_DEFINE_SETUP([AT_KEYWORDS],
1945 [m4_append_uniq_w([AT_keywords], m4_tolower(_m4_expand([$1
1946 ])))])
1949 # AT_CAPTURE_FILE(FILE)
1950 # ---------------------
1951 # If the current test group does not behave as expected, save the contents of
1952 # FILE in the test suite log.
1953 _AT_DEFINE_SETUP([AT_CAPTURE_FILE],
1954 [m4_append_uniq([AT_capture_files], ["$1"], [ \
1955 ])])
1958 # AT_CLEANUP
1959 # ----------
1960 # Complete a group of related tests.
1961 _AT_DEFINE_INIT([AT_CLEANUP],
1962 [m4_ifdef([AT_ingroup], [AT_ingroup[]_m4_undefine([AT_ingroup])],
1963   [m4_fatal([$0: missing AT_SETUP detected])])dnl
1964 m4_append([AT_help_all],
1965 m4_defn([AT_ordinal]);m4_defn([AT_line]);m4_defn([AT_description]);dnl
1966 m4_ifdef([AT_keywords], [m4_defn([AT_keywords])]);
1967 )dnl
1968 m4_divert_pop([TEST_SCRIPT])dnl Back to TEST_GROUPS
1969 AT_xfail
1971   AS_ECHO(["AT_ordinal. $at_setup_line: testing $at_desc ..."])
1972   $at_traceon
1973 m4_undivert([TEST_SCRIPT])dnl Insert the code here
1974   set +x
1975   $at_times_p && times >"$at_times_file"
1976 ) AS_MESSAGE_LOG_FD>&1 2>&1 AT_JOB_FIFO_OUT_FD>&- | eval $at_tee_pipe
1977 read at_status <"$at_status_file"
1978 [#AT_STOP_]AT_ordinal
1979 m4_divert_pop([TEST_GROUPS])dnl Back to KILL.
1980 ])# AT_CLEANUP
1983 # AT_BANNER([TEXT])
1984 # -----------------
1985 # Start a category of related test groups.  If multiple groups are executed,
1986 # output TEXT as a banner without any shell expansion, prior to any test
1987 # from the category.  If TEXT is empty, no banner is printed.
1988 _AT_DEFINE_INIT([AT_BANNER],
1989 [m4_ifdef([AT_ingroup], [m4_fatal([$0: nested AT_SETUP detected])])dnl
1990 m4_define([AT_banner_ordinal], m4_incr(AT_banner_ordinal))
1991 m4_divert_text([BANNERS],
1992 [@%:@ Banner AT_banner_ordinal. AT_LINE
1993 @%:@ Category starts at test group m4_incr(AT_ordinal).
1994 at_banner_text_[]AT_banner_ordinal="AS_ESCAPE([$1])"])dnl
1995 ])# AT_BANNER
1998 # AT_DATA_UNQUOTED(FILE, CONTENTS)
1999 # -----------------------
2000 # Initialize an input data FILE with given CONTENTS, which should be
2001 # empty or end with a newline.
2002 # This macro is not robust to active symbols in CONTENTS *on purpose*.
2003 # If you don't want CONTENTS to be evaluated, quote it twice.
2004 # In addition, it does not quote shell variables.  For example, it
2005 # can be used to generate data files containing a carriage return.
2006 _AT_DEFINE_SETUP([AT_DATA_UNQUOTED],
2007 [m4_if([$2], [], [: >$1],
2008        [$2], [[]], [: >$1],
2009 [cat >$1 <<_ATEOF
2010 $2[]_ATEOF
2011 ])])
2014 # AT_DATA(FILE, CONTENTS)
2015 # -----------------------
2016 # Initialize an input data FILE with given CONTENTS, which should be
2017 # empty or end with a newline.
2018 # This macro is not robust to active symbols in CONTENTS *on purpose*.
2019 # If you don't want CONTENTS to be evaluated, quote it twice.
2020 _AT_DEFINE_SETUP([AT_DATA],
2021 [m4_if([$2], [], [: >$1],
2022        [$2], [[]], [: >$1],
2023 [cat >$1 <<'_ATEOF'
2024 $2[]_ATEOF
2025 ])])
2028 # AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
2029 #          [RUN-IF-FAIL], [RUN-IF-PASS])
2030 # ------------------------------------------------
2031 # Execute a test by performing given shell COMMANDS.  These commands
2032 # should normally exit with STATUS, while producing expected STDOUT and
2033 # STDERR contents.  Shell metacharacters in STDOUT and STDERR are
2034 # _not_ processed by the shell, but are treated as string literals.
2036 # STATUS, STDOUT, and STDERR are not checked if equal to 'ignore'.
2038 # If STDOUT is 'expout', then stdout is compared to the content of the file
2039 # 'expout'.  Likewise for STDERR and 'experr'.
2041 # If STDOUT is 'stdout', then the stdout is left in the file 'stdout',
2042 # likewise for STDERR and 'stderr'.  Don't do this:
2044 #    AT_CHECK([command >out])
2045 #    # Some checks on 'out'
2047 # do this instead:
2049 #    AT_CHECK([command], [], [stdout])
2050 #    # Some checks on 'stdout'
2052 # You might wonder why you can't just use 'ignore', then directly use stdout
2053 # and stderr left by the test suite:
2055 #    AT_CHECK([command], [], [ignore])
2056 #    AT_CHECK([check stdout])
2058 # If the test suite always captured data in the file 'stdout', then the
2059 # second command would be trying to read and write from the same file, with
2060 # undefined behavior.  Therefore, the test suite actually captures data in
2061 # an internal file of a different name, and only creates 'stdout' when
2062 # explicitly requested.
2064 # Any line of stderr starting with leading blanks and a '+' are filtered
2065 # out, since most shells when tracing include subshell traces in stderr.
2066 # This may cause spurious failures when the test suite is run with '-x'.
2068 _AT_DEFINE_SETUP([AT_CHECK],
2069 [_AT_CHECK(m4_expand([$1]), [$2], AS_ESCAPE(m4_dquote(m4_expand([$3]))),
2070   AS_ESCAPE(m4_dquote(m4_expand([$4]))), [$5], [$6])])
2072 # AT_CHECK_UNQUOTED(COMMANDS, [STATUS = 0], STDOUT, STDERR,
2073 #                   [RUN-IF-FAIL], [RUN-IF-PASS])
2074 # ---------------------------------------------------------
2075 # Like AT_CHECK, but do not AS_ESCAPE shell metacharacters in the STDOUT
2076 # and STDERR arguments before running the comparison.
2077 _AT_DEFINE_SETUP([AT_CHECK_UNQUOTED],
2078 [_AT_CHECK(m4_expand([$1]), [$2], AS_ESCAPE(m4_dquote(m4_expand([$3])), [""]),
2079   AS_ESCAPE(m4_dquote(m4_expand([$4])), [""]), [$5], [$6])])
2081 # AT_CHECK_NOESCAPE(COMMANDS, [STATUS = 0], STDOUT, STDERR,
2082 #                   [RUN-IF-FAIL], [RUN-IF-PASS])
2083 # ---------------------------------------------------------
2084 # Obsolete spelling of AT_CHECK_UNQUOTED.
2085 m4_define([AT_CHECK_NOESCAPE],
2086 [m4_warn([obsolete], [consider using AT_CHECK_UNQUOTED instead of $0])]dnl
2087 [_AT_CHECK(m4_expand([$1]), [$2], m4_expand([$3]),
2088   m4_expand([$4]), [$5], [$6])])
2091 # _AT_DECIDE_TRACEABLE(COMMANDS)
2092 # ------------------------------
2093 # Worker for _AT_CHECK that expands to shell code.  If COMMANDS are safe to
2094 # trace with 'set -x', the shell code will evaluate to true.  Otherwise,
2095 # the shell code will print a message stating an aspect of COMMANDS that makes
2096 # tracing them unsafe, and evaluate to false.
2098 # Tracing COMMANDS is not safe if they contain a command that spans multiple
2099 # lines.  When the test suite user passes '-x' or '--trace', the test suite
2100 # precedes every command with a 'set -x'.  Since most tests expect a specific
2101 # stderr, if only to confirm that it is empty, the test suite filters ^+ from
2102 # the captured stderr before comparing with the expected stderr.  If a command
2103 # spans multiple lines, so will its trace, but a '+' only prefixes the first
2104 # line of that trace:
2106 # $ echo 'foo
2107 # bar'
2108 # => stdout
2109 # foo
2110 # bar
2111 # => stderr
2112 # + foo
2113 # bar
2115 # In a subset of cases, one could filter such extended shell traces from
2116 # stderr.  Since test commands spanning several lines are rare, I chose
2117 # instead to simply not trace COMMANDS that could yield multiple trace lines.
2118 # Distinguishing such COMMANDS became the task at hand.
2120 # These features may cause a shell command to span multiple lines:
2122 # (a) A quoted literal newline.
2123 # Example:
2124 #   echo foo'
2125 #   'bar
2126 # M4 is a hostile language for the job of parsing COMMANDS to determine whether
2127 # each literal newline is quoted, so we simply disable tracing for all COMMANDS
2128 # that bear literal newlines.
2130 # (b) A command substitution not subject to word splitting.
2131 # Example:
2132 #   var=$(printf 'foo\nbar')
2133 # Example:
2134 #   echo "`printf 'foo\\nbar`"
2135 # One cannot know in general the number of lines a command substitution will
2136 # yield without executing the substituted command.  As such, we disable tracing
2137 # for all COMMANDS containing these constructs.
2139 # (c) A parameter expansion not subject to word splitting.
2140 # Example:
2141 #   var=foo'
2142 #   'bar
2143 #   echo "$var"
2144 # Parameter expansions appear in COMMANDS with much greater frequency than do
2145 # newlines and command substitutions, so disabling tracing for all such
2146 # COMMANDS would much more substantially devalue 'testsuite -x'.  To determine
2147 # which parameter expansions yield multiple lines, we escape all '`', '"',
2148 # and '\' in a copy of COMMANDS and expand that string within double quotes
2149 # at runtime.  If the result of that expansion contains multiple lines, the
2150 # test suite disables tracing for the command in question.
2152 # This method leads the test suite to expand some parameters that the shell
2153 # itself will never expand due to single-quotes or backslash escapes.  This is
2154 # not a problem for '$foo' expansions, which will simply yield the empty string
2155 # or some unrelated value.  A '${...}' expansion could actually form invalid
2156 # shell code, however; consider '${=foo}'.  Therefore, we disable tracing for
2157 # all COMMANDS containing '${...}'.  This affects few COMMANDS.
2159 # This macro falls in a very hot path; the Autoconf test suite expands it 1640
2160 # times as of this writing.  To give a sense of the impact of the heuristics I
2161 # just described, the test suite preemptively disables tracing for 31 of those,
2162 # and 268 contain parameter expansions that require runtime evaluation.  The
2163 # balance are always safe to trace.
2164 m4_define([_AT_DECIDE_TRACEABLE],
2165 dnl Utility macro.
2167 dnl Examine COMMANDS for a reason to never trace COMMANDS.
2168 [m4_pushdef([at_reason],
2169 m4_cond([m4_eval(m4_index([$1], [`]) >= 0)], [1],
2170                 [[a `...` command substitution]],
2171         [m4_eval(m4_index([$1], [$(]) >= 0)], [1],
2172                 [[a $(...) command substitution]],
2173         [m4_eval(m4_index([$1], [${]) >= 0)], [1],
2174                 [[a ${...} parameter expansion]],
2175         [m4_eval(m4_index([$1], m4_newline) >= 0)], [1],
2176                 [[an embedded newline]],
2177         [m4_eval(m4_bregexp([$1], [[^|]|[^|]]) >= 0)], [1],
2178                 [[a shell pipeline]],
2179         []))]dnl No reason.
2180 [m4_if(m4_index(_m4_defn([at_reason]), [a]), [0],]dnl
2181 dnl We know at build time that tracing COMMANDS is never safe.
2182 [[at_fn_check_prepare_notrace '_m4_defn([at_reason])'],
2183        m4_index([$1], [$]), [-1],]dnl
2184 dnl We know at build time that tracing COMMANDS is always safe.
2185 [[at_fn_check_prepare_trace],]dnl
2186 dnl COMMANDS may contain parameter expansions; expand them at runtime.
2187 [[at_fn_check_prepare_dynamic "AS_ESCAPE([[$1]], [`\"])"])[]]dnl
2188 [_m4_popdef([at_reason])])
2191 # AT_DIFF_STDERR/AT_DIFF_STDOUT
2192 # -----------------------------
2193 # These are subroutines of AT_CHECK.  Using indirect dispatch is a tad
2194 # faster than using m4_case, and these are called very frequently.
2195 m4_define([AT_DIFF_STDERR(stderr)],
2196           [echo stderr:; tee stderr <"$at_stderr"])
2197 m4_define([AT_DIFF_STDERR(stderr-nolog)],
2198           [echo stderr captured; cp "$at_stderr" stderr])
2199 m4_define([AT_DIFF_STDERR(ignore)],
2200           [echo stderr:; cat "$at_stderr"])
2201 m4_define([AT_DIFF_STDERR(ignore-nolog)])
2202 m4_define([AT_DIFF_STDERR(experr)],
2203           [$at_diff experr "$at_stderr" || at_failed=:])
2204 m4_define([AT_DIFF_STDERR()],
2205           [at_fn_diff_devnull "$at_stderr" || at_failed=:])
2207 m4_define([AT_DIFF_STDOUT(stdout)],
2208           [echo stdout:; tee stdout <"$at_stdout"])
2209 m4_define([AT_DIFF_STDOUT(stdout-nolog)],
2210           [echo stdout captured; cp "$at_stdout" stdout])
2211 m4_define([AT_DIFF_STDOUT(ignore)],
2212           [echo stdout:; cat "$at_stdout"])
2213 m4_define([AT_DIFF_STDOUT(ignore-nolog)])
2214 m4_define([AT_DIFF_STDOUT(expout)],
2215           [$at_diff expout "$at_stdout" || at_failed=:])
2216 m4_define([AT_DIFF_STDOUT()],
2217           [at_fn_diff_devnull "$at_stdout" || at_failed=:])
2219 # _AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
2220 #           [RUN-IF-FAIL], [RUN-IF-PASS])
2221 # -------------------------------------------------
2222 # Worker for AT_CHECK and AT_CHECK_UNQUOTED, with COMMANDS, STDOUT, and
2223 # STDERR pre-expanded.
2225 # Implementation Details
2226 # ----------------------
2227 # Ideally, we would like to run
2229 #    ( $at_traceon; COMMANDS >at-stdout 2> at-stderr )
2231 # but we must group COMMANDS as it is not limited to a single command, and
2232 # then the shells will save the traces in at-stderr. So we have to filter
2233 # them out when checking stderr, and we must send them into the test suite's
2234 # stderr to honor -x properly. Since only the first line of the trace of a
2235 # multiline command starts with a '+', and I know of no straightforward way to
2236 # filter out the unadorned trace lines, we disable shell tracing entirely for
2237 # commands that could span multiple lines.
2239 # Limiting COMMANDS to a single command is not good either, since then
2240 # the user herself would use {} or (), and then we face the same problem.
2242 # But then, there is no point in running
2244 #   ( $at_traceon { $1 ; } >at-stdout 2>at-stder1 )
2246 # instead of the simpler
2248 #  ( $at_traceon; $1 ) >at-stdout 2>at-stder1
2250 # Note that we truncate and append to the output files, to avoid losing
2251 # output from multiple concurrent processes, e.g., an inner testsuite
2252 # with parallel jobs.
2253 m4_define([_AT_CHECK],
2254 [m4_define([AT_ingroup])]dnl
2255 [{ set +x
2256 AS_ECHO(["$at_srcdir/AT_LINE: AS_ESCAPE([[$1]])"])
2257 _AT_DECIDE_TRACEABLE([$1]) _AT_LINE_ESCAPED
2258 ( $at_check_trace; [$1]
2259 ) >>"$at_stdout" 2>>"$at_stderr" AS_MESSAGE_LOG_FD>&-
2260 at_status=$? at_failed=false
2261 $at_check_filter
2262 m4_ifdef([AT_DIFF_STDERR($4)], [m4_indir([AT_DIFF_STDERR($4)])],
2263   [echo >>"$at_stderr"; AS_ECHO([["$4"]]) | \
2264   $at_diff - "$at_stderr" || at_failed=:])
2265 m4_ifdef([AT_DIFF_STDOUT($3)], [m4_indir([AT_DIFF_STDOUT($3)])],
2266   [echo >>"$at_stdout"; AS_ECHO([["$3"]]) | \
2267   $at_diff - "$at_stdout" || at_failed=:])
2268 m4_if([$2], [ignore], [at_fn_check_skip],
2269   [at_fn_check_status m4_default([$2], [0])]) $at_status "$at_srcdir/AT_LINE"
2270 m4_ifvaln([$5$6], [AS_IF($at_failed, [$5], [$6])])]dnl
2271 [$at_failed && at_fn_log_failure AT_capture_files
2272 $at_traceon; }
2273 ])# _AT_CHECK
2275 # _AT_CHECK_EXIT(COMMANDS, [EXIT-STATUS-IF-PASS])
2276 # -----------------------------------------------
2277 # Minimal version of _AT_CHECK for AT_SKIP_IF and AT_FAIL_IF.
2278 m4_define([_AT_CHECK_EXIT],
2279 [m4_define([AT_ingroup])]dnl
2280 [AS_ECHO(_AT_LINE_ESCAPED) >"$at_check_line_file"
2281 m4_ifval([$1], [($1) \
2282   && ])at_fn_check_skip $2 "$at_srcdir/AT_LINE"])# _AT_CHECK_EXIT