Hash :
c7cfa093
Author :
Date :
2013-05-21T20:22:17
tests: run_make: options to do command redirection
Let's improve the API of the 'run_make()' helper shell function by
adding three new options:
-O Save the standard output from make on disk, in a regular file
named 'stdout'.
-E Save the standard error from make on disk, in a regular file
named 'stderr'.
-M Save both the standard output and standard error from make on
disk, in a regular file named 'output'. This option supersedes
both the '-O' and '-E' options.
This new API has two main advantages.
1. Its use will allow us to get rid of more cumbersome idioms
like, e.g.,
$MAKE check >stdout && { cat stdout; exit 1; }
cat stdout
That can now be substituted with a simpler one:
run_make -e FAIL -O check
2. More importantly, using the new API we will prevent any extra output
from the shell traces of the code in run_make to be redirected along
with the make stderr (where that was redirected). This problem was
present in usages like, e.g.,
run_make TESTS=foo.test check 2>stderr && exit 1
grep 'expected error message' stderr
Such usages are now to be rewritten as follows:
run_make -e FAIL -E TESTS=foo.test check
grep 'expected error message' stderr
ensuring that 'stderr' won't end up containing unrelated stuff.
Note that we do not convert in bulk the old idioms and the use of
redirected 'run_make' invocations with this patch. We only convert
some occurrences, to ensure that the new implementation of 'run_make'
is sound enough. More sweeping conversions will likely be done in
follow-up patches.
* t/ax/am-test-lib.sh (run_make): Enhance and implement the extended API.
* t/tap-xfail-tests.sh: Use the new 'run_make' API.
* t/test-driver-cond.sh: Likewise.
* t/tests-environment-fd-redirect.sh: Likewise.
* t/uninstall-fail.sh: Likewise.
* t/yacc-dist-nobuild.sh: Likewise.
Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#! /bin/sh
# Copyright (C) 2011-2013 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/>.
# parallel-tests:
# - Automake can correctly handle conditionals contents for the
# LOG_DRIVER variables.
. test-init.sh
cp "$am_testaux_srcdir"/trivial-test-driver . \
|| fatal_ "failed to fetch auxiliary script trivial-test-driver"
cp "$am_scriptdir"/tap-driver.pl . \
|| fatal_ "failed to fetch auxiliary script tap-driver.pl"
cat >> configure.ac << END
AM_CONDITIONAL([COND1], [:])
AM_CONDITIONAL([COND2], [false])
AM_CONDITIONAL([COND3], [false])
AC_SUBST([PERL], ['$PERL'])
AC_SUBST([my_LOG_DRIVER], ['\${SHELL} \${top_srcdir}/trivial-test-driver'])
AM_SUBST_NOTMAKE([my_LOG_DRIVER])
AC_OUTPUT
END
$ACLOCAL
$AUTOCONF
cat > Makefile.am << 'END'
TESTS = foo bar.test baz.sh
EXTRA_DIST = $(TESTS) tap-driver.pl trivial-test-driver
TEST_EXTENSIONS = .test .sh
LOG_DRIVER =
SH_LOG_DRIVER = $(tap_rulez)
if COND1
LOG_DRIVER += @my_LOG_DRIVER@
if COND2
tap_rulez = false
else !COND2
tap_rulez = $(PERL) $(srcdir)/tap-driver.pl
endif !COND2
endif COND1
END
cat > foo <<'END'
#!/bin/sh
echo "PASS: from $0"
echo "SKIP: from $0"
exit 1 # exit status should be ignored by the trivial-test-driver.
END
cat > bar.test <<'END'
#!/bin/sh
exit 0
END
cat > baz.sh <<'END'
#!/bin/sh
echo 1..3
echo 'ok 1'
echo 'not ok 2 # TODO'
echo 'not ok 3 # TODO'
END
chmod a+x foo bar.test baz.sh
$AUTOMAKE -a
test -f test-driver
grep DRIVER Makefile.in || exit 99 # For debugging.
grep '^my_LOG_DRIVER *=' Makefile.in \
&& fatal_ 'unexpected $(my_LOG_DRIVER) in Makefile.in'
grep '^TEST_LOG_DRIVER =.*\$(SHELL).*/test-driver' Makefile.in
$PERL -MTAP::Parser -e 1 \
|| skip_ "cannot import TAP::Parser perl module"
./configure
do_count ()
{
count_test_results total=6 pass=3 fail=0 skip=1 xfail=2 xpass=0 error=0
grep '^PASS: foo, testcase 1 *$' stdout
grep '^SKIP: foo, testcase 2 *$' stdout
grep '^PASS: bar\.test *$' stdout
$EGREP 'PASS: baz\.sh 1( |$)' stdout
$EGREP 'XFAIL: baz\.sh 2( |$)' stdout
$EGREP 'XFAIL: baz\.sh 3( |$)' stdout
}
run_make -O -e IGNORE check
cat test-suite.log
cat foo.log
cat bar.log
cat baz.log
test $am_make_rc_got -eq 0 || exit 1
do_count
run_make -O distcheck
do_count
: