Add simple test suite.

This commit is contained in:
Simon Ruderich
2013-06-01 21:51:28 +02:00
parent 96710bc3fa
commit fb9548453f
14 changed files with 273 additions and 2 deletions

8
.gitignore vendored
View File

@@ -18,3 +18,11 @@
/src/coloredstderr.lo
/src/libcoloredstderr.la
/stamp-h1
/tests/.deps/
/tests/Makefile
/tests/Makefile.in
/tests/example
/tests/example.o
/tests/run.sh.log
/tests/run.sh.trs
/tests/test-suite.log

View File

@@ -1,3 +1,3 @@
SUBDIRS = src
SUBDIRS = src tests
ACLOCAL_AMFLAGS = -I m4

View File

@@ -28,6 +28,10 @@ LT_INIT([disable-static])
AC_PROG_CC
dnl Used by test suite.
AC_PROG_SED
AC_PROG_EGREP
AC_C_INLINE
AC_CHECK_HEADERS([fcntl.h])
@@ -47,5 +51,5 @@ AC_ARG_ENABLE([debug],
AC_DEFINE([DEBUG], 1, [Define to enable debug output.])
fi])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile])
AC_OUTPUT

15
tests/Makefile.am Normal file
View File

@@ -0,0 +1,15 @@
TESTS = run.sh
check_PROGRAMS = example
example_SOURCES = example.c
dist_check_SCRIPTS = run.sh lib.sh
dist_check_DATA = example.expected \
example-noforce.sh \
example-noforce.sh.expected \
example-redirects.sh \
example-redirects.sh.expected \
example-simple.sh \
example-simple.sh.expected
# Used by run.sh.
export EGREP

1
tests/example-noforce.sh Symbolic link
View File

@@ -0,0 +1 @@
example-simple.sh

View File

@@ -0,0 +1,3 @@
write to stdout
write to stderr
write to stdout without newlinewrite to stderr without newline

38
tests/example-redirects.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/sh
# Copyright (C) 2013 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
# the Free Software Foundation, either version 3 of the License, 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/>.
echo write to stderr 1 >&2
echo write to stdout 1
(
echo write to stdout which gets redirected to stderr
) >&2
echo write to stdout 2
(
echo write to stderr which gets redirected to stdout >&2
) 2>&1
echo write to stdout 3
(
(
echo another redirect to stderr
) >&3
) 3>&2

View File

@@ -0,0 +1,8 @@
>stderr>write to stderr 1
<stderr<write to stdout 1
>stderr>write to stdout which gets redirected to stderr
<stderr<write to stdout 2
write to stderr which gets redirected to stdout
write to stdout 3
>stderr>another redirect to stderr
<stderr<

23
tests/example-simple.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/sh
# Copyright (C) 2013 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
# the Free Software Foundation, either version 3 of the License, 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/>.
echo write to stdout
echo write to stderr >&2
printf '%s' 'write to stdout without newline'
printf '%s' 'write to stderr without newline' >&2

View File

@@ -0,0 +1,3 @@
write to stdout
>stderr>write to stderr
<stderr<write to stdout without newline>stderr>write to stderr without newline<stderr<

38
tests/example.c Normal file
View File

@@ -0,0 +1,38 @@
/*
* Test basic features of coloredstderr.
*
* Copyright (C) 2013 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
* the Free Software Foundation, either version 3 of the License, 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/>.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char **argv) {
fprintf(stderr, "write to stderr: %d\n", argc);
printf("write to stdout\n");
fflush(stdout);
write(STDERR_FILENO, "write to stderr 2", 17);
write(STDOUT_FILENO, "write to stdout 2", 17);
fprintf(stderr, "\n");
fprintf(stdout, "\n");
return EXIT_SUCCESS;
}

4
tests/example.expected Normal file
View File

@@ -0,0 +1,4 @@
>stderr>write to stderr: 1
<stderr<write to stdout
>stderr>write to stderr 2<stderr<write to stdout 2>stderr>
<stderr<

91
tests/lib.sh Normal file
View File

@@ -0,0 +1,91 @@
# Library for the test suite.
# Copyright (C) 2013 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
# the Free Software Foundation, either version 3 of the License, 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/>.
# Allow running the script directly without running `make check`.
test "x$builddir" = x && builddir=.
test "x$EGREP" = x && EGREP='grep -E'
# In case we are called with LD_PRELOAD already set.
unset LD_PRELOAD
# Clean locale for reproducible tests.
LC_ALL=C
unset LANGUAGE
die() {
echo "$@" >&2
exit 1
}
get_library_path() {
# Get name of the real library file from libtool's .la file.
dlname=`$EGREP "^dlname='" "$builddir/../src/libcoloredstderr.la"` \
|| die 'dlname not found'
dlname=`echo "$dlname" | sed "s/^dlname='//; s/'$//"`
library="$builddir/../src/.libs/$dlname"
test -e "$library" || die "'$library' not found"
echo "`pwd`/$library"
}
library=`get_library_path`
force_write=1
run_test() {
printf '%s' "Running test '$*' .. "
testcase="$1"
expected="$2"
shift
shift
(
# Standard setup.
LD_PRELOAD="$library"
COLORED_STDERR_FDS=2,
export LD_PRELOAD
export COLORED_STDERR_FDS
# Change pre/post strings for simpler testing.
COLORED_STDERR_PRE='>stderr>'
COLORED_STDERR_POST='<stderr<'
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
COLORED_STDERR_FORCE_WRITE=1
export COLORED_STDERR_FORCE_WRITE
fi
"$testcase" > output 2>&1
)
diff -u "$expected" output \
|| die 'failed!'
rm output
echo 'passed.'
}
test_script() {
run_test "$srcdir/$1" "$srcdir/$1.expected"
}
test_program() {
run_test "$builddir/$1" "$srcdir/$1.expected"
}

35
tests/run.sh Executable file
View File

@@ -0,0 +1,35 @@
#!/bin/sh
# Test suite for coloredstderr.
# Copyright (C) 2013 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
# the Free Software Foundation, either version 3 of the License, 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/>.
set -e
test "x$srcdir" = x && srcdir=.
. "$srcdir/lib.sh"
# Make sure we don't write to non-ttys by default.
force_write=
test_script example-noforce.sh
force_write=1
test_script example-simple.sh
test_script example-redirects.sh
test_program example