Fix xattrs test on OS X.
[rsync/rsync.git] / testsuite / rsync.fns
index 396cee6..ca05297 100644 (file)
 # License along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+tmpdir="$scratchdir"
+fromdir="$tmpdir/from"
+todir="$tmpdir/to"
+chkdir="$tmpdir/chk"
 
-TMP="$scratchdir"
-FROM=${TMP}/from
-TO=${TMP}/to
-LOG=${TMP}/log
-RSYNC="$rsync_bin"
+# For itemized output:
+all_plus='+++++++++'
+allspace='         '
+dots='.....' # trailing dots after changes
+tab_ch='       ' # a single tab character
 
 # Berkley's nice.
 PATH="$PATH:/usr/ucb"
 
-if diff -u $srcdir/testsuite/rsync.fns $srcdir/testsuite/rsync.fns >/dev/null 2>&1; then
+if diff -u "$suitedir/rsync.fns" "$suitedir/rsync.fns" >/dev/null 2>&1; then
     diffopt="-u"
 else
     diffopt="-c"
 fi
 
+HOME="$scratchdir"
+export HOME
+
 runtest() {
     echo $ECHO_N "Test $1: $ECHO_C"
     if eval "$2"
     then
-       echo "${ECHO_T} done."
+       echo "$ECHO_T   done."
        return 0
     else
-       echo "${ECHO_T} failed!"
+       echo "$ECHO_T failed!"
        return 1
     fi
 }
 
+set_cp_destdir() {
+    while test $# -gt 1; do
+       shift
+    done
+    destdir="$1"
+}
+
+# Perform a "cp -p", making sure that timestamps are really the same,
+# even if the copy rounded microsecond times on the destination file.
+cp_touch() {
+    cp -p "${@}" || test_fail "cp -p failed"
+    if test $# -gt 2 -o -d "$2"; then
+       set_cp_destdir "${@}" # sets destdir var
+       while test $# -gt 1; do
+           destname="$destdir/`basename $1`"
+           touch -r "$destname" "$1" "$destname"
+           shift
+       done
+    else
+       touch -r "$2" "$1" "$2"
+    fi
+}
+
+# Call this if you want to filter out verbose messages (-v or -vv) from
+# the output of an rsync run (whittling the output down to just the file
+# messages).  This isn't needed if you use -i without -v.
+filter_outfile() {
+    sed -e '/^building file list /d' \
+       -e '/^sending incremental file list/d' \
+       -e '/^created directory /d' \
+       -e '/^done$/d' \
+       -e '/ --whole-file$/d' \
+       -e '/^total: /d' \
+       -e '/^client charset: /d' \
+       -e '/^server charset: /d' \
+       -e '/^$/,$d' \
+       <"$outfile" >"$outfile.new"
+    mv "$outfile.new" "$outfile"
+}
+
 printmsg() {
     echo "$1"
 }
 
-
 rsync_ls_lR() {
-    find "$@" -print | sort | xargs "$TOOLDIR/tls"
+    find "$@" -print | sort | sed 's/ /\\ /g' | xargs "$TOOLDIR/tls" $TLS_ARGS
+}
+
+get_testuid() {
+    id 2>/dev/null | sed 's/^[^0-9]*\([0-9][0-9]*\).*/\1/'
+}
+
+check_perms() {
+    perms=`"$TOOLDIR/tls" "$1" | sed 's/^[-d]\(.........\).*/\1/'`
+    if test $perms = $2; then
+       return 0
+    fi
+    echo "permissions: $perms on $1"
+    echo "should be:   $2"
+    test_fail "failed test $3"
 }
 
 rsync_getgroups() { 
@@ -60,16 +120,16 @@ rsync_getgroups() {
 
 
 ####################
-# Build test directories TO and FROM, with FROM full of files.
+# Build test directories $todir and $fromdir, with $fromdir full of files.
 
 hands_setup() {
     # Clean before creation
-    rm -rf $FROM
-    rm -rf $TO
+    rm -rf "$fromdir"
+    rm -rf "$todir"
 
-    [ -d $TMP ] || mkdir $TMP
-    [ -d $FROM ] || mkdir $FROM
-    [ -d $TO ] || mkdir $TO
+    [ -d "$tmpdir" ] || mkdir "$tmpdir"
+    [ -d "$fromdir" ] || mkdir "$fromdir"
+    [ -d "$todir" ] || mkdir "$todir"
 
     # On some BSD systems, the umask affects the mode of created
     # symlinks, even though the mode apparently has no effect on how
@@ -82,46 +142,54 @@ hands_setup() {
     # the same.  So, we need to set our umask before doing any creations.
 
     # set up test data
-    touch ${FROM}/empty
-    mkdir ${FROM}/emptydir
+    touch "$fromdir/empty"
+    mkdir "$fromdir/emptydir"
 
     # a hundred lines of text or so
-    rsync_ls_lR "${srcdir}" > ${FROM}/filelist
+    rsync_ls_lR "$srcdir" > "$fromdir/filelist"
 
-    # This might fail on systems that don't have -n
-    echo $ECHO_N "This file has no trailing lf$ECHO_C" > ${FROM}/nolf
+    echo $ECHO_N "This file has no trailing lf$ECHO_C" > "$fromdir/nolf"
     umask 0
-    ln -s nolf ${FROM}/nolf-symlink
+    ln -s nolf "$fromdir/nolf-symlink"
     umask 022
 
-    cat $srcdir/*.c > ${FROM}/text
-    mkdir ${FROM}/dir
-    cp ${FROM}/text ${FROM}/dir
-    mkdir ${FROM}/dir/subdir
-    mkdir ${FROM}/dir/subdir/subsubdir
-    ls -ltr /etc > ${FROM}/dir/subdir/subsubdir/etc-ltr-list
-    mkdir ${FROM}/dir/subdir/subsubdir2
-    ls -lt /bin > ${FROM}/dir/subdir/subsubdir2/bin-lt-list
+    cat "$srcdir"/*.c > "$fromdir/text"
+    mkdir "$fromdir/dir"
+    cp "$fromdir/text" "$fromdir/dir"
+    mkdir "$fromdir/dir/subdir"
+    echo some data > "$fromdir/dir/subdir/foobar.baz"
+    mkdir "$fromdir/dir/subdir/subsubdir"
+    if [ -r /etc ]; then
+       ls -ltr /etc > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
+    else
+       ls -ltr / > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
+    fi
+    mkdir "$fromdir/dir/subdir/subsubdir2"
+    if [ -r /bin ]; then
+       ls -lt /bin > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
+    else
+       ls -lt / > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
+    fi
 
 #      echo testing head:
-#      ls -lR ${srcdir} | head -10 || echo failed
+#      ls -lR "$srcdir" | head -10 || echo failed
 }
 
 
 ####################
 # Many machines do not have "mkdir -p", so we have to build up long paths.
 # How boring.  
-makepath () {
-    echo "        makepath $1"
-    p="$1"
-    (
+makepath() {
+    for p in "${@}"; do
+       (echo "        makepath $p"
+
        # Absolut Unix.
        if echo $p | grep '^/' >/dev/null
        then
            cd /
        fi
     
-       # This will break if $1 contains a space.
+       # This will break if $p contains a space.
        for c in `echo $p | tr '/' ' '`
        do 
            if [ -d "$c" ] || mkdir "$c" 
@@ -130,8 +198,8 @@ makepath () {
            else
                echo "failed to create $c" >&2; return $?
            fi
-       done
-    )
+       done)
+    done
 }
 
 
@@ -155,28 +223,32 @@ checkit() {
     eval "$1" 
     status=$?
     if [ $status != 0 ]; then
-       failed="YES";
+       failed="$failed status=$status"
     fi
 
     echo "-------------"
-    echo "check how the files compare with diff:"
+    echo "check how the directory listings compare with diff:"
     echo ""
-    for f in `cd "$2"; find . -type f -print `
-    do 
-        diff $diffopt "$2"/"$f" "$3"/"$f" || failed=YES
-    done
+    ( cd "$2" && rsync_ls_lR . ) > "$tmpdir/ls-from"
+    ( cd "$3" && rsync_ls_lR . ) > "$tmpdir/ls-to"
+    diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" || failed="$failed dir-diff"
 
     echo "-------------"
-    echo "check how the directory listings compare with diff:"
+    echo "check how the files compare with diff:"
     echo ""
-    ( cd "$2" && rsync_ls_lR . ) > ${TMP}/ls-from 
-    ( cd "$3" && rsync_ls_lR . ) > ${TMP}/ls-to 
-    diff $diffopt ${TMP}/ls-from ${TMP}/ls-to || failed=YES
-    if [ -z "${failed}" ] ; then
-       return 0
+    if [ "x$4" != x ]; then
+       echo "  === Skipping (as directed) ==="
     else
-       return 1
+       diff -r $diffopt "$2" "$3" || failed="$failed file-diff"
+    fi
+
+    echo "-------------"
+    if [ -z "$failed" ] ; then
+       return 0
     fi
+
+    echo "Failed: $failed"
+    return 1
 }
 
 
@@ -188,33 +260,75 @@ build_rsyncd_conf() {
     port=2612
     pidfile="$scratchdir/rsyncd.pid"
     logfile="$scratchdir/rsyncd.log"
-
-    cat >$conf <<EOF
+    hostname=`uname -n`
+
+    uid_setting='uid = 0'
+    gid_setting='gid = 0'
+    case `get_testuid` in
+    0) ;;
+    *)
+       # Non-root cannot specify uid & gid settings
+       uid_setting="#$uid_setting"
+       gid_setting="#$gid_setting"
+       ;;
+    esac
+
+    cat >"$conf" <<EOF
 # rsyncd configuration file autogenerated by $0
 
 pid file = $pidfile
 use chroot = no
-hosts allow = localhost, 127.0.0.1
+munge symlinks = no
+hosts allow = localhost 127.0.0.0/24 192.168.0.0/16 10.0.0.0/8 $hostname
 log file = $logfile
-max verbosity = 9
-
-uid = 0
-gid = 0
+log format = %i %h [%a] %m (%u) %l %f%L
+transfer logging = yes
+exclude = ? foobar.baz
+max verbosity = 4
+$uid_setting
+$gid_setting
 
 [test-from]
-       path = $FROM
+       path = $fromdir
        read only = yes
+       comment = r/o
 
 [test-to]
-       path = $TO
+       path = $todir
+       read only = no
+       comment = r/w
+
+[test-scratch]
+       path = $scratchdir
        read only = no
+
+[test-hidden]
+       path = $fromdir
+       list = no
 EOF
+
+    # Build a helper script to ignore exit code 23
+    ignore23="$scratchdir/ignore23"
+    echo "building help script $ignore23"
+
+    cat >"$ignore23" <<'EOT'
+if "${@}"; then
+    exit
+fi
+
+ret=$?
+
+if test $ret = 23; then
+    exit
+fi
+
+exit $ret
+EOT
+chmod +x "$ignore23"
 }
 
 
 build_symlinks() {
-    fromdir="$scratchdir/from"
-    todir="$scratchdir/to"
     mkdir "$fromdir"
     date >"$fromdir/referent"
     ln -s referent "$fromdir/relative"
@@ -230,7 +344,7 @@ test_fail() {
 
 test_skipped() {
     echo "$@" >&2
-    echo "$@" > "$TMP/whyskipped"
+    echo "$@" > "$tmpdir/whyskipped"
     exit 77
 }