summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/libcroco/tests/testctl
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/libcroco/tests/testctl')
-rwxr-xr-xsrc/3rdparty/libcroco/tests/testctl462
1 files changed, 462 insertions, 0 deletions
diff --git a/src/3rdparty/libcroco/tests/testctl b/src/3rdparty/libcroco/tests/testctl
new file mode 100755
index 0000000..205112b
--- /dev/null
+++ b/src/3rdparty/libcroco/tests/testctl
@@ -0,0 +1,462 @@
+#! /bin/sh
+
+#####################################
+#This script just runs the tests of
+#libcroco, saves their result, diff them
+#against a set of reference results and
+#displays OK/KO.
+#To use it as a tester, the best way is
+#just to run 'testctl run' and see the result.
+####################################
+
+#the directory that contains the tests sources is:
+#$TEST_SOURCE_DIR. User can set this var in the environment
+#before calling this script. Otherwise, we set it to a default value
+if test x$TEST_SOURCE_DIR = x ; then
+ TEST_SOURCE_DIR=`dirname "$0"`
+fi
+
+#the directory that contains the test outputs is:
+#$TEST_OUT_DIR
+#User can set this var in the environment before
+#calling this script. Otherwise, we set it to a default value.
+if test x$TEST_OUT_DIR = x ; then
+ TEST_OUT_DIR=tests
+fi
+
+if [ -d "$TEST_OUT_DIR/.libs" ]; then
+ TEST_BIN_DIR="$TEST_OUT_DIR/.libs"
+else
+ TEST_BIN_DIR="$TEST_OUT_DIR"
+fi
+
+#the list of tests to be run
+TEST_PROG_LIST=
+
+#the test input dirs.
+TEST_INPUT_DIR=test-inputs
+
+#the reference test output dirs.
+TEST_OUT_REF_DIR=test-output-refs
+
+#temporary test result dir
+TEST_OUTPUT_DIR=test-outputs
+
+ERROR_REPORT_FILE=tests-error.log
+COMMAND_LIST=
+COMMAND=
+if test x$RUN_VALGRIND = x ; then
+ RUN_VALGRIND=no
+else
+ RUN_VALGRIND=yes
+fi
+if test "x$CHECKER" = "x" ; then
+ CHECKER="valgrind --tool=memcheck"
+fi
+
+VALGRIND_LOGS_DIR=valgrind-logs
+VALGRIND=
+TEST_PROG=
+EGREP="grep -E"
+
+DIFF=`which diff`
+if test "empty$DIFF" = "empty" ; then
+ echo "You don't have the diff program installed"
+ echo "Please, install is first"
+fi
+
+display_usage ()
+{
+ echo ""
+ echo "usage: $0 [general options] <command> [command option]"
+ echo ""
+ echo "where general options are:"
+ echo "===================="
+ echo "-h|--help displays this help"
+ echo ""
+ echo "commands are:"
+ echo "=============="
+ echo "run run the tests and display their result"
+ echo "ref run the tests but saves their output as a reference"
+ echo "cleanup removes the tmp directories that may have been created"
+ echo ""
+ echo "run command options:"
+ echo "--valgrind runs the test using valgrind"
+ echo "--testprog <test program>"
+}
+
+parse_command_line ()
+{
+ if test "empty$1" = "empty" ; then
+ display_usage ;
+ exit -1
+ fi
+
+ while true ; do
+ arg=$1
+
+ if test "empty$arg" = "empty" ; then
+ break ;
+ fi
+
+ case "$arg" in
+ -h|--help)
+ display_usage $@
+ exit 0
+ ;;
+
+ -*)
+ echo "$0: unknown option: $arg"
+ display_usage $@
+ exit 0
+ ;;
+
+ run|ref|cleanup)
+ COMMAND_LIST=$arg
+ REMAINING_ARGS=$@
+ echo "REMAINING_ARGS=$REMAINING_ARGS"
+ break ;
+ ;;
+
+ *)
+ display_usage $@
+ exit 0
+ ;;
+ esac
+ done
+}
+
+
+#builds the list of available test functions.
+build_tests_list ()
+{
+ for TEST_PROG in "$TEST_SOURCE_DIR"/test*.sh "$TEST_OUT_DIR"/test?; do
+ TEST_PROG=`basename $TEST_PROG`
+ echo "run test: $TEST_PROG"
+ TEST_PROG_LIST="$TEST_PROG_LIST $TEST_PROG"
+ done
+}
+
+#runs a test programs.
+#usage run_test_prog <test-name> <reference> <display-on-stdout>
+#where "test-name" is the name of the test program to run
+#"reference" is a boolean value: yes/no. (the string "yes" or the string no)
+#if yes, means that the output of the test is to be saved as a reference.
+#if no, means that the output of the test is to be saved as a result of a test.
+run_test_prog ()
+{
+ TEST_PROG="$1"
+ REFERENCE="$2"
+ DISPLAY_ON_STDOUT="$3"
+ OUTPUT_DIR=
+ OUTPUT_SUFFIX=
+ TEST_INPUT_LIST=
+ VALGRIND_OPTIONS="--error-limit=no --num-callers=100 --logfile=$TEST_OUT_DIR/$VALGRIND_LOGS_DIR/$TEST_PROG-valgrind.log --leak-check=yes --show-reachable=yes --quiet --suppressions=$TEST_SOURCE_DIR/vg.supp"
+ if test x$RUN_VALGRIND = xno ; then
+ VALGRIND=
+ else
+ if ! test -x "$TEST_SOURCE_DIR"/valgrind-version.sh ; then
+ echo "Argh! Could not find file $TEST_SOURCE_DIR/valgrind-version.sh"
+ exit -1 ;
+ fi
+ version=`"$TEST_SOURCE_DIR"/valgrind-version.sh`
+ if ! test "x$version" = "xokay" ; then
+ echo "You must install a valgrind version greater than 2.1.1"
+ echo "version=$version"
+ exit -1
+ fi
+ if test "x$CHECKER" = "x" ; then
+ VALGRIND=`which valgrind`
+ if test "x$VALGRIND" = x ; then
+ echo "Could not find valgrind in your path"
+ else
+ VALGRIND="$VALGRIND $VALGRIND_OPTIONS"
+ echo "Gonna run the tests with valgrind, using the following options: $VALGRIND_OPTIONS"
+ fi
+ else
+ VALGRIND="$CHECKER $VALGRIND_OPTIONS"
+ echo "Gonna run the tests with valgrind, using the cmd line: $VALGRIND"
+ fi
+ fi
+ export VALGRIND
+ case "$TEST_PROG" in
+ *.sh) is_shell_script=yes ;;
+ *) is_shell_script=no ;;
+ esac
+
+ if ! test -d "$TEST_OUT_DIR/$VALGRIND_LOGS_DIR" ; then
+ mkdir "$TEST_OUT_DIR/$VALGRIND_LOGS_DIR"
+ fi
+
+ for TEST_INPUT in `ls -1 "$TEST_SOURCE_DIR/$TEST_INPUT_DIR" | $EGREP "^${TEST_PROG}"'[.0-9]+css$'` ; do
+ TEST_INPUT_LIST="$TEST_INPUT_LIST $TEST_INPUT"
+ done
+
+ if test "$REFERENCE" = "yes" ; then
+ OUTPUT_DIR="$TEST_SOURCE_DIR/$TEST_OUT_REF_DIR"
+ OUTPUT_SUFFIX=.out
+ else
+ OUTPUT_DIR="$TEST_OUT_DIR/$TEST_OUTPUT_DIR"
+ OUTPUT_SUFFIX=.out
+ if test ! -d "$OUTPUT_DIR" ; then
+ echo "creating tmp directory $OUTPUT_DIR ..."
+ mkdir "$OUTPUT_DIR"
+ echo "done"
+ fi
+ fi
+
+ if test "empty$TEST_INPUT_LIST" != "empty" ; then
+ for TEST_INPUT in $TEST_INPUT_LIST ; do
+ TEST_INPUT_NAME=`basename $TEST_INPUT .sh`
+ if test "$DISPLAY_ON_STDOUT" = "yes" ; then
+ echo "###############################################"
+ echo "launching $VALGRIND $TEST_PROG $TEST_SOURCE_DIR/$TEST_INPUT_DIR/$TEST_INPUT"....
+ echo "###############################################"
+ if test x$is_shell_script = xyes ; then
+ "$TEST_SOURCE_DIR/$TEST_PROG" "$TEST_SOURCE_DIR/$TEST_INPUT_DIR/$TEST_INPUT"
+ else
+ $VALGRIND "$TEST_BIN_DIR/$TEST_PROG" "$TEST_SOURCE_DIR/$TEST_INPUT_DIR/$TEST_INPUT"
+ fi
+ echo "###############################################"
+ echo "done"
+ echo "###############################################"
+ echo ""
+ else
+ echo "executing $VALGRIND $TEST_PROG $TEST_SOURCE_DIR/$TEST_INPUT_DIR/$TEST_INPUT > $OUTPUT_DIR/${TEST_INPUT_NAME}${OUTPUT_SUFFIX} ..."
+ $VALGRIND "$TEST_BIN_DIR/$TEST_PROG" "$TEST_SOURCE_DIR/$TEST_INPUT_DIR/$TEST_INPUT" > "$OUTPUT_DIR/${TEST_INPUT_NAME}${OUTPUT_SUFFIX}"
+ echo "done"
+ fi
+ done
+ else
+ if test "$DISPLAY_ON_STDOUT" = "yes" ; then
+ echo "####################################################"
+ echo "launching $VALGRIND $TEST_PROG ..."
+ echo "####################################################"
+ if test x$is_shell_script = xyes ; then
+ "$TEST_SOURCE_DIR/$TEST_PROG"
+ else
+ $VALGRIND "$TEST_BIN_DIR/$TEST_PROG"
+ fi
+ echo "####################################################"
+ echo "done"
+ echo "####################################################"
+ echo ""
+ else
+ TEST_INPUT_NAME=`basename "$TEST_PROG" .sh`
+ echo "executing $VALGRIND $TEST_PROG > $OUTPUT_DIR/${TEST_PROG}${OUTPUT_SUFFIX} ..."
+ if test x$is_shell_script = xyes ; then
+ "$TEST_SOURCE_DIR/$TEST_PROG" > "$OUTPUT_DIR/${TEST_INPUT_NAME}${OUTPUT_SUFFIX}"
+ else
+ $VALGRIND "$TEST_BIN_DIR/$TEST_PROG" > "$OUTPUT_DIR/${TEST_INPUT_NAME}${OUTPUT_SUFFIX}"
+ fi
+ echo "done"
+ fi
+ fi
+ unset VALGRIND
+}
+
+cleanup_tests ()
+{
+ if test -d "$TEST_OUT_DIR/$TEST_OUTPUT_DIR" ; then
+ echo "removing $TEST_OUT_DIR/$TEST_OUTPUT_DIR/*"
+ rm -rf "$TEST_OUT_DIR/$TEST_OUTPUT_DIR"
+ rm -rf "$TEST_OUT_DIR/$VALGRIND_LOGS_DIR"
+ fi
+ if test -f "$TEST_OUT_DIR/$ERROR_REPORT_FILE" ; then
+ rm "$TEST_OUT_DIR/$ERROR_REPORT_FILE"
+ fi
+ return 0
+}
+
+run_test_report ()
+{
+ code=0
+ diff -ur --exclude='*CVS*' --exclude='*cvs*' --exclude='Makefile*' --exclude=.arch-ids "$TEST_SOURCE_DIR/$TEST_OUT_REF_DIR" "$TEST_OUT_DIR/$TEST_OUTPUT_DIR" > "$TEST_OUT_DIR/tmpdiff.$$"
+ NB_DIFF=`wc -l < "$TEST_OUT_DIR/tmpdiff.$$"`
+
+ if test "$NB_DIFF" -eq 0 ; then
+ echo "/////////////ALL THE TESTS ARE OK :) //////////////////"
+ rm "$TEST_OUT_DIR/tmpdiff.$$"
+ else
+ echo "SOME TESTS ARE KO :("
+ mv "$TEST_OUT_DIR/tmpdiff.$$" "$TEST_OUT_DIR/$ERROR_REPORT_FILE"
+ echo "See $TEST_OUT_DIR/$ERROR_REPORT_FILE to see what's going on"
+ code=1
+ fi
+
+ ###################
+ #Valgrind errors #
+ ###################
+ memleaks=no
+ for vg_log in `find "$TEST_OUT_DIR/$VALGRIND_LOGS_DIR" -name '*-valgrind.log*' -print` ; do
+ if test -s "$vg_log" ; then
+ leaks=`cat "$vg_log" | grep -i leak | grep -v no`
+ errors=`cat "$vg_log" | grep -w Invalid`
+ if test "x$leaks" = "x" -a "x$errors" = "x" ; then
+ rm -f "$vg_log" ;
+ else
+ echo "valgrind reported some memory leaks/corruptions in $vg_log"
+ memleaks=yes
+ fi
+ else
+ rm "$vg_log"
+ fi
+ done
+ if test "x$RUN_VALGRIND" = "xyes" ; then
+ if test "x$memleaks" = "xno" ; then
+ echo "Oh, YESSSSSS!, VALGRIND DID NOT DETECT ANY MEMLEAK !! You can go have a beer."
+ else
+ echo "Please report these leaks by sending the valgrind logs to the authors of libcroco."
+ code=2
+ fi
+ fi
+ return $code
+}
+
+run_test_report_single ()
+{
+ TEST_BASE=`basename "$1" .sh`
+ code=0
+ for reffile in "$TEST_SOURCE_DIR/$TEST_OUT_REF_DIR/$TEST_BASE".*; do
+ outfile="$TEST_OUT_DIR/$TEST_OUTPUT_DIR/`basename "$reffile"`"
+ diff -u "$reffile" "$outfile" || code=1
+ done
+ if [ $code -ne 0 ]; then
+ echo "TEST $TEST_BASE IS KO :("
+ fi
+ return $code
+}
+
+############################
+#Executes the "run" command along with
+#its command options.
+#For the sake of safety checking
+############################
+execute_run_cmd ()
+{
+ args=$@
+ test_and_report=no
+
+ if test "$1" != "run" ; then
+ echo "internal error: first argument should be \'run\'"
+ return
+ fi
+ shift
+
+ while true ; do
+ cur_arg=$1
+ echo "cur_arg=$cur_arg"
+
+ case $cur_arg in
+ --valgrind)
+ RUN_VALGRIND=yes
+ shift
+ ;;
+
+ "--testprog")
+ shift
+ if test "empty$1" = "empty" ; then
+ echo "--testprog should be followed by a prog name"
+ display_usage
+ exit
+ fi
+ TEST_PROG=$1
+ echo "TEST_PROG=$TEST_PROG"
+ shift
+ ;;
+
+ "--test-and-report")
+ test_and_report=yes
+ shift
+ TEST_PROG="$1"
+ shift
+ if test -z "$TEST_PROG"; then
+ echo "--test-and-report must be followed by a prog name"
+ exit
+ fi
+ ;;
+
+ *)
+ break
+ ;;
+ esac
+ done
+
+ if test "empty$TEST_PROG" = "empty"; then
+
+ cleanup_tests
+
+ build_tests_list ;
+ if test "empty$TEST_PROG_LIST" = "empty" ; then
+ echo "could not find any test to run"
+ exit
+ fi
+
+ for TEST in $TEST_PROG_LIST ; do
+ run_test_prog "$TEST" no no;
+ done
+ run_test_report ;
+ elif test "$test_and_report" = "yes"; then
+ run_test_prog "$TEST_PROG"
+ run_test_report_single "$TEST_PROG"
+ else
+ #run the test and display result on stdout
+ run_test_prog "$TEST_PROG" no yes ;
+ fi
+}
+
+##############################
+#Analyzes a command string "<command> [command option]"
+#and runs the necessary commands.
+#
+#Must be called with the command line
+#starting with a command name.
+#all the previous general argument must
+#have been stripped away.
+#############################
+execute_command ()
+{
+ arg="$1" ;
+
+ case "$arg" in
+
+ run)
+ execute_run_cmd "$@"
+ ;;
+
+ ref)
+ build_tests_list ;
+ if test "empty$TEST_PROG_LIST" = "empty" ; then
+ echo "could not find any test to run"
+ exit
+ fi
+
+ for TEST in $TEST_PROG_LIST ; do
+ run_test_prog "$TEST" yes no;
+ done
+ ;;
+
+ cleanup)
+ cleanup_tests
+ ;;
+
+ *)
+ echo "unknown command"
+ exit ;
+ esac
+
+}
+
+main ()
+{
+ parse_command_line $@
+
+ if test "empty$COMMAND_LIST" = "empty" ; then
+ echo "no test command to execute"
+ exit
+ fi
+
+ execute_command $REMAINING_ARGS
+}
+
+main $@