tests: rename 'tests/' => 't/', '*.test' => '*.sh'
[platform/upstream/automake.git] / t / tap-signal.tap
1 #! /bin/sh
2 # Copyright (C) 2011-2012 Free Software Foundation, Inc.
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2, or (at your option)
7 # any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 # TAP support:
18 #  - a test script terminated by a signal causes an hard error
19
20 am_parallel_tests=yes
21 . ./defs || Exit 1
22
23 fetch_tap_driver
24
25 plan_ 10
26
27 cat >> configure.ac <<END
28 AC_OUTPUT
29 END
30
31 cat > Makefile.am << END
32 TEST_LOG_DRIVER = \$(srcdir)/tap-driver
33 TEST_LOG_COMPILER = $PERL -w
34 ## Will be updated later.
35 TESTS =
36 END
37
38 all_signals='1 2 3 9 13 15'
39 blocked_signals=''
40 for sig in $all_signals; do
41   # Ignore blocked signals
42   if is_blocked_signal $sig; then
43     blocked_signals="$blocked_signals $sig"
44     continue
45   fi
46   # Write the dummy test scripts in perl, not as shell scripts, to work
47   # around unportabilities in the handling of signals (in fact, even
48   # with bash, the older script were unable to properly deliver a SIGQUIT
49   # to themselves consistently).  The shebang is dummy here, as we prefer
50   # to rely on the definition of TEST_LOG_COMPILER instead.
51   unindent > signal-$sig.test <<END
52     #! perl
53     # We need autoflush to avoid losing output, which could cause spurious
54     # "no test plan seen" in the TAP driver.
55     BEGIN { $| = 1 }
56     use warnings FATAL => "all";
57     print "1..1\\n";
58     print "ok 1\\n";
59     kill $sig, \$\$;
60     print "Bail out! \$0 not killed?\\n";
61 END
62   echo TESTS += signal-$sig.test >> Makefile.am
63 done
64 results_count=`ls *.test | wc -l | tr -d "$tab$sp"`
65
66 chmod a+x *.test
67
68 $ACLOCAL
69 $AUTOCONF
70 $AUTOMAKE
71
72 ./configure
73
74 system=`uname -s -r || echo unknown` # Needed later.
75
76 signal_caught ()
77 {
78   numeric=$1
79   case $numeric in
80      1) symbolic=HUP;;
81      2) symbolic=INT;;
82      3) symbolic=QUIT;;
83      9) symbolic=KILL;;
84     13) symbolic=PIPE;;
85     15) symbolic=TERM;;
86      *) fatal_ "unexpected signal number '$numeric'"
87   esac
88   # Sending a SIGQUIT on Cygwin 1.5 can cause a segmentation fault
89   # instead (sometimes).  Don't let this older bug pollute the results
90   # of our testsuite.
91   case $numeric,$system in
92     3,CYGWIN*\ 1.5.*) sig_re="((SIG)?($symbolic|SEGV)|$numeric|11)";;
93     *) sig_re="((SIG)?$symbolic|$numeric)";;
94   esac
95   wbound_re="($|[^a-zA-Z0-9_-])"
96   pfx_re="^ERROR: signal-$numeric\\.test"
97   case $am_tap_implementation in
98     perl) rx="$pfx_re - terminated by signal $sig_re$";;
99     shell) rx="$pfx_re .*terminated by signal $sig_re$wbound_re";;
100     *) fatal_ "invalid \$am_tap_implementation '$am_tap_implementation'";;
101   esac
102   desc="TAP driver catch test termination by signal SIG$symbolic"
103   case " $blocked_signals " in
104     *" $numeric "*) skip_ -r "SIG$symbolic is blocked" "$desc" ;;
105     *) command_ok_ "$desc" env LC_ALL=C $EGREP "$rx" stdout ;;
106   esac
107 }
108
109 command_ok_ '"make check" fails' eval '
110   (
111     st=0; $MAKE check >stdout || st=$?
112     cat stdout
113     # Extra "echo" and silencing of xtraces required to avoid possible
114     # garbled output with NetBSD make, which would miss some final
115     # newlines in the expected places and thus mess up our TAP output.
116     set +x; echo
117     test $st -gt 0
118   )
119 '
120 cat stdout # For debugging.
121
122 command_ok_ "count of test results" count_test_results \
123   total=`expr $results_count '*' 2` \
124   pass=$results_count error=$results_count \
125   fail=0 xpass=0 xfail=0 skip=0
126
127 for sig in $all_signals; do
128   signal_caught $sig
129 done
130
131 echo 'TEST_LOG_DRIVER_FLAGS = --ignore-exit' >> Makefile
132
133 command_ok_ '"make check" passes [--ignore-exit]' eval '$MAKE check >stdout'
134 cat stdout # For debugging.
135
136 command_ok_ "count of test results [--ignore-exit]" count_test_results \
137   total=$results_count pass=$results_count \
138   fail=0 xpass=0 xfail=0 skip=0 error=0
139
140 :