Moved the filter_outfile() function here since it was identical
[rsync/rsync.git] / testsuite / rsync.fns
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 # Berkley's nice.
27 PATH="$PATH:/usr/ucb"
28
29 if diff -u "$srcdir/testsuite/rsync.fns" "$srcdir/testsuite/rsync.fns" >/dev/null 2>&1; then
30     diffopt="-u"
31 else
32     diffopt="-c"
33 fi
34
35 HOME="$scratchdir"
36 export HOME
37
38 runtest() {
39     echo $ECHO_N "Test $1: $ECHO_C"
40     if eval "$2"
41     then
42         echo "$ECHO_T   done."
43         return 0
44     else
45         echo "$ECHO_T failed!"
46         return 1
47     fi
48 }
49
50 # Call this if you want to filter out verbose messages (-v or -vv) from
51 # the output of an rsync run (whittling the output down to just the file
52 # messages).  This isn't needed if you use -i without -v.
53 filter_outfile() {
54     sed -e '/^building file list /d' \
55         -e '/^created directory /d' \
56         -e '/^done$/d' \
57         -e '/ --whole-file$/d' \
58         -e '/^total: /d' \
59         -e '/^$/,$d' \
60         <"$outfile" >"$outfile.new"
61     mv "$outfile.new" "$outfile"
62 }
63
64 printmsg() {
65     echo "$1"
66 }
67
68
69 rsync_ls_lR() {
70     find "$@" -print | sort | sed 's/ /\\ /g' | xargs "$TOOLDIR/tls"
71 }
72
73 rsync_getgroups() { 
74     "$TOOLDIR/getgroups"
75 }
76
77
78 ####################
79 # Build test directories $todir and $fromdir, with $fromdir full of files.
80
81 hands_setup() {
82     # Clean before creation
83     rm -rf "$fromdir"
84     rm -rf "$todir"
85
86     [ -d "$tmpdir" ] || mkdir "$tmpdir"
87     [ -d "$fromdir" ] || mkdir "$fromdir"
88     [ -d "$todir" ] || mkdir "$todir"
89
90     # On some BSD systems, the umask affects the mode of created
91     # symlinks, even though the mode apparently has no effect on how
92     # the links behave in the future, and it cannot be changed using
93     # chmod!  rsync always sets its umask to 000 so that it can
94     # accurately recreate permissions, but this script is probably run
95     # with a different umask. 
96
97     # This causes a little problem that "ls -l" of the two will not be
98     # the same.  So, we need to set our umask before doing any creations.
99
100     # set up test data
101     touch "$fromdir/empty"
102     mkdir "$fromdir/emptydir"
103
104     # a hundred lines of text or so
105     rsync_ls_lR "$srcdir" > "$fromdir/filelist"
106
107     echo $ECHO_N "This file has no trailing lf$ECHO_C" > "$fromdir/nolf"
108     umask 0
109     ln -s nolf "$fromdir/nolf-symlink"
110     umask 022
111
112     cat "$srcdir"/*.c > "$fromdir/text"
113     mkdir "$fromdir/dir"
114     cp "$fromdir/text" "$fromdir/dir"
115     mkdir "$fromdir/dir/subdir"
116     echo some data > "$fromdir/dir/subdir/foobar.baz"
117     mkdir "$fromdir/dir/subdir/subsubdir"
118     if [ -r /etc ]; then
119         ls -ltr /etc > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
120     else
121         ls -ltr / > "$fromdir/dir/subdir/subsubdir/etc-ltr-list"
122     fi
123     mkdir "$fromdir/dir/subdir/subsubdir2"
124     if [ -r /bin ]; then
125         ls -lt /bin > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
126     else
127         ls -lt / > "$fromdir/dir/subdir/subsubdir2/bin-lt-list"
128     fi
129
130 #      echo testing head:
131 #      ls -lR "$srcdir" | head -10 || echo failed
132 }
133
134
135 ####################
136 # Many machines do not have "mkdir -p", so we have to build up long paths.
137 # How boring.  
138 makepath () {
139     echo "        makepath $1"
140     p="$1"
141     (
142         # Absolut Unix.
143         if echo $p | grep '^/' >/dev/null
144         then
145             cd /
146         fi
147     
148         # This will break if $1 contains a space.
149         for c in `echo $p | tr '/' ' '`
150         do 
151             if [ -d "$c" ] || mkdir "$c" 
152             then
153                 cd "$c" || return $?
154             else
155                 echo "failed to create $c" >&2; return $?
156             fi
157         done
158     )
159 }
160
161
162
163 ###########################
164 # Run a test (in '$1') then compare directories $2 and $3 to see if
165 # there are any difference.  If there are, explain them.
166
167 # So normally basically $1 should be an rsync command, and $2 and $3
168 # the source and destination directories.  This is only good when you
169 # expect to transfer the whole directory exactly as is.  If some files
170 # should be excluded, you might need to use something else.
171
172 checkit() {
173     failed=
174
175     # We can just write everything to stdout/stderr, because the
176     # wrapper hides it unless there is a problem.
177
178     echo "Running: \"$1\""  
179     eval "$1" 
180     status=$?
181     if [ $status != 0 ]; then
182         failed="YES";
183     fi
184
185     echo "-------------"
186     echo "check how the directory listings compare with diff:"
187     echo ""
188     ( cd "$2" && rsync_ls_lR . ) > "$tmpdir/ls-from"
189     ( cd "$3" && rsync_ls_lR . ) > "$tmpdir/ls-to"
190     diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" || failed=YES
191
192     echo "-------------"
193     echo "check how the files compare with diff:"
194     echo ""
195     if [ "x$4" != x ]; then
196         echo "  === Skipping (as directed) ==="
197     else
198         diff -r $diffopt "$2" "$3" || failed=YES
199     fi
200
201     echo "-------------"
202     if [ -z "$failed" ] ; then
203         return 0
204     else
205         return 1
206     fi
207 }
208
209
210 build_rsyncd_conf() {
211     # Build an appropriate configuration file
212     conf="$scratchdir/test-rsyncd.conf"
213     echo "building configuration $conf"
214
215     port=2612
216     pidfile="$scratchdir/rsyncd.pid"
217     logfile="$scratchdir/rsyncd.log"
218
219     cat >"$conf" <<EOF
220 # rsyncd configuration file autogenerated by $0
221
222 pid file = $pidfile
223 use chroot = no
224 hosts allow = localhost, 127.0.0.1
225 log file = $logfile
226 exclude = foobar.baz
227 max verbosity = 9
228
229 uid = 0
230 gid = 0
231
232 [test-from]
233         path = $fromdir
234         read only = yes
235
236 [test-to]
237         path = $todir
238         read only = no
239 EOF
240 }
241
242
243 build_symlinks() {
244     mkdir "$fromdir"
245     date >"$fromdir/referent"
246     ln -s referent "$fromdir/relative"
247     ln -s "$fromdir/referent" "$fromdir/absolute"
248     ln -s nonexistent "$fromdir/dangling"
249     ln -s "$srcdir/rsync.c" "$fromdir/unsafe"
250 }
251
252 test_fail() {
253     echo "$@" >&2
254     exit 1
255 }
256
257 test_skipped() {
258     echo "$@" >&2
259     echo "$@" > "$tmpdir/whyskipped"
260     exit 77
261 }
262
263 # It failed, but we expected that.  don't dump out error logs, 
264 # because most users won't want to see them.  But do leave
265 # the working directory around.
266 test_xfail() {
267     echo "$@" >&2
268     exit 78
269 }
270
271 # Determine what shell command will appropriately test for links.
272 ln -s foo "$scratchdir/testlink"
273 for cmd in test /bin/test /usr/bin/test /usr/ucb/bin/test /usr/ucb/test
274 do
275     for switch in -h -L
276     do
277         if $cmd $switch "$scratchdir/testlink" 2>/dev/null
278         then
279             # how nice
280             TEST_SYMLINK_CMD="$cmd $switch"
281             # i wonder if break 2 is portable?
282             break 2
283         fi
284    done
285 done
286 # ok, now get rid of it
287 rm "$scratchdir/testlink"
288
289
290 if [ "x$TEST_SYMLINK_CMD" = 'x' ]
291 then
292     test_fail "Couldn't determine how to test for symlinks"
293 else
294     echo "Testing for symlinks using '$TEST_SYMLINK_CMD'"
295 fi
296         
297
298 # Test whether something is a link, allowing for shell peculiarities
299 is_a_link() {
300     # note the variable contains the first option and therefore is not quoted
301     $TEST_SYMLINK_CMD "$1"
302 }
303
304
305 # We need to set the umask to be reproducible.  Note also that when we
306 # do some daemon tests as root, we will setuid() and therefore the
307 # directory has to be writable by the nobody user in some cases.  The
308 # best thing is probably to explicitly chmod those directories after
309 # creation.
310  
311 umask 022