3 # Copyright (C) 2001 by Martin Pool <mbp@samba.org>
5 # General-purpose test functions for rsync.
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.
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.
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.
21 fromdir="$tmpdir/from"
25 # For itemized output:
28 dots='.....' # trailing dots after changes
33 if diff -u "$suitedir/rsync.fns" "$suitedir/rsync.fns" >/dev/null 2>&1; then
43 echo $ECHO_N "Test $1: $ECHO_C"
49 echo "$ECHO_T failed!"
55 while test $# -gt 1; do
61 # Perform a "cp -p", making sure that timestamps are really the same,
62 # even if the copy rounded microsecond times on the destination file.
64 cp -p "${@}" || test_fail "cp -p failed"
65 if test $# -gt 2 -o -d "$2"; then
66 set_cp_destdir "${@}" # sets destdir var
67 while test $# -gt 1; do
68 destname="$destdir/`basename $1`"
69 touch -r "$destname" "$1" "$destname"
73 touch -r "$2" "$1" "$2"
77 # Call this if you want to filter out verbose messages (-v or -vv) from
78 # the output of an rsync run (whittling the output down to just the file
79 # messages). This isn't needed if you use -i without -v.
81 sed -e '/^building file list /d' \
82 -e '/^sending incremental file list/d' \
83 -e '/^created directory /d' \
85 -e '/ --whole-file$/d' \
87 -e '/^client charset: /d' \
88 -e '/^server charset: /d' \
90 <"$outfile" >"$outfile.new"
91 mv "$outfile.new" "$outfile"
99 find "$@" -print | sort | sed 's/ /\\ /g' | xargs "$TOOLDIR/tls" $TLS_ARGS
103 perms=`"$TOOLDIR/tls" "$1" | sed 's/^[-d]\(.........\).*/\1/'`
104 if test $perms = $2; then
107 echo "permissions: $perms on $1"
109 test_fail "failed test $3"
118 # Build test directories $todir and $fromdir, with $fromdir full of files.
121 # Clean before creation
125 [ -d "$tmpdir" ] || mkdir "$tmpdir"
126 [ -d "$fromdir" ] || mkdir "$fromdir"
127 [ -d "$todir" ] || mkdir "$todir"
129 # On some BSD systems, the umask affects the mode of created
130 # symlinks, even though the mode apparently has no effect on how
131 # the links behave in the future, and it cannot be changed using
132 # chmod! rsync always sets its umask to 000 so that it can
133 # accurately recreate permissions, but this script is probably run
134 # with a different umask.
136 # This causes a little problem that "ls -l" of the two will not be
137 # the same. So, we need to set our umask before doing any creations.
140 touch "$fromdir/empty"
141 mkdir "$fromdir/emptydir"
143 # a hundred lines of text or so
144 rsync_ls_lR "$srcdir" > "$fromdir/filelist"
146 echo $ECHO_N "This file has no trailing lf$ECHO_C" > "$fromdir/nolf"
148 ln -s nolf "$fromdir/nolf-symlink"
151 cat "$srcdir"/*.c > "$fromdir/text"
153 cp "$fromdir/text" "$fromdir/dir"
154 mkdir "$fromdir/dir/subdir"
155 echo some data > "$fromdir/dir/subdir/foobar.baz"
156 mkdir "$fromdir/dir/subdir/subsubdir"
158 ls -ltr /etc > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
160 ls -ltr / > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
162 mkdir "$fromdir/dir/subdir/subsubdir2"
164 ls -lt /bin > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
166 ls -lt / > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
170 # ls -lR "$srcdir" | head -10 || echo failed
175 # Many machines do not have "mkdir -p", so we have to build up long paths.
182 if echo $p | grep '^/' >/dev/null
187 # This will break if $p contains a space.
188 for c in `echo $p | tr '/' ' '`
190 if [ -d "$c" ] || mkdir "$c"
194 echo "failed to create $c" >&2; return $?
202 ###########################
203 # Run a test (in '$1') then compare directories $2 and $3 to see if
204 # there are any difference. If there are, explain them.
206 # So normally basically $1 should be an rsync command, and $2 and $3
207 # the source and destination directories. This is only good when you
208 # expect to transfer the whole directory exactly as is. If some files
209 # should be excluded, you might need to use something else.
214 # We can just write everything to stdout/stderr, because the
215 # wrapper hides it unless there is a problem.
217 echo "Running: \"$1\""
220 if [ $status != 0 ]; then
225 echo "check how the directory listings compare with diff:"
227 ( cd "$2" && rsync_ls_lR . ) > "$tmpdir/ls-from"
228 ( cd "$3" && rsync_ls_lR . ) > "$tmpdir/ls-to"
229 diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" || failed=YES
232 echo "check how the files compare with diff:"
234 if [ "x$4" != x ]; then
235 echo " === Skipping (as directed) ==="
237 diff -r $diffopt "$2" "$3" || failed=YES
241 if [ -z "$failed" ] ; then
249 build_rsyncd_conf() {
250 # Build an appropriate configuration file
251 conf="$scratchdir/test-rsyncd.conf"
252 echo "building configuration $conf"
255 pidfile="$scratchdir/rsyncd.pid"
256 logfile="$scratchdir/rsyncd.log"
259 uid_setting='uid = 0'
260 gid_setting='gid = 0'
264 # Non-root cannot specify uid & gid settings
265 uid_setting="#$uid_setting"
266 gid_setting="#$gid_setting"
271 # rsyncd configuration file autogenerated by $0
276 hosts allow = localhost 127.0.0.0/24 192.168.0.0/16 10.0.0.0/8 $hostname
278 log format = %i %h [%a] %m (%u) %l %f%L
279 transfer logging = yes
280 exclude = ? foobar.baz
304 # Build a helper script to ignore exit code 23
305 ignore23="$scratchdir/ignore23"
306 echo "building help script $ignore23"
308 cat >"$ignore23" <<'EOT'
315 if test $ret = 23; then
327 date >"$fromdir/referent"
328 ln -s referent "$fromdir/relative"
329 ln -s "$fromdir/referent" "$fromdir/absolute"
330 ln -s nonexistent "$fromdir/dangling"
331 ln -s "$srcdir/rsync.c" "$fromdir/unsafe"
341 echo "$@" > "$tmpdir/whyskipped"
345 # It failed, but we expected that. don't dump out error logs,
346 # because most users won't want to see them. But do leave
347 # the working directory around.
353 # Determine what shell command will appropriately test for links.
354 ln -s foo "$scratchdir/testlink"
355 for cmd in test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
359 if $cmd $switch "$scratchdir/testlink" 2>/dev/null
362 TEST_SYMLINK_CMD="$cmd $switch"
363 # i wonder if break 2 is portable?
368 # ok, now get rid of it
369 rm "$scratchdir/testlink"
372 if [ "x$TEST_SYMLINK_CMD" = 'x' ]
374 test_fail "Couldn't determine how to test for symlinks"
376 echo "Testing for symlinks using '$TEST_SYMLINK_CMD'"
380 # Test whether something is a link, allowing for shell peculiarities
382 # note the variable contains the first option and therefore is not quoted
383 $TEST_SYMLINK_CMD "$1"
387 # We need to set the umask to be reproducible. Note also that when we
388 # do some daemon tests as root, we will setuid() and therefore the
389 # directory has to be writable by the nobody user in some cases. The
390 # best thing is probably to explicitly chmod those directories after