| 1 | # This file is part of Autoconf. -*- Autoconf -*-
|
|---|
| 2 | # M4 macros used in building test suites.
|
|---|
| 3 |
|
|---|
| 4 | # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
|
|---|
| 5 | # Foundation, Inc.
|
|---|
| 6 |
|
|---|
| 7 | # This program is free software; you can redistribute it and/or modify
|
|---|
| 8 | # it under the terms of the GNU General Public License as published by
|
|---|
| 9 | # the Free Software Foundation; either version 2, or (at your option)
|
|---|
| 10 | # any later version.
|
|---|
| 11 | #
|
|---|
| 12 | # This program is distributed in the hope that it will be useful,
|
|---|
| 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 15 | # GNU General Public License for more details.
|
|---|
| 16 | #
|
|---|
| 17 | # You should have received a copy of the GNU General Public License
|
|---|
| 18 | # along with this program; if not, write to the Free Software
|
|---|
| 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|---|
| 20 | # 02110-1301, USA.
|
|---|
| 21 |
|
|---|
| 22 | # As a special exception, the Free Software Foundation gives unlimited
|
|---|
| 23 | # permission to copy, distribute and modify the configure scripts that
|
|---|
| 24 | # are the output of Autoconf. You need not follow the terms of the GNU
|
|---|
| 25 | # General Public License when using or distributing such scripts, even
|
|---|
| 26 | # though portions of the text of Autoconf appear in them. The GNU
|
|---|
| 27 | # General Public License (GPL) does govern all other use of the material
|
|---|
| 28 | # that constitutes the Autoconf program.
|
|---|
| 29 | #
|
|---|
| 30 | # Certain portions of the Autoconf source text are designed to be copied
|
|---|
| 31 | # (in certain cases, depending on the input) into the output of
|
|---|
| 32 | # Autoconf. We call these the "data" portions. The rest of the Autoconf
|
|---|
| 33 | # source text consists of comments plus executable code that decides which
|
|---|
| 34 | # of the data portions to output in any given case. We call these
|
|---|
| 35 | # comments and executable code the "non-data" portions. Autoconf never
|
|---|
| 36 | # copies any of the non-data portions into its output.
|
|---|
| 37 | #
|
|---|
| 38 | # This special exception to the GPL applies to versions of Autoconf
|
|---|
| 39 | # released by the Free Software Foundation. When you make and
|
|---|
| 40 | # distribute a modified version of Autoconf, you may extend this special
|
|---|
| 41 | # exception to the GPL to apply to your modified version as well, *unless*
|
|---|
| 42 | # your modified version has the potential to copy into its output some
|
|---|
| 43 | # of the text that was the non-data portion of the version that you started
|
|---|
| 44 | # with. (In other words, unless your change moves or copies text from
|
|---|
| 45 | # the non-data portions to the data portions.) If your modification has
|
|---|
| 46 | # such potential, you must delete any notice of this special exception
|
|---|
| 47 | # to the GPL from your modified version.
|
|---|
| 48 |
|
|---|
| 49 | # _m4_divert(DIVERSION-NAME)
|
|---|
| 50 | # --------------------------
|
|---|
| 51 | # Convert a diversion name into its number. Otherwise, return
|
|---|
| 52 | # DIVERSION-NAME which is supposed to be an actual diversion number.
|
|---|
| 53 | # Of course it would be nicer to use m4_case here, instead of zillions
|
|---|
| 54 | # of little macros, but it then takes twice longer to run `autoconf'!
|
|---|
| 55 | #
|
|---|
| 56 | # From M4sugar:
|
|---|
| 57 | # -1. KILL
|
|---|
| 58 | # 10000. GROW
|
|---|
| 59 | #
|
|---|
| 60 | # From M4sh:
|
|---|
| 61 | # 0. BINSH
|
|---|
| 62 | # 1. HEADER-REVISION
|
|---|
| 63 | # 2. HEADER-COMMENT
|
|---|
| 64 | # 3. HEADER-COPYRIGHT
|
|---|
| 65 | # 4. M4SH-SANITIZE
|
|---|
| 66 | # 5. M4SH-INIT
|
|---|
| 67 | # 1000. BODY
|
|---|
| 68 | #
|
|---|
| 69 | # Defined below:
|
|---|
| 70 | # - DEFAULTS
|
|---|
| 71 | # Overall initialization, value of $at_groups_all.
|
|---|
| 72 | # - PARSE_ARGS_BEGIN
|
|---|
| 73 | # Setup defaults required for option processing.
|
|---|
| 74 | # - PARSE_ARGS
|
|---|
| 75 | # Option processing. After AT_INIT, user options can be entered here as
|
|---|
| 76 | # cases of a case statement.
|
|---|
| 77 | # - PARSE_ARGS_END
|
|---|
| 78 | # Finish up the option processing.
|
|---|
| 79 | #
|
|---|
| 80 | # - HELP
|
|---|
| 81 | # Start printing the help message.
|
|---|
| 82 | # - HELP_MODES
|
|---|
| 83 | # Modes help text. Additional modes can be appended as self-contained
|
|---|
| 84 | # cat'd here-docs as generated by AS_HELP_STRING.
|
|---|
| 85 | # - HELP_TUNING
|
|---|
| 86 | # Tuning help text. Additional tuning options can be appended as
|
|---|
| 87 | # self-contained cat'd here-docs as generated by AS_HELP_STRING.
|
|---|
| 88 | # - HELP_OTHER
|
|---|
| 89 | # User help can be appended to this as self-contained cat'd here-docs.
|
|---|
| 90 | # - HELP_END
|
|---|
| 91 | # Finish up the help texts.
|
|---|
| 92 | #
|
|---|
| 93 | # - VERSION
|
|---|
| 94 | # Head of the handling of --version.
|
|---|
| 95 | # - VERSION_NOTICES
|
|---|
| 96 | # Copyright notices for --version.
|
|---|
| 97 | # - VERSION_END
|
|---|
| 98 | # Tail of the handling of --version.
|
|---|
| 99 | #
|
|---|
| 100 | # - PREPARE_TESTS
|
|---|
| 101 | # Like DEFAULTS but run after argument processing for purposes of
|
|---|
| 102 | # optimization. Do anything else that needs to be done to prepare for
|
|---|
| 103 | # tests. Sets up verbose and log file descriptors. Sets and logs PATH.
|
|---|
| 104 | # - TESTS
|
|---|
| 105 | # The core of the test suite.
|
|---|
| 106 | # - TESTS_END
|
|---|
| 107 | # tail of the core for;case, overall wrap up, generation of debugging
|
|---|
| 108 | # scripts and statistics.
|
|---|
| 109 | # - TEST_SCRIPT
|
|---|
| 110 | # The code for each test, the ``normal'' diversion
|
|---|
| 111 |
|
|---|
| 112 | m4_define([_m4_divert(DEFAULTS)], 100)
|
|---|
| 113 | m4_define([_m4_divert(PARSE_ARGS_BEGIN)], 200)
|
|---|
| 114 | m4_define([_m4_divert(PARSE_ARGS)], 201)
|
|---|
| 115 | m4_define([_m4_divert(PARSE_ARGS_END)], 202)
|
|---|
| 116 | m4_define([_m4_divert(HELP)], 300)
|
|---|
| 117 | m4_define([_m4_divert(HELP_MODES)], 301)
|
|---|
| 118 | m4_define([_m4_divert(HELP_TUNING)], 302)
|
|---|
| 119 | m4_define([_m4_divert(HELP_OTHER)], 303)
|
|---|
| 120 | m4_define([_m4_divert(HELP_END)], 304)
|
|---|
| 121 | m4_define([_m4_divert(VERSION)], 350)
|
|---|
| 122 | m4_define([_m4_divert(VERSION_NOTICES)], 351)
|
|---|
| 123 | m4_define([_m4_divert(VERSION_END)], 352)
|
|---|
| 124 | m4_define([_m4_divert(PREPARE_TESTS)], 400)
|
|---|
| 125 | m4_define([_m4_divert(TESTS)], 401)
|
|---|
| 126 | m4_define([_m4_divert(TESTS_END)], 402)
|
|---|
| 127 | m4_define([_m4_divert(TEST_SCRIPT)], 403)
|
|---|
| 128 |
|
|---|
| 129 |
|
|---|
| 130 | # AT_LINE
|
|---|
| 131 | # -------
|
|---|
| 132 | # Return the current file sans directory, a colon, and the current
|
|---|
| 133 | # line. Be sure to return a _quoted_ file name, so if, for instance,
|
|---|
| 134 | # the user is lunatic enough to have a file named `dnl' (and I, for
|
|---|
| 135 | # one, love to be brainless and stubborn sometimes), then we return a
|
|---|
| 136 | # quoted name.
|
|---|
| 137 | #
|
|---|
| 138 | # Gee, we can't use simply
|
|---|
| 139 | #
|
|---|
| 140 | # m4_bpatsubst(__file__, [^.*/\(.*\)], [[\1]])
|
|---|
| 141 | #
|
|---|
| 142 | # since then, since `dnl' doesn't match the pattern, it is returned
|
|---|
| 143 | # with once quotation level less, so you lose! And since GNU M4
|
|---|
| 144 | # is one of the biggest junk in the whole universe wrt regexp, don't
|
|---|
| 145 | # even think about using `?' or `\?'. Bah, `*' will do.
|
|---|
| 146 | # Pleeeeeeeease, Gary, provide us with dirname and ERE!
|
|---|
| 147 | m4_define([AT_LINE],
|
|---|
| 148 | [m4_bpatsubst(__file__, [^\(.*/\)*\(.*\)], [[\2]]):__line__])
|
|---|
| 149 |
|
|---|
| 150 |
|
|---|
| 151 | # _AT_NORMALIZE_TEST_GROUP_NUMBER(SHELL-VAR)
|
|---|
| 152 | # ------------------------------------------
|
|---|
| 153 | # Normalize SHELL-VAR so that its value has the same number of digits as
|
|---|
| 154 | # all the other test group numbers.
|
|---|
| 155 | m4_define([_AT_NORMALIZE_TEST_GROUP_NUMBER],
|
|---|
| 156 | [
|
|---|
| 157 | while :; do
|
|---|
| 158 | case $$1 in #(
|
|---|
| 159 | $at_format*) break;;
|
|---|
| 160 | esac
|
|---|
| 161 | $1=0$$1
|
|---|
| 162 | done
|
|---|
| 163 | ])
|
|---|
| 164 |
|
|---|
| 165 | # _AT_CREATE_DEBUGGING_SCRIPT
|
|---|
| 166 | # ---------------------------
|
|---|
| 167 | # Create the debugging script $at_group_dir/run which will reproduce the
|
|---|
| 168 | # current test group.
|
|---|
| 169 | m4_define([_AT_CREATE_DEBUGGING_SCRIPT],
|
|---|
| 170 | [ {
|
|---|
| 171 | echo "#! /bin/sh"
|
|---|
| 172 | echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$[@]"}'\''='\''"$[@]"'\'''
|
|---|
| 173 | echo "cd '$at_dir'"
|
|---|
| 174 | echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$[0]" \
|
|---|
| 175 | '-v -d' "$at_debug_args" "$at_group" '${1+"$[@]"}'
|
|---|
| 176 | echo 'exit 1'
|
|---|
| 177 | } >$at_group_dir/run
|
|---|
| 178 | chmod +x $at_group_dir/run
|
|---|
| 179 | ])# _AT_CREATE_DEBUGGING_SCRIPT
|
|---|
| 180 |
|
|---|
| 181 |
|
|---|
| 182 | # AT_INIT([TESTSUITE-NAME])
|
|---|
| 183 | # -------------------------
|
|---|
| 184 | # Begin test suite.
|
|---|
| 185 | m4_define([AT_INIT],
|
|---|
| 186 | [m4_pattern_forbid([^_?AT_])
|
|---|
| 187 | m4_define([AT_TESTSUITE_NAME],
|
|---|
| 188 | m4_defn([AT_PACKAGE_STRING])[ test suite]m4_ifval([$1], [: $1]))
|
|---|
| 189 | m4_define([AT_ordinal], 0)
|
|---|
| 190 | m4_define([AT_banner_ordinal], 0)
|
|---|
| 191 | m4_define([AT_groups_all], [])
|
|---|
| 192 | m4_define([AT_help_all], [])
|
|---|
| 193 | AS_INIT
|
|---|
| 194 | AT_COPYRIGHT(
|
|---|
| 195 | [Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
|
|---|
| 196 | Foundation, Inc.
|
|---|
| 197 | This test suite is free software; the Free Software Foundation gives
|
|---|
| 198 | unlimited permission to copy, distribute and modify it.])
|
|---|
| 199 | AS_PREPARE
|
|---|
| 200 | m4_divert_push([DEFAULTS])dnl
|
|---|
| 201 |
|
|---|
| 202 | SHELL=${CONFIG_SHELL-/bin/sh}
|
|---|
| 203 |
|
|---|
| 204 | # How were we run?
|
|---|
| 205 | at_cli_args="$[@]"
|
|---|
| 206 |
|
|---|
| 207 | # Load the config file.
|
|---|
| 208 | for at_file in atconfig atlocal
|
|---|
| 209 | do
|
|---|
| 210 | test -r $at_file || continue
|
|---|
| 211 | . ./$at_file || AS_ERROR([invalid content: $at_file])
|
|---|
| 212 | done
|
|---|
| 213 |
|
|---|
| 214 | # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
|
|---|
| 215 | : ${at_top_build_prefix=$at_top_builddir}
|
|---|
| 216 |
|
|---|
| 217 | # atconfig delivers names relative to the directory the test suite is
|
|---|
| 218 | # in, but the groups themselves are run in testsuite-dir/group-dir.
|
|---|
| 219 | if test -n "$at_top_srcdir"; then
|
|---|
| 220 | builddir=../..
|
|---|
| 221 | for at_dir in srcdir top_srcdir top_build_prefix
|
|---|
| 222 | do
|
|---|
| 223 | at_val=AS_VAR_GET([at_$at_dir])
|
|---|
| 224 | AS_VAR_SET([$at_dir], [$at_val/../..])
|
|---|
| 225 | done
|
|---|
| 226 | fi
|
|---|
| 227 |
|
|---|
| 228 | # Not all shells have the 'times' builtin; the subshell is needed to make
|
|---|
| 229 | # sure we discard the 'times: not found' message from the shell.
|
|---|
| 230 | at_times_p=false
|
|---|
| 231 | (times) >/dev/null 2>&1 && at_times_p=:
|
|---|
| 232 |
|
|---|
| 233 | # CLI Arguments to pass to the debugging scripts.
|
|---|
| 234 | at_debug_args=
|
|---|
| 235 | # -e sets to true
|
|---|
| 236 | at_errexit_p=false
|
|---|
| 237 | # Shall we be verbose?
|
|---|
| 238 | at_verbose=:
|
|---|
| 239 | at_quiet=echo
|
|---|
| 240 |
|
|---|
| 241 | # Shall we keep the debug scripts? Must be `:' when the suite is
|
|---|
| 242 | # run by a debug script, so that the script doesn't remove itself.
|
|---|
| 243 | at_debug_p=false
|
|---|
| 244 | # Display help message?
|
|---|
| 245 | at_help_p=false
|
|---|
| 246 | # Display the version message?
|
|---|
| 247 | at_version_p=false
|
|---|
| 248 | # List test groups?
|
|---|
| 249 | at_list_p=false
|
|---|
| 250 | # Test groups to run
|
|---|
| 251 | at_groups=
|
|---|
| 252 |
|
|---|
| 253 | # The directory we are in.
|
|---|
| 254 | at_dir=`pwd`
|
|---|
| 255 | # The directory the whole suite works in.
|
|---|
| 256 | # Should be absolutely to let the user `cd' at will.
|
|---|
| 257 | at_suite_dir=$at_dir/$as_me.dir
|
|---|
| 258 | # The file containing the suite.
|
|---|
| 259 | at_suite_log=$at_dir/$as_me.log
|
|---|
| 260 | # The file containing the location of the last AT_CHECK.
|
|---|
| 261 | at_check_line_file=$at_suite_dir/at-check-line
|
|---|
| 262 | # The file containing the exit status of the last command.
|
|---|
| 263 | at_status_file=$at_suite_dir/at-status
|
|---|
| 264 | # The files containing the output of the tested commands.
|
|---|
| 265 | at_stdout=$at_suite_dir/at-stdout
|
|---|
| 266 | at_stder1=$at_suite_dir/at-stder1
|
|---|
| 267 | at_stderr=$at_suite_dir/at-stderr
|
|---|
| 268 | # The file containing dates.
|
|---|
| 269 | at_times_file=$at_suite_dir/at-times
|
|---|
| 270 | m4_divert_pop([DEFAULTS])dnl
|
|---|
| 271 | m4_wrap([m4_divert_text([DEFAULTS],
|
|---|
| 272 | [
|
|---|
| 273 | # List of the tested programs.
|
|---|
| 274 | at_tested='m4_ifdef([AT_tested], [AT_tested])'
|
|---|
| 275 | # List of the all the test groups.
|
|---|
| 276 | at_groups_all='AT_groups_all'
|
|---|
| 277 | # As many question marks as there are digits in the last test group number.
|
|---|
| 278 | # Used to normalize the test group numbers so that `ls' lists them in
|
|---|
| 279 | # numerical order.
|
|---|
| 280 | at_format='m4_bpatsubst(m4_defn([AT_ordinal]), [.], [?])'
|
|---|
| 281 | # Description of all the test groups.
|
|---|
| 282 | at_help_all="AS_ESCAPE(m4_defn([AT_help_all]))"])])dnl
|
|---|
| 283 | m4_divert_push([PARSE_ARGS])dnl
|
|---|
| 284 |
|
|---|
| 285 | at_prev=
|
|---|
| 286 | for at_option
|
|---|
| 287 | do
|
|---|
| 288 | # If the previous option needs an argument, assign it.
|
|---|
| 289 | if test -n "$at_prev"; then
|
|---|
| 290 | at_option=$at_prev=$at_option
|
|---|
| 291 | at_prev=
|
|---|
| 292 | fi
|
|---|
| 293 |
|
|---|
| 294 | case $at_option in
|
|---|
| 295 | *=*) at_optarg=`expr "x$at_option" : 'x[[^=]]*=\(.*\)'` ;;
|
|---|
| 296 | *) at_optarg= ;;
|
|---|
| 297 | esac
|
|---|
| 298 |
|
|---|
| 299 | # Accept the important Cygnus configure options, so we can diagnose typos.
|
|---|
| 300 |
|
|---|
| 301 | case $at_option in
|
|---|
| 302 | --help | -h )
|
|---|
| 303 | at_help_p=:
|
|---|
| 304 | ;;
|
|---|
| 305 |
|
|---|
| 306 | --list | -l )
|
|---|
| 307 | at_list_p=:
|
|---|
| 308 | ;;
|
|---|
| 309 |
|
|---|
| 310 | --version | -V )
|
|---|
| 311 | at_version_p=:
|
|---|
| 312 | ;;
|
|---|
| 313 |
|
|---|
| 314 | --clean | -c )
|
|---|
| 315 | test -d "$at_suite_dir" &&
|
|---|
| 316 | find "$at_suite_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
|
|---|
| 317 | rm -f -r "$at_suite_dir" "$at_suite_log"
|
|---|
| 318 | exit 0
|
|---|
| 319 | ;;
|
|---|
| 320 |
|
|---|
| 321 | --debug | -d )
|
|---|
| 322 | at_debug_p=:
|
|---|
| 323 | ;;
|
|---|
| 324 |
|
|---|
| 325 | --errexit | -e )
|
|---|
| 326 | at_debug_p=:
|
|---|
| 327 | at_errexit_p=:
|
|---|
| 328 | ;;
|
|---|
| 329 |
|
|---|
| 330 | --verbose | -v )
|
|---|
| 331 | at_verbose=echo; at_quiet=:
|
|---|
| 332 | ;;
|
|---|
| 333 |
|
|---|
| 334 | --trace | -x )
|
|---|
| 335 | at_traceon='set -x'; at_traceoff='set +x'
|
|---|
| 336 | ;;
|
|---|
| 337 |
|
|---|
| 338 | [[0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]])
|
|---|
| 339 | at_groups="$at_groups$at_option "
|
|---|
| 340 | ;;
|
|---|
| 341 |
|
|---|
| 342 | # Ranges
|
|---|
| 343 | [[0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-])
|
|---|
| 344 | at_range_start=`echo $at_option |tr -d X-`
|
|---|
| 345 | at_range=`echo " $at_groups_all " | \
|
|---|
| 346 | sed -e 's/^.* \('$at_range_start' \)/\1/'`
|
|---|
| 347 | at_groups="$at_groups$at_range "
|
|---|
| 348 | ;;
|
|---|
| 349 |
|
|---|
| 350 | [-[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]])
|
|---|
| 351 | at_range_end=`echo $at_option |tr -d X-`
|
|---|
| 352 | at_range=`echo " $at_groups_all " | \
|
|---|
| 353 | sed -e 's/\( '$at_range_end'\) .*$/\1/'`
|
|---|
| 354 | at_groups="$at_groups$at_range "
|
|---|
| 355 | ;;
|
|---|
| 356 |
|
|---|
| 357 | [[0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9]] | \
|
|---|
| 358 | [[0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9]] | \
|
|---|
| 359 | [[0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
|
|---|
| 360 | [[0-9][0-9][0-9]-[0-9][0-9][0-9]] | \
|
|---|
| 361 | [[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] | \
|
|---|
| 362 | [[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]] )
|
|---|
| 363 | at_range_start=`expr $at_option : '\(.*\)-'`
|
|---|
| 364 | at_range_end=`expr $at_option : '.*-\(.*\)'`
|
|---|
| 365 | if test $at_range_start -gt $at_range_end; then
|
|---|
| 366 | at_tmp=$at_range_end
|
|---|
| 367 | at_range_end=$at_range_start
|
|---|
| 368 | at_range_start=$at_tmp
|
|---|
| 369 | fi
|
|---|
| 370 | at_range=`echo " $at_groups_all " | \
|
|---|
| 371 | sed -e 's/^.*\( '$at_range_start' \)/\1/' \
|
|---|
| 372 | -e 's/\( '$at_range_end'\) .*$/\1/'`
|
|---|
| 373 | at_groups="$at_groups$at_range "
|
|---|
| 374 | ;;
|
|---|
| 375 |
|
|---|
| 376 | # Keywords.
|
|---|
| 377 | --keywords | -k )
|
|---|
| 378 | at_prev=--keywords
|
|---|
| 379 | ;;
|
|---|
| 380 | --keywords=* )
|
|---|
| 381 | at_groups_selected=$at_help_all
|
|---|
| 382 | at_save_IFS=$IFS
|
|---|
| 383 | IFS=,
|
|---|
| 384 | set X $at_optarg
|
|---|
| 385 | shift
|
|---|
| 386 | IFS=$at_save_IFS
|
|---|
| 387 | for at_keyword
|
|---|
| 388 | do
|
|---|
| 389 | at_invert=
|
|---|
| 390 | case $at_keyword in
|
|---|
| 391 | '!'*)
|
|---|
| 392 | at_invert="-v"
|
|---|
| 393 | at_keyword=`expr "X$at_keyword" : 'X!\(.*\)'`
|
|---|
| 394 | ;;
|
|---|
| 395 | esac
|
|---|
| 396 | # It is on purpose that we match the test group titles too.
|
|---|
| 397 | at_groups_selected=`echo "$at_groups_selected" |
|
|---|
| 398 | grep -i $at_invert ["^[1-9][^;]*;.*[; ]$at_keyword[ ;]"]`
|
|---|
| 399 | done
|
|---|
| 400 | at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'`
|
|---|
| 401 | # Smash the newlines.
|
|---|
| 402 | at_groups="$at_groups`echo $at_groups_selected` "
|
|---|
| 403 | ;;
|
|---|
| 404 | m4_divert_pop([PARSE_ARGS])dnl
|
|---|
| 405 | dnl Process *=* last to allow for user specified --option=* type arguments.
|
|---|
| 406 | m4_divert_push([PARSE_ARGS_END])dnl
|
|---|
| 407 |
|
|---|
| 408 | *=*)
|
|---|
| 409 | at_envvar=`expr "x$at_option" : 'x\([[^=]]*\)='`
|
|---|
| 410 | # Reject names that are not valid shell variable names.
|
|---|
| 411 | expr "x$at_envvar" : "[.*[^_$as_cr_alnum]]" >/dev/null &&
|
|---|
| 412 | AS_ERROR([invalid variable name: $at_envvar])
|
|---|
| 413 | at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
|
|---|
| 414 | eval "$at_envvar='$at_value'"
|
|---|
| 415 | export $at_envvar
|
|---|
| 416 | # Propagate to debug scripts.
|
|---|
| 417 | at_debug_args="$at_debug_args $at_envvar='$at_value'"
|
|---|
| 418 | ;;
|
|---|
| 419 |
|
|---|
| 420 | *) echo "$as_me: invalid option: $at_option" >&2
|
|---|
| 421 | echo "Try \`$[0] --help' for more information." >&2
|
|---|
| 422 | exit 1
|
|---|
| 423 | ;;
|
|---|
| 424 | esac
|
|---|
| 425 | done
|
|---|
| 426 |
|
|---|
| 427 | # Selected test groups.
|
|---|
| 428 | if test -z "$at_groups"; then
|
|---|
| 429 | at_groups=$at_groups_all
|
|---|
| 430 | else
|
|---|
| 431 | # Sort the tests, removing duplicates:
|
|---|
| 432 | at_groups=`echo $at_groups | tr ' ' "$as_nl" | sort -nu`
|
|---|
| 433 | # and add banners. (Passing at_groups_all is tricky--see the comment
|
|---|
| 434 | # starting with "Passing at_groups is tricky.")
|
|---|
| 435 | at_groups=`echo "$at_groups$as_nl $at_groups_all" |
|
|---|
| 436 | awk ['BEGIN { FS = "@" } # Effectively switch off field splitting.
|
|---|
| 437 | /^$/ { next } # Ignore the empty line.
|
|---|
| 438 | !/ / { groups++; selected[$ 0] = 1; next }
|
|---|
| 439 | # The last line, containing at_groups_all.
|
|---|
| 440 | {
|
|---|
| 441 | n = split($ 0, a, " ")
|
|---|
| 442 | # If there are several tests, select their banners:
|
|---|
| 443 | if (groups > 1) {
|
|---|
| 444 | for (i = 1; i <= n; i++) {
|
|---|
| 445 | if (a[i] ~ /^banner-/)
|
|---|
| 446 | banner = a[i]
|
|---|
| 447 | else if (banner != "" && selected[a[i]] == 1)
|
|---|
| 448 | selected[banner] = 1
|
|---|
| 449 | }
|
|---|
| 450 | }
|
|---|
| 451 | for (i = 1; i <= n; i++)
|
|---|
| 452 | if (selected[a[i]] == 1)
|
|---|
| 453 | list = list " " a[i]
|
|---|
| 454 | print list
|
|---|
| 455 | }']`
|
|---|
| 456 | fi
|
|---|
| 457 | m4_divert_pop([PARSE_ARGS_END])dnl
|
|---|
| 458 | m4_divert_push([HELP])dnl
|
|---|
| 459 |
|
|---|
| 460 | # Help message.
|
|---|
| 461 | if $at_help_p; then
|
|---|
| 462 | cat <<_ATEOF
|
|---|
| 463 | Usage: $[0] [[OPTION]... [VARIABLE=VALUE]... [TESTS]]
|
|---|
| 464 |
|
|---|
| 465 | Run all the tests, or the selected TESTS, given by numeric ranges, and
|
|---|
| 466 | save a detailed log file. Upon failure, create debugging scripts.
|
|---|
| 467 |
|
|---|
| 468 | You should not change environment variables unless explicitly passed
|
|---|
| 469 | as command line arguments. Set \`AUTOTEST_PATH' to select the executables
|
|---|
| 470 | to exercise. Each relative directory is expanded as build and source
|
|---|
| 471 | directories relatively to the top level of this distribution. E.g.,
|
|---|
| 472 |
|
|---|
| 473 | $ $[0] AUTOTEST_PATH=bin
|
|---|
| 474 |
|
|---|
| 475 | possibly amounts into
|
|---|
| 476 |
|
|---|
| 477 | PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
|
|---|
| 478 | _ATEOF
|
|---|
| 479 | m4_divert_pop([HELP])dnl
|
|---|
| 480 | m4_divert_push([HELP_MODES])dnl
|
|---|
| 481 | cat <<_ATEOF
|
|---|
| 482 |
|
|---|
| 483 | Operation modes:
|
|---|
| 484 | -h, --help print the help message, then exit
|
|---|
| 485 | -V, --version print version number, then exit
|
|---|
| 486 | -c, --clean remove all the files this test suite might create and exit
|
|---|
| 487 | -l, --list describes all the tests, or the selected TESTS
|
|---|
| 488 | _ATEOF
|
|---|
| 489 | m4_divert_pop([HELP_MODES])dnl
|
|---|
| 490 | m4_divert_push([HELP_TUNING])dnl
|
|---|
| 491 | cat <<_ATEOF
|
|---|
| 492 |
|
|---|
| 493 | Execution tuning:
|
|---|
| 494 | -k, --keywords=KEYWORDS
|
|---|
| 495 | select the tests matching all the comma-separated KEYWORDS
|
|---|
| 496 | multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD
|
|---|
| 497 | -e, --errexit abort as soon as a test fails; implies --debug
|
|---|
| 498 | -v, --verbose force more detailed output
|
|---|
| 499 | default for debugging scripts
|
|---|
| 500 | -d, --debug inhibit clean up and top-level logging
|
|---|
| 501 | default for debugging scripts
|
|---|
| 502 | -x, --trace enable tests shell tracing
|
|---|
| 503 | _ATEOF
|
|---|
| 504 | m4_divert_pop([HELP_TUNING])dnl
|
|---|
| 505 | m4_divert_push([HELP_END])dnl
|
|---|
| 506 | cat <<_ATEOF
|
|---|
| 507 |
|
|---|
| 508 | Report bugs to <AT_PACKAGE_BUGREPORT>.
|
|---|
| 509 | _ATEOF
|
|---|
| 510 | exit 0
|
|---|
| 511 | fi
|
|---|
| 512 |
|
|---|
| 513 | # List of tests.
|
|---|
| 514 | if $at_list_p; then
|
|---|
| 515 | cat <<_ATEOF
|
|---|
| 516 | AT_TESTSUITE_NAME test groups:
|
|---|
| 517 |
|
|---|
| 518 | NUM: FILE-NAME:LINE TEST-GROUP-NAME
|
|---|
| 519 | KEYWORDS
|
|---|
| 520 |
|
|---|
| 521 | _ATEOF
|
|---|
| 522 | # Passing at_groups is tricky. We cannot use it to form a literal string
|
|---|
| 523 | # or regexp because of the limitation of AIX awk. And Solaris' awk
|
|---|
| 524 | # doesn't grok more than 99 fields in a record, so we have to use `split'.
|
|---|
| 525 | echo "$at_groups$as_nl$at_help_all" |
|
|---|
| 526 | awk 'BEGIN { FS = ";" }
|
|---|
| 527 | NR == 1 {
|
|---|
| 528 | for (n = split($ 0, a, " "); n; n--) selected[[a[n]]] = 1
|
|---|
| 529 | next
|
|---|
| 530 | }
|
|---|
| 531 | {
|
|---|
| 532 | if (selected[[$ 1]]) {
|
|---|
| 533 | printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
|
|---|
| 534 | if ($ 4) printf " %s\n", $ 4
|
|---|
| 535 | }
|
|---|
| 536 | }'
|
|---|
| 537 | exit 0
|
|---|
| 538 | fi
|
|---|
| 539 | m4_divert_pop([HELP_END])dnl
|
|---|
| 540 | m4_divert_push([VERSION])dnl
|
|---|
| 541 | if $at_version_p; then
|
|---|
| 542 | echo "$as_me (AT_PACKAGE_STRING)"
|
|---|
| 543 | cat <<\_ACEOF
|
|---|
| 544 | m4_divert_pop([VERSION])dnl
|
|---|
| 545 | m4_divert_push([VERSION_END])dnl
|
|---|
| 546 | _ACEOF
|
|---|
| 547 | exit 0
|
|---|
| 548 | fi
|
|---|
| 549 | m4_divert_pop([VERSION_END])dnl
|
|---|
| 550 | m4_divert_push([PREPARE_TESTS])dnl
|
|---|
| 551 |
|
|---|
| 552 | # Don't take risks: use only absolute directories in PATH.
|
|---|
| 553 | #
|
|---|
| 554 | # For stand-alone test suites, AUTOTEST_PATH is relative to `.'.
|
|---|
| 555 | #
|
|---|
| 556 | # For embedded test suites, AUTOTEST_PATH is relative to the top level
|
|---|
| 557 | # of the package. Then expand it into build/src parts, since users
|
|---|
| 558 | # may create executables in both places.
|
|---|
| 559 | AUTOTEST_PATH=`echo $AUTOTEST_PATH | sed "s&:&$PATH_SEPARATOR&g"`
|
|---|
| 560 | at_path=
|
|---|
| 561 | _AS_PATH_WALK([$AUTOTEST_PATH $PATH],
|
|---|
| 562 | [test -n "$at_path" && at_path=$at_path$PATH_SEPARATOR
|
|---|
| 563 | case $as_dir in
|
|---|
| 564 | [[\\/]]* | ?:[[\\/]]* )
|
|---|
| 565 | at_path=$at_path$as_dir
|
|---|
| 566 | ;;
|
|---|
| 567 | * )
|
|---|
| 568 | if test -z "$at_top_build_prefix"; then
|
|---|
| 569 | # Stand-alone test suite.
|
|---|
| 570 | at_path=$at_path$as_dir
|
|---|
| 571 | else
|
|---|
| 572 | # Embedded test suite.
|
|---|
| 573 | at_path=$at_path$at_top_build_prefix$as_dir$PATH_SEPARATOR
|
|---|
| 574 | at_path=$at_path$at_top_srcdir/$as_dir
|
|---|
| 575 | fi
|
|---|
| 576 | ;;
|
|---|
| 577 | esac])
|
|---|
| 578 |
|
|---|
| 579 | # Now build and simplify PATH.
|
|---|
| 580 | #
|
|---|
| 581 | # There might be directories that don't exist, but don't redirect
|
|---|
| 582 | # builtins' (eg., cd) stderr directly: Ultrix's sh hates that.
|
|---|
| 583 | PATH=
|
|---|
| 584 | _AS_PATH_WALK([$at_path],
|
|---|
| 585 | [as_dir=`(cd "$as_dir" && pwd) 2>/dev/null`
|
|---|
| 586 | test -d "$as_dir" || continue
|
|---|
| 587 | case $PATH in
|
|---|
| 588 | $as_dir | \
|
|---|
| 589 | $as_dir$PATH_SEPARATOR* | \
|
|---|
| 590 | *$PATH_SEPARATOR$as_dir | \
|
|---|
| 591 | *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;;
|
|---|
| 592 |
|
|---|
| 593 | '') PATH=$as_dir ;;
|
|---|
| 594 | *) PATH=$PATH$PATH_SEPARATOR$as_dir ;;
|
|---|
| 595 | esac])
|
|---|
| 596 | export PATH
|
|---|
| 597 |
|
|---|
| 598 | # Setting up the FDs.
|
|---|
| 599 | # 5 is the log file. Not to be overwritten if `-d'.
|
|---|
| 600 | m4_define([AS_MESSAGE_LOG_FD], [5])
|
|---|
| 601 | if $at_debug_p; then
|
|---|
| 602 | at_suite_log=/dev/null
|
|---|
| 603 | else
|
|---|
| 604 | : >"$at_suite_log"
|
|---|
| 605 | fi
|
|---|
| 606 | exec AS_MESSAGE_LOG_FD>>"$at_suite_log"
|
|---|
| 607 |
|
|---|
| 608 | # Banners and logs.
|
|---|
| 609 | AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
|
|---|
| 610 | {
|
|---|
| 611 | AS_BOX(m4_defn([AT_TESTSUITE_NAME])[.])
|
|---|
| 612 | echo
|
|---|
| 613 |
|
|---|
| 614 | echo "$as_me: command line was:"
|
|---|
| 615 | echo " $ $[0] $at_cli_args"
|
|---|
| 616 | echo
|
|---|
| 617 |
|
|---|
| 618 | # Try to find a few ChangeLogs in case it might help determining the
|
|---|
| 619 | # exact version. Use the relative dir: if the top dir is a symlink,
|
|---|
| 620 | # find will not follow it (and options to follow the links are not
|
|---|
| 621 | # portable), which would result in no output here.
|
|---|
| 622 | if test -n "$at_top_srcdir"; then
|
|---|
| 623 | AS_BOX([ChangeLogs.])
|
|---|
| 624 | echo
|
|---|
| 625 | for at_file in `find "$at_top_srcdir" -name ChangeLog -print`
|
|---|
| 626 | do
|
|---|
| 627 | echo "$as_me: $at_file:"
|
|---|
| 628 | sed 's/^/| /;10q' $at_file
|
|---|
| 629 | echo
|
|---|
| 630 | done
|
|---|
| 631 |
|
|---|
| 632 | AS_UNAME
|
|---|
| 633 | echo
|
|---|
| 634 | fi
|
|---|
| 635 |
|
|---|
| 636 | # Contents of the config files.
|
|---|
| 637 | for at_file in atconfig atlocal
|
|---|
| 638 | do
|
|---|
| 639 | test -r $at_file || continue
|
|---|
| 640 | echo "$as_me: $at_file:"
|
|---|
| 641 | sed 's/^/| /' $at_file
|
|---|
| 642 | echo
|
|---|
| 643 | done
|
|---|
| 644 |
|
|---|
| 645 | AS_BOX([Tested programs.])
|
|---|
| 646 | echo
|
|---|
| 647 | } >&AS_MESSAGE_LOG_FD
|
|---|
| 648 |
|
|---|
| 649 | # Report what programs are being tested.
|
|---|
| 650 | for at_program in : $at_tested
|
|---|
| 651 | do
|
|---|
| 652 | test "$at_program" = : && continue
|
|---|
| 653 | _AS_PATH_WALK([$PATH], [test -f "$as_dir/$at_program" && break])
|
|---|
| 654 | if test -f "$as_dir/$at_program"; then
|
|---|
| 655 | {
|
|---|
| 656 | echo "$at_srcdir/AT_LINE: $as_dir/$at_program --version"
|
|---|
| 657 | "$as_dir/$at_program" --version
|
|---|
| 658 | echo
|
|---|
| 659 | } >&AS_MESSAGE_LOG_FD 2>&1
|
|---|
| 660 | else
|
|---|
| 661 | AS_ERROR([cannot find $at_program])
|
|---|
| 662 | fi
|
|---|
| 663 | done
|
|---|
| 664 |
|
|---|
| 665 | {
|
|---|
| 666 | AS_BOX([Running the tests.])
|
|---|
| 667 | } >&AS_MESSAGE_LOG_FD
|
|---|
| 668 |
|
|---|
| 669 | at_start_date=`date`
|
|---|
| 670 | at_start_time=`date +%s 2>/dev/null`
|
|---|
| 671 | echo "$as_me: starting at: $at_start_date" >&AS_MESSAGE_LOG_FD
|
|---|
| 672 | at_xpass_list=
|
|---|
| 673 | at_xfail_list=
|
|---|
| 674 | at_pass_list=
|
|---|
| 675 | at_fail_list=
|
|---|
| 676 | at_skip_list=
|
|---|
| 677 | at_group_count=0
|
|---|
| 678 | m4_divert_pop([PREPARE_TESTS])dnl
|
|---|
| 679 | m4_divert_push([TESTS])dnl
|
|---|
| 680 |
|
|---|
| 681 | # Create the master directory if it doesn't already exist.
|
|---|
| 682 | test -d "$at_suite_dir" ||
|
|---|
| 683 | mkdir "$at_suite_dir" ||
|
|---|
| 684 | AS_ERROR([cannot create '$at_suite_dir'])
|
|---|
| 685 |
|
|---|
| 686 | # Can we diff with `/dev/null'? DU 5.0 refuses.
|
|---|
| 687 | if diff /dev/null /dev/null >/dev/null 2>&1; then
|
|---|
| 688 | at_devnull=/dev/null
|
|---|
| 689 | else
|
|---|
| 690 | at_devnull=$at_suite_dir/devnull
|
|---|
| 691 | >"$at_devnull"
|
|---|
| 692 | fi
|
|---|
| 693 |
|
|---|
| 694 | # Use `diff -u' when possible.
|
|---|
| 695 | if at_diff=`diff -u "$at_devnull" "$at_devnull" 2>&1` && test -z "$at_diff"
|
|---|
| 696 | then
|
|---|
| 697 | at_diff='diff -u'
|
|---|
| 698 | else
|
|---|
| 699 | at_diff=diff
|
|---|
| 700 | fi
|
|---|
| 701 |
|
|---|
| 702 |
|
|---|
| 703 | for at_group in $at_groups
|
|---|
| 704 | do
|
|---|
| 705 | # Be sure to come back to the top test directory.
|
|---|
| 706 | cd "$at_suite_dir"
|
|---|
| 707 |
|
|---|
| 708 | case $at_group in
|
|---|
| 709 | banner-*)
|
|---|
| 710 | at_group_log=$at_suite_log
|
|---|
| 711 | ;;
|
|---|
| 712 |
|
|---|
| 713 | *)
|
|---|
| 714 | at_group_normalized=$at_group
|
|---|
| 715 | _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
|
|---|
| 716 |
|
|---|
| 717 | # Create a fresh directory for the next test group, and enter.
|
|---|
| 718 | at_group_dir=$at_suite_dir/$at_group_normalized
|
|---|
| 719 | at_group_log=$at_group_dir/$as_me.log
|
|---|
| 720 | if test -d "$at_group_dir"; then
|
|---|
| 721 | find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
|
|---|
| 722 | rm -fr "$at_group_dir"
|
|---|
| 723 | fi
|
|---|
| 724 | # Be tolerant if the above `rm' was not able to remove the directory.
|
|---|
| 725 | AS_MKDIR_P([$at_group_dir])
|
|---|
| 726 | cd $at_group_dir
|
|---|
| 727 | ;;
|
|---|
| 728 | esac
|
|---|
| 729 |
|
|---|
| 730 | echo 0 > "$at_status_file"
|
|---|
| 731 |
|
|---|
| 732 | # Clearly separate the test groups when verbose.
|
|---|
| 733 | test $at_group_count != 0 && $at_verbose
|
|---|
| 734 |
|
|---|
| 735 | # In verbose mode, append to the log file *and* show on
|
|---|
| 736 | # the standard output; in quiet mode only write to the log
|
|---|
| 737 | if test $at_verbose = echo; then
|
|---|
| 738 | at_tee_pipe='tee -a "$at_group_log"'
|
|---|
| 739 | else
|
|---|
| 740 | at_tee_pipe='cat >> "$at_group_log"'
|
|---|
| 741 | fi
|
|---|
| 742 |
|
|---|
| 743 | case $at_group in
|
|---|
| 744 | dnl Test groups inserted here (TESTS).
|
|---|
| 745 | m4_divert_pop([TESTS])[]dnl
|
|---|
| 746 | m4_divert_push([TESTS_END])[]dnl
|
|---|
| 747 |
|
|---|
| 748 | * )
|
|---|
| 749 | echo "$as_me: no such test group: $at_group" >&2
|
|---|
| 750 | continue
|
|---|
| 751 | ;;
|
|---|
| 752 | esac
|
|---|
| 753 |
|
|---|
| 754 | # Be sure to come back to the suite directory, in particular
|
|---|
| 755 | # since below we might `rm' the group directory we are in currently.
|
|---|
| 756 | cd "$at_suite_dir"
|
|---|
| 757 |
|
|---|
| 758 | case $at_group in
|
|---|
| 759 | banner-*) ;;
|
|---|
| 760 | *)
|
|---|
| 761 | if test ! -f "$at_check_line_file"; then
|
|---|
| 762 | sed "s/^ */$as_me: warning: /" <<_ATEOF
|
|---|
| 763 | A failure happened in a test group before any test could be
|
|---|
| 764 | run. This means that test suite is improperly designed. Please
|
|---|
| 765 | report this failure to <AT_PACKAGE_BUGREPORT>.
|
|---|
| 766 | _ATEOF
|
|---|
| 767 | echo "$at_setup_line" >"$at_check_line_file"
|
|---|
| 768 | fi
|
|---|
| 769 | at_group_count=`expr 1 + $at_group_count`
|
|---|
| 770 | $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C"
|
|---|
| 771 | echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> "$at_group_log"
|
|---|
| 772 | case $at_xfail:$at_status in
|
|---|
| 773 | yes:0)
|
|---|
| 774 | at_msg="UNEXPECTED PASS"
|
|---|
| 775 | at_xpass_list="$at_xpass_list $at_group"
|
|---|
| 776 | at_errexit=$at_errexit_p
|
|---|
| 777 | ;;
|
|---|
| 778 | no:0)
|
|---|
| 779 | at_msg="ok"
|
|---|
| 780 | at_pass_list="$at_pass_list $at_group"
|
|---|
| 781 | at_errexit=false
|
|---|
| 782 | ;;
|
|---|
| 783 | *:77)
|
|---|
| 784 | at_msg='skipped ('`cat "$at_check_line_file"`')'
|
|---|
| 785 | at_skip_list="$at_skip_list $at_group"
|
|---|
| 786 | at_errexit=false
|
|---|
| 787 | ;;
|
|---|
| 788 | yes:*)
|
|---|
| 789 | at_msg='expected failure ('`cat "$at_check_line_file"`')'
|
|---|
| 790 | at_xfail_list="$at_xfail_list $at_group"
|
|---|
| 791 | at_errexit=false
|
|---|
| 792 | ;;
|
|---|
| 793 | no:*)
|
|---|
| 794 | at_msg='FAILED ('`cat "$at_check_line_file"`')'
|
|---|
| 795 | at_fail_list="$at_fail_list $at_group"
|
|---|
| 796 | at_errexit=$at_errexit_p
|
|---|
| 797 | ;;
|
|---|
| 798 | esac
|
|---|
| 799 | # Make sure there is a separator even with long titles.
|
|---|
| 800 | echo " $at_msg"
|
|---|
| 801 | at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
|
|---|
| 802 | case $at_status in
|
|---|
| 803 | 0|77)
|
|---|
| 804 | # $at_times_file is only available if the group succeeded.
|
|---|
| 805 | # We're not including the group log, so the success message
|
|---|
| 806 | # is written in the global log separately. But we also
|
|---|
| 807 | # write to the group log in case they're using -d.
|
|---|
| 808 | if test -f "$at_times_file"; then
|
|---|
| 809 | at_log_msg="$at_log_msg ("`sed 1d "$at_times_file"`')'
|
|---|
| 810 | rm -f "$at_times_file"
|
|---|
| 811 | fi
|
|---|
| 812 | echo "$at_log_msg" >> "$at_group_log"
|
|---|
| 813 | echo "$at_log_msg" >&AS_MESSAGE_LOG_FD
|
|---|
| 814 |
|
|---|
| 815 | # Cleanup the group directory, unless the user wants the files.
|
|---|
| 816 | if $at_debug_p ; then
|
|---|
| 817 | _AT_CREATE_DEBUGGING_SCRIPT
|
|---|
| 818 | elif test -d "$at_group_dir"; then
|
|---|
| 819 | find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
|
|---|
| 820 | rm -fr "$at_group_dir"
|
|---|
| 821 | fi
|
|---|
| 822 | ;;
|
|---|
| 823 | *)
|
|---|
| 824 | # Upon failure, include the log into the testsuite's global
|
|---|
| 825 | # log. The failure message is written in the group log. It
|
|---|
| 826 | # is later included in the global log.
|
|---|
| 827 | echo "$at_log_msg" >> "$at_group_log"
|
|---|
| 828 |
|
|---|
| 829 | # Upon failure, keep the group directory for autopsy, and
|
|---|
| 830 | # create the debugging script.
|
|---|
| 831 | _AT_CREATE_DEBUGGING_SCRIPT
|
|---|
| 832 | $at_errexit && break
|
|---|
| 833 | ;;
|
|---|
| 834 | esac
|
|---|
| 835 | ;;
|
|---|
| 836 | esac
|
|---|
| 837 | done
|
|---|
| 838 |
|
|---|
| 839 | # Back to the top directory.
|
|---|
| 840 | cd "$at_dir"
|
|---|
| 841 |
|
|---|
| 842 | # Compute the duration of the suite.
|
|---|
| 843 | at_stop_date=`date`
|
|---|
| 844 | at_stop_time=`date +%s 2>/dev/null`
|
|---|
| 845 | echo "$as_me: ending at: $at_stop_date" >&AS_MESSAGE_LOG_FD
|
|---|
| 846 | case $at_start_time,$at_stop_time in
|
|---|
| 847 | [[0-9]*,[0-9]*])
|
|---|
| 848 | at_duration_s=`expr $at_stop_time - $at_start_time`
|
|---|
| 849 | at_duration_m=`expr $at_duration_s / 60`
|
|---|
| 850 | at_duration_h=`expr $at_duration_m / 60`
|
|---|
| 851 | at_duration_s=`expr $at_duration_s % 60`
|
|---|
| 852 | at_duration_m=`expr $at_duration_m % 60`
|
|---|
| 853 | at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
|
|---|
| 854 | echo "$as_me: test suite duration: $at_duration" >&AS_MESSAGE_LOG_FD
|
|---|
| 855 | ;;
|
|---|
| 856 | esac
|
|---|
| 857 |
|
|---|
| 858 | # Wrap up the test suite with summary statistics.
|
|---|
| 859 | at_skip_count=`set dummy $at_skip_list; shift; echo $[@%:@]`
|
|---|
| 860 | at_fail_count=`set dummy $at_fail_list; shift; echo $[@%:@]`
|
|---|
| 861 | at_xpass_count=`set dummy $at_xpass_list; shift; echo $[@%:@]`
|
|---|
| 862 | at_xfail_count=`set dummy $at_xfail_list; shift; echo $[@%:@]`
|
|---|
| 863 |
|
|---|
| 864 | at_run_count=`expr $at_group_count - $at_skip_count`
|
|---|
| 865 | at_unexpected_count=`expr $at_xpass_count + $at_fail_count`
|
|---|
| 866 | at_total_fail_count=`expr $at_xfail_count + $at_fail_count`
|
|---|
| 867 |
|
|---|
| 868 | echo
|
|---|
| 869 | AS_BOX([Test results.])
|
|---|
| 870 | echo
|
|---|
| 871 | {
|
|---|
| 872 | echo
|
|---|
| 873 | AS_BOX([Test results.])
|
|---|
| 874 | echo
|
|---|
| 875 | } >&AS_MESSAGE_LOG_FD
|
|---|
| 876 |
|
|---|
| 877 | dnl
|
|---|
| 878 | dnl FIXME: this code is as far from i18n-cleanness as man
|
|---|
| 879 | dnl could imagine...
|
|---|
| 880 | dnl
|
|---|
| 881 | if test $at_run_count = 1; then
|
|---|
| 882 | at_result="1 test"
|
|---|
| 883 | at_were=was
|
|---|
| 884 | else
|
|---|
| 885 | at_result="$at_run_count tests"
|
|---|
| 886 | at_were=were
|
|---|
| 887 | fi
|
|---|
| 888 | if $at_errexit_p && test $at_unexpected_count != 0; then
|
|---|
| 889 | if test $at_xpass_count = 1; then
|
|---|
| 890 | at_result="$at_result $at_were run, one passed"
|
|---|
| 891 | else
|
|---|
| 892 | at_result="$at_result $at_were run, one failed"
|
|---|
| 893 | fi
|
|---|
| 894 | at_result="$at_result unexpectedly and inhibited subsequent tests."
|
|---|
| 895 | else
|
|---|
| 896 | # Don't you just love exponential explosion of the number of cases?
|
|---|
| 897 | case $at_xpass_count:$at_fail_count:$at_xfail_count in
|
|---|
| 898 | # So far, so good.
|
|---|
| 899 | 0:0:0) at_result="$at_result $at_were successful." ;;
|
|---|
| 900 | 0:0:*) at_result="$at_result behaved as expected." ;;
|
|---|
| 901 |
|
|---|
| 902 | # Some unexpected failures
|
|---|
| 903 | 0:*:0) at_result="$at_result $at_were run,
|
|---|
| 904 | $at_fail_count failed unexpectedly." ;;
|
|---|
| 905 |
|
|---|
| 906 | # Some failures, both expected and unexpected
|
|---|
| 907 | 0:*:1) at_result="$at_result $at_were run,
|
|---|
| 908 | $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
|
|---|
| 909 | 0:*:*) at_result="$at_result $at_were run,
|
|---|
| 910 | $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
|
|---|
| 911 |
|
|---|
| 912 | # No unexpected failures, but some xpasses
|
|---|
| 913 | *:0:*) at_result="$at_result $at_were run,
|
|---|
| 914 | $at_xpass_count passed unexpectedly." ;;
|
|---|
| 915 |
|
|---|
| 916 | # No expected failures, but failures and xpasses
|
|---|
| 917 | *:1:0) at_result="$at_result $at_were run,
|
|---|
| 918 | $at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;;
|
|---|
| 919 | *:*:0) at_result="$at_result $at_were run,
|
|---|
| 920 | $at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;;
|
|---|
| 921 |
|
|---|
| 922 | # All of them.
|
|---|
| 923 | *:*:1) at_result="$at_result $at_were run,
|
|---|
| 924 | $at_xpass_count passed unexpectedly,
|
|---|
| 925 | $at_total_fail_count failed ($at_xfail_count expected failure)." ;;
|
|---|
| 926 | *:*:*) at_result="$at_result $at_were run,
|
|---|
| 927 | $at_xpass_count passed unexpectedly,
|
|---|
| 928 | $at_total_fail_count failed ($at_xfail_count expected failures)." ;;
|
|---|
| 929 | esac
|
|---|
| 930 |
|
|---|
| 931 | if test $at_skip_count = 0 && test $at_run_count -gt 1; then
|
|---|
| 932 | at_result="All $at_result"
|
|---|
| 933 | fi
|
|---|
| 934 | fi
|
|---|
| 935 |
|
|---|
| 936 | # Now put skips in the mix.
|
|---|
| 937 | case $at_skip_count in
|
|---|
| 938 | 0) ;;
|
|---|
| 939 | 1) at_result="$at_result
|
|---|
| 940 | 1 test was skipped." ;;
|
|---|
| 941 | *) at_result="$at_result
|
|---|
| 942 | $at_skip_count tests were skipped." ;;
|
|---|
| 943 | esac
|
|---|
| 944 |
|
|---|
| 945 | if test $at_unexpected_count = 0; then
|
|---|
| 946 | echo "$at_result"
|
|---|
| 947 | echo "$at_result" >&AS_MESSAGE_LOG_FD
|
|---|
| 948 | else
|
|---|
| 949 | echo "ERROR: $at_result" >&2
|
|---|
| 950 | echo "ERROR: $at_result" >&AS_MESSAGE_LOG_FD
|
|---|
| 951 | {
|
|---|
| 952 | echo
|
|---|
| 953 | AS_BOX([Summary of the failures.])
|
|---|
| 954 |
|
|---|
| 955 | # Summary of failed and skipped tests.
|
|---|
| 956 | if test $at_fail_count != 0; then
|
|---|
| 957 | echo "Failed tests:"
|
|---|
| 958 | $SHELL "$[0]" $at_fail_list --list
|
|---|
| 959 | echo
|
|---|
| 960 | fi
|
|---|
| 961 | if test $at_skip_count != 0; then
|
|---|
| 962 | echo "Skipped tests:"
|
|---|
| 963 | $SHELL "$[0]" $at_skip_list --list
|
|---|
| 964 | echo
|
|---|
| 965 | fi
|
|---|
| 966 | if test $at_xpass_count != 0; then
|
|---|
| 967 | echo "Unexpected passes:"
|
|---|
| 968 | $SHELL "$[0]" $at_xpass_list --list
|
|---|
| 969 | echo
|
|---|
| 970 | fi
|
|---|
| 971 | if test $at_fail_count != 0; then
|
|---|
| 972 | AS_BOX([Detailed failed tests.])
|
|---|
| 973 | echo
|
|---|
| 974 | for at_group in $at_fail_list
|
|---|
| 975 | do
|
|---|
| 976 | at_group_normalized=$at_group
|
|---|
| 977 | _AT_NORMALIZE_TEST_GROUP_NUMBER(at_group_normalized)
|
|---|
| 978 | cat "$at_suite_dir/$at_group_normalized/$as_me.log"
|
|---|
| 979 | echo
|
|---|
| 980 | done
|
|---|
| 981 | echo
|
|---|
| 982 | fi
|
|---|
| 983 | if test -n "$at_top_srcdir"; then
|
|---|
| 984 | AS_BOX([${at_top_build_prefix}config.log])
|
|---|
| 985 | sed 's/^/| /' ${at_top_build_prefix}config.log
|
|---|
| 986 | echo
|
|---|
| 987 | fi
|
|---|
| 988 | } >&AS_MESSAGE_LOG_FD
|
|---|
| 989 |
|
|---|
| 990 | AS_BOX([$as_me.log was created.])
|
|---|
| 991 |
|
|---|
| 992 | echo
|
|---|
| 993 | echo "Please send \`${at_testdir+${at_testdir}/}$as_me.log' and all information you think might help:"
|
|---|
| 994 | echo
|
|---|
| 995 | echo " To: <AT_PACKAGE_BUGREPORT>"
|
|---|
| 996 | echo " Subject: @<:@AT_PACKAGE_STRING@:>@ $as_me:dnl
|
|---|
| 997 | $at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}dnl
|
|---|
| 998 | $at_xpass_list${at_xpass_list:+ passed unexpectedly}"
|
|---|
| 999 | echo
|
|---|
| 1000 | if test $at_debug_p = false; then
|
|---|
| 1001 | echo
|
|---|
| 1002 | echo 'You may investigate any problem if you feel able to do so, in which'
|
|---|
| 1003 | echo 'case the test suite provides a good starting point. Its output may'
|
|---|
| 1004 | echo "be found below \`${at_testdir+${at_testdir}/}$as_me.dir'."
|
|---|
| 1005 | echo
|
|---|
| 1006 | fi
|
|---|
| 1007 | exit 1
|
|---|
| 1008 | fi
|
|---|
| 1009 |
|
|---|
| 1010 | exit 0
|
|---|
| 1011 | m4_divert_pop([TESTS_END])dnl
|
|---|
| 1012 | dnl End of AT_INIT: divert to KILL, only test groups are to be
|
|---|
| 1013 | dnl output, the rest is ignored. Current diversion is BODY, inherited
|
|---|
| 1014 | dnl from M4sh.
|
|---|
| 1015 | m4_divert_pop([BODY])
|
|---|
| 1016 | m4_divert_push([KILL])
|
|---|
| 1017 | ])# AT_INIT
|
|---|
| 1018 |
|
|---|
| 1019 |
|
|---|
| 1020 | # _AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ARGS],[ACTION-IF-GIVEN],
|
|---|
| 1021 | # [ACTION-IF-NOT-GIVEN])
|
|---|
| 1022 | # ---------------------------------------------------------------------------
|
|---|
| 1023 | # Internal implementation of AT_ARG_OPTION & AT_ARG_OPTION_ARG
|
|---|
| 1024 | m4_defun([_AT_ARG_OPTION],
|
|---|
| 1025 | [m4_divert_once([HELP_OTHER],
|
|---|
| 1026 | [cat <<_ATEOF
|
|---|
| 1027 |
|
|---|
| 1028 | Other options:
|
|---|
| 1029 | _ATEOF
|
|---|
| 1030 | ])dnl m4_divert_once HELP_OTHER
|
|---|
| 1031 | m4_divert_text([HELP_OTHER],
|
|---|
| 1032 | [cat <<_ATEOF
|
|---|
| 1033 | $2
|
|---|
| 1034 | _ATEOF])dnl
|
|---|
| 1035 | dnl Turn our options into our desired strings
|
|---|
| 1036 | m4_ifdef([AT_first_option],[m4_undefine([AT_first_option])])dnl
|
|---|
| 1037 | m4_ifdef([AT_case],[m4_undefine([AT_case])])dnl
|
|---|
| 1038 | m4_ifdef([AT_case_no],[m4_undefine([AT_case_no])])dnl
|
|---|
| 1039 | m4_ifdef([AT_case_arg],[m4_undefine([AT_case_arg])])dnl
|
|---|
| 1040 | m4_foreach([AT_option], m4_split(m4_normalize([$1]),[[ \|]+]),
|
|---|
| 1041 | [m4_define_default([AT_first_option],AT_option)dnl
|
|---|
| 1042 | m4_append([AT_case],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option, [ | ])dnl
|
|---|
| 1043 | m4_append([AT_case_no],[--no]AT_option, [ | ])dnl
|
|---|
| 1044 | m4_append([AT_case_arg],m4_if(m4_len(AT_option),1,[],[-])[-]AT_option[=*], [ | ])dnl
|
|---|
| 1045 | ])dnl m4_foreach AT_option
|
|---|
| 1046 | dnl keep track so we or the user may process ACTION-IF-NOT-GIVEN
|
|---|
| 1047 | m4_divert_once([PARSE_ARGS_BEGIN],
|
|---|
| 1048 | [
|
|---|
| 1049 | ##
|
|---|
| 1050 | ## Set up package specific options.
|
|---|
| 1051 | ##
|
|---|
| 1052 | ])dnl
|
|---|
| 1053 | m4_divert_text([PARSE_ARGS_BEGIN],
|
|---|
| 1054 | [dnl Provide a default value for options without arguments.
|
|---|
| 1055 | m4_ifvaln([$3],,[at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false])dnl
|
|---|
| 1056 | at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=false
|
|---|
| 1057 | ])dnl m4_divert_text DEFAULTS
|
|---|
| 1058 | m4_ifval([$3],[m4_divert_once([PARSE_ARGS_END],
|
|---|
| 1059 | [
|
|---|
| 1060 | ##
|
|---|
| 1061 | ## Verify our last option didn't require an argument
|
|---|
| 1062 | ##
|
|---|
| 1063 | AS_IF([test -n "$at_prev"],[AS_ERROR([`$at_prev' requires an argument.])])])])
|
|---|
| 1064 | m4_divert_text([PARSE_ARGS],
|
|---|
| 1065 | [dnl Parse the options and args when necessary.
|
|---|
| 1066 | m4_ifvaln([$3],
|
|---|
| 1067 | [ AT_case )
|
|---|
| 1068 | at_prev=--m4_bpatsubst([AT_first_option], -, _)
|
|---|
| 1069 | ;;
|
|---|
| 1070 | AT_case_arg )
|
|---|
| 1071 | at_arg_[]m4_bpatsubst([AT_first_option], -, _)=$at_optarg
|
|---|
| 1072 | at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
|
|---|
| 1073 | $4
|
|---|
| 1074 | ;;],
|
|---|
| 1075 | [ AT_case )
|
|---|
| 1076 | at_optarg=:
|
|---|
| 1077 | at_arg_[]m4_bpatsubst([AT_first_option], -, _)=:
|
|---|
| 1078 | at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
|
|---|
| 1079 | m4_ifval([$4],[$4])dnl
|
|---|
| 1080 | ;;
|
|---|
| 1081 | AT_case_no )
|
|---|
| 1082 | at_optarg=false
|
|---|
| 1083 | at_arg_[]m4_bpatsubst([AT_first_option], -, _)=false
|
|---|
| 1084 | at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)=:
|
|---|
| 1085 | m4_ifval([$4],[$4])dnl
|
|---|
| 1086 | ;;])dnl m4_ifvaln $3
|
|---|
| 1087 | ])dnl m4_divert_text PARSE_ARGS
|
|---|
| 1088 | m4_ifvaln([$5],
|
|---|
| 1089 | [m4_divert_once([PARSE_ARGS_END],
|
|---|
| 1090 | [
|
|---|
| 1091 | ##
|
|---|
| 1092 | ## Process package specific options when _not_ supplied.
|
|---|
| 1093 | ##])dnl m4_divert_once PARSE_ARGS_END
|
|---|
| 1094 | m4_divert_text([PARSE_ARGS_END],
|
|---|
| 1095 | [
|
|---|
| 1096 | AS_IF([$at_arg_given_[]m4_bpatsubst([AT_first_option], -, _)],,[$5])dnl
|
|---|
| 1097 | ])dnl m4_divert_text PARSE_ARGS_END
|
|---|
| 1098 | ])dnl m4_ifvaln $5
|
|---|
| 1099 | ])dnl _AT_ARG_OPTION
|
|---|
| 1100 |
|
|---|
| 1101 |
|
|---|
| 1102 | # AT_ARG_OPTION(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
|
|---|
| 1103 | # ------------------------------------------------------------------------
|
|---|
| 1104 | # Accept a set of OPTIONS with arguments. Add HELP-TEXT to the HELP_OTHER
|
|---|
| 1105 | # diversion.
|
|---|
| 1106 | #
|
|---|
| 1107 | # Preceding dashes should not be passed into OPTIONS. Users will be required
|
|---|
| 1108 | # to pass `--' before long options and `-' before single character options.
|
|---|
| 1109 | #
|
|---|
| 1110 | # $at_arg_OPTION will be set to `:' if this option is received, `false' if
|
|---|
| 1111 | # if --noOPTION is received, and `false' by default.
|
|---|
| 1112 | #
|
|---|
| 1113 | # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
|
|---|
| 1114 | # $at_optarg set to `:' or `false' as appropriate. $at_optarg is actually
|
|---|
| 1115 | # just a copy of $at_arg_OPTION.
|
|---|
| 1116 | #
|
|---|
| 1117 | # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
|
|---|
| 1118 | # if no option from OPTIONS was found.
|
|---|
| 1119 | m4_defun([AT_ARG_OPTION],[_AT_ARG_OPTION([$1],[$2],,[$3],[$4])])
|
|---|
| 1120 |
|
|---|
| 1121 |
|
|---|
| 1122 | # AT_ARG_OPTION_ARG(OPTIONS,HELP-TEXT,[ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])
|
|---|
| 1123 | # ---------------------------------------------------------------------------
|
|---|
| 1124 | # Accept a set of OPTIONS with arguments, seperated by commas. Add HELP-TEXT
|
|---|
| 1125 | # to the HELP_OTHER diversion.
|
|---|
| 1126 | #
|
|---|
| 1127 | # Preceding dashes should not be passed into OPTIONS. Users will be required
|
|---|
| 1128 | # to pass `--' before long options and `-' before single character options.
|
|---|
| 1129 | #
|
|---|
| 1130 | # By default, any argument to these options will be assigned to the shell
|
|---|
| 1131 | # variable $at_arg_OPTION, where OPTION is the first option in OPTIONS with
|
|---|
| 1132 | # any `-' characters replaced with `_'.
|
|---|
| 1133 | #
|
|---|
| 1134 | # Run ACTION-IF-GIVEN each time an option in OPTIONS is encountered with
|
|---|
| 1135 | # $at_optarg set. $at_optarg is actually just a copy of $at_arg_OPTION.
|
|---|
| 1136 | #
|
|---|
| 1137 | # ACTION-IF-NOT-GIVEN will be run once after option parsing is complete
|
|---|
| 1138 | # if no option from OPTIONS was found.
|
|---|
| 1139 | m4_defun([AT_ARG_OPTION_ARG],[_AT_ARG_OPTION([$1],[$2],1,[$3],[$4])])
|
|---|
| 1140 |
|
|---|
| 1141 |
|
|---|
| 1142 | # AT_TESTED(PROGRAMS)
|
|---|
| 1143 | # -------------------
|
|---|
| 1144 | # Specify the list of programs exercised by the test suite. Their
|
|---|
| 1145 | # versions are logged, and in the case of embedded test suite, they
|
|---|
| 1146 | # must correspond to the version of the package. PATH should be
|
|---|
| 1147 | # already preset so the proper executable will be selected.
|
|---|
| 1148 | m4_define([AT_TESTED],
|
|---|
| 1149 | [m4_append_uniq([AT_tested], [$1], [
|
|---|
| 1150 | ])])
|
|---|
| 1151 |
|
|---|
| 1152 |
|
|---|
| 1153 | # AT_COPYRIGHT(TEXT)
|
|---|
| 1154 | # ------------------
|
|---|
| 1155 | # Emit TEXT, a copyright notice, in the top of the test suite and in
|
|---|
| 1156 | # --version output. Macros in TEXT are evaluated once.
|
|---|
| 1157 | m4_define([AT_COPYRIGHT],
|
|---|
| 1158 | [AS_COPYRIGHT([$1])[]dnl
|
|---|
| 1159 | m4_divert_text([VERSION_NOTICES],
|
|---|
| 1160 | [
|
|---|
| 1161 | $1])])# AT_COPYRIGHT
|
|---|
| 1162 |
|
|---|
| 1163 |
|
|---|
| 1164 | # AT_SETUP(DESCRIPTION)
|
|---|
| 1165 | # ---------------------
|
|---|
| 1166 | # Start a group of related tests, all to be executed in the same subshell.
|
|---|
| 1167 | # The group is testing what DESCRIPTION says.
|
|---|
| 1168 | m4_define([AT_SETUP],
|
|---|
| 1169 | [m4_ifdef([AT_keywords], [m4_undefine([AT_keywords])])
|
|---|
| 1170 | m4_ifdef([AT_capture_files], [m4_undefine([AT_capture_files])])
|
|---|
| 1171 | m4_define([AT_line], AT_LINE)
|
|---|
| 1172 | m4_define([AT_xfail], [at_xfail=no])
|
|---|
| 1173 | m4_define([AT_description], [$1])
|
|---|
| 1174 | m4_define([AT_ordinal], m4_incr(AT_ordinal))
|
|---|
| 1175 | m4_append([AT_groups_all], [ ]m4_defn([AT_ordinal]))
|
|---|
| 1176 | m4_divert_push([TESTS])dnl
|
|---|
| 1177 | AT_ordinal ) @%:@ AT_ordinal. m4_defn([AT_line]): $1
|
|---|
| 1178 | at_setup_line='m4_defn([AT_line])'
|
|---|
| 1179 | at_desc="AS_ESCAPE([$1])"
|
|---|
| 1180 | $at_quiet $ECHO_N "m4_format([%3d: %-]m4_eval(47 - m4_qdelta([$1]))[s],
|
|---|
| 1181 | AT_ordinal, AS_ESCAPE([[$1]]))[]$ECHO_C"
|
|---|
| 1182 | m4_divert_push([TEST_SCRIPT])dnl
|
|---|
| 1183 | ])
|
|---|
| 1184 |
|
|---|
| 1185 |
|
|---|
| 1186 | # AT_XFAIL_IF(SHELL-EXPRESSION)
|
|---|
| 1187 | # -----------------------------
|
|---|
| 1188 | # Set up the test to be expected to fail if SHELL-EXPRESSION evaluates to
|
|---|
| 1189 | # true (exitcode = 0).
|
|---|
| 1190 | m4_define([AT_XFAIL_IF],
|
|---|
| 1191 | [dnl
|
|---|
| 1192 | dnl Try to limit the amount of conditionals that we emit.
|
|---|
| 1193 | m4_case([$1],
|
|---|
| 1194 | [], [],
|
|---|
| 1195 | [false], [],
|
|---|
| 1196 | [:], [m4_define([AT_xfail], [at_xfail=yes])],
|
|---|
| 1197 | [true], [m4_define([AT_xfail], [at_xfail=yes])],
|
|---|
| 1198 | [m4_append([AT_xfail], [
|
|---|
| 1199 | $1 && at_xfail=yes])])])
|
|---|
| 1200 |
|
|---|
| 1201 |
|
|---|
| 1202 | # AT_KEYWORDS(KEYWORDS)
|
|---|
| 1203 | # ---------------------
|
|---|
| 1204 | # Declare a list of keywords associated to the current test group.
|
|---|
| 1205 | m4_define([AT_KEYWORDS],
|
|---|
| 1206 | [m4_append_uniq([AT_keywords], [$1], [ ])])
|
|---|
| 1207 |
|
|---|
| 1208 |
|
|---|
| 1209 | # AT_CAPTURE_FILE(FILE)
|
|---|
| 1210 | # ---------------------
|
|---|
| 1211 | # If the current test group does not behave as expected, save the contents of
|
|---|
| 1212 | # FILE in the test suite log.
|
|---|
| 1213 | m4_define([AT_CAPTURE_FILE],
|
|---|
| 1214 | [m4_append_uniq([AT_capture_files], ["$1"], [ \
|
|---|
| 1215 | ])])
|
|---|
| 1216 |
|
|---|
| 1217 |
|
|---|
| 1218 | # AT_CLEANUP
|
|---|
| 1219 | # ----------
|
|---|
| 1220 | # Complete a group of related tests.
|
|---|
| 1221 | m4_define([AT_CLEANUP],
|
|---|
| 1222 | [m4_append([AT_help_all],
|
|---|
| 1223 | m4_defn([AT_ordinal]);m4_defn([AT_line]);m4_defn([AT_description]);m4_ifdef([AT_keywords], [m4_defn([AT_keywords])]);
|
|---|
| 1224 | )dnl
|
|---|
| 1225 | m4_divert_pop([TEST_SCRIPT])dnl Back to TESTS
|
|---|
| 1226 | AT_xfail
|
|---|
| 1227 | echo "# -*- compilation -*-" >> "$at_group_log"
|
|---|
| 1228 | (
|
|---|
| 1229 | echo "AT_ordinal. m4_defn([AT_line]): testing $1..."
|
|---|
| 1230 | $at_traceon
|
|---|
| 1231 | m4_undivert([TEST_SCRIPT])dnl Insert the code here
|
|---|
| 1232 | $at_traceoff
|
|---|
| 1233 | $at_times_p && times >"$at_times_file"
|
|---|
| 1234 | ) AS_MESSAGE_LOG_FD>&1 2>&1 | eval $at_tee_pipe
|
|---|
| 1235 | at_status=`cat "$at_status_file"`
|
|---|
| 1236 | ;;
|
|---|
| 1237 |
|
|---|
| 1238 | m4_divert_pop([TESTS])dnl Back to KILL.
|
|---|
| 1239 | ])# AT_CLEANUP
|
|---|
| 1240 |
|
|---|
| 1241 |
|
|---|
| 1242 | # AT_BANNER(TEXT)
|
|---|
| 1243 | # ---------------
|
|---|
| 1244 | # Output TEXT without any shell expansion.
|
|---|
| 1245 | m4_define([AT_BANNER],
|
|---|
| 1246 | [m4_define([AT_banner_ordinal], m4_incr(AT_banner_ordinal))
|
|---|
| 1247 | m4_append([AT_groups_all], [ banner-]m4_defn([AT_banner_ordinal]))
|
|---|
| 1248 | m4_divert_text([TESTS],
|
|---|
| 1249 | [
|
|---|
| 1250 | banner-AT_banner_ordinal ) @%:@ Banner AT_banner_ordinal. AT_LINE
|
|---|
| 1251 | cat <<\_ATEOF
|
|---|
| 1252 |
|
|---|
| 1253 | $1
|
|---|
| 1254 |
|
|---|
| 1255 | _ATEOF
|
|---|
| 1256 | ;;
|
|---|
| 1257 | ])dnl
|
|---|
| 1258 | ])# AT_BANNER
|
|---|
| 1259 |
|
|---|
| 1260 |
|
|---|
| 1261 | # AT_DATA(FILE, CONTENTS)
|
|---|
| 1262 | # -----------------------
|
|---|
| 1263 | # Initialize an input data FILE with given CONTENTS, which should end with
|
|---|
| 1264 | # an end of line.
|
|---|
| 1265 | # This macro is not robust to active symbols in CONTENTS *on purpose*.
|
|---|
| 1266 | # If you don't want CONTENTS to be evaluated, quote it twice.
|
|---|
| 1267 | m4_define([AT_DATA],
|
|---|
| 1268 | [cat >$1 <<'_ATEOF'
|
|---|
| 1269 | $2[]_ATEOF
|
|---|
| 1270 | ])
|
|---|
| 1271 |
|
|---|
| 1272 |
|
|---|
| 1273 | # AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
|
|---|
| 1274 | # [RUN-IF-FAIL], [RUN-IF-PASS])
|
|---|
| 1275 | # ------------------------------------------------
|
|---|
| 1276 | # Execute a test by performing given shell COMMANDS. These commands
|
|---|
| 1277 | # should normally exit with STATUS, while producing expected STDOUT and
|
|---|
| 1278 | # STDERR contents. Shell metacharacters in STDOUT and STDERR are
|
|---|
| 1279 | # _not_ processed by the shell, but are treated as string literals.
|
|---|
| 1280 | #
|
|---|
| 1281 | # STATUS, STDOUT, and STDERR are not checked if equal to `ignore'.
|
|---|
| 1282 | #
|
|---|
| 1283 | # If STDOUT is `expout', then stdout is compared to the content of the file
|
|---|
| 1284 | # `expout'. Likewise for STDERR and `experr'.
|
|---|
| 1285 | #
|
|---|
| 1286 | # If STDOUT is `stdout', then the stdout is left in the file `stdout',
|
|---|
| 1287 | # likewise for STDERR and `stderr'. Don't do this:
|
|---|
| 1288 | #
|
|---|
| 1289 | # AT_CHECK([command >out])
|
|---|
| 1290 | # # Some checks on `out'
|
|---|
| 1291 | #
|
|---|
| 1292 | # do this instead:
|
|---|
| 1293 | #
|
|---|
| 1294 | # AT_CHECK([command], [], [stdout])
|
|---|
| 1295 | # # Some checks on `stdout'
|
|---|
| 1296 | #
|
|---|
| 1297 | # This is an unfortunate limitation inherited from Ultrix which will not
|
|---|
| 1298 | # let you redirect several times the same FD (see the Autoconf documentation).
|
|---|
| 1299 | # If you use the `AT_CHECK([command >out])' be sure to get a test suite
|
|---|
| 1300 | # that will show spurious failures.
|
|---|
| 1301 | #
|
|---|
| 1302 | # You might wonder why not just use `ignore' and directly use stdout and
|
|---|
| 1303 | # stderr left by the test suite. Firstly because the names of these files
|
|---|
| 1304 | # is an internal detail, and secondly, because
|
|---|
| 1305 | #
|
|---|
| 1306 | # AT_CHECK([command], [], [ignore])
|
|---|
| 1307 | # AT_CHECK([check stdout])
|
|---|
| 1308 | #
|
|---|
| 1309 | # will use `stdout' both in input and output: undefined behavior would
|
|---|
| 1310 | # certainly result. That's why the test suite will save them in `at-stdout'
|
|---|
| 1311 | # and `at-stderr', and will provide you with `stdout' and `stderr'.
|
|---|
| 1312 | #
|
|---|
| 1313 | # Any line of stderr starting with leading blanks and a `+' are filtered
|
|---|
| 1314 | # out, since most shells when tracing include subshell traces in stderr.
|
|---|
| 1315 | # This may cause spurious failures when the test suite is run with `-x'.
|
|---|
| 1316 | #
|
|---|
| 1317 | m4_define([AT_CHECK],
|
|---|
| 1318 | [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6],1)])
|
|---|
| 1319 |
|
|---|
| 1320 | # AT_CHECK_NOESCAPE(COMMANDS, [STATUS = 0], STDOUT, STDERR,
|
|---|
| 1321 | # [RUN-IF-FAIL], [RUN-IF-PASS])
|
|---|
| 1322 | # ---------------------------------------------------------
|
|---|
| 1323 | # Like AT_CHECK, but do not AS_ESCAPE shell metacharacters in the STDOUT
|
|---|
| 1324 | # and STDERR arguments before running the comparison.
|
|---|
| 1325 | m4_define([AT_CHECK_NOESCAPE],
|
|---|
| 1326 | [_AT_CHECK([$1],[$2],[$3],[$4],[$5],[$6])])
|
|---|
| 1327 |
|
|---|
| 1328 |
|
|---|
| 1329 | # _AT_DECIDE_TRACEABLE(COMMANDS)
|
|---|
| 1330 | # ------------------------------
|
|---|
| 1331 | # Worker for for _AT_CHECK that expands to shell code. If COMMANDS are safe to
|
|---|
| 1332 | # trace with `set -x', the shell code will set `at_trace_this=yes'. Otherwise,
|
|---|
| 1333 | # the shell code will print a message stating an aspect of COMMANDS that makes
|
|---|
| 1334 | # tracing them unsafe.
|
|---|
| 1335 | #
|
|---|
| 1336 | # Tracing COMMANDS is not safe if they contain a command that spans multiple
|
|---|
| 1337 | # lines. When the test suite user passes `-x' or `--trace', the test suite
|
|---|
| 1338 | # precedes every command with a `set -x'. Since most tests expect a specific
|
|---|
| 1339 | # stderr, if only to confirm that it is empty, the test suite filters ^+ from
|
|---|
| 1340 | # the captured stderr before comparing with the expected stderr. If a command
|
|---|
| 1341 | # spans multiple lines, so will its trace, but a `+' only prefixes the first
|
|---|
| 1342 | # line of that trace:
|
|---|
| 1343 | #
|
|---|
| 1344 | # $ echo 'foo
|
|---|
| 1345 | # bar'
|
|---|
| 1346 | # => stdout
|
|---|
| 1347 | # foo
|
|---|
| 1348 | # bar
|
|---|
| 1349 | # => stderr
|
|---|
| 1350 | # + foo
|
|---|
| 1351 | # bar
|
|---|
| 1352 | #
|
|---|
| 1353 | # In a subset of cases, one could filter such extended shell traces from stderr.
|
|---|
| 1354 | # Since test commands spanning several lines are rare, I chose instead to simply
|
|---|
| 1355 | # not trace COMMANDS that could yield multiple trace lines. Distinguishing such
|
|---|
| 1356 | # COMMANDS became the task at hand.
|
|---|
| 1357 | #
|
|---|
| 1358 | # These features may cause a shell command to span multiple lines:
|
|---|
| 1359 | #
|
|---|
| 1360 | # (a) A quoted literal newline.
|
|---|
| 1361 | # Example:
|
|---|
| 1362 | # echo foo'
|
|---|
| 1363 | # 'bar
|
|---|
| 1364 | # M4 is a hostile language for the job of parsing COMMANDS to determine whether
|
|---|
| 1365 | # each literal newline is quoted, so we simply disable tracing for all COMMANDS
|
|---|
| 1366 | # that bear literal newlines.
|
|---|
| 1367 | #
|
|---|
| 1368 | # (b) A command substitution not subject to word splitting.
|
|---|
| 1369 | # Example:
|
|---|
| 1370 | # var=$(printf 'foo\nbar')
|
|---|
| 1371 | # Example:
|
|---|
| 1372 | # echo "`printf 'foo\\nbar`"
|
|---|
| 1373 | # One cannot know in general the number of lines a command substitution will
|
|---|
| 1374 | # yield without executing the substituted command. As such, we disable tracing
|
|---|
| 1375 | # for all COMMANDS containing these constructs.
|
|---|
| 1376 | #
|
|---|
| 1377 | # (c) A parameter expansion not subject to word splitting.
|
|---|
| 1378 | # Example:
|
|---|
| 1379 | # var=foo'
|
|---|
| 1380 | # 'bar
|
|---|
| 1381 | # echo "$var"
|
|---|
| 1382 | # Parameter expansions appear in COMMANDS with much greater frequency than do
|
|---|
| 1383 | # newlines and command substitutions, so disabling tracing for all such COMMANDS
|
|---|
| 1384 | # would much more substantially devalue `testsuite -x'. To determine which
|
|---|
| 1385 | # parameter expansions yield multiple lines, we escape all ``', `"', and `\' in
|
|---|
| 1386 | # a copy of COMMANDS and expand that string within double quotes at runtime. If
|
|---|
| 1387 | # the result of that expansion contains multiple lines, the test suite disables
|
|---|
| 1388 | # tracing for the command in question.
|
|---|
| 1389 | #
|
|---|
| 1390 | # This method leads the test suite to expand some parameters that the shell
|
|---|
| 1391 | # itself will never expand due to single-quotes or backslash escapes. This is
|
|---|
| 1392 | # not a problem for `$foo' expansions, which will simply yield the empty string
|
|---|
| 1393 | # or some unrelated value. A `${...}' expansion could actually form invalid
|
|---|
| 1394 | # shell code, however; consider `${=foo}'. Therefore, we disable tracing for
|
|---|
| 1395 | # all COMMANDS containing `${...}'. This affects few COMMANDS.
|
|---|
| 1396 | #
|
|---|
| 1397 | # This macro falls in a very hot path; the Autoconf test suite expands it 1640
|
|---|
| 1398 | # times as of this writing. To give a sense of the impact of the heuristics I
|
|---|
| 1399 | # just described, the test suite preemptively disables tracing for 31 of those,
|
|---|
| 1400 | # and 268 contain parameter expansions that require runtime evaluation. The
|
|---|
| 1401 | # balance are always safe to trace.
|
|---|
| 1402 | #
|
|---|
| 1403 | # _AT_CHECK expands COMMANDS, but the Autoconf language does not provide a way
|
|---|
| 1404 | # to safely expand arbitrary COMMANDS in an argument list, so the below tests
|
|---|
| 1405 | # examine COMMANDS unexpanded.
|
|---|
| 1406 | m4_define([_AT_DECIDE_TRACEABLE],
|
|---|
| 1407 | [dnl Utility macros.
|
|---|
| 1408 | m4_pushdef([at_lf], [
|
|---|
| 1409 | ])[]dnl
|
|---|
| 1410 | dnl
|
|---|
| 1411 | dnl Examine COMMANDS for a reason to never trace COMMANDS.
|
|---|
| 1412 | m4_pushdef([at_reason],
|
|---|
| 1413 | m4_bmatch([$1],
|
|---|
| 1414 | [`.*`], [[a `...` command substitution]],
|
|---|
| 1415 | [\$(], [[a $(...) command substitution]],
|
|---|
| 1416 | [\${], [[a ${...} parameter expansion]],
|
|---|
| 1417 | at_lf, [[an embedded newline]],
|
|---|
| 1418 | [[]]dnl No reason.
|
|---|
| 1419 | ))dnl
|
|---|
| 1420 | dnl
|
|---|
| 1421 | m4_ifval(m4_defn([at_reason]),
|
|---|
| 1422 | [echo 'Not enabling shell tracing (command contains ]m4_defn([at_reason])[)'],
|
|---|
| 1423 | [m4_bmatch([$1], [\$],
|
|---|
| 1424 | dnl COMMANDS may contain parameter expansions; expand them at runtime.
|
|---|
| 1425 | [case "AS_ESCAPE([$1], [`"\])" in
|
|---|
| 1426 | *'
|
|---|
| 1427 | '*) echo 'Not enabling shell tracing (command contains an embedded newline)' ;;
|
|---|
| 1428 | *) at_trace_this=yes ;;
|
|---|
| 1429 | esac],
|
|---|
| 1430 | dnl We know at build time that tracing COMMANDS is always safe.
|
|---|
| 1431 | [at_trace_this=yes])])[]dnl
|
|---|
| 1432 | m4_popdef([at_lf])[]dnl
|
|---|
| 1433 | m4_popdef([at_reason])])
|
|---|
| 1434 |
|
|---|
| 1435 |
|
|---|
| 1436 | # _AT_CHECK(COMMANDS, [STATUS = 0], STDOUT, STDERR,
|
|---|
| 1437 | # [RUN-IF-FAIL], [RUN-IF-PASS], SHELL_ESCAPE_IO)
|
|---|
| 1438 | # ---------------------------------------------------------
|
|---|
| 1439 | # Worker for AT_CHECK & AT_CHECK_NOESCAPE. The final SHELL-ESCAPE-IO
|
|---|
| 1440 | # argument determines whether the STDOUT & STDERR arguments will be escaped or
|
|---|
| 1441 | # not.
|
|---|
| 1442 | #
|
|---|
| 1443 | #
|
|---|
| 1444 | # Implementation Details
|
|---|
| 1445 | # ----------------------
|
|---|
| 1446 | # Ideally, we would like to run
|
|---|
| 1447 | #
|
|---|
| 1448 | # ( $at_traceon; COMMANDS >at-stdout 2> at-stderr )
|
|---|
| 1449 | #
|
|---|
| 1450 | # but we must group COMMANDS as it is not limited to a single command, and
|
|---|
| 1451 | # then the shells will save the traces in at-stderr. So we have to filter
|
|---|
| 1452 | # them out when checking stderr, and we must send them into the test suite's
|
|---|
| 1453 | # stderr to honor -x properly. Since only the first line of the trace of a
|
|---|
| 1454 | # multiline command starts with a `+', and I know of no straightforward way to
|
|---|
| 1455 | # filter out the unadorned trace lines, we disable shell tracing entirely for
|
|---|
| 1456 | # commands that could span multiple lines.
|
|---|
| 1457 | #
|
|---|
| 1458 | # Limiting COMMANDS to a single command is not good either, since them
|
|---|
| 1459 | # the user herself would use {} or (), and then we face the same problem.
|
|---|
| 1460 | #
|
|---|
| 1461 | # But then, there is no point in running
|
|---|
| 1462 | #
|
|---|
| 1463 | # ( $at_traceon { $1 ; } >at-stdout 2>at-stder1 )
|
|---|
| 1464 | #
|
|---|
| 1465 | # instead of the simpler
|
|---|
| 1466 | #
|
|---|
| 1467 | # ( $at_traceon; $1 ) >at-stdout 2>at-stder1
|
|---|
| 1468 | #
|
|---|
| 1469 | m4_define([_AT_CHECK],
|
|---|
| 1470 | [$at_traceoff
|
|---|
| 1471 | echo "$at_srcdir/AT_LINE: AS_ESCAPE([$1])"
|
|---|
| 1472 | echo AT_LINE >"$at_check_line_file"
|
|---|
| 1473 |
|
|---|
| 1474 | at_trace_this=
|
|---|
| 1475 | if test -n "$at_traceon"; then
|
|---|
| 1476 | _AT_DECIDE_TRACEABLE([$1])
|
|---|
| 1477 | fi
|
|---|
| 1478 |
|
|---|
| 1479 | if test -n "$at_trace_this"; then
|
|---|
| 1480 | ( $at_traceon; $1 ) >"$at_stdout" 2>"$at_stder1"
|
|---|
| 1481 | at_status=$?
|
|---|
| 1482 | grep '^ *+' "$at_stder1" >&2
|
|---|
| 1483 | grep -v '^ *+' "$at_stder1" >"$at_stderr"
|
|---|
| 1484 | else
|
|---|
| 1485 | ( :; $1 ) >"$at_stdout" 2>"$at_stderr"
|
|---|
| 1486 | at_status=$?
|
|---|
| 1487 | fi
|
|---|
| 1488 |
|
|---|
| 1489 | at_failed=false
|
|---|
| 1490 | dnl Check stderr.
|
|---|
| 1491 | m4_case([$4],
|
|---|
| 1492 | stderr, [echo stderr:; tee stderr <"$at_stderr"],
|
|---|
| 1493 | ignore, [echo stderr:; cat "$at_stderr"],
|
|---|
| 1494 | experr, [$at_diff experr "$at_stderr" || at_failed=:],
|
|---|
| 1495 | [], [$at_diff "$at_devnull" "$at_stderr" || at_failed=:],
|
|---|
| 1496 | [echo >>"$at_stderr"; echo "m4_ifval([$7],[AS_ESCAPE([$4])],[$4])" | $at_diff - "$at_stderr" || at_failed=:])
|
|---|
| 1497 | dnl Check stdout.
|
|---|
| 1498 | m4_case([$3],
|
|---|
| 1499 | stdout, [echo stdout:; tee stdout <"$at_stdout"],
|
|---|
| 1500 | ignore, [echo stdout:; cat "$at_stdout"],
|
|---|
| 1501 | expout, [$at_diff expout "$at_stdout" || at_failed=:],
|
|---|
| 1502 | [], [$at_diff "$at_devnull" "$at_stdout" || at_failed=:],
|
|---|
| 1503 | [echo >>"$at_stdout"; echo "m4_ifval([$7],[AS_ESCAPE([$3])],[$3])" | $at_diff - "$at_stdout" || at_failed=:])
|
|---|
| 1504 | dnl Check exit val. Don't `skip' if we are precisely checking $? = 77.
|
|---|
| 1505 | case $at_status in
|
|---|
| 1506 | m4_if([$2], [77],
|
|---|
| 1507 | [],
|
|---|
| 1508 | [ 77) echo 77 > "$at_status_file"; exit 77;;
|
|---|
| 1509 | ])dnl
|
|---|
| 1510 | m4_if([$2], [ignore],
|
|---|
| 1511 | [ *);;],
|
|---|
| 1512 | [ m4_default([$2], [0])) ;;
|
|---|
| 1513 | *) echo "$at_srcdir/AT_LINE: exit code was $at_status, expected m4_default([$2], [0])"
|
|---|
| 1514 | at_failed=:;;])
|
|---|
| 1515 | esac
|
|---|
| 1516 | AS_IF($at_failed, [$5
|
|---|
| 1517 | m4_ifdef([AT_capture_files],
|
|---|
| 1518 | [for file in AT_capture_files
|
|---|
| 1519 | do echo "$file:"; sed 's/^/> /' "$file"; done])
|
|---|
| 1520 | echo 1 > "$at_status_file"
|
|---|
| 1521 | exit 1], [$6])
|
|---|
| 1522 | $at_traceon
|
|---|
| 1523 | ])# _AT_CHECK
|
|---|