Add an "unsafe" symlink to the symlink test case so we can see what happens.
[rsync/rsync.git] / runtests.sh
index f21371b..ab6f77a 100755 (executable)
@@ -3,8 +3,8 @@
 # Copyright (C) 2001 by Martin Pool <mbp@samba.org>
 
 # This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version
-# 2.1 as published by the Free Software Foundation.
+# it under the terms of the GNU General Public License version
+# 2 as published by the Free Software Foundation.
 #
 # This program is distributed in the hope that it will be useful, but
 # WITHOUT ANY WARRANTY; without even the implied warranty of
 # they're in POSIX 1003.2, and since the build farm relies on them
 # they're probably working on most machines we really care about.
 
+# You cannot use "function foo {" syntax, but must instead say "foo()
+# {", or it breaks on FreeBSD.
+
+# BSD machines tend not to have "head" or "seq".
+
+# You cannot do "export VAR=VALUE" all on one line; the export must be
+# separate from the assignment.  (SCO SysV)
+
+
+
+# STILL TO DO:
+
+# We need a good protection against tests that hang indefinitely.
+# Perhaps some combination of starting them in the background, wait,
+# and kill?
+
+# Perhaps we need a common way to cleanup tests.  At the moment just
+# clobbering the directory when we're done should be enough.
+
+# If any of the targets fail, then (GNU?) Make returns 2, instead of
+# the return code from the failing command.  This is fine, but it
+# means that the build farm just shows "2" for failed tests, not the
+# number of tests that actually failed.  For more details we might
+# need to grovel through the log files to find a line saying how many
+# failed.
+
 
 set -e
 
@@ -134,31 +160,33 @@ missing=0
 passed=0
 failed=0
 
-scratchdir=./testtmp
-[ -d "$scratchdir" ] && rm -r "$scratchdir"
-mkdir "$scratchdir"
-scratchdir=`cd $scratchdir && pwd`
+scratchdir="`pwd`"/testtmp
 echo "    scratchdir=$scratchdir"
 
 suitedir="$srcdir/testsuite"
 
 export scratchdir suitedir
 
-for testbase in rsync-hello hands ssh-basic
+clean_scratch() {
+    [ -d "$scratchdir" ] && rm -rf "$scratchdir"
+    mkdir "$scratchdir"
+}
+
+if [ "x$whichtests" = x ]
+then
+    whichtests="*.test"
+fi
+
+for testscript in $suitedir/$whichtests
 do
-    testscript="$suitedir/$testbase.test"
-    if test \! -f "$testscript" 
-    then
-       echo "$testscript does not exist" >&2
-       missing=`expr $missing + 1`
-       continue
-    fi
+    testbase=`echo $testscript | sed 's!.*/!!'`
 
     echo "----- $testbase starting"
+    clean_scratch
 
-    if sh $RUNSHFLAGS "$testscript"
+    if sh $RUNSHFLAGS "$testscript" >"$scratchdir/test.log"  2>&1
     then
-       echo "----- $testbase completed succesfully"
+       echo "----- $testbase completed successfully"
        passed=`expr $passed + 1`
     else 
        case $? in
@@ -167,7 +195,9 @@ do
            skipped=`expr $skipped + 1`
            ;;
        *)
-           echo "----- $testbase failed!"
+           echo "----- $testbase failed: log follows"
+           cat "$scratchdir/test.log"
+           echo "----- $testbase log ends"
            failed=`expr $failed + 1`
            if [ "x$nopersist" = "xyes" ]
            then
@@ -180,9 +210,16 @@ done
 echo '------------------------------------------------------------'
 echo "----- overall results:"
 echo "      $passed passed"
-echo "      $failed failed"
-echo "      $skipped skipped"
-echo "      $missing missing"
+[ "$failed" -gt 0 ]  && echo "      $failed failed"
+[ "$skipped" -gt 0 ] && echo "      $skipped skipped"
+[ "$missing" -gt 0 ] && echo "      $missing missing"
 echo '------------------------------------------------------------'
 
-exit `expr $failed + $missing`
+# OK, so expr exits with 0 if the result is neither null nor zero; and
+# 1 if the expression is null or zero.  This is the opposite of what
+# we want, and if we just call expr then this script will always fail,
+# because -e is set.
+
+result=`expr $failed + $missing || true`
+echo "overall result is $result"
+exit $result