File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / testsuite / rsync.fns
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 14 07:51:15 2013 UTC (10 years, 8 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_1_2p5, RSYNC3_1_0, HEAD
v 3.1.0

    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: 
   34: if diff -u "$suitedir/rsync.fns" "$suitedir/rsync.fns" >/dev/null 2>&1; then
   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: 
  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: 
  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
  287: max verbosity = 4
  288: $uid_setting
  289: $gid_setting
  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>