Some shells seems to just ignore SIGQUIT under some circumstances, even when it is not blocked; however, if the signal it trapped, the trap gets correctly executed.
* tests/defs [$sh_errexit_works = yes]: Also trap SIGQUIT. Add extensive explanation of why we do so. * tests/self-check-cleanup.tap: Improve and fix to ensure that an earlier failure does not prevent the rest of the test to execute. Problem revealed by a failure in `self-check-cleanup.tap'. --- ChangeLog | 12 ++++++++++++ tests/defs | 15 +++++++++++++++ tests/self-check-cleanup.tap | 22 ++++++++++++++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index cbc6693..909b337 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2011-09-13 Stefano Lattarini <stefano.lattar...@gmail.com> + tests: also trap SIGQUIT; other fixes + Some shells seems to just ignore SIGQUIT under some circumstances, + even when it is not blocked; however, if the signal it trapped, + the trap gets correctly executed. + * tests/defs [$sh_errexit_works = yes]: Also trap SIGQUIT. Add + extensive explanation of why we do so. + * tests/self-check-cleanup.tap: Improve and fix to ensure that an + earlier failure does not prevent the rest of the test to execute. + Problem revealed by a failure in `self-check-cleanup.tap'. + +2011-09-13 Stefano Lattarini <stefano.lattar...@gmail.com> + test defs: work around weird ksh behaviour w.r.t. signal handling * tests/defs (is_blocked_signal): Use perl to determine whether a signal is trapped, since trying to do it portably within the shell diff --git a/tests/defs b/tests/defs index 9fed42e..f1822c8 100644 --- a/tests/defs +++ b/tests/defs @@ -963,6 +963,21 @@ if test "$sh_errexit_works" = yes; then trap "fatal_ 'caught signal SIGHUP'" 1 trap "fatal_ 'caught signal SIGINIT'" 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 it 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 + # - Solaris 10 /bin/sh + # - 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 diff --git a/tests/self-check-cleanup.tap b/tests/self-check-cleanup.tap index c9d0bc9..d369c9f 100755 --- a/tests/self-check-cleanup.tap +++ b/tests/self-check-cleanup.tap @@ -42,6 +42,14 @@ export have_symlinks # Is used also by spawned shells. dir=dummy.dir +# Don't let a failure poison all subsequent tests. +do_clean () +{ + test -d $dir || return 0 + find $dir -type d -exec chmod u+rwx '{}' ';' || : + rm -rf $dir +} + # Check that pre-test cleanup works also with directories with # "null" permissions, and containing broken symlinks. mkdir $dir $dir/sub @@ -56,9 +64,11 @@ chmod 000 $dir/sub/* $dir/file $dir/symlink chmod 000 $dir/sub $dir command_ok_ "pre-cleanup can deal with null-perms testdir" \ $SHELL -c '. ./defs' dummy.test -command_ok_ "pre-cleanup removed null-perms testdir" +command_ok_ "pre-cleanup removed null-perms testdir" \ eval 'test ! -f $dir && test ! -d $dir && test ! -r $dir' +do_clean + # Check that post-test cleanup works also with directories with # "null" permissions, and containing broken symlinks. command_ok_ "post-cleanup can deal with null-perms testdir" \ @@ -78,9 +88,11 @@ command_ok_ "post-cleanup can deal with null-perms testdir" \ chmod 000 dir/sub dir : ' dummy.test -command_ok_ "post-cleanup removed null-perms testdir" +command_ok_ "post-cleanup removed null-perms testdir" \ eval 'test ! -f $dir && test ! -d $dir && test ! -r $dir' +do_clean + # Check that pre-test cleanup does not unduly change the permissions of # files to which symlinks in the temporary test directory point to. if test $have_symlinks = yes; then @@ -123,6 +135,8 @@ else # $have_symlinks = no skip_row_ 6 "symlinks not supported" fi +do_clean + # 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. @@ -136,7 +150,7 @@ for st in 1 2 3 10 77 99 126 127 130 255; do " dummy.test command_ok_ "testdir not removed if exiting with status $st" \ test -f dummy.dir/foo - rm -rf dummy.dir + do_clean done for sig in 1 2 3 9 13 15; do @@ -152,7 +166,7 @@ for sig in 1 2 3 9 13 15; do " dummy.test command_ok_ "testdir not removed if getting signal $sig" \ test -f dummy.dir/foo - rm -rf dummy.dir + do_clean done : -- 1.7.2.3