#!/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