mirror of
https://github.com/deepseek-ai/3FS
synced 2025-06-26 18:16:45 +00:00
Initial commit
This commit is contained in:
185
tests/fuse/test_trash.sh
Normal file
185
tests/fuse/test_trash.sh
Normal file
@@ -0,0 +1,185 @@
|
||||
#!/bin/bash
|
||||
|
||||
RED='\033[0;31m'
|
||||
set -e
|
||||
|
||||
error_handler() {
|
||||
echo "Error occurred on line $1"
|
||||
}
|
||||
|
||||
# 设置 trap 来捕获 ERR 信号
|
||||
trap 'error_handler $LINENO' ERR
|
||||
|
||||
check_exists() {
|
||||
local path="$1"
|
||||
echo check $path
|
||||
if [ -e "$path" ]; then
|
||||
echo "ok, 路径存在: $path"
|
||||
else
|
||||
echo "${RED}error, 路径不存在: $path"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查路径是否不存在
|
||||
check_not_exists() {
|
||||
local path="$1"
|
||||
if [ ! -e "$path" ]; then
|
||||
echo "ok, 路径不存在: $path"
|
||||
else
|
||||
echo "${RED}error, 路径存在: $path"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
assert_fail() {
|
||||
set +e
|
||||
|
||||
# 执行传入的命令(包括管道)
|
||||
eval "$@"
|
||||
|
||||
# 检查整个管道的退出状态码
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Assertion failed: Command '$*' succeeded, but expected to fail."
|
||||
exit 1
|
||||
else
|
||||
echo "Assertion passed: Command '$*' failed as expected."
|
||||
fi
|
||||
|
||||
set -e
|
||||
}
|
||||
|
||||
if (($# < 2)); then
|
||||
echo "${0} <binary> <test-dir> <log-dir>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BINARY=${1%/}
|
||||
TEST_DIR=${2%/}
|
||||
LOG_DIR=${3:-}
|
||||
DEFAULT_LOG=${TEST_DIR}/log
|
||||
LOG=${LOG_DIR:=${DEFAULT_LOG}}
|
||||
|
||||
MOUNT1=${TEST_DIR}/mnt1
|
||||
MOUNT2=${TEST_DIR}/mnt2
|
||||
export HF3FS_CLI_MOUNTPOINT=`realpath ${MOUNT1}`
|
||||
|
||||
# test hf3fs trash
|
||||
sudo rm -rf ${MOUNT1}/trash
|
||||
# without trash directory, can't rmtree
|
||||
mkdir -p ${MOUNT1}/test/subdir
|
||||
assert_fail 'yes | hf3fs_cli rmtree --expire 3hours ${MOUNT1}/test/subdir'
|
||||
|
||||
sudo mkdir ${MOUNT1}/trash
|
||||
sudo mkdir -p ${MOUNT1}/trash/`id -un`
|
||||
sudo chown ${UID}:${UID} ${MOUNT1}/trash/`id -un`
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/invalid-name
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/1d-20240801_1200-20240801_1000 # invalid timestamp, begin < end
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/1d-20240801_1200-20240801_1300 # expired
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/1d-20240801_1200-20240801_1300/data-{1..200}
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300 # not expired
|
||||
mkdir -p ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300/data-{1..200}
|
||||
# trash cleaner 在删除时使用的是普通用户的 uid/gid, 不应该有 root 权限
|
||||
sudo mkdir -p ${MOUNT1}/trash/`id -un`/noperm-20240801_1200-20240801_1300/data-{1..20}
|
||||
|
||||
# root user's directory
|
||||
sudo mkdir ${MOUNT1}/trash/user-root
|
||||
sudo mkdir -p ${MOUNT1}/trash/user-root/1d-20240801_1200-20240801_1300/data
|
||||
# another user's directory
|
||||
sudo mkdir ${MOUNT1}/trash/user-1000
|
||||
sudo chown 1000:1000 ${MOUNT1}/trash/user-1000
|
||||
sudo mkdir -p ${MOUNT1}/trash/user-1000/1d-20240801_1200-20240801_1300/data
|
||||
sudo mkdir -p ${MOUNT1}/trash/user-1000/1d-20240801_1200-20240801_1310/data
|
||||
sudo chown -R 1000:1000 ${MOUNT1}/trash/user-1000/1d-20240801_1200-20240801_1310
|
||||
|
||||
sudo ${BINARY}/trash_cleaner --interval 0 --paths ${MOUNT1}/trash/
|
||||
|
||||
# after clean check some directory is cleaned, some still exists
|
||||
echo ==== ${MOUNT1}/trash/`id -un` ====
|
||||
ls ${MOUNT1}/trash/`id -un`
|
||||
check_exists ${MOUNT1}/trash/`id -un`/invalid-name
|
||||
check_exists ${MOUNT1}/trash/`id -un`/1d-20240801_1200-20240801_1000
|
||||
check_exists ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
check_not_exists ${MOUNT1}/trash/`id -un`/1d-20240801_1200-20240801_1300
|
||||
check_exists ${MOUNT1}/trash/`id -un`/noperm-20240801_1200-20240801_1300/data-{1..20}
|
||||
|
||||
echo ==== ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300 ====
|
||||
check_exists ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
ls ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
# rmtree to remove trash immediately
|
||||
assert_fail 'yes | hf3fs_cli rmtree ${MOUNT1}/trash/`id -un`/'
|
||||
assert_fail 'yes | hf3fs_cli rmtree ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300 --expire 3hours'
|
||||
check_exists ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
yes | hf3fs_cli rmtree ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
check_not_exists ${MOUNT1}/trash/`id -un`/1d-20300801_1200-20300801_1300
|
||||
|
||||
# root user's trash directory should exists
|
||||
check_exists ${MOUNT1}/trash/user-root
|
||||
check_exists ${MOUNT1}/trash/user-root/1d-20240801_1200-20240801_1300/data
|
||||
|
||||
# another user's trash directory
|
||||
check_exists ${MOUNT1}/trash/user-1000/
|
||||
# no permission to remove
|
||||
check_exists ${MOUNT1}/trash/user-1000/1d-20240801_1200-20240801_1300/data
|
||||
check_not_exists ${MOUNT1}/trash/user-1000/1d-20240801_1200-20240801_1310/data
|
||||
|
||||
# test hf3fs cli
|
||||
sudo rm -rf ${MOUNT1}/root
|
||||
sudo mkdir ${MOUNT1}/root
|
||||
sudo mkdir ${MOUNT1}/root/`id -un`
|
||||
sudo chown ${UID}:${UID} ${MOUNT1}/root/`id -un`
|
||||
mkdir ${MOUNT1}/root/`id -un`/subdir
|
||||
|
||||
assert_fail 'yes | hf3fs_cli rmtree --expire 3hours ${MOUNT1}/test/some-not-found-path'
|
||||
assert_fail 'hf3fs_cli mv ${MOUNT1}/test/some-not-found-path ${MOUNT1}/'
|
||||
assert_fail 'hf3fs_cli mv ${MOUNT1}/root/`id -un`/subdir ${MOUNT1}/root/`id -un`/subdir'
|
||||
|
||||
# don't support ..
|
||||
assert_fail 'yes | hf3fs_cli rmtree --expire 1h ${MOUNT1}/root/../root/`id -un`/subdir'
|
||||
assert_fail 'yes | hf3fs_cli rmtree --expire 1h ${MOUNT1}/root/`id -un`/subdir2/../subdir'
|
||||
|
||||
hf3fs_cli mv ${MOUNT1}/root/`id -un`/subdir ${MOUNT1}/root/`id -un`/another-dir
|
||||
assert_fail 'hf3fs_cli mv ${MOUNT1}/root/`id -un`/another-dir ${MOUNT1}/root/`id -un`/another-dir/another-dir'
|
||||
mkdir ${MOUNT1}/root/`id -un`/subdir
|
||||
hf3fs_cli mv ${MOUNT1}/root/`id -un`/subdir ${MOUNT1}/root/`id -un`/another-dir
|
||||
check_exists ${MOUNT1}/root/`id -un`/another-dir/subdir
|
||||
mkdir ${MOUNT1}/root/`id -un`/subdir
|
||||
assert_fail 'hf3fs_cli mv ${MOUNT1}/root/`id -un`/subdir ${MOUNT1}/root/`id -un`/another-dir'
|
||||
|
||||
yes | hf3fs_cli rmtree --expire 3hours ${MOUNT1}/root/`id -un`/another-dir
|
||||
mkdir ${MOUNT1}/root/`id -un`/another-dir
|
||||
yes | hf3fs_cli rmtree --expire 3hours ${MOUNT1}/root/`id -un`/another-dir
|
||||
mkdir ${MOUNT1}/root/`id -un`/another-dir
|
||||
yes | hf3fs_cli rmtree --expire 3hours ${MOUNT1}/root/`id -un`/another-dir
|
||||
stat ${MOUNT1}/trash/`id -un`/*/another-dir
|
||||
stat ${MOUNT1}/trash/`id -un`/*/another-dir.*
|
||||
|
||||
#don't allow move into trash
|
||||
mkdir ${MOUNT1}/root/`id -un`/adir
|
||||
assert_fail 'mv ${MOUNT1}/root/`id -un`/adir ${MOUNT1}/trash/`id -un`/'
|
||||
# allow mv between trash
|
||||
mkdir ${MOUNT1}/trash/`id -un`/srctrash
|
||||
mv ${MOUNT1}/trash/`id -un`/srctrash ${MOUNT1}/trash/`id -un`/dsttrash
|
||||
|
||||
# rmtree don't support symlink
|
||||
pushd ${MOUNT1}/root/`id -un`/
|
||||
mkdir -p dir1/subdir
|
||||
ln -s dir1 symlink-to-dir1
|
||||
yes | hf3fs_cli rmtree --expire 3hours symlink-to-dir1
|
||||
check_not_exists symlink-to-dir1
|
||||
check_exists dir1
|
||||
yes | hf3fs_cli rmtree --expire 3hours dir1
|
||||
check_not_exists dir1
|
||||
|
||||
mkdir -p dir-otheruser/subdir
|
||||
sudo chown -R 999:999 dir-otheruser
|
||||
sudo chmod 0777 dir-otheruser
|
||||
assert_fail 'yes | hf3fs_cli rmtree --expire 3hours dir-otheruser'
|
||||
check_exists dir-otheruser
|
||||
popd
|
||||
|
||||
# don't allow cross filesystem link
|
||||
mkdir ${MOUNT1}/root/`id -un`/src
|
||||
assert_fail 'hf3fs_cli mv ${MOUNT1}/root/`id -un`/src ${MOUNT2}/root/`id -un`/dest'
|
||||
hf3fs_cli mv ${MOUNT1}/root/`id -un`/src ${MOUNT1}/root/`id -un`/dest
|
||||
echo ======= 测试完成 ========
|
||||
Reference in New Issue
Block a user