summaryrefslogtreecommitdiff
path: root/t/tap-signal.tap
diff options
context:
space:
mode:
Diffstat (limited to 't/tap-signal.tap')
-rwxr-xr-xt/tap-signal.tap140
1 files changed, 140 insertions, 0 deletions
diff --git a/t/tap-signal.tap b/t/tap-signal.tap
new file mode 100755
index 000000000..ab1cd40ef
--- /dev/null
+++ b/t/tap-signal.tap
@@ -0,0 +1,140 @@
+#! /bin/sh
+# Copyright (C) 2011-2012 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 <http://www.gnu.org/licenses/>.
+
+# TAP support:
+# - a test script terminated by a signal causes an hard error
+
+am_parallel_tests=yes
+. ./defs || Exit 1
+
+fetch_tap_driver
+
+plan_ 10
+
+cat >> configure.ac <<END
+AC_OUTPUT
+END
+
+cat > Makefile.am << END
+TEST_LOG_DRIVER = \$(srcdir)/tap-driver
+TEST_LOG_COMPILER = $PERL -w
+## Will be updated later.
+TESTS =
+END
+
+all_signals='1 2 3 9 13 15'
+blocked_signals=''
+for sig in $all_signals; do
+ # Ignore blocked signals
+ if is_blocked_signal $sig; then
+ blocked_signals="$blocked_signals $sig"
+ continue
+ fi
+ # Write the dummy test scripts in perl, not as shell scripts, to work
+ # around unportabilities in the handling of signals (in fact, even
+ # with bash, the older script were unable to properly deliver a SIGQUIT
+ # to themselves consistently). The shebang is dummy here, as we prefer
+ # to rely on the definition of TEST_LOG_COMPILER instead.
+ unindent > signal-$sig.test <<END
+ #! perl
+ # We need autoflush to avoid losing output, which could cause spurious
+ # "no test plan seen" in the TAP driver.
+ BEGIN { $| = 1 }
+ use warnings FATAL => "all";
+ print "1..1\\n";
+ print "ok 1\\n";
+ kill $sig, \$\$;
+ print "Bail out! \$0 not killed?\\n";
+END
+ echo TESTS += signal-$sig.test >> Makefile.am
+done
+results_count=`ls *.test | wc -l | tr -d "$tab$sp"`
+
+chmod a+x *.test
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+
+./configure
+
+system=`uname -s -r || echo unknown` # Needed later.
+
+signal_caught ()
+{
+ numeric=$1
+ case $numeric in
+ 1) symbolic=HUP;;
+ 2) symbolic=INT;;
+ 3) symbolic=QUIT;;
+ 9) symbolic=KILL;;
+ 13) symbolic=PIPE;;
+ 15) symbolic=TERM;;
+ *) fatal_ "unexpected signal number '$numeric'"
+ esac
+ # Sending a SIGQUIT on Cygwin 1.5 can cause a segmentation fault
+ # instead (sometimes). Don't let this older bug pollute the results
+ # of our testsuite.
+ case $numeric,$system in
+ 3,CYGWIN*\ 1.5.*) sig_re="((SIG)?($symbolic|SEGV)|$numeric|11)";;
+ *) sig_re="((SIG)?$symbolic|$numeric)";;
+ esac
+ wbound_re="($|[^a-zA-Z0-9_-])"
+ pfx_re="^ERROR: signal-$numeric\\.test"
+ case $am_tap_implementation in
+ perl) rx="$pfx_re - terminated by signal $sig_re$";;
+ shell) rx="$pfx_re .*terminated by signal $sig_re$wbound_re";;
+ *) fatal_ "invalid \$am_tap_implementation '$am_tap_implementation'";;
+ esac
+ desc="TAP driver catch test termination by signal SIG$symbolic"
+ case " $blocked_signals " in
+ *" $numeric "*) skip_ -r "SIG$symbolic is blocked" "$desc" ;;
+ *) command_ok_ "$desc" env LC_ALL=C $EGREP "$rx" stdout ;;
+ esac
+}
+
+command_ok_ '"make check" fails' eval '
+ (
+ st=0; $MAKE check >stdout || st=$?
+ cat stdout
+ # Extra "echo" and silencing of xtraces required to avoid possible
+ # garbled output with NetBSD make, which would miss some final
+ # newlines in the expected places and thus mess up our TAP output.
+ set +x; echo
+ test $st -gt 0
+ )
+'
+cat stdout # For debugging.
+
+command_ok_ "count of test results" count_test_results \
+ total=`expr $results_count '*' 2` \
+ pass=$results_count error=$results_count \
+ fail=0 xpass=0 xfail=0 skip=0
+
+for sig in $all_signals; do
+ signal_caught $sig
+done
+
+echo 'TEST_LOG_DRIVER_FLAGS = --ignore-exit' >> Makefile
+
+command_ok_ '"make check" passes [--ignore-exit]' eval '$MAKE check >stdout'
+cat stdout # For debugging.
+
+command_ok_ "count of test results [--ignore-exit]" count_test_results \
+ total=$results_count pass=$results_count \
+ fail=0 xpass=0 xfail=0 skip=0 error=0
+
+: