Merge branch 'branch-1.13.2' into maint
[platform/upstream/automake.git] / t / ax / test-lib.sh
1 # -*- shell-script -*-
2 #
3 # Copyright (C) 1996-2013 Free Software Foundation, Inc.
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2, or (at your option)
8 # any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 ########################################################
19 ###  IMPORTANT NOTE: keep this file 'set -e' clean.  ###
20 ########################################################
21
22 # Do not source several times.
23 test ${test_lib_sourced-no} = yes && return 0
24 test_lib_sourced=yes
25
26 # CDPATH is evil if used in non-interactive scripts (and even more
27 # evil if exported in the environment).
28 CDPATH=; unset CDPATH
29
30 # Be more Bourne compatible.
31 # (Snippet inspired to configure's initialization in Autoconf 2.64)
32 DUALCASE=1; export DUALCASE # for MKS sh
33 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
34   emulate sh
35   NULLCMD=:
36   setopt NO_GLOB_SUBST
37   # If Zsh is not started directly in POSIX-compatibility mode, it has some
38   # incompatibilities in the handling of $0 that conflict with our usage;
39   # i.e., $0 inside a file sourced with the '.' builtin is temporarily set
40   # to the name of the sourced file.  Work around that.
41   # Note that a bug in some versions of Zsh prevents us from resetting $0
42   # in a sourced script, so the use of $argv0.  For more info see:
43   #   <http://www.zsh.org/mla/workers/2009/msg01140.html>
44   # The apparently useless 'eval' here is needed by at least dash 0.5.2,
45   # to prevent it from bailing out with an error like:
46   #   "Syntax error: Bad substitution".
47   eval 'argv0=${functrace[-1]%:*}' && test -f "$argv0" || {
48     echo "Cannot determine the path of running test script." >&2
49     echo "Your Zsh (version $ZSH_VERSION) is probably too old." >&2
50     exit 99
51   }
52 else
53   argv0=$0
54   # Ignore command substitution failure, for it might cause problems
55   # with "set -e" on some shells.
56   am_shell_opts=$(set -o) || :
57   case $am_shell_opts in *posix*) set -o posix;; esac
58   unset am_shell_opts
59 fi
60
61 # A single whitespace character.
62 sp=' '
63 # A tabulation character.
64 tab='   '
65 # A newline character.
66 nl='
67 '
68
69 # As autoconf-generated configure scripts do, ensure that IFS
70 # is defined initially, so that saving and restoring $IFS works.
71 IFS=$sp$tab$nl
72
73 # The name of the current test (without the '.sh' or '.tap' suffix).
74 me=${argv0##*/} # Strip all directory components.
75 case $me in     # Strip test suffix.
76    *.tap) me=${me%.tap};;
77     *.sh) me=${me%.sh} ;;
78  esac
79
80 # Source extra package-specific configuration.
81 . test-defs.sh
82 # And fail hard if something went wrong.
83 test $? -eq 0 || exit 99
84
85 # We use a trap below for cleanup.  This requires us to go through
86 # hoops to get the right exit status transported through the signal.
87 # Turn off errexit here so that we don't trip the bug with OSF1/Tru64
88 # sh inside this function (FIXME: is this still relevant now that we
89 # require a POSIX shell?).
90 _am_exit ()
91 {
92   set +e
93   # See comments in the exit trap for the reason we do this.
94   test 77 = $1 && am__test_skipped=yes
95   # Spurious escaping to ensure we do not call our 'exit' alias.
96   (\exit $1); \exit $1
97 }
98 # Avoid interferences from the environment
99 am__test_skipped=no
100 # This alias must actually be placed before any use if 'exit' -- even
101 # just inside a function definition.  Weird, but real.
102 alias exit=_am_exit
103
104 ## ------------------------------------ ##
105 ##  General testsuite shell functions.  ##
106 ## ------------------------------------ ##
107
108 # Print warnings (e.g., about skipped and failed tests) to this file
109 # number.  Override by putting, say:
110 #   AM_TESTS_ENVIRONMENT = stderr_fileno_=9; export stderr_fileno_;
111 #   AM_TESTS_FD_REDIRECT = 9>&2
112 # in your Makefile.am.
113 # This is useful when using automake's parallel tests mode, to print the
114 # reason for skip/failure to console, rather than to the *.log files.
115 : ${stderr_fileno_=2}
116
117 # Helper functions used by "plain" tests of the Automake testsuite
118 # (i.e., tests that don't use any test protocol).
119 # TAP tests will override these functions with their TAP-enhanced
120 # equivalents later  (see sourcing of 'tap-functions.sh' below).
121 # These are copied from Gnulib's 'tests/init.sh'.
122 warn_ () { echo "$@" 1>&$stderr_fileno_; }
123 fail_ () { warn_ "$me: failed test: $@"; exit 1; }
124 skip_ () { warn_ "$me: skipped test: $@"; exit 77; }
125 fatal_ () { warn_ "$me: hard error: $@"; exit 99; }
126 framework_failure_ () { warn_ "$me: set-up failure: $@"; exit 99; }
127 # For compatibility with TAP functions.
128 skip_all_ () { skip_ "$@"; }
129
130 if test $am_test_protocol = tap; then
131   . tap-functions.sh
132 fi
133
134 ## ---------------------------- ##
135 ##  Auxiliary shell functions.  ##
136 ## ---------------------------- ##
137
138 # Tell whether we should keep the test directories around, even in
139 # case of success.  By default, we don't.
140 am_keeping_testdirs ()
141 {
142   case $keep_testdirs in
143      ""|n|no|NO) return 1;;
144               *) return 0;;
145   esac
146 }
147
148 # seq_ - print a sequence of numbers
149 # ----------------------------------
150 # This function simulates GNU seq(1) portably.  Valid usages:
151 #  - seq LAST
152 #  - seq FIRST LAST
153 #  - seq FIRST INCREMENT LAST
154 seq_ ()
155 {
156   case $# in
157     0) fatal_ "seq_: missing argument";;
158     1) seq_first=1  seq_incr=1  seq_last=$1;;
159     2) seq_first=$1 seq_incr=1  seq_last=$2;;
160     3) seq_first=$1 seq_incr=$2 seq_last=$3;;
161     *) fatal_ "seq_: too many arguments";;
162   esac
163   i=$seq_first
164   while test $i -le $seq_last; do
165     echo $i
166     i=$(($i + $seq_incr))
167   done
168 }
169
170 # rm_rf_ [FILES OR DIRECTORIES ...]
171 # ---------------------------------
172 # Recursively remove the given files or directory, also handling the case
173 # of non-writable subdirectories.
174 rm_rf_ ()
175 {
176   test $# -gt 0 || return 0
177   # Ignore failures in find, we are only interested in failures of the
178   # final rm.
179   find "$@" -type d ! -perm -700 -exec chmod u+rwx {} \; || :
180   rm -rf "$@"
181 }
182
183 commented_sed_unindent_prog='
184   /^$/b                    # Nothing to do for empty lines.
185   x                        # Get x<indent> into pattern space.
186   /^$/{                    # No prior x<indent>, go prepare it.
187     g                      # Copy this 1st non-blank line into pattern space.
188     s/^\(['"$tab"' ]*\).*/x\1/   # Prepare x<indent> in pattern space.
189   }                        # Now: x<indent> in pattern and <line> in hold.
190   G                        # Build x<indent>\n<line> in pattern space, and
191   h                        # duplicate it into hold space.
192   s/\n.*$//                # Restore x<indent> in pattern space, and
193   x                        # exchange with the above duplicate in hold space.
194   s/^x\(.*\)\n\1//         # Remove leading <indent> from <line>.
195   s/^x.*\n//               # Restore <line> when there is no leading <indent>.
196 '
197
198 # unindent [input files...]
199 # -------------------------
200 # Remove the "proper" amount of leading whitespace from the given files,
201 # and output the result on stdout.  That amount is determined by looking
202 # at the leading whitespace of the first non-blank line in the input
203 # files.  If no input file is specified, standard input is implied.
204 unindent ()
205 {
206   if test x"$sed_unindent_prog" = x; then
207     sed_unindent_prog=$(printf '%s\n' "$commented_sed_unindent_prog" \
208                           | sed -e "s/  *# .*//")
209   fi
210   sed "$sed_unindent_prog" ${1+"$@"}
211 }
212 sed_unindent_prog="" # Avoid interferences from the environment.
213
214 ## ---------------------------------------------------------------- ##
215 ##  Create and set up of the temporary directory used by the test.  ##
216 ##  Set up of the exit trap for cleanup of said directory.          ##
217 ## ---------------------------------------------------------------- ##
218
219 # Set up the exit trap.
220 am_exit_trap ()
221 {
222   exit_status=$1
223   set +e
224   cd "$am_top_builddir"
225   if test $am_test_protocol = tap; then
226     if test "$planned_" = later && test $exit_status -eq 0; then
227       plan_ "now"
228     fi
229     test $exit_status -eq 0 && test $tap_pass_count_ -eq $tap_count_ \
230       || keep_testdirs=yes
231   else
232     # This is to ensure that a test script does give a SKIP outcome just
233     # because a command in it happens to exit with status 77.  This
234     # behaviour, while from time to time useful to developers, is not
235     # meant to be enabled by default, as it could cause spurious failures
236     # in the wild.  Thus it will be enabled only when the variable
237     # "am_explicit_skips" is set to a "true" value.
238     case $am_explicit_skips in
239       [yY]|[yY]es|1)
240         if test $exit_status -eq 77 && test $am__test_skipped != yes; then
241           echo "$me: implicit skip turned into failure"
242           exit_status=78
243         fi;;
244     esac
245     test $exit_status -eq 0 || keep_testdirs=yes
246   fi
247   am_keeping_testdirs || rm_rf_ $am_test_subdir
248   set +x
249   echo "$me: exit $exit_status"
250   # Spurious escaping to ensure we do not call our "exit" alias.
251   \exit $exit_status
252 }
253
254 am_set_exit_traps ()
255 {
256   trap 'am_exit_trap $?' 0
257   trap "fatal_ 'caught signal SIGHUP'" 1
258   trap "fatal_ 'caught signal SIGINT'" 2
259   trap "fatal_ 'caught signal SIGTERM'" 15
260   # Various shells seems to just ignore SIGQUIT under some circumstances,
261   # even if the signal is not blocked; however, if the signal it trapped,
262   # the trap gets correctly executed.  So we also trap SIGQUIT.
263   # Here is a list of some shells that have been verified to exhibit the
264   # problematic behavior with SIGQUIT:
265   #  - zsh 4.3.12 on Debian GNU/Linux
266   #  - /bin/ksh and /usr/xpg4/bin/sh on Solaris 10
267   #  - Bash 3.2.51 on Solaris 10 and bash 4.1.5 on Debian GNU/Linux
268   #  - AT&T ksh on Debian Gnu/Linux (deb package ksh, version 93u-1)
269   # OTOH, at least these shells that do *not* exhibit that behaviour:
270   #  - modern version of the Almquist Shell (at least 0.5.5.1), on
271   #    both Solaris and GNU/Linux
272   #  - public domain Korn Shell, version 5.2.14, on Debian GNU/Linux
273   trap "fatal_ 'caught signal SIGQUIT'" 3
274   # Ignore further SIGPIPE in the trap code.  This is required to avoid
275   # a very weird issue with some shells, at least when the execution of
276   # the automake testsuite is driven by the 'prove' utility: if prove
277   # (or the make process that has spawned it) gets interrupted with
278   # Ctrl-C, the shell might go in a loop, continually getting a SIGPIPE,
279   # sometimes finally dumping core, other times hanging indefinitely.
280   # See also Test::Harness bug [rt.cpan.org #70855], archived at
281   # <https://rt.cpan.org/Ticket/Display.html?id=70855>
282   trap "trap '' 13; fatal_ 'caught signal SIGPIPE'" 13
283 }
284
285 am_test_setup ()
286 {
287   process_requirements $required
288   am_set_exit_traps
289   # Create and populate the temporary directory, if required.
290   if test x"$am_create_testdir" = x"no"; then
291     am_test_subdir=
292   else
293     am_setup_testdir
294   fi
295   am_extra_info
296   set -x
297   pwd
298 }