061d70e819
don't treat getfattr after 'setfattr -x' (ie, removexattr()) as an error. ignore the output so the script runs for completion Change-Id: Id7089b91e7259a39be7cb6fce627828774c4acbc Signed-off-by: Amar Tumballi <amar@gluster.com> BUG: 787956 Reviewed-on: http://review.gluster.com/2768 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vijay@gluster.com>
481 lines
9.9 KiB
Bash
Executable File
481 lines
9.9 KiB
Bash
Executable File
#!/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)
|
|
# Pending are 7 procedures.
|
|
# getspec, fsyncdir, access, fentrylk, fsetxattr, fgetxattr, rchecksum
|
|
# TODO: add commands which can generate fops for missing fops
|
|
|
|
## Script tests below File Operations over RPC (when afr is used)
|
|
|
|
# CREATE
|
|
# ENTRYLK
|
|
# FINODELK
|
|
# FLUSH
|
|
# FSTAT
|
|
# FSYNC
|
|
# FTRUNCATE
|
|
# FXATTROP
|
|
# GETXATTR
|
|
# INODELK
|
|
# LINK
|
|
# LK
|
|
# LOOKUP
|
|
# MKDIR
|
|
# MKNOD
|
|
# OPEN
|
|
# OPENDIR
|
|
# READ
|
|
# READDIR
|
|
# READDIRP
|
|
# READLINK
|
|
# RELEASE
|
|
# RELEASEDIR
|
|
# REMOVEXATTR
|
|
# RENAME
|
|
# RMDIR
|
|
# SETATTR
|
|
# SETXATTR
|
|
# STAT
|
|
# STATFS
|
|
# SYMLINK
|
|
# TRUNCATE
|
|
# UNLINK
|
|
# WRITE
|
|
# XATTROP
|
|
|
|
#set -e;
|
|
set -o pipefail;
|
|
|
|
function fail() {
|
|
echo "$*: failed.";
|
|
exit 1;
|
|
}
|
|
|
|
function test_mkdir()
|
|
{
|
|
mkdir -p $PFX/dir;
|
|
test $(stat -c '%F' $PFX/dir) == "directory" || fail "mkdir"
|
|
}
|
|
|
|
|
|
function test_create()
|
|
{
|
|
: > $PFX/dir/file;
|
|
|
|
test "$(stat -c '%F' $PFX/dir/file)" == "regular empty file" || fail "create"
|
|
}
|
|
|
|
|
|
function test_statfs()
|
|
{
|
|
local size;
|
|
|
|
size=$(stat -f -c '%s' $PFX/dir/file);
|
|
test "x$size" != "x0" || fail "statfs"
|
|
}
|
|
|
|
|
|
function test_open()
|
|
{
|
|
exec 4<$PFX/dir/file || fail "open"
|
|
exec 4>&- || fail "open"
|
|
}
|
|
|
|
|
|
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 || fail "open"
|
|
}
|
|
|
|
|
|
function test_read()
|
|
{
|
|
local count;
|
|
|
|
count=$(dd if=$PFX/dir/file bs=64k count=16 2>/dev/null | wc -c);
|
|
test $count == 1048576 || fail "read"
|
|
}
|
|
|
|
|
|
function test_truncate()
|
|
{
|
|
truncate -s 512 $PFX/dir/file;
|
|
test $(stat -c '%s' $PFX/dir/file) == 512 || fail "truncate"
|
|
|
|
truncate -s 0 $PFX/dir/file;
|
|
test $(stat -c '%s' $PFX/dir/file) == 0 || fail "truncate"
|
|
}
|
|
|
|
|
|
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" || fail "fstat"
|
|
}
|
|
|
|
|
|
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" \
|
|
|| fail "mknod for block device"
|
|
|
|
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" \
|
|
|| fail "mknod for character device"
|
|
|
|
mknod -m 0666 $PFX/dir/fifo p;
|
|
test "$(stat -c '%F %a' $PFX/dir/fifo)" == "fifo 666" || \
|
|
fail "mknod for fifo"
|
|
}
|
|
|
|
|
|
function test_symlink()
|
|
{
|
|
local msg;
|
|
|
|
ln -s $PFX/dir/file $PFX/dir/symlink;
|
|
test "$(stat -c '%F' $PFX/dir/symlink)" == "symbolic link" || fail "Creation of symlink"
|
|
|
|
msg=$(cat $PFX/dir/symlink);
|
|
test "x$msg" == "xhooha" || fail "Content match for symlink"
|
|
}
|
|
|
|
|
|
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 || fail "Inode comparison for hardlink"
|
|
test $nlink1 == 2 || fail "Link count for hardlink"
|
|
test $nlink2 == 2 || fail "Link count for hardlink"
|
|
|
|
msg=$(cat $PFX/dir/hardlink);
|
|
|
|
test "x$msg" == "xhooha" || fail "Content match for hardlinks"
|
|
}
|
|
|
|
|
|
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 || fail "mv"
|
|
msg=$(cat $PFX/dir/file2);
|
|
test "x$msg" == "xhooha" || fail "File contents comparison after mv"
|
|
|
|
ino2=$(stat -c '%i' $PFX/dir/file2);
|
|
test $ino1 == $ino2 || fail "Inode comparison after mv"
|
|
|
|
mv $PFX/dir/file2 $PFX/dir/file;
|
|
msg=$(cat $PFX/dir/file);
|
|
test "x$msg" == "xhooha" || fail "File contents comparison after mv"
|
|
|
|
ino3=$(stat -c '%i' $PFX/dir/file);
|
|
test $ino1 == $ino3 || fail "Inode comparison after mv"
|
|
|
|
#### dir
|
|
|
|
ino1=$(stat -c '%i' $PFX/dir);
|
|
|
|
mv $PFX/dir $PFX/dir2 || fail "Directory mv"
|
|
ino2=$(stat -c '%i' $PFX/dir2);
|
|
test $ino1 == $ino2 || fail "Inode comparison after directory mv"
|
|
|
|
mv $PFX/dir2 $PFX/dir || fail "Directory mv"
|
|
ino3=$(stat -c '%i' $PFX/dir);
|
|
test $ino1 == $ino3 || fail "Inode comparison after directory mv"
|
|
}
|
|
|
|
|
|
function test_chmod()
|
|
{
|
|
local mode0;
|
|
local mode1;
|
|
local mode2;
|
|
|
|
|
|
#### file
|
|
|
|
mode0=$(stat -c '%a' $PFX/dir/file);
|
|
chmod 0753 $PFX/dir/file || fail "chmod"
|
|
|
|
mode1=$(stat -c '%a' $PFX/dir/file);
|
|
test 0$mode1 == 0753 || fail "Mode comparison after chmod"
|
|
|
|
chmod 0$mode0 $PFX/dir/file || fail "chmod"
|
|
mode2=$(stat -c '%a' $PFX/dir/file);
|
|
test 0$mode2 == 0$mode0 || fail "Mode comparison after chmod"
|
|
|
|
#### dir
|
|
|
|
mode0=$(stat -c '%a' $PFX/dir);
|
|
chmod 0753 $PFX/dir || fail "chmod"
|
|
|
|
mode1=$(stat -c '%a' $PFX/dir);
|
|
test 0$mode1 == 0753 || fail "Mode comparison after chmod"
|
|
|
|
chmod 0$mode0 $PFX/dir || fail "chmod"
|
|
mode2=$(stat -c '%a' $PFX/dir);
|
|
test 0$mode2 == 0$mode0 || fail "Mode comparison after chmod"
|
|
}
|
|
|
|
|
|
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 || fail "chown"
|
|
|
|
user2=$(stat -c '%u' $PFX/dir/file);
|
|
group2=$(stat -c '%g' $PFX/dir/file);
|
|
|
|
test $user2 == 13 || fail "User comparison after chown"
|
|
test $group2 == 42 || fail "Group comparison after chown"
|
|
|
|
chown $user1:$group1 $PFX/dir/file || fail "chown"
|
|
|
|
user2=$(stat -c '%u' $PFX/dir/file);
|
|
group2=$(stat -c '%g' $PFX/dir/file);
|
|
|
|
test $user2 == $user1 || fail "User comparison after chown"
|
|
test $group2 == $group1 || fail "Group comparison after chown"
|
|
|
|
#### dir
|
|
|
|
user1=$(stat -c '%u' $PFX/dir);
|
|
group1=$(stat -c '%g' $PFX/dir);
|
|
|
|
chown 13:42 $PFX/dir || fail "chown"
|
|
|
|
user2=$(stat -c '%u' $PFX/dir);
|
|
group2=$(stat -c '%g' $PFX/dir);
|
|
|
|
test $user2 == 13 || fail "User comparison after chown"
|
|
test $group2 == 42 || fail "Group comparison after chown"
|
|
|
|
chown $user1:$group1 $PFX/dir || fail "chown"
|
|
|
|
user2=$(stat -c '%u' $PFX/dir);
|
|
group2=$(stat -c '%g' $PFX/dir);
|
|
|
|
test $user2 == $user1 || fail "User comparison after chown"
|
|
test $group2 == $group1 || fail "Group comparison after chown"
|
|
}
|
|
|
|
|
|
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 || fail "atime change on file"
|
|
|
|
acc1=$(stat -c '%X' $PFX/dir/file);
|
|
mod1=$(stat -c '%Y' $PFX/dir/file);
|
|
|
|
sleep 1;
|
|
touch -m $PFX/dir/file || fail "mtime change on file"
|
|
|
|
acc2=$(stat -c '%X' $PFX/dir/file);
|
|
mod2=$(stat -c '%Y' $PFX/dir/file);
|
|
|
|
test $acc0 != $acc1 || fail "atime mismatch comparison on file"
|
|
test $acc1 == $acc2 || fail "atime match comparison on file"
|
|
test $mod0 == $mod1 || fail "mtime match comparison on file"
|
|
test $mod1 != $mod2 || fail "mtime mismatch comparison on file"
|
|
|
|
#### dir
|
|
|
|
acc0=$(stat -c '%X' $PFX/dir);
|
|
mod0=$(stat -c '%Y' $PFX/dir);
|
|
|
|
sleep 1;
|
|
touch -a $PFX/dir || fail "atime change on directory"
|
|
|
|
acc1=$(stat -c '%X' $PFX/dir);
|
|
mod1=$(stat -c '%Y' $PFX/dir);
|
|
|
|
sleep 1;
|
|
touch -m $PFX/dir || fail "mtime change on directory"
|
|
|
|
acc2=$(stat -c '%X' $PFX/dir);
|
|
mod2=$(stat -c '%Y' $PFX/dir);
|
|
|
|
test $acc0 != $acc1 || fail "atime mismatch comparison on directory"
|
|
test $acc1 == $acc2 || fail "atime match comparison on directory"
|
|
test $mod0 == $mod1 || fail "mtime match comparison on directory"
|
|
test $mod1 != $mod2 || fail "mtime mismatch comparison on directory"
|
|
}
|
|
|
|
|
|
function test_locks()
|
|
{
|
|
exec 200>$PFX/dir/lockfile || fail "exec"
|
|
|
|
## exclusive locks test
|
|
flock -e 200 || fail "flock -e"
|
|
! flock -n -e $PFX/dir/lockfile -c true || fail "! flock -n -e"
|
|
! flock -n -s $PFX/dir/lockfile -c true || fail "! flock -n -s"
|
|
flock -u 200 || fail "flock -u"
|
|
|
|
## shared locks test
|
|
flock -s 200 || fail "flock -s"
|
|
! flock -n -e $PFX/dir/lockfile -c true || fail "! flock -n -e"
|
|
flock -n -s $PFX/dir/lockfile -c true || fail "! flock -n -s"
|
|
flock -u 200 || fail "flock -u"
|
|
|
|
exec 200>&- || fail "exec"
|
|
|
|
}
|
|
|
|
|
|
function test_readdir()
|
|
{
|
|
/bin/ls $PFX/dir >/dev/null || fail "ls"
|
|
}
|
|
|
|
|
|
function test_setxattr()
|
|
{
|
|
setfattr -n trusted.testing -v c00k33 $PFX/dir/file || fail "setfattr"
|
|
}
|
|
|
|
|
|
function test_listxattr()
|
|
{
|
|
getfattr -m trusted $PFX/dir/file 2>/dev/null | grep -q trusted.testing || fail "getfattr"
|
|
}
|
|
|
|
|
|
function test_getxattr()
|
|
{
|
|
getfattr -n trusted.testing $PFX/dir/file 2>/dev/null | grep -q c00k33 || fail "getfattr"
|
|
}
|
|
|
|
|
|
function test_removexattr()
|
|
{
|
|
setfattr -x trusted.testing $PFX/dir/file || fail "setfattr remove"
|
|
getfattr -n trusted.testing $PFXf/dir/file 2>&1 | grep -q "No such attribute"
|
|
}
|
|
|
|
|
|
function test_unlink()
|
|
{
|
|
rm $PFX/dir/file || fail "rm"
|
|
}
|
|
|
|
|
|
function test_rmdir()
|
|
{
|
|
rm -rf $PFX || fail "rm -rf"
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
_init && main "$@";
|