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

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

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