X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;ds=inline;f=tests%2Flib.sh;h=7face08e441416bdac527b843467f32723ff5977;hb=700b7084bb1759498f1061125a05153768d2d4ac;hp=88bcbbe62a5614c6ee5c38f1880a125f5cdd2d6c;hpb=7108005fff7a043e17c5cc6036c4b20ad37ba6b9;p=coloredstderr%2Fcoloredstderr.git
diff --git a/tests/lib.sh b/tests/lib.sh
index 88bcbbe..7face08 100644
--- a/tests/lib.sh
+++ b/tests/lib.sh
@@ -15,17 +15,38 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
+set -e
+
# Allow running the script directly without running `make check`.
test "x$builddir" = x && builddir=.
+test "x$abs_builddir" = x && abs_builddir="`pwd`"
test "x$EGREP" = x && EGREP='grep -E'
-# In case we are called with LD_PRELOAD already set.
-unset LD_PRELOAD
+# The tests fail if running under coloredstderr because the tests redirect
+# stderr to stdout which is detected by coloredstderr :D (and not colored as a
+# result). Therefore remove LD_PRELOAD and re-exec the test.
+if test -n "$LD_PRELOAD"; then
+ unset LD_PRELOAD
+ exec "$0"
+fi
+
+# Use valgrind to run the tests if it's available.
+valgrind_cmd=
+if type valgrind >/dev/null 2>&1; then
+ valgrind_cmd='valgrind --quiet --error-exitcode=1'
+fi
+
# Clean locale for reproducible tests.
LC_ALL=C
unset LANGUAGE
+# Clear user defined variables.
+unset COLORED_STDERR_FDS
+unset COLORED_STDERR_FORCE_WRITE
+# Set default COLORED_STDERR_PRIVATE_FDS value.
+fds=2,
+
die() {
echo "$@" >&2
@@ -56,12 +77,14 @@ run_test() {
shift
shift
+ output="output-$$"
+
(
# Standard setup.
LD_PRELOAD="$library"
- COLORED_STDERR_FDS=2,
+ COLORED_STDERR_PRIVATE_FDS="$fds"
export LD_PRELOAD
- export COLORED_STDERR_FDS
+ export COLORED_STDERR_PRIVATE_FDS
# Change pre/post strings for simpler testing.
COLORED_STDERR_PRE='>STDERR>'
@@ -69,23 +92,55 @@ run_test() {
export COLORED_STDERR_PRE
export COLORED_STDERR_POST
# And force writes to a file (unless we are testing the force).
- if test "x$force_write" != x; then
+ if test -n "$force_write"; then
COLORED_STDERR_FORCE_WRITE=1
export COLORED_STDERR_FORCE_WRITE
fi
- "$testcase" > output 2>&1
+ $valgrind_cmd "$@" "$testcase" > "$output" 2>&1
)
- diff -u "$expected" output \
+ # Some sed implementations (e.g. on FreeBSD 9.1) always append a trailing
+ # newline. Add "EOF" to detect if the real output had one.
+ echo EOF >> "$output"
+
+ # Merge continuous regions of colored output. The exact calls don't matter
+ # as long as the output is colored.
+ sed 's/STDERR>//g' < "$output" > "$output.tmp"
+ mv "$output.tmp" "$output"
+
+ diff -u "$expected" "$output" \
|| die 'failed!'
- rm output
+ rm "$output"
echo 'passed.'
}
test_script() {
- run_test "$srcdir/$1" "$srcdir/$1.expected"
+ testcase="$1"
+ expected="$2"
+ # shift || true is not enough for dash.
+ test $# -ge 2 && shift
+ shift
+
+ if test -z "$expected"; then
+ expected="$testcase"
+ fi
+ run_test "$srcdir/$testcase" "$srcdir/$expected.expected" "$@"
+}
+test_script_subshell() {
+ test_script "$1" "$2" sh -c 'sh $1' ''
}
test_program() {
- run_test "$builddir/$1" "$srcdir/$1.expected"
+ testcase="$1"
+ expected="$2"
+ test $# -ge 2 && shift
+ shift
+
+ if test -z "$expected"; then
+ expected="$testcase"
+ fi
+ run_test "$builddir/$testcase" "$srcdir/$expected.expected" "$@"
+}
+test_program_subshell() {
+ test_program "$1" "$2" sh -c '$1' ''
}