Annotation of embedaddon/rsync/testsuite/rsync.fns, revision 1.1.1.2

1.1       misho       1: #! /bin/sh
                      2: 
                      3: # Copyright (C) 2001 by Martin Pool <mbp@samba.org>
                      4: 
                      5: # General-purpose test functions for rsync.
                      6: 
                      7: # This program is free software; you can redistribute it and/or modify
                      8: # it under the terms of the GNU General Public License version
                      9: # 2 as published by the Free Software Foundation.
                     10: #
                     11: # This program is distributed in the hope that it will be useful, but
                     12: # WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14: # Lesser General Public License for more details.
                     15: # 
                     16: # You should have received a copy of the GNU Lesser General Public
                     17: # License along with this program; if not, write to the Free Software
                     18: # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     19: 
                     20: tmpdir="$scratchdir"
                     21: fromdir="$tmpdir/from"
                     22: todir="$tmpdir/to"
                     23: chkdir="$tmpdir/chk"
                     24: 
                     25: # For itemized output:
                     26: all_plus='+++++++++'
                     27: allspace='         '
                     28: dots='.....' # trailing dots after changes
                     29: tab_ch='       ' # a single tab character
                     30: 
                     31: # Berkley's nice.
                     32: PATH="$PATH:/usr/ucb"
                     33: 
1.1.1.2 ! misho      34: if diff -u "$suitedir/rsync.fns" "$suitedir/rsync.fns" >/dev/null 2>&1; then
1.1       misho      35:     diffopt="-u"
                     36: else
                     37:     diffopt="-c"
                     38: fi
                     39: 
                     40: HOME="$scratchdir"
                     41: export HOME
                     42: 
                     43: runtest() {
                     44:     echo $ECHO_N "Test $1: $ECHO_C"
                     45:     if eval "$2"
                     46:     then
                     47:        echo "$ECHO_T   done."
                     48:        return 0
                     49:     else
                     50:        echo "$ECHO_T failed!"
                     51:        return 1
                     52:     fi
                     53: }
                     54: 
                     55: set_cp_destdir() {
                     56:     while test $# -gt 1; do
                     57:        shift
                     58:     done
                     59:     destdir="$1"
                     60: }
                     61: 
                     62: # Perform a "cp -p", making sure that timestamps are really the same,
                     63: # even if the copy rounded microsecond times on the destination file.
                     64: cp_touch() {
                     65:     cp -p "${@}" || test_fail "cp -p failed"
                     66:     if test $# -gt 2 -o -d "$2"; then
                     67:        set_cp_destdir "${@}" # sets destdir var
                     68:        while test $# -gt 1; do
                     69:            destname="$destdir/`basename $1`"
                     70:            touch -r "$destname" "$1" "$destname"
                     71:            shift
                     72:        done
                     73:     else
                     74:        touch -r "$2" "$1" "$2"
                     75:     fi
                     76: }
                     77: 
                     78: # Call this if you want to filter out verbose messages (-v or -vv) from
                     79: # the output of an rsync run (whittling the output down to just the file
                     80: # messages).  This isn't needed if you use -i without -v.
                     81: filter_outfile() {
                     82:     sed -e '/^building file list /d' \
                     83:        -e '/^sending incremental file list/d' \
                     84:        -e '/^created directory /d' \
                     85:        -e '/^done$/d' \
                     86:        -e '/ --whole-file$/d' \
                     87:        -e '/^total: /d' \
                     88:        -e '/^client charset: /d' \
                     89:        -e '/^server charset: /d' \
                     90:        -e '/^$/,$d' \
                     91:        <"$outfile" >"$outfile.new"
                     92:     mv "$outfile.new" "$outfile"
                     93: }
                     94: 
                     95: printmsg() {
                     96:     echo "$1"
                     97: }
                     98: 
                     99: rsync_ls_lR() {
                    100:     find "$@" -print | sort | sed 's/ /\\ /g' | xargs "$TOOLDIR/tls" $TLS_ARGS
                    101: }
                    102: 
                    103: get_testuid() {
                    104:     id 2>/dev/null | sed 's/^[^0-9]*\([0-9][0-9]*\).*/\1/'
                    105: }
                    106: 
                    107: check_perms() {
                    108:     perms=`"$TOOLDIR/tls" "$1" | sed 's/^[-d]\(.........\).*/\1/'`
                    109:     if test $perms = $2; then
                    110:        return 0
                    111:     fi
                    112:     echo "permissions: $perms on $1"
                    113:     echo "should be:   $2"
                    114:     test_fail "failed test $3"
                    115: }
                    116: 
                    117: rsync_getgroups() { 
                    118:     "$TOOLDIR/getgroups"
                    119: }
                    120: 
                    121: 
                    122: ####################
                    123: # Build test directories $todir and $fromdir, with $fromdir full of files.
                    124: 
                    125: hands_setup() {
                    126:     # Clean before creation
                    127:     rm -rf "$fromdir"
                    128:     rm -rf "$todir"
                    129: 
                    130:     [ -d "$tmpdir" ] || mkdir "$tmpdir"
                    131:     [ -d "$fromdir" ] || mkdir "$fromdir"
                    132:     [ -d "$todir" ] || mkdir "$todir"
                    133: 
                    134:     # On some BSD systems, the umask affects the mode of created
                    135:     # symlinks, even though the mode apparently has no effect on how
                    136:     # the links behave in the future, and it cannot be changed using
                    137:     # chmod!  rsync always sets its umask to 000 so that it can
                    138:     # accurately recreate permissions, but this script is probably run
                    139:     # with a different umask. 
                    140: 
                    141:     # This causes a little problem that "ls -l" of the two will not be
                    142:     # the same.  So, we need to set our umask before doing any creations.
                    143: 
                    144:     # set up test data
                    145:     touch "$fromdir/empty"
                    146:     mkdir "$fromdir/emptydir"
                    147: 
                    148:     # a hundred lines of text or so
                    149:     rsync_ls_lR "$srcdir" > "$fromdir/filelist"
                    150: 
                    151:     echo $ECHO_N "This file has no trailing lf$ECHO_C" > "$fromdir/nolf"
                    152:     umask 0
                    153:     ln -s nolf "$fromdir/nolf-symlink"
                    154:     umask 022
                    155: 
                    156:     cat "$srcdir"/*.c > "$fromdir/text"
                    157:     mkdir "$fromdir/dir"
                    158:     cp "$fromdir/text" "$fromdir/dir"
                    159:     mkdir "$fromdir/dir/subdir"
                    160:     echo some data > "$fromdir/dir/subdir/foobar.baz"
                    161:     mkdir "$fromdir/dir/subdir/subsubdir"
                    162:     if [ -r /etc ]; then
                    163:        ls -ltr /etc > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
                    164:     else
                    165:        ls -ltr / > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
                    166:     fi
                    167:     mkdir "$fromdir/dir/subdir/subsubdir2"
                    168:     if [ -r /bin ]; then
                    169:        ls -lt /bin > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
                    170:     else
                    171:        ls -lt / > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
                    172:     fi
                    173: 
                    174: #      echo testing head:
                    175: #      ls -lR "$srcdir" | head -10 || echo failed
                    176: }
                    177: 
                    178: 
                    179: ####################
                    180: # Many machines do not have "mkdir -p", so we have to build up long paths.
                    181: # How boring.  
                    182: makepath() {
                    183:     for p in "${@}"; do
                    184:        (echo "        makepath $p"
                    185: 
                    186:        # Absolut Unix.
                    187:        if echo $p | grep '^/' >/dev/null
                    188:        then
                    189:            cd /
                    190:        fi
                    191:     
                    192:        # This will break if $p contains a space.
                    193:        for c in `echo $p | tr '/' ' '`
                    194:        do 
                    195:            if [ -d "$c" ] || mkdir "$c" 
                    196:            then
                    197:                cd "$c" || return $?
                    198:            else
                    199:                echo "failed to create $c" >&2; return $?
                    200:            fi
                    201:        done)
                    202:     done
                    203: }
                    204: 
                    205: 
                    206: 
                    207: ###########################
                    208: # Run a test (in '$1') then compare directories $2 and $3 to see if
                    209: # there are any difference.  If there are, explain them.
                    210: 
                    211: # So normally basically $1 should be an rsync command, and $2 and $3
                    212: # the source and destination directories.  This is only good when you
                    213: # expect to transfer the whole directory exactly as is.  If some files
                    214: # should be excluded, you might need to use something else.
                    215: 
                    216: checkit() {
                    217:     failed=
                    218: 
                    219:     # We can just write everything to stdout/stderr, because the
                    220:     # wrapper hides it unless there is a problem.
                    221: 
                    222:     echo "Running: \"$1\""  
                    223:     eval "$1" 
                    224:     status=$?
                    225:     if [ $status != 0 ]; then
                    226:        failed="$failed status=$status"
                    227:     fi
                    228: 
                    229:     echo "-------------"
                    230:     echo "check how the directory listings compare with diff:"
                    231:     echo ""
                    232:     ( cd "$2" && rsync_ls_lR . ) > "$tmpdir/ls-from"
                    233:     ( cd "$3" && rsync_ls_lR . ) > "$tmpdir/ls-to"
                    234:     diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" || failed="$failed dir-diff"
                    235: 
                    236:     echo "-------------"
                    237:     echo "check how the files compare with diff:"
                    238:     echo ""
                    239:     if [ "x$4" != x ]; then
                    240:        echo "  === Skipping (as directed) ==="
                    241:     else
                    242:        diff -r $diffopt "$2" "$3" || failed="$failed file-diff"
                    243:     fi
                    244: 
                    245:     echo "-------------"
                    246:     if [ -z "$failed" ] ; then
                    247:        return 0
                    248:     fi
                    249: 
                    250:     echo "Failed: $failed"
                    251:     return 1
                    252: }
                    253: 
                    254: 
                    255: build_rsyncd_conf() {
                    256:     # Build an appropriate configuration file
                    257:     conf="$scratchdir/test-rsyncd.conf"
                    258:     echo "building configuration $conf"
                    259: 
                    260:     port=2612
                    261:     pidfile="$scratchdir/rsyncd.pid"
                    262:     logfile="$scratchdir/rsyncd.log"
                    263:     hostname=`uname -n`
                    264: 
1.1.1.2 ! misho     265:     uid_setting='uid = 0'
        !           266:     gid_setting='gid = 0'
        !           267:     case `get_testuid` in
        !           268:     0) ;;
        !           269:     *)
        !           270:        # Non-root cannot specify uid & gid settings
        !           271:        uid_setting="#$uid_setting"
        !           272:        gid_setting="#$gid_setting"
        !           273:        ;;
        !           274:     esac
        !           275: 
1.1       misho     276:     cat >"$conf" <<EOF
                    277: # rsyncd configuration file autogenerated by $0
                    278: 
                    279: pid file = $pidfile
                    280: use chroot = no
                    281: munge symlinks = no
                    282: hosts allow = localhost 127.0.0.0/24 192.168.0.0/16 10.0.0.0/8 $hostname
                    283: log file = $logfile
                    284: log format = %i %h [%a] %m (%u) %l %f%L
                    285: transfer logging = yes
                    286: exclude = ? foobar.baz
1.1.1.2 ! misho     287: max verbosity = 4
        !           288: $uid_setting
        !           289: $gid_setting
1.1       misho     290: 
                    291: [test-from]
                    292:        path = $fromdir
                    293:        read only = yes
                    294:        comment = r/o
                    295: 
                    296: [test-to]
                    297:        path = $todir
                    298:        read only = no
                    299:        comment = r/w
                    300: 
                    301: [test-scratch]
                    302:        path = $scratchdir
                    303:        read only = no
                    304: 
                    305: [test-hidden]
                    306:        path = $fromdir
                    307:        list = no
                    308: EOF
                    309: 
                    310:     # Build a helper script to ignore exit code 23
                    311:     ignore23="$scratchdir/ignore23"
                    312:     echo "building help script $ignore23"
                    313: 
                    314:     cat >"$ignore23" <<'EOT'
                    315: if "${@}"; then
                    316:     exit
                    317: fi
                    318: 
                    319: ret=$?
                    320: 
                    321: if test $ret = 23; then
                    322:     exit
                    323: fi
                    324: 
                    325: exit $ret
                    326: EOT
                    327: chmod +x "$ignore23"
                    328: }
                    329: 
                    330: 
                    331: build_symlinks() {
                    332:     mkdir "$fromdir"
                    333:     date >"$fromdir/referent"
                    334:     ln -s referent "$fromdir/relative"
                    335:     ln -s "$fromdir/referent" "$fromdir/absolute"
                    336:     ln -s nonexistent "$fromdir/dangling"
                    337:     ln -s "$srcdir/rsync.c" "$fromdir/unsafe"
                    338: }
                    339: 
                    340: test_fail() {
                    341:     echo "$@" >&2
                    342:     exit 1
                    343: }
                    344: 
                    345: test_skipped() {
                    346:     echo "$@" >&2
                    347:     echo "$@" > "$tmpdir/whyskipped"
                    348:     exit 77
                    349: }
                    350: 
                    351: # It failed, but we expected that.  don't dump out error logs, 
                    352: # because most users won't want to see them.  But do leave
                    353: # the working directory around.
                    354: test_xfail() {
                    355:     echo "$@" >&2
                    356:     exit 78
                    357: }
                    358: 
                    359: # Determine what shell command will appropriately test for links.
                    360: ln -s foo "$scratchdir/testlink"
                    361: for cmd in test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
                    362: do
                    363:     for switch in -h -L
                    364:     do
                    365:         if $cmd $switch "$scratchdir/testlink" 2>/dev/null
                    366:        then
                    367:            # how nice
                    368:            TEST_SYMLINK_CMD="$cmd $switch"
                    369:            # i wonder if break 2 is portable?
                    370:            break 2
                    371:        fi
                    372:    done
                    373: done
                    374: # ok, now get rid of it
                    375: rm "$scratchdir/testlink"
                    376: 
                    377: 
                    378: if [ "x$TEST_SYMLINK_CMD" = 'x' ]
                    379: then
                    380:     test_fail "Couldn't determine how to test for symlinks"
                    381: else
                    382:     echo "Testing for symlinks using '$TEST_SYMLINK_CMD'"
                    383: fi
                    384:        
                    385: 
                    386: # Test whether something is a link, allowing for shell peculiarities
                    387: is_a_link() {
                    388:     # note the variable contains the first option and therefore is not quoted
                    389:     $TEST_SYMLINK_CMD "$1"
                    390: }
                    391: 
                    392: 
                    393: # We need to set the umask to be reproducible.  Note also that when we
                    394: # do some daemon tests as root, we will setuid() and therefore the
                    395: # directory has to be writable by the nobody user in some cases.  The
                    396: # best thing is probably to explicitly chmod those directories after
                    397: # creation.
                    398:  
                    399: umask 022

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