#!/bin/sh

# Copyright (C) 2001 by Martin Pool <mbp@samba.org>

# This program is distributable under the terms of the GNU GPL (see
# COPYING)

# We don't really want to start the server listening, because that
# might interfere with the security or operation of the test machine.
# Instead we use the fake-connect feature to dynamically assign a pair
# of ports.

# Having started the server we try some basic operations against it:

# getting a list of module
# listing files in a module
# retrieving a module
# uploading to a module
# checking the log file
# password authentication

. "$suitedir/rsync.fns"

chkfile="$scratchdir/rsync.chk"
outfile="$scratchdir/rsync.out"

SSH="src/support/lsh.sh --no-cd"
FILE_REPL='s/^\([^d][^ ]*\) *\(..........[0-9]\) /\1 \2 /'
DIR_REPL='s/^\(d[^ ]*\)  *[0-9][.,0-9]* /\1         DIR /'
LS_REPL='s;[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] ;####/##/## ##:##:## ;g'

build_rsyncd_conf

makepath "$fromdir/foo" "$fromdir/bar/baz"
makepath "$todir"
echo one >"$fromdir/foo/one"
echo two >"$fromdir/bar/two"
echo three >"$fromdir/bar/baz/three"

cd "$scratchdir"

ln -s test-rsyncd.conf rsyncd.conf

my_uid=`get_testuid`
root_uid=`get_rootuid`
confopt=''
if test x"$my_uid" = x"$root_uid"; then
    # Root needs to specify the config file, or it uses /etc/rsyncd.conf.
    echo "Forcing --config=$conf"
    confopt=" --config=$conf"
fi

# These have a space-padded 15-char name, then a tab, then a comment.
sed 's/NOCOMMENT//' <<EOT >"$chkfile"
test-from      	r/o
test-to        	r/w
test-scratch   	NOCOMMENT
EOT

$RSYNC -ve "$SSH" --rsync-path="$RSYNC$confopt" localhost:: | tee "$outfile"
echo '===='
diff $diffopt "$chkfile" "$outfile" || test_fail "test 0 failed"

RSYNC_CONNECT_PROG="$RSYNC --config=$conf --daemon"
export RSYNC_CONNECT_PROG

$RSYNC -v localhost:: | tee "$outfile"
echo '===='
diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"

$RSYNC -r localhost::test-hidden \
    | sed "$FILE_REPL" | sed "$DIR_REPL" | sed "$LS_REPL" \
    | tee "$outfile"
cat <<EOT >"$chkfile"
drwxr-xr-x         DIR ####/##/## ##:##:## .
drwxr-xr-x         DIR ####/##/## ##:##:## bar
-rw-r--r--           4 ####/##/## ##:##:## bar/two
drwxr-xr-x         DIR ####/##/## ##:##:## bar/baz
-rw-r--r--           6 ####/##/## ##:##:## bar/baz/three
drwxr-xr-x         DIR ####/##/## ##:##:## foo
-rw-r--r--           4 ####/##/## ##:##:## foo/one
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"

$RSYNC -r localhost::test-from/f* \
    | sed "$FILE_REPL" | sed "$DIR_REPL" | sed "$LS_REPL" \
    | tee "$outfile"
cat <<EOT >"$chkfile"
drwxr-xr-x         DIR ####/##/## ##:##:## foo
-rw-r--r--           4 ####/##/## ##:##:## foo/one
EOT
diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"

if $RSYNC --version | grep "[, ] atimes" >/dev/null; then
    $RSYNC -rU localhost::test-from/f* \
	| sed "$FILE_REPL" | sed "$DIR_REPL" | sed "$LS_REPL" \
	| tee "$outfile"
    cat <<EOT >"$chkfile"
drwxr-xr-x         DIR ####/##/## ##:##:##                     foo
-rw-r--r--           4 ####/##/## ##:##:## ####/##/## ##:##:## foo/one
EOT
    diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
fi
