diff options
Diffstat (limited to 'extras/rpc-coverage.sh')
-rwxr-xr-x | extras/rpc-coverage.sh | 469 |
1 files changed, 440 insertions, 29 deletions
diff --git a/extras/rpc-coverage.sh b/extras/rpc-coverage.sh index 1f4dfcc9a9d..ce12fddb4d4 100755 --- a/extras/rpc-coverage.sh +++ b/extras/rpc-coverage.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # This script can be used to provoke 35 fops (if afr is used), # 28 fops (if afr is not used) (-fstat,-readdirp, and lk,xattrop calls) @@ -44,40 +44,451 @@ # WRITE # XATTROP -set -e +set -e; +set -o pipefail; -MOUNTPOINT=$1; +function test_mkdir() +{ + mkdir -p $PFX/dir; -[ -z $MOUNTPOINT ] && { - MOUNTPOINT="/mnt/glusterfs"; + test $(stat -c '%F' $PFX/dir) == "directory"; } -current_dir=$PWD; -TESTDIR="${MOUNTPOINT}/fop-test-$(date +%Y%m%d%H%M%S)" -mkdir $TESTDIR; -cd $TESTDIR; -echo "Lets see open working" >> testfile; -echo "Lets see truncate working 012345678" > testfile; -truncate -s 30 testfile; -mkdir testdir; -mkfifo testfifo; -ln testfile testfile-ln; -ln -sf testfile testfile-symlink; -mv testfile-symlink testfile-symlink-mv; -chmod 0777 testfile; -flock -x testfile.lock dd if=/dev/zero of=testfile1 conv=fsync bs=1M count=2 > /dev/null 2>&1; -cat testfile1 > /dev/null; -ls -lR . > /dev/null; -setfattr -n trusted.rpc.coverage -v testing testfile; -getfattr -d -m . testfile > /dev/null; -setfattr -x trusted.rpc.coverage testfile; -df -h testdir > /dev/null; +function test_create() +{ + : > $PFX/dir/file; -rm -f testfifo testfile testfile1 testfile-ln testfile.lock testfile-symlink-mv; -rmdir testdir; + test "$(stat -c '%F' $PFX/dir/file)" == "regular empty file"; +} + + +function test_statfs() +{ + local size; + + size=$(stat -f -c '%s' $PFX/dir/file); + + test "x$size" != "x0"; +} + + +function test_open() +{ + exec 4<$PFX/dir/file; + exec 4>&-; +} + + +function test_write() +{ + dd if=/dev/zero of=$PFX/dir/file bs=65536 count=16 2>/dev/null; + + test $(stat -c '%s' $PFX/dir/file) == 1048576; +} + + +function test_read() +{ + local count; + + count=$(dd if=$PFX/dir/file bs=64k count=16 2>/dev/null | wc -c); + + test $count == 1048576; +} + + +function test_truncate() +{ + truncate -s 512 $PFX/dir/file; + + test $(stat -c '%s' $PFX/dir/file) == 512; + + truncate -s 0 $PFX/dir/file; + + test $(stat -c '%s' $PFX/dir/file) == 0; +} + + +function test_fstat() +{ + local msg; + + export PFX; + msg=$(sh -c 'tail -f $PFX/dir/file --pid=$$ & sleep 1 && echo hooha > $PFX/dir/file && sleep 1'); + + test "x$msg" == "xhooha"; +} + + +function test_mknod() +{ + mknod -m 0666 $PFX/dir/block b 13 42; + + test "$(stat -c '%F %a %t %T' $PFX/dir/block)" == "block special file 666 d 2a"; + + mknod -m 0666 $PFX/dir/char c 13 42; + + test "$(stat -c '%F %a %t %T' $PFX/dir/char)" == "character special file 666 d 2a"; + + mknod -m 0666 $PFX/dir/fifo p; + + test "$(stat -c '%F %a' $PFX/dir/fifo)" == "fifo 666"; +} + + +function test_symlink() +{ + local msg; + + ln -s $PFX/dir/file $PFX/dir/symlink; + + test "$(stat -c '%F' $PFX/dir/symlink)" == "symbolic link"; + + msg=$(cat $PFX/dir/symlink); + + test "x$msg" == "xhooha"; +} + + +function test_hardlink() +{ + local ino1; + local ino2; + local nlink1; + local nlink2; + local msg; + + ln $PFX/dir/file $PFX/dir/hardlink; + + ino1=$(stat -c '%i' $PFX/dir/file); + nlink1=$(stat -c '%h' $PFX/dir/file); + ino2=$(stat -c '%i' $PFX/dir/hardlink); + nlink2=$(stat -c '%h' $PFX/dir/hardlink); + + test $ino1 == $ino2; + test $nlink1 == 2; + test $nlink2 == 2; + + msg=$(cat $PFX/dir/hardlink); + + test "x$msg" == "xhooha"; +} + + +function test_rename() +{ + local ino1; + local ino2; + local ino3; + local msg; + + #### file + + ino1=$(stat -c '%i' $PFX/dir/file); + + mv $PFX/dir/file $PFX/dir/file2; + + msg=$(cat $PFX/dir/file2); + test "x$msg" == "xhooha"; + + ino2=$(stat -c '%i' $PFX/dir/file2); + test $ino1 == $ino2; + + mv $PFX/dir/file2 $PFX/dir/file; + + msg=$(cat $PFX/dir/file); + test "x$msg" == "xhooha"; + + ino3=$(stat -c '%i' $PFX/dir/file); + test $ino1 == $ino3; + + #### dir + + ino1=$(stat -c '%i' $PFX/dir); + + mv $PFX/dir $PFX/dir2; + + ino2=$(stat -c '%i' $PFX/dir2); + test $ino1 == $ino2; + + mv $PFX/dir2 $PFX/dir; + + ino3=$(stat -c '%i' $PFX/dir); + test $ino1 == $ino3; +} + + +function test_chmod() +{ + local mode0; + local mode1; + local mode2; + + + #### file + + mode0=$(stat -c '%a' $PFX/dir/file); + + chmod 0753 $PFX/dir/file; + + mode1=$(stat -c '%a' $PFX/dir/file); + test 0$mode1 == 0753; + + chmod 0$mode0 $PFX/dir/file; + + mode2=$(stat -c '%a' $PFX/dir/file); + + test 0$mode2 == 0$mode0; + + #### dir + + mode0=$(stat -c '%a' $PFX/dir); + + chmod 0753 $PFX/dir; + + mode1=$(stat -c '%a' $PFX/dir); + test 0$mode1 == 0753; + + chmod 0$mode0 $PFX/dir; -cd $current_dir; + mode2=$(stat -c '%a' $PFX/dir); + + test 0$mode2 == 0$mode0; +} + + +function test_chown() +{ + local user1; + local user2; + local group1; + local group2; + + #### file + + user1=$(stat -c '%u' $PFX/dir/file); + group1=$(stat -c '%g' $PFX/dir/file); + + chown 13:42 $PFX/dir/file; + + user2=$(stat -c '%u' $PFX/dir/file); + group2=$(stat -c '%g' $PFX/dir/file); + + test $user2 == 13; + test $group2 == 42; + + chown $user1:$group1 $PFX/dir/file; + + user2=$(stat -c '%u' $PFX/dir/file); + group2=$(stat -c '%g' $PFX/dir/file); + + test $user2 == $user1; + test $group2 == $group1; + + #### dir + + user1=$(stat -c '%u' $PFX/dir); + group1=$(stat -c '%g' $PFX/dir); + + chown 13:42 $PFX/dir; + + user2=$(stat -c '%u' $PFX/dir); + group2=$(stat -c '%g' $PFX/dir); + + test $user2 == 13; + test $group2 == 42; + + chown $user1:$group1 $PFX/dir; + + user2=$(stat -c '%u' $PFX/dir); + group2=$(stat -c '%g' $PFX/dir); + + test $user2 == $user1; + test $group2 == $group1; +} + + +function test_utimes() +{ + local acc0; + local acc1; + local acc2; + local mod0; + local mod1; + local mod2; + + #### file + + acc0=$(stat -c '%X' $PFX/dir/file); + mod0=$(stat -c '%Y' $PFX/dir/file); + + sleep 1; + touch -a $PFX/dir/file; + + acc1=$(stat -c '%X' $PFX/dir/file); + mod1=$(stat -c '%Y' $PFX/dir/file); + + sleep 1; + touch -m $PFX/dir/file; + + acc2=$(stat -c '%X' $PFX/dir/file); + mod2=$(stat -c '%Y' $PFX/dir/file); + + test $acc0 != $acc1; + test $acc1 == $acc2; + test $mod0 == $mod1; + test $mod1 != $mod2; + + #### dir + + acc0=$(stat -c '%X' $PFX/dir); + mod0=$(stat -c '%Y' $PFX/dir); + + sleep 1; + touch -a $PFX/dir; + + acc1=$(stat -c '%X' $PFX/dir); + mod1=$(stat -c '%Y' $PFX/dir); + + sleep 1; + touch -m $PFX/dir; + + acc2=$(stat -c '%X' $PFX/dir); + mod2=$(stat -c '%Y' $PFX/dir); + + test $acc0 != $acc1; + test $acc1 == $acc2; + test $mod0 == $mod1; + test $mod1 != $mod2; +} + + +function test_locks() +{ + exec 200>$PFX/dir/lockfile; + + ## exclusive locks test + flock -e 200; + ! flock -n -e $PFX/dir/lockfile -c true; + ! flock -n -s $PFX/dir/lockfile -c true; + flock -u 200; + + ## shared locks test + flock -s 200; + ! flock -n -e $PFX/dir/lockfile -c true; + flock -n -s $PFX/dir/lockfile -c true; + flock -u 200; + + exec 200>&-; + +} + + +function test_readdir() +{ + /bin/ls $PFX/dir >/dev/null +} + + +function test_setxattr() +{ + setfattr -n trusted.testing -v c00k33 $PFX/dir/file; +} + + +function test_listxattr() +{ + getfattr -m trusted $PFX/dir/file 2>/dev/null | grep -q trusted.testing; +} + + +function test_getxattr() +{ + getfattr -n trusted.testing $PFX/dir/file 2>/dev/null | grep -q c00k33; +} + + +function test_removexattr() +{ + setfattr -x trusted.testing $PFX/dir/file; + getfattr -n trusted.testing $PFX/dir/file 2>&1 | grep -q 'No such attribute'; +} + + +function test_unlink() +{ + rm $PFX/dir/file; +} + + +function test_rmdir() +{ + rm -rf $PFX; +} + + +function run_tests() +{ + test_mkdir; + test_create; + test_statfs; + test_open; + test_write; + test_read; + test_truncate; + test_fstat; + test_mknod; + test_hardlink; + test_symlink; + test_rename; + test_chmod; + test_chown; + test_utimes; + test_locks; + test_readdir; + test_setxattr; + test_listxattr; + test_getxattr; + test_removexattr; + test_unlink; + test_rmdir; +} + + +function _init() +{ + DIR=$(pwd); +} + + +function parse_cmdline() +{ + if [ "x$1" == "x" ] ; then + echo "Usage: $0 /path/mount" + exit 1 + fi + + DIR=$1; + + if [ ! -d "$DIR" ] ; then + echo "$DIR: not a directory" + exit 1 + fi + + PFX="$DIR/coverage"; + rm -rvf $PFX; +} + + +function main() +{ + parse_cmdline "$@"; + + run_tests; + + exit 0; +} -rmdir ${TESTDIR} +_init && main "$@"; |