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