X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/815193e89ec0b5466fb7c13cefb6ccbc72088c1d..9439c0cb5a4b020b9bfcfe0351e33c17b9c53b54:/testsuite/devices.test diff --git a/testsuite/devices.test b/testsuite/devices.test index b76d37fa..b25fa6ea 100644 --- a/testsuite/devices.test +++ b/testsuite/devices.test @@ -9,26 +9,136 @@ . "$suitedir/rsync.fns" +chkfile="$scratchdir/rsync.chk" +outfile="$scratchdir/rsync.out" + # Build some hardlinks case `id -u` in '') ;; # If "id" failed, try to continue... -0) ;; -*) test_skipped "Rsync won't copy devices unless we're root" ;; +0) ;; +*) if [ -f /usr/bin/fakeroot ]; then + echo "Let's try re-running the script under fakeroot..." + exec /usr/bin/fakeroot /bin/sh $RUNSHFLAGS "$0" + fi + + # If we can't test the real device code, try to test --fake-super instead + $RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync needs root/fakeroot/--fake-super for device tests" + RSYNC="$RSYNC --fake-super" + export RSYNC_FAKE_SUPER=1 + case "`xattr 2>&1`" in + *--list:*) + mknod() { + fn="$1" + case "$2" in + p) mode=10644 ;; + c) mode=20644 ;; + b) mode=60644 ;; + esac + maj="${3:-0}" + min="${4:-0}" + touch "$fn" + xattr -s 'rsync.%stat' "$mode $maj,$min 0:0" "$fn" + } + ;; + *) + mknod() { + fn="$1" + case "$2" in + p) mode=10644 ;; + c) mode=20644 ;; + b) mode=60644 ;; + esac + maj="${3:-0}" + min="${4:-0}" + touch "$fn" + setfattr -n 'user.rsync.%stat' -v "$mode $maj,$min 0:0" "$fn" + } + ;; + esac + ;; esac # TODO: Need to test whether hardlinks are possible on this OS/filesystem mkdir "$fromdir" -mknod "$fromdir/char" c 41 67 || test_skipped "Can't create char device node unless root" -mknod "$fromdir/char2" c 42 68 || test_skipped "Can't create char device node unless root" -mknod "$fromdir/char3" c 42 69 || test_skipped "Can't create char device node unless root" -mknod "$fromdir/block" b 42 69 || test_skipped "Can't create block device node unless root" -mknod "$fromdir/block2" b 42 73 || test_skipped "Can't create block device node unless root" -mknod "$fromdir/block3" b 105 73 || test_skipped "Can't create block device node unless root" -mkfifo "$fromdir/fifo" || test_skipped "Can't run mkfifo" - -checkit "$RSYNC -aHvv \"$fromdir/\" \"$todir/\"" "$fromdir" "$todir" +mkdir "$todir" +mknod "$fromdir/char" c 41 67 || test_skipped "Can't create char device node" +mknod "$fromdir/char2" c 42 68 || test_skipped "Can't create char device node" +mknod "$fromdir/char3" c 42 69 || test_skipped "Can't create char device node" +mknod "$fromdir/block" b 42 69 || test_skipped "Can't create block device node" +mknod "$fromdir/block2" b 42 73 || test_skipped "Can't create block device node" +mknod "$fromdir/block3" b 105 73 || test_skipped "Can't create block device node" +ln "$fromdir/block3" "$fromdir/block2.5" || echo "Skipping hard-linked device test..." +mkfifo "$fromdir/fifo" || mknod "$fromdir/fifo" p || test_skipped "Can't run mkfifo" +touch -r "$fromdir/block" "$fromdir/block2" + +$RSYNC -ai "$fromdir/block" "$todir/block2" \ + | tee "$outfile" +cat <"$chkfile" +cD+++++++++ block +EOT +diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed" + +$RSYNC -ai "$fromdir/block2" "$todir/block" \ + | tee "$outfile" +cat <"$chkfile" +cD+++++++++ block2 +EOT +diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed" + +sleep 1 + +$RSYNC -Di "$fromdir/block3" "$todir/block" \ + | tee "$outfile" +cat <"$chkfile" +cD..T...... block3 +EOT +diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed" + +$RSYNC -aiHvv "$fromdir/" "$todir/" \ + | tee "$outfile" +filter_outfile +cat <"$chkfile" +.d..t...... ./ +cD..t...... block +cD block2 +cD+++++++++ block3 +hD+++++++++ block2.5 => block3 +cD+++++++++ char +cD+++++++++ char2 +cD+++++++++ char3 +cS+++++++++ fifo +EOT +if test ! -r "$fromdir/block2.5"; then + sed -e '/block2\.5/d' <"$chkfile" >"$chkfile.new" + mv "$chkfile.new" "$chkfile" +fi +diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed" + +echo "check how the directory listings compare with diff:" +echo "" +( cd "$fromdir" && rsync_ls_lR . ) > "$tmpdir/ls-from" +( cd "$todir" && rsync_ls_lR . ) > "$tmpdir/ls-to" +diff $diffopt "$tmpdir/ls-from" "$tmpdir/ls-to" + +if test -b "$fromdir/block2.5"; then + set -x + $RSYNC -aii --link-dest="$todir" "$fromdir/" "$chkdir/" \ + | tee "$outfile" + cat <"$chkfile" +cd ./ +hD block +hD block2 +hD block2.5 +hD block3 +hD char +hD char2 +hD char3 +hS fifo +EOT + diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed" +fi # The script would have aborted on error, so getting here means we've won. exit 0