Annotation of embedaddon/rsync/testsuite/rsync.fns, revision 1.1.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>