Annotation of embedaddon/rsync/runtests.sh, revision 1.1.1.1

1.1       misho       1: #! /bin/sh
                      2: 
                      3: # Copyright (C) 2001, 2002 by Martin Pool <mbp@samba.org>
                      4: # Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
                      5: 
                      6: # This program is free software; you can redistribute it and/or modify
                      7: # it under the terms of the GNU General Public License version
                      8: # 2 as published by the Free Software Foundation.
                      9: #
                     10: # This program is distributed in the hope that it will be useful, but
                     11: # WITHOUT ANY WARRANTY; without even the implied warranty of
                     12: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     13: # Lesser General Public License for more details.
                     14: # 
                     15: # You should have received a copy of the GNU Lesser General Public
                     16: # License along with this program; if not, write to the Free Software
                     17: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     18: 
                     19: # rsync top-level test script -- this invokes all the other more
                     20: # detailed tests in order.  This script can either be called by `make
                     21: # check' or `make installcheck'.  `check' runs against the copies of
                     22: # the program and other files in the build directory, and
                     23: # `installcheck' against the installed copy of the program.  
                     24: 
                     25: # In either case we need to also be able to find the source directory,
                     26: # since we read test scripts and possibly other information from
                     27: # there.
                     28: 
                     29: # Whenever possible, informational messages are written to stdout and
                     30: # error messages to stderr.  They're separated out by the build farm
                     31: # display scripts.
                     32: 
                     33: # According to the GNU autoconf manual, the only valid place to set up
                     34: # directory locations is through Make, since users are allowed to (try
                     35: # to) change their mind on the Make command line.  So, Make has to
                     36: # pass in all the values we need.
                     37: 
                     38: # For other configured settings we read ./config.sh, which tells us
                     39: # about shell commands on this machine and similar things.
                     40: 
                     41: # rsync_bin gives the location of the rsync binary.  This is either
                     42: # builddir/rsync if we're testing an uninstalled copy, or
                     43: # install_prefix/bin/rsync if we're testing an installed copy.  On the
                     44: # build farm rsync will be installed, but into a scratch /usr.
                     45: 
                     46: # srcdir gives the location of the source tree, which lets us find the
                     47: # build scripts.  At the moment we assume we are invoked from the
                     48: # source directory.
                     49: 
                     50: # This script must be invoked from the build directory.  
                     51: 
                     52: # A scratch directory, 'testtmp', is used in the build directory to
                     53: # hold per-test subdirectories.
                     54: 
                     55: # This script also uses the $loglevel environment variable.  1 is the
                     56: # default value, and 10 the most verbose.  You can set this from the
                     57: # Make command line.  It's also set by the build farm to give more
                     58: # detail for failing builds.
                     59: 
                     60: 
                     61: # NOTES FOR TEST CASES:
                     62: 
                     63: # Each test case runs in its own shell. 
                     64: 
                     65: # Exit codes from tests:
                     66: 
                     67: #    1  tests failed
                     68: #    2  error in starting tests
                     69: #   77  this test skipped (random value unlikely to happen by chance, same as
                     70: #       automake)
                     71: 
                     72: # HOWEVER, the overall exit code to the farm is different: we return
                     73: # the *number of tests that failed*, so that it will show up nicely in
                     74: # the overall summary.
                     75: 
                     76: # rsync.fns contains some general setup functions and definitions.
                     77: 
                     78: 
                     79: # NOTES ON PORTABILITY:
                     80: 
                     81: # Both this script and the Makefile have to be pretty conservative
                     82: # about which Unix features they use.
                     83: 
                     84: # We cannot count on Make exporting variables to commands, unless
                     85: # they're explicitly given on the command line.
                     86: 
                     87: # Also, we can't count on 'cp -a' or 'mkdir -p', although they're
                     88: # pretty handy (see function makepath for the latter).
                     89: 
                     90: # I think some of the GNU documentation suggests that we shouldn't
                     91: # rely on shell functions.  However, the Bash manual seems to say that
                     92: # they're in POSIX 1003.2, and since the build farm relies on them
                     93: # they're probably working on most machines we really care about.
                     94: 
                     95: # You cannot use "function foo {" syntax, but must instead say "foo()
                     96: # {", or it breaks on FreeBSD.
                     97: 
                     98: # BSD machines tend not to have "head" or "seq".
                     99: 
                    100: # You cannot do "export VAR=VALUE" all on one line; the export must be
                    101: # separate from the assignment.  (SCO SysV)
                    102: 
                    103: # Don't rely on grep -q, as that doesn't work everywhere -- just redirect
                    104: # stdout to /dev/null to keep it quiet.
                    105: 
                    106: 
                    107: # STILL TO DO:
                    108: 
                    109: # We need a good protection against tests that hang indefinitely.
                    110: # Perhaps some combination of starting them in the background, wait,
                    111: # and kill?
                    112: 
                    113: # Perhaps we need a common way to cleanup tests.  At the moment just
                    114: # clobbering the directory when we're done should be enough.
                    115: 
                    116: # If any of the targets fail, then (GNU?) Make returns 2, instead of
                    117: # the return code from the failing command.  This is fine, but it
                    118: # means that the build farm just shows "2" for failed tests, not the
                    119: # number of tests that actually failed.  For more details we might
                    120: # need to grovel through the log files to find a line saying how many
                    121: # failed.
                    122: 
                    123: 
                    124: set -e
                    125: 
                    126: . "./shconfig"
                    127: 
                    128: RUNSHFLAGS='-e'
                    129: export RUNSHFLAGS
                    130: 
                    131: # for Solaris
                    132: if [ -d /usr/xpg4/bin ]; then
                    133:     PATH="/usr/xpg4/bin/:$PATH"
                    134:     export PATH
                    135: fi
                    136: 
                    137: if [ "x$loglevel" != x ] && [ "$loglevel" -gt 8 ]; then
                    138:     if set -x; then
                    139:        # If it doesn't work the first time, don't keep trying.
                    140:        RUNSHFLAGS="$RUNSHFLAGS -x"
                    141:     fi
                    142: fi
                    143: 
                    144: POSIXLY_CORRECT=1 
                    145: if test x"$TOOLDIR" = x; then
                    146:     TOOLDIR=`pwd`
                    147: fi
                    148: srcdir=`dirname $0`
                    149: if test x"$srcdir" = x -o x"$srcdir" = x.; then
                    150:     srcdir="$TOOLDIR"
                    151: fi
                    152: if test x"$rsync_bin" = x; then
                    153:     rsync_bin="$TOOLDIR/rsync"
                    154: fi
                    155: 
                    156: # This allows the user to specify extra rsync options -- use carefully!
                    157: RSYNC="$rsync_bin $*"
                    158: #RSYNC="valgrind $rsync_bin $*"
                    159: 
                    160: TLS_ARGS=''
                    161: if egrep '^#define HAVE_LUTIMES 1' config.h >/dev/null; then
                    162:     TLS_ARGS="$TLS_ARGS -l"
                    163: fi
                    164: if egrep '#undef CHOWN_MODIFIES_SYMLINK' config.h >/dev/null; then
                    165:     TLS_ARGS="$TLS_ARGS -L"
                    166: fi
                    167: 
                    168: export POSIXLY_CORRECT TOOLDIR srcdir RSYNC TLS_ARGS
                    169: 
                    170: echo "============================================================"
                    171: echo "$0 running in $TOOLDIR"
                    172: echo "    rsync_bin=$RSYNC"
                    173: echo "    srcdir=$srcdir"
                    174: echo "    TLS_ARGS=$TLS_ARGS"
                    175: 
                    176: if [ -f /usr/bin/whoami ]; then
                    177:     testuser=`/usr/bin/whoami`
                    178: elif [ -f /usr/ucb/whoami ]; then
                    179:     testuser=`/usr/ucb/whoami`
                    180: elif [ -f /bin/whoami ]; then
                    181:     testuser=`/bin/whoami`
                    182: else
                    183:     testuser=`id -un 2>/dev/null || echo ${LOGNAME:-${USERNAME:-${USER:-'UNKNOWN'}}}`
                    184: fi
                    185: 
                    186: echo "    testuser=$testuser"
                    187: echo "    os=`uname -a`"
                    188: 
                    189: # It must be "yes", not just nonnull
                    190: if [ "x$preserve_scratch" = xyes ]; then
                    191:     echo "    preserve_scratch=yes"
                    192: else
                    193:     echo "    preserve_scratch=no"
                    194: fi    
                    195: 
                    196: # Check if setacl/setfacl is around and if it supports the -k or -s option.
                    197: if setacl -k u::7,g::5,o:5 testsuite 2>/dev/null; then
                    198:     setfacl_nodef='setacl -k'
                    199: elif setfacl --help 2>&1 | grep ' -k,\|\[-[a-z]*k' >/dev/null; then
                    200:     setfacl_nodef='setfacl -k'
                    201: elif setfacl -s u::7,g::5,o:5 testsuite 2>/dev/null; then
                    202:     setfacl_nodef='setfacl -s u::7,g::5,o:5'
                    203: else
                    204:     # The "true" command runs successfully, but does nothing.
                    205:     setfacl_nodef=true
                    206: fi
                    207: 
                    208: export setfacl_nodef
                    209: 
                    210: if [ ! -f "$rsync_bin" ]; then
                    211:     echo "rsync_bin $rsync_bin is not a file" >&2
                    212:     exit 2
                    213: fi
                    214: 
                    215: if [ ! -d "$srcdir" ]; then
                    216:     echo "srcdir $srcdir is not a directory" >&2
                    217:     exit 2
                    218: fi
                    219: 
                    220: skipped=0
                    221: missing=0
                    222: passed=0
                    223: failed=0
                    224: 
                    225: # Directory that holds the other test subdirs.  We create separate dirs
                    226: # inside for each test case, so that they can be left behind in case of
                    227: # failure to aid investigation.  We don't remove the testtmp subdir at
                    228: # the end so that it can be configured as a symlink to a filesystem that
                    229: # has ACLs and xattr support enabled (if desired).
                    230: scratchbase="$TOOLDIR"/testtmp
                    231: echo "    scratchbase=$scratchbase"
                    232: [ -d "$scratchbase" ] || mkdir "$scratchbase"
                    233: 
                    234: suitedir="$srcdir/testsuite"
                    235: 
                    236: export scratchdir suitedir
                    237: 
                    238: prep_scratch() {
                    239:     [ -d "$scratchdir" ] && chmod -R u+rwX "$scratchdir" && rm -rf "$scratchdir"
                    240:     mkdir "$scratchdir"
                    241:     # Get rid of default ACLs and dir-setgid to avoid confusing some tests.
                    242:     $setfacl_nodef "$scratchdir" || true
                    243:     chmod g-s "$scratchdir"
                    244:     case "$srcdir" in
                    245:     /*) ln -s "$srcdir" "$scratchdir/src" ;;
                    246:     *)  ln -s "$TOOLDIR/$srcdir" "$scratchdir/src" ;;
                    247:     esac
                    248:     return 0
                    249: }
                    250: 
                    251: maybe_discard_scratch() {
                    252:     [ x"$preserve_scratch" != xyes ] && [ -d "$scratchdir" ] && rm -rf "$scratchdir"
                    253:     return 0
                    254: }
                    255: 
                    256: if [ "x$whichtests" = x ]; then
                    257:     whichtests="*.test"
                    258: fi
                    259: 
                    260: for testscript in $suitedir/$whichtests
                    261: do
                    262:     testbase=`echo $testscript | sed -e 's!.*/!!' -e 's/.test\$//'`
                    263:     scratchdir="$scratchbase/$testbase"
                    264: 
                    265:     prep_scratch
                    266: 
                    267:     set +e
                    268:     sh $RUNSHFLAGS "$testscript" >"$scratchdir/test.log" 2>&1
                    269:     result=$?
                    270:     set -e
                    271: 
                    272:     if [ "x$always_log" = xyes -o \( $result != 0 -a $result != 77 -a $result != 78 \) ]
                    273:     then
                    274:        echo "----- $testbase log follows"
                    275:        cat "$scratchdir/test.log"
                    276:        echo "----- $testbase log ends"
                    277:        if [ -f "$scratchdir/rsyncd.log" ]; then
                    278:            echo "----- $testbase rsyncd.log follows"
                    279:            cat "$scratchdir/rsyncd.log"
                    280:            echo "----- $testbase rsyncd.log ends"
                    281:        fi
                    282:     fi
                    283: 
                    284:     case $result in
                    285:     0)
                    286:        echo "PASS    $testbase"
                    287:        passed=`expr $passed + 1`
                    288:        maybe_discard_scratch
                    289:        ;;
                    290:     77)
                    291:        # backticks will fill the whole file onto one line, which is a feature
                    292:        whyskipped=`cat "$scratchdir/whyskipped"`
                    293:        echo "SKIP    $testbase ($whyskipped)"
                    294:        skipped=`expr $skipped + 1`
                    295:        maybe_discard_scratch
                    296:        ;;
                    297:     78)
                    298:         # It failed, but we expected that.  don't dump out error logs, 
                    299:        # because most users won't want to see them.  But do leave
                    300:        # the working directory around.
                    301:        echo "XFAIL   $testbase"
                    302:        failed=`expr $failed + 1`
                    303:        ;;
                    304:     *)
                    305:        echo "FAIL    $testbase"
                    306:        failed=`expr $failed + 1`
                    307:        if [ "x$nopersist" = xyes ]; then
                    308:            exit 1
                    309:        fi
                    310:     esac
                    311: done
                    312: 
                    313: echo '------------------------------------------------------------'
                    314: echo "----- overall results:"
                    315: echo "      $passed passed"
                    316: [ "$failed" -gt 0 ]  && echo "      $failed failed"
                    317: [ "$skipped" -gt 0 ] && echo "      $skipped skipped"
                    318: [ "$missing" -gt 0 ] && echo "      $missing missing"
                    319: echo '------------------------------------------------------------'
                    320: 
                    321: # OK, so expr exits with 0 if the result is neither null nor zero; and
                    322: # 1 if the expression is null or zero.  This is the opposite of what
                    323: # we want, and if we just call expr then this script will always fail,
                    324: # because -e is set.
                    325: 
                    326: result=`expr $failed + $missing || true`
                    327: echo "overall result is $result"
                    328: exit $result

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>