# -*- shell-script -*- # # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ######################################################## ### IMPORTANT NOTE: keep this file 'set -e' clean. ### ######################################################## # Do not source several times. test ${test_lib_sourced-no} = yes && return 0 test_lib_sourced=yes # CDPATH is evil if used in non-interactive scripts (and even more # evil if exported in the environment). CDPATH=; unset CDPATH # Be more Bourne compatible. # (Snippet inspired to configure's initialization in Autoconf 2.64) DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: setopt NO_GLOB_SUBST # If Zsh is not started directly in POSIX-compatibility mode, it has some # incompatibilities in the handling of $0 that conflict with our usage; # i.e., $0 inside a file sourced with the '.' builtin is temporarily set # to the name of the sourced file. Work around that. # Note that a bug in some versions of Zsh prevents us from resetting $0 # in a sourced script, so the use of $argv0. For more info see: # # The apparently useless 'eval' here is needed by at least dash 0.5.2, # to prevent it from bailing out with an error like: # "Syntax error: Bad substitution". eval 'argv0=${functrace[-1]%:*}' && test -f "$argv0" || { echo "Cannot determine the path of running test script." >&2 echo "Your Zsh (version $ZSH_VERSION) is probably too old." >&2 exit 99 } else argv0=$0 # Ignore command substitution failure, for it might cause problems # with "set -e" on some shells. am_shell_opts=$(set -o) || : case $am_shell_opts in *posix*) set -o posix;; esac unset am_shell_opts fi # A single whitespace character. sp=' ' # A tabulation character. tab=' ' # A newline character. nl=' ' # As autoconf-generated configure scripts do, ensure that IFS # is defined initially, so that saving and restoring $IFS works. IFS=$sp$tab$nl # The name of the current test (without the '.sh' or '.tap' suffix). me=${argv0##*/} # Strip all directory components. case $me in # Strip test suffix. *.tap) me=${me%.tap};; *.sh) me=${me%.sh} ;; esac # Source extra package-specific configuration. . test-defs.sh # And fail hard if something went wrong. test $? -eq 0 || exit 99 # We use a trap below for cleanup. This requires us to go through # hoops to get the right exit status transported through the signal. # Turn off errexit here so that we don't trip the bug with OSF1/Tru64 # sh inside this function (FIXME: is this still relevant now that we # require a POSIX shell?). _am_exit () { set +e # See comments in the exit trap for the reason we do this. test 77 = $1 && am__test_skipped=yes # Extra escaping to ensure we do not call our 'exit' alias. (\exit $1); \exit $1 } # Avoid interferences from the environment am__test_skipped=no # This alias must actually be placed before any use if 'exit' -- even # just inside a function definition. Weird, but real. alias exit=_am_exit # In some shells (e.g., Solaris 10 /bin/ksh, or NetBSD 5.1 /bin/sh), # "unset VAR" returns a non-zero exit status in case the VAR variable # is already unset. This doesn't interact well with our usage of # "set -e" in the testsuite. This function and the alias below help # to work around the issue. But be sure to use them only if actually # needed. The repeated unset in the check below cater to the very # unlikely case where the '_am_v' variable is set in the environment. if unset _am_v && unset _am_v; then : Nothing needs to be done. else _am_unset () { for _am_v do # Extra escaping (here and below) to ensure we do not call our # 'unset' alias. eval ${_am_v}=dummy && \unset ${_am_v} || return 1 done \unset _am_v } alias unset=_am_unset fi ## ------------------------------------ ## ## General testsuite shell functions. ## ## ------------------------------------ ## # Print warnings (e.g., about skipped and failed tests) to this file # number. Override by putting, say: # AM_TESTS_ENVIRONMENT = stderr_fileno_=9; export stderr_fileno_; # AM_TESTS_FD_REDIRECT = 9>&2 # in your Makefile.am. # This is useful when using automake's parallel tests mode, to print the # reason for skip/failure to console, rather than to the *.log files. : ${stderr_fileno_=2} # Helper functions used by "plain" tests of the Automake testsuite # (i.e., tests that don't use any test protocol). # TAP tests will override these functions with their TAP-enhanced # equivalents later (see sourcing of 'tap-functions.sh' below). # These are copied from Gnulib's 'tests/init.sh'. warn_ () { echo "$@" 1>&$stderr_fileno_; } fail_ () { warn_ "$me: failed test: $@"; exit 1; } skip_ () { warn_ "$me: skipped test: $@"; exit 77; } fatal_ () { warn_ "$me: hard error: $@"; exit 99; } framework_failure_ () { warn_ "$me: set-up failure: $@"; exit 99; } # For compatibility with TAP functions. skip_all_ () { skip_ "$@"; } if test $am_test_protocol = tap; then . tap-functions.sh fi ## ---------------------------- ## ## Auxiliary shell functions. ## ## ---------------------------- ## # Tell whether we should keep the test directories around, even in # case of success. By default, we don't. am_keeping_testdirs () { case $keep_testdirs in ""|n|no|NO) return 1;; *) return 0;; esac } # seq_ - print a sequence of numbers # ---------------------------------- # This function simulates GNU seq(1) portably. Valid usages: # - seq LAST # - seq FIRST LAST # - seq FIRST INCREMENT LAST seq_ () { case $# in 0) fatal_ "seq_: missing argument";; 1) seq_first=1 seq_incr=1 seq_last=$1;; 2) seq_first=$1 seq_incr=1 seq_last=$2;; 3) seq_first=$1 seq_incr=$2 seq_last=$3;; *) fatal_ "seq_: too many arguments";; esac i=$seq_first while test $i -le $seq_last; do echo $i i=$(($i + $seq_incr)) done } # rm_rf_ [FILES OR DIRECTORIES ...] # --------------------------------- # Recursively remove the given files or directory, also handling the case # of non-writable subdirectories. rm_rf_ () { test $# -gt 0 || return 0 $PERL "$am_testaux_srcdir"/deltree.pl "$@" } commented_sed_unindent_prog=' /^$/b # Nothing to do for empty lines. x # Get x into pattern space. /^$/{ # No prior x, go prepare it. g # Copy this 1st non-blank line into pattern space. s/^\(['"$tab"' ]*\).*/x\1/ # Prepare x in pattern space. } # Now: x in pattern and in hold. G # Build x\n in pattern space, and h # duplicate it into hold space. s/\n.*$// # Restore x in pattern space, and x # exchange with the above duplicate in hold space. s/^x\(.*\)\n\1// # Remove leading from . s/^x.*\n// # Restore when there is no leading . ' # unindent [input files...] # ------------------------- # Remove the "proper" amount of leading whitespace from the given files, # and output the result on stdout. That amount is determined by looking # at the leading whitespace of the first non-blank line in the input # files. If no input file is specified, standard input is implied. unindent () { if test x"$sed_unindent_prog" = x; then sed_unindent_prog=$(printf '%s\n' "$commented_sed_unindent_prog" \ | sed -e "s/ *# .*//") fi sed "$sed_unindent_prog" ${1+"$@"} } sed_unindent_prog="" # Avoid interferences from the environment. ## ---------------------------------------------------------------- ## ## Create and set up of the temporary directory used by the test. ## ## Set up of the exit trap for cleanup of said directory. ## ## ---------------------------------------------------------------- ## # Set up the exit trap. am_exit_trap () { exit_status=$1 set +e cd "$am_top_builddir" if test $am_test_protocol = tap; then if test "$planned_" = later && test $exit_status -eq 0; then plan_ "now" fi test $exit_status -eq 0 && test $tap_pass_count_ -eq $tap_count_ \ || keep_testdirs=yes else # This is to ensure that a test script does give a SKIP outcome just # because a command in it happens to exit with status 77. This # behaviour, while from time to time useful to developers, is not # meant to be enabled by default, as it could cause spurious failures # in the wild. Thus it will be enabled only when the variable # 'am_explicit_skips' is set to a "true" value. case $am_explicit_skips in [yY]|[yY]es|1) if test $exit_status -eq 77 && test $am__test_skipped != yes; then echo "$me: implicit skip turned into failure" exit_status=78 fi;; esac test $exit_status -eq 0 || keep_testdirs=yes fi am_keeping_testdirs || rm_rf_ $am_test_subdir set +x # Spurious escaping to ensure we do not call our "exit" alias. \exit $exit_status } am_set_exit_traps () { trap 'am_exit_trap $?' 0 trap "fatal_ 'caught signal SIGHUP'" 1 trap "fatal_ 'caught signal SIGINT'" 2 trap "fatal_ 'caught signal SIGTERM'" 15 # Various shells seems to just ignore SIGQUIT under some circumstances, # even if the signal is not blocked; however, if the signal is trapped, # the trap gets correctly executed. So we also trap SIGQUIT. # Here is a list of some shells that have been verified to exhibit the # problematic behavior with SIGQUIT: # - zsh 4.3.12 on Debian GNU/Linux # - /bin/ksh and /usr/xpg4/bin/sh on Solaris 10 # - Bash 3.2.51 on Solaris 10 and bash 4.1.5 on Debian GNU/Linux # - AT&T ksh on Debian Gnu/Linux (deb package ksh, version 93u-1) # OTOH, at least these shells that do *not* exhibit that behaviour: # - modern version of the Almquist Shell (at least 0.5.5.1), on # both Solaris and GNU/Linux # - public domain Korn Shell, version 5.2.14, on Debian GNU/Linux trap "fatal_ 'caught signal SIGQUIT'" 3 # Ignore further SIGPIPE in the trap code. This is required to avoid # a very weird issue with some shells, at least when the execution of # the automake testsuite is driven by the 'prove' utility: if prove # (or the make process that has spawned it) gets interrupted with # Ctrl-C, the shell might go in a loop, continually getting a SIGPIPE, # sometimes finally dumping core, other times hanging indefinitely. # See also Test::Harness bug [rt.cpan.org #70855], archived at # trap "trap '' 13; fatal_ 'caught signal SIGPIPE'" 13 } am_test_setup () { process_requirements $required am_set_exit_traps # Create and populate the temporary directory, if required. if test x"$am_create_testdir" = x"no"; then am_test_subdir= else am_setup_testdir fi am_extra_info set -x pwd }