diff options
Diffstat (limited to 'source3/script/tests/test_shadow_copy_torture.sh')
-rwxr-xr-x | source3/script/tests/test_shadow_copy_torture.sh | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/source3/script/tests/test_shadow_copy_torture.sh b/source3/script/tests/test_shadow_copy_torture.sh new file mode 100755 index 0000000..3a6ba91 --- /dev/null +++ b/source3/script/tests/test_shadow_copy_torture.sh @@ -0,0 +1,227 @@ +#!/usr/bin/env bash +# +# Blackbox test for shadow_copy2 VFS. +# + +if [ $# -lt 7 ]; then + cat <<EOF +Usage: test_shadow_copy SERVER SERVER_IP DOMAIN USERNAME PASSWORD WORKDIR SMBTORTURE SMBCLIENT +EOF + exit 1 +fi + +SERVER=${1} +SERVER_IP=${2} +DOMAIN=${3} +USERNAME=${4} +PASSWORD=${5} +WORKDIR=${6} +SMBTORTURE="$VALGRIND ${7}" +SMBCLIENT="$VALGRIND ${8}" +shift 7 + +incdir=$(dirname $0)/../../../testprogs/blackbox +. $incdir/subunit.sh + +SNAPSHOT="@GMT-2015.10.31-19.40.30" + +failed=0 + +cd $SELFTEST_TMPDIR || exit 1 + +# build a hierarchy of files, symlinks, and directories +build_files() +{ + local destdir + destdir=$1 + + echo "$content" >$destdir/foo + + mkdir -p $WORKDIR/subdir/ + touch $WORKDIR/subdir/hardlink +} + +# build a snapshots directory +build_snapshots() +{ + local snapdir + + snapdir=$WORKDIR/.snapshots + + mkdir -p $snapdir/$SNAPSHOT + + build_files $snapdir/$SNAPSHOT + + mkdir -p $snapdir/$SNAPSHOT/subdir + ln "$WORKDIR"/subdir/hardlink "$snapdir"/$SNAPSHOT/subdir/hardlink +} + +build_stream_on_snapshot() +{ + file=$WORKDIR/.snapshots/$SNAPSHOT/foo + + setfattr -n 'user.DosStream.bar:$DATA' -v baz $file || return 1 +} + +test_shadow_copy_write() +{ + local msg + + msg=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + + testit "writing to shadow copy of a file" \ + $SMBTORTURE \ + -U$USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + --option="torture:twrp_file=foo" \ + --option="torture:twrp_snapshot=$SNAPSHOT" \ + smb2.twrp.write || + failed=$(expr $failed + 1) +} + +test_shadow_copy_stream() +{ + local msg + + msg=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + build_stream_on_snapshot || { + subunit_start_test msg + subunit_skip_test msg <<EOF +test_shadow_copy_stream needs an fs with xattrs +EOF + return 0 + } + + testit "reading stream of a shadow copy of a file" \ + $SMBTORTURE \ + -U$USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + --option="torture:twrp_file=foo" \ + --option="torture:twrp_stream=bar" \ + --option="torture:twrp_stream_size=3" \ + --option="torture:twrp_snapshot=$SNAPSHOT" \ + smb2.twrp.stream || + failed=$(expr $failed + 1) +} + +test_shadow_copy_openroot() +{ + local msg + + msg=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + + testit "opening shadow copy root of share" \ + $SMBTORTURE \ + -U$USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + --option="torture:twrp_snapshot=$SNAPSHOT" \ + smb2.twrp.openroot || + failed=$(expr $failed + 1) +} + +test_shadow_copy_fix_inodes() +{ + local msg + + msg=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + + out=$($SMBCLIENT \ + -U $USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + -c "open $SNAPSHOT/subdir/hardlink") || failed=$(expr $failed + 1) + echo $out + echo $out | grep "hardlink: for read/write fnum 1" || return 1 +} + +build_hiddenfile() +{ + local snapdir + + snapdir=$WORKDIR/.snapshots + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + + touch $WORKDIR/hiddenfile + + # Create a file with hidden attribute + $SMBCLIENT -U $USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + -c "put $WORKDIR/hiddenfile hiddenfile; setmode hiddenfile +h" + # ...and move it to the snapshot directory + mv $WORKDIR/hiddenfile $snapdir/$SNAPSHOT/ +} + +test_hiddenfile() +{ + build_hiddenfile + + out=$($SMBCLIENT \ + -U $USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + -c "allinfo $SNAPSHOT/hiddenfile") || return 1 + echo $out + echo $out | grep "attributes: HA (22)" || return 1 + + out=$($SMBCLIENT \ + -U $USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + -c "ls $SNAPSHOT/hiddenfile") || return 1 + echo $out + echo $out | grep "hiddenfile[[:blank:]]*AH" || return 1 + + return 0 +} + +test_shadow_copy_listdir_fix_inodes() +{ + local msg + + msg=$1 + + #delete snapshots from previous tests + find $WORKDIR -name ".snapshots" -exec rm -rf {} \; 1>/dev/null 2>&1 + build_snapshots + + testit "$msg" \ + $SMBTORTURE \ + -U$USERNAME%$PASSWORD \ + "//$SERVER/shadow_write" \ + --option="torture:twrp_snapshot=$SNAPSHOT" \ + smb2.twrp.listdir || + failed=$(expr $failed + 1) +} + +build_files $WORKDIR + +# test open for writing and write behaviour of snapshoted files +test_shadow_copy_write "write behaviour of snapshoted files" + +test_shadow_copy_stream "reading stream of snapshotted file" + +test_shadow_copy_openroot "opening root of shadow copy share" + +testit "fix inodes with hardlink" test_shadow_copy_fix_inodes || failed=$(expr $failed + 1) + +testit "Test reading DOS attribute" test_hiddenfile || failed=$(expr $failed + 1) + +test_shadow_copy_listdir_fix_inodes "fix inodes when listing directory" + +exit $failed |