165 lines
3.7 KiB
Bash
165 lines
3.7 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
########## Competition Block ##########
|
|
|
|
# tc = test compete
|
|
_tc_tmp="${test_dir:-"/tmp"}/tmp_compete"
|
|
|
|
# Each competition link is given to both tools
|
|
# and the output is compared
|
|
#
|
|
# Array format:
|
|
# [0] = Title
|
|
# [1] = path for competition
|
|
# [2] = path for competition
|
|
# ...
|
|
|
|
# Compete test suites (arrays)
|
|
compete_canonicalize=( "Canonicalize invalid path"
|
|
"-v" # Not recommended file naming
|
|
"///tmp//./b"
|
|
#"//tmp//./b/.." # TODO return empty
|
|
#"//tmp//./b/." # TODO return empty
|
|
)
|
|
|
|
compete_all=( "Test - everything starting from /"
|
|
/**/*
|
|
)
|
|
|
|
|
|
tocompete_init() {
|
|
# initialize custom test structure
|
|
{
|
|
tocompete_clean
|
|
mkdir -p "${_tc_tmp}"
|
|
# compete_links
|
|
touch "${_tc_tmp}/a"
|
|
ln -s "${_tc_tmp}/a" "${_tc_tmp}/a 2"
|
|
ln -s "${_tc_tmp}/a 2" "${_tc_tmp}/a 3"
|
|
|
|
# compete_no_permission
|
|
mkdir -p "${_tc_tmp}/noperm"
|
|
chmod 400 "${_tc_tmp}/noperm"
|
|
ln -s "noperm" "${_tc_tmp}/lnoperm"
|
|
ln -s "/" "${_tc_tmp}/lroot"
|
|
|
|
#echo "rl: " && readlink "${_tc_tmp}/lnoperm"
|
|
#ls -l "${_tc_tmp}"
|
|
}
|
|
|
|
# Base directory for the test
|
|
cd "${_tc_tmp}"
|
|
|
|
# Compete test arrays with "dynamic" cases need to be inside the init function
|
|
# e.g. "$(cd ../test && pwd)/file" - base directory must be set first
|
|
# e.g. "${_tc_tmp}/"* - _tc_tmp must be populated first
|
|
compete_links=( "Test - Valid links"
|
|
"${_tc_tmp}/a 3" # slink chain a3 -> a2 -> a
|
|
"${_tc_tmp}/a"*
|
|
"/dev/stdin"
|
|
"/bin/adb"
|
|
"/dev/fd" # Test skip - /dev/fd is different on every call
|
|
"/dev/stdout" # skip - different output
|
|
"/etc/mtab" # skip - Always different
|
|
"/proc/mounts" # skip - Always different
|
|
)
|
|
|
|
compete_no_permission=( "No permission to enter directory (direct and link)"
|
|
"lnoperm"
|
|
"noperm"
|
|
"lroot"
|
|
)
|
|
|
|
# Add tests to global test array from test_rdlink
|
|
tocompete+=(
|
|
compete_no_permission
|
|
compete_links
|
|
compete_canonicalize
|
|
compete_all
|
|
)
|
|
}
|
|
|
|
tocompete_clean() {
|
|
rm -rf "${_tc_tmp}"
|
|
}
|
|
|
|
########## Assertion Block ##########
|
|
|
|
# ta = test assert
|
|
_ta_tmp="${test_dir:-"/tmp"}/tmp_assert"
|
|
|
|
# Assertion string compare test arrays
|
|
#
|
|
# Array format
|
|
# [0] = Title
|
|
# [1] input == [2] expected
|
|
# [3] input == [4] expected
|
|
# ...
|
|
|
|
toassert_init() {
|
|
{
|
|
mkdir -p "${_ta_tmp}"
|
|
}
|
|
|
|
# Base directory for the test
|
|
cd "${_ta_tmp}"
|
|
|
|
# Assert test arrays with "dynamic" cases need to be inside the init function
|
|
# e.g. "$(cd ../test && pwd)/file" - base directory must be set first
|
|
# e.g. "${_tc_tmp}/"* - _tc_tmp must be populated first
|
|
assert_invalid_files=( "Assert - invalid files"
|
|
"${_ta_tmp}/missing_file" "${_ta_tmp}/missing_file"
|
|
"${_ta_tmp}/missd/missf" "${_ta_tmp}/missd/missf"
|
|
"${_ta_tmp}/miss c" "${_ta_tmp}/miss c"
|
|
"rel_a" "${_ta_tmp}/rel_a"
|
|
"../rel_b" "$(cd ".." && pwd)/rel_b"
|
|
)
|
|
|
|
# Add test arrays to global test array from test_rdlink
|
|
toassert+=(
|
|
assert_invalid_files
|
|
)
|
|
}
|
|
|
|
toassert_clean() {
|
|
rm -rf "${_ta_tmp}"
|
|
}
|
|
|
|
########## Common data and functions ##########
|
|
#
|
|
# [0] path to exclude [1] Reason for exclution
|
|
# [2] path to exclude [3] Reason for exclution
|
|
exclude_path=(
|
|
"/dev/fd" "Always different"
|
|
"/dev/stdout" "Always different in pipes"
|
|
"/etc/mtab" "Always different"
|
|
"/proc/mounts" "Always different"
|
|
)
|
|
|
|
toexclude() {
|
|
local path=
|
|
local exclude=
|
|
for path in "${exclude_path[@]}" ; do
|
|
if [[ ! "${exclude}" ]] ; then
|
|
exclude="${path}"
|
|
else
|
|
# return reason for exclution
|
|
if [[ "${exclude}" == "${1:-}" ]] ; then
|
|
printf "${path}"
|
|
return 0
|
|
fi
|
|
exclude=
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
########## Clean custom test data ##########
|
|
#
|
|
totest_cleanall() {
|
|
tocompete_clean
|
|
toassert_clean
|
|
}
|
|
trap totest_cleanall EXIT
|
|
|