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>