From: Stefano Lattarini Date: Tue, 6 Sep 2011 15:53:29 +0000 (+0200) Subject: Merge branch 'test-protocols' into testsuite-work X-Git-Tag: ng-0.5a~89^2~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5f256bcbe38d72d1f69cee806d8714c9c7d0b17;p=thirdparty%2Fautomake.git Merge branch 'test-protocols' into testsuite-work * test-protocols: tests: fix spurious failures due to ignored signals --- b5f256bcbe38d72d1f69cee806d8714c9c7d0b17 diff --cc tests/defs index 671ce6f6f,ad0490bf8..931188b60 --- a/tests/defs +++ b/tests/defs @@@ -222,55 -152,37 +222,64 @@@ is_newest ( test -z "$is_newest_files" } + # is_blocked_signal SIGNAL-NUMBER + # -------------------------------- + # Return success if the given signal number is blocked in the shell, + # return a non-zero exit status and print a proper diagnostic otherwise. + is_blocked_signal () + { + $SHELL -c "kill -$1 \$\$; echo '$me: signal $1 seems blocked'" + } + -# AUTOMAKE_run status [options...] -# -------------------------------- -# Run Automake with OPTIONS, and fail if automake -# does not exit with STATUS. +# AUTOMAKE_run [-e STATUS] [-d DESCRIPTION] [--] [AUTOMAKE-ARGS...] +# ----------------------------------------------------------------- +# Run automake with AUTOMAKE-ARGS, and fail if it doesn't exit with +# STATUS. Should be polymorphic for TAP and "plain" tests. The +# DESCRIPTION, when provided, is used for console reporting, only if +# the TAP protocol is in use in the current test script. AUTOMAKE_run () { - expected_exitcode=$1 - shift - exitcode=0 - $AUTOMAKE ${1+"$@"} >stdout 2>stderr || exitcode=$? + am__desc= + am__exp_rc=0 + while test $# -gt 0; do + case $1 in + -d) am__desc=$2; shift;; + -e) am__exp_rc=$2; shift;; + --) shift; break;; + # Don't fail on unknown option: assume they (and the rest of the + # command line) are to be passed verbatim to automake (so stop our + # own option parsing). + *) break;; + esac + shift + done + am__got_rc=0 + $AUTOMAKE ${1+"$@"} >stdout 2>stderr || am__got_rc=$? cat stderr >&2 cat stdout - test $exitcode = $expected_exitcode || Exit 1 + if test $using_tap != yes; then + test $am__got_rc -eq $am__exp_rc || Exit 1 + return + fi + if test -z "$am__desc"; then + if test $am__got_rc -eq $am__exp_rc; then + am__desc="automake exited $am__got_rc" + else + am__desc="automake exited $am__got_rc, expecting $am__exp_rc" + fi + fi + command_ok_ "$am__desc" test $am__got_rc -eq $am__exp_rc } -# AUTOMAKE_fails [options...] -# --------------------------- -# Run Automake with OPTIONS, and fail if automake -# does not exit with STATUS. +# AUTOMAKE_fails [-d DESCRIPTION] [OPTIONS...] +# -------------------------------------------- +# Run automake with OPTIONS, and fail if doesn't exit with status `1'. +# Should be polymorphic for TAP and "plain" tests. The DESCRIPTION, +# when provided, is used for console reporting, only if the TAP +# protocol is in use in the current test script. AUTOMAKE_fails () { - AUTOMAKE_run 1 ${1+"$@"} + AUTOMAKE_run -e 1 ${1+"$@"} } # using_gmake diff --cc tests/self-check-cleanup.test index fb5b055f7,9cfde1d3e..754ed0de6 --- a/tests/self-check-cleanup.test +++ b/tests/self-check-cleanup.test @@@ -112,28 -108,21 +112,31 @@@ fi # $have_symlink # Check that the cleanup trap does not remove the temporary # test directory in case of test failure, skip, hard-error, # or when receiving a signal. - for bailout_command in \ - 'Exit 1' \ - 'Exit 2' \ - 'Exit 10' \ - 'Exit 77' \ - 'Exit 99' \ - 'Exit 126' \ - 'Exit 127' \ - 'Exit 255' \ - 'kill -1 $$' \ - 'kill -2 $$' \ - 'kill -9 $$' \ - 'kill -13 $$' \ - 'kill -15 $$' \ - ; do + + for st in 1 2 3 10 77 99 126 127 130 255; do - $SHELL -c ". ./defs; : > foo; Exit $st" dummy.test && Exit 1 ++ $SHELL -c " ++ stderr_fileno_=2 ++ . ./defs ++ : > foo ++ Exit $st ++ " dummy.test && Exit 1 + test -f dummy.dir/foo + rm -rf dummy.dir + done + + for signum in 1 2 3 9 13 15; do + if is_blocked_signal $signum; then + echo "$me: signal $signum is blocked, skipping part of the test" + continue + fi - $SHELL -c ". ./defs; : > foo; kill -$signum \$\$" dummy.test && Exit 1 + $SHELL -c " + stderr_fileno_=2 + . ./defs + : > foo - $bailout_command ++ kill -$signum \$\$ + " dummy.test && Exit 1 test -f dummy.dir/foo + rm -rf dummy.dir done : diff --cc tests/self-check-exit.tap index 6f35e0874,000000000..563500b2e mode 100755,000000..100755 --- a/tests/self-check-exit.tap +++ b/tests/self-check-exit.tap @@@ -1,99 -1,0 +1,103 @@@ +#! /bin/sh +# Copyright (C) 2011 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 . + +# Sanity check for the automake testsuite. +# Check that, in case of failing commands, the correct exit status is +# passed to the exit trap installed by the `./defs' script. +# Also check that the `errexit' shell flag is active. + +am_create_testdir=no +. ./defs || Exit 99 + +plan_ 34 + +# This test becomes more cumbersome if we keep the `errexit' shell flag +# set. And removing it is no big deal, as this test is a TAP-based one, +# so that false positives remain very unlikely. +set +e + +AM_TESTS_REEXEC=no; export AM_TESTS_REEXEC + +init='. ./defs; stderr_fileno_=2; unset am_explicit_skips' + +for st in 1 2 3 4 5 77 99 126 127 128 129 130 255; do + for exit_cmd in "Exit $st" "sh -c 'exit $st'"; do + $SHELL -c "$init; $exit_cmd; :" + command_ok_ "$exit_cmd" test $? -eq $st + done +done + +for sig in 1 2 13 15; do ++ if is_blocked_signal $sig; then ++ skip_ -r "signal $sig seems blocked" ++ continue ++ fi + if test $sig -eq 2; then + # Some Korn shells might otherwise get a spurious SIGINT + # signal when one is sent to the child $SHELL. + trap : 2 + fi + $SHELL -c "$init; kill -$sig \$\$; :" + rc=$? + if test $sig -eq 2; then + # Reset default SIGINT handler as portably as possible. + trap 2 || trap - 2 + fi + if test x"$sh_errexit_works" = x"yes"; then + # The exit trap should turn into an hard errors any failure + # caused by signals. + command_ok_ "kill -$sig" test $rc -eq 99 + else + # The exit trap is not installed, so that the shell should exit + # with status 128+n when receiving signal number n. But don't + # be too strict in the check, as POSIX only says that "The exit + # status of a command that terminated because it received a + # signal shall be reported as greater than 128". + command_ok_ "kill -$sig" test $rc -gt 128 + fi + unset rc +done + +: Non-existent program. +# Solaris 10 /bin/sh erroneously exit with success right away when the +# following three conditions are met at the same time: +# 1. the `errexit' flag is active, +# 2. an exit trap is installed, and +# 3. a non-existing command is issued. +# Note that the non-existent command is issued as the last command to +# the shell in the next line; this is deliberate. +if $SHELL -c 'set -e; trap "exit \$?" 0; non-existent-program'; then + maybe_todo=TODO reason="known Solaris /bin/sh bug" +else + maybe_todo="" reason="" +fi +$SHELL -c "$init; non-existent-program; :" +command_ok_ "command not found" -D "$maybe_todo" -r "$reason" \ + -- test $? -gt 0 + +: Non-executable command. +test -f Makefile && test ! -x Makefile || \ + framowork_failure_ "no proper Makefile in the current directory" +$SHELL -c "$init; ./Makefile; :" +command_ok_ "permission denied" test $? -gt 0 + +: Syntax errors in the test code. +$SHELL -c "$init; if :; then" +command_ok_ "syntax error 1" test $? -gt 0 +$SHELL -c "$init; fi" +command_ok_ "syntax error 2" test $? -gt 0 + +: