]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - tests/lib.sh
update copyright year
[coloredstderr/coloredstderr.git] / tests / lib.sh
index 3e29a55023816cc539065c20c1b8ce898b00b7db..957ff55ef49a3c1e678f1c65659466a7a41b587f 100644 (file)
@@ -1,6 +1,6 @@
 # Library for the test suite.
 
-# Copyright (C) 2013  Simon Ruderich
+# Copyright (C) 2013-2015  Simon Ruderich
 #
 # 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
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+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,33 +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
 
-        $valgrind_cmd "$@" "$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<>STDERR>//g' < "$output" > "$output.tmp"
+    mv "$output.tmp" "$output"
+
+    diff -u "$expected" "$output" \
         || die 'failed!'
-    rm output
+    rm "$output"
     echo 'passed.'
 }
 
 test_script() {
     testcase="$1"
+    expected="$2"
+    # shift || true is not enough for dash.
+    test $# -ge 2 && shift
     shift
-    run_test "$srcdir/$testcase" "$srcdir/$testcase.expected" "$@"
+
+    if test -z "$expected"; then
+        expected="$testcase"
+    fi
+    run_test "$srcdir/$testcase" "$srcdir/$expected.expected" "$@"
 }
 test_script_subshell() {
-    test_script "$1" bash -c 'bash $1' ''
+    test_script "$1" "$2" sh -c 'sh $1' ''
 }
 test_program() {
     testcase="$1"
+    expected="$2"
+    test $# -ge 2 && shift
     shift
-    run_test "$builddir/$testcase" "$srcdir/$testcase.expected" "$@"
+
+    if test -z "$expected"; then
+        expected="$testcase"
+    fi
+    run_test "$builddir/$testcase" "$srcdir/$expected.expected" "$@"
 }
 test_program_subshell() {
-    test_program "$1" sh -c '$1' ''
+    test_program "$1" "$2" sh -c '$1' ''
 }