From: Uri Simchoni Date: Thu, 29 Oct 2015 20:24:30 +0000 (+0200) Subject: vfs_shadow_copy2: add a blackbox test suite X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba%2Fsamba-obnox.git;a=commitdiff_plain;h=7362c27a62e3802fc8df975ce50115b683811f4a vfs_shadow_copy2: add a blackbox test suite Add a blackbox test suite for vfs_shadow_copy2, testing parameters mountpoint, basedir, snapdir, snapdirseverywhere, and testing correct wide-link processing. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11580 Signed-off-by: Uri Simchoni Reviewed-by: Michael Adam Autobuild-User(master): Michael Adam Autobuild-Date(master): Wed Jan 13 17:11:38 CET 2016 on sn-devel-144 --- diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index 09066203e86..cd293a6c9bc 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -1126,6 +1126,15 @@ sub provision($$$$$$$$) my $widelinks_linkdir="$shrdir/widelinks_foo"; push(@dirs,$widelinks_linkdir); + my $shadow_tstdir="$shrdir/shadow"; + push(@dirs,$shadow_tstdir); + my $shadow_mntdir="$shadow_tstdir/mount"; + push(@dirs,$shadow_mntdir); + my $shadow_basedir="$shadow_mntdir/base"; + push(@dirs,$shadow_basedir); + my $shadow_shrdir="$shadow_basedir/share"; + push(@dirs,$shadow_shrdir); + # this gets autocreated by winbindd my $wbsockdir="$prefix_abs/winbindd"; my $wbsockprivdir="$lockdir/winbindd_privileged"; @@ -1392,6 +1401,10 @@ sub provision($$$$$$$$) # fruit:copyfile is a global option fruit:copyfile = yes + #this does not mean that we use non-secure test env, + #it just means we ALLOW one to be configured. + allow insecure wide links = yes + # Begin extra options $extra_options # End extra options @@ -1553,6 +1566,62 @@ sub provision($$$$$$$$) shell_snap:delete command = $fake_snap_pl --delete # a relative path here fails, the snapshot dir is no longer found shadow:snapdir = $shrdir/.snapshots + +[shadow1] + path = $shadow_shrdir + comment = previous versions snapshots under mount point + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + +[shadow2] + path = $shadow_shrdir + comment = previous versions snapshots outside mount point + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + shadow:snapdir = $shadow_tstdir/.snapshots + +[shadow3] + path = $shadow_shrdir + comment = previous versions with subvolume snapshots, snapshots under base dir + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + shadow:basedir = $shadow_basedir + shadow:snapdir = $shadow_basedir/.snapshots + +[shadow4] + path = $shadow_shrdir + comment = previous versions with subvolume snapshots, snapshots outside mount point + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + shadow:basedir = $shadow_basedir + shadow:snapdir = $shadow_tstdir/.snapshots + +[shadow5] + path = $shadow_shrdir + comment = previous versions at volume root snapshots under mount point + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_shrdir + +[shadow6] + path = $shadow_shrdir + comment = previous versions at volume root snapshots outside mount point + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_shrdir + shadow:snapdir = $shadow_tstdir/.snapshots + +[shadow7] + path = $shadow_shrdir + comment = previous versions snapshots everywhere + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + shadow:snapdirseverywhere = yes + +[shadow_wl] + path = $shadow_shrdir + comment = previous versions with wide links allowed + vfs objects = shadow_copy2 + shadow:mountpoint = $shadow_mntdir + wide links = yes "; close(CONF); diff --git a/source3/script/tests/test_shadow_copy.sh b/source3/script/tests/test_shadow_copy.sh new file mode 100755 index 00000000000..eecd5b86eac --- /dev/null +++ b/source3/script/tests/test_shadow_copy.sh @@ -0,0 +1,290 @@ +#!/bin/bash +# +# Blackbox test for shadow_copy2 VFS. +# + +if [ $# -lt 7 ]; then +cat </dev/null 2>&1 + build_snapshots $WORKDIR/$where "$prefix" 0 2 + + testit "$msg - regular file" \ + test_count_versions $share foo $ncopies_allowed || \ + failed=`expr $failed + 1` + + testit "$msg - regular file in subdir" \ + test_count_versions $share bar/baz $ncopies_allowed || \ + failed=`expr $failed + 1` + + testit "$msg - local symlink" \ + test_count_versions $share bar/lfoo $ncopies_allowed || \ + failed=`expr $failed + 1` + + testit "$msg - abs symlink outside" \ + test_count_versions $share bar/letcpasswd $ncopies_blocked || \ + failed=`expr $failed + 1` + + testit "$msg - rel symlink outside" \ + test_count_versions $share bar/loutside $ncopies_blocked || \ + failed=`expr $failed + 1` +} + +test_shadow_copy_everywhere() +{ + local share #share to contact + + share=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots "$WORKDIR/mount" "base/share" 0 0 + build_snapshots "$WORKDIR/mount/base" "share" 1 2 + build_snapshots "$WORKDIR/mount/base/share" "" 3 5 + build_snapshots "$WORKDIR/mount/base/share/bar" "" 6 9 1 + + testit "snapshots in each dir - regular file" \ + test_count_versions $share foo 4 || \ + failed=`expr $failed + 1` + + testit "snapshots in each dir - regular file in subdir" \ + test_count_versions $share bar/baz 5 || \ + failed=`expr $failed + 1` + + testit "snapshots in each dir - local symlink (but outside snapshot)" \ + test_count_versions $share bar/lfoo 1 || \ + failed=`expr $failed + 1` + + testit "snapshots in each dir - abs symlink outside" \ + test_count_versions $share bar/letcpasswd 1 || \ + failed=`expr $failed + 1` + + testit "snapshots in each dir - rel symlink outside" \ + test_count_versions $share bar/loutside 1 || \ + failed=`expr $failed + 1` + + #the previous versions of the file bar/lfoo points to are outside its + #snapshot, and are not reachable. However, but previous versions + #taken at different, non-overlapping times higher up the + #hierarchy are still reachable. + testit "fetch a previous version of a regular file" \ + test_fetch_snap_file $share "bar/baz" 6 || \ + failed=`expr $failed + 1` + + testit_expect_failure "fetch a (non-existent) previous version of a symlink" \ + test_fetch_snap_file $share "bar/lfoo" 6 || \ + failed=`expr $failed + 1` + + testit "fetch a previous version of a symlink via browsing (1)" \ + test_fetch_snap_file $share "bar/lfoo" 0 || \ + failed=`expr $failed + 1` + + testit "fetch a previous version of a symlink via browsing (2)" \ + test_fetch_snap_file $share "bar/lfoo" 1 || \ + failed=`expr $failed + 1` + + testit "fetch a previous version of a symlink via browsing (3)" \ + test_fetch_snap_file $share "bar/lfoo" 3 || \ + failed=`expr $failed + 1` + +} + +#build "latest" files +build_files $WORKDIR/mount base/share "latest" + +failed=0 + +# a test with wide links allowed - also to verify that what's later +# being blocked is a result of server security measures and not +# a testing artifact. +test_shadow_copy_fixed shadow_wl mount base/share "shadow copies with wide links allowed" 1 + +# tests for a fixed snapshot location +test_shadow_copy_fixed shadow1 mount base/share "full volume snapshots mounted under volume" +test_shadow_copy_fixed shadow2 . base/share "full volume snapshots mounted outside volume" +test_shadow_copy_fixed shadow3 mount/base share "sub volume snapshots mounted under snapshot point" +test_shadow_copy_fixed shadow4 . share "sub volume snapshots mounted outside" +test_shadow_copy_fixed shadow5 mount/base/share "" "full volume snapshots and share mounted under volume" +test_shadow_copy_fixed shadow6 . "" "full volume snapshots and share mounted outside" + +# tests for snapshot everywhere - one snapshot location +test_shadow_copy_fixed shadow7 mount base/share "'everywhere' full volume snapshots" +test_shadow_copy_fixed shadow7 mount/base share "'everywhere' sub volume snapshots" +test_shadow_copy_fixed shadow7 mount/base/share "" "'everywhere' share snapshots" + +# a test for snapshots everywhere - multiple snapshot locations +test_shadow_copy_everywhere shadow7 + +exit $failed diff --git a/source3/selftest/tests.py b/source3/selftest/tests.py index 655c593b80e..25d20fe0f9d 100755 --- a/source3/selftest/tests.py +++ b/source3/selftest/tests.py @@ -179,6 +179,7 @@ for env in ["fileserver"]: plantestsuite("samba3.blackbox.dfree_command (%s)" % env, env, [os.path.join(samba3srcdir, "script/tests/test_dfree_command.sh"), '$SERVER', '$DOMAIN', '$USERNAME', '$PASSWORD', '$PREFIX', smbclient3]) plantestsuite("samba3.blackbox.valid_users (%s)" % env, env, [os.path.join(samba3srcdir, "script/tests/test_valid_users.sh"), '$SERVER', '$SERVER_IP', '$DOMAIN', '$USERNAME', '$PASSWORD', '$PREFIX', smbclient3]) plantestsuite("samba3.blackbox.offline (%s)" % env, env, [os.path.join(samba3srcdir, "script/tests/test_offline.sh"), '$SERVER', '$SERVER_IP', '$DOMAIN', '$USERNAME', '$PASSWORD', '$LOCAL_PATH/offline', smbclient3]) + plantestsuite("samba3.blackbox.shadow_copy2 (%s)" % env, env, [os.path.join(samba3srcdir, "script/tests/test_shadow_copy.sh"), '$SERVER', '$SERVER_IP', '$DOMAIN', '$USERNAME', '$PASSWORD', '$LOCAL_PATH/shadow', smbclient3]) # # tar command tests