diff options
Diffstat (limited to 'integration-tests/lib.sh')
-rw-r--r-- | integration-tests/lib.sh | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/integration-tests/lib.sh b/integration-tests/lib.sh new file mode 100644 index 000000000..1e4ce1c37 --- /dev/null +++ b/integration-tests/lib.sh @@ -0,0 +1,185 @@ +GREEN="\e[0;32m" +YELLOW="\e[0;33m" +RED="\e[0;31m" +END="\e[0m" + +# patch_file_location +# +# Patch the location of a file in a file:// path. +# +# Args: +# bst ($1) - The bst file to patch. +# file ($2) - The file path to change to. +# +patch_file_location() { + local bst="$1" + local file="$2" + + sed -i "s|file://.*$|file://$file|" "$bst" +} + +# check_permissions +# +# Compare the user execute permissions between two files. +# +# Args: +# source ($1) - The first file +# target ($2) - The second file +# +# Returns: +# 1 if the permissions mismatch +# +check_permissions () { + local source="$1" + local target="$2" + local file_perm1 + local file_perm2 + + # This only checks executable permissions since git will not + # persist local permissions. + file_perm1=$(stat -c '%A' "$source" | sed 's/...\(.\).\+/\1/') + file_perm2=$(stat -c '%A' "$target" | sed 's/...\(.\).\+/\1/') + + if [ "$file_perm1" != "$file_perm2" ] + then + printf "Error: File permissions differ for files %s (%s) and %s (%s)" \ + "$source" "$(stat -c '%A' "$source")" \ + "$target" "$(stat -c '%A' "$target")\n" + return 1 + fi + return 0 +} + +# ensure_equal +# +# Recursively test for differences in content or permissions between +# the given directories. +# +# Args: +# src ($1) - The first directory +# target ($2) - The second directory +# +# Returns: +# 0 (bash true) if the files in the directories match, otherwise 1 +# if they mismatch +# +ensure_equal () ( + set +e + + local src="$1" + local target="$2" + + local target_file + local target_files + local source_file + + # Check for file differences + diff -r "$src" "$target" + if [ $? -ne 0 ] + then + echo "Error: Unexpected or missing file in '$src'" + return 1 + fi + + # Check for permission differences + target_files=$(find "$target") + for target_file in $target_files + do + source_file="$src${target_file#$target}" + + check_permissions "$source_file" "$target_file" + if [ $? -ne 0 ] + then + echo "Error: File permissions differ for files '$source_file' and '$target_file'" + return 1 + fi + done + + return 0 +) + +# bst_with_flags +# +# Call bst with the flags defined by the main script. +# +bst_with_flags() { + if [ ! -z "${BST_COVERAGE}" ]; then + coverage run --parallel-mode \ + --rcfile=${BST_COVERAGE} \ + $(which bst) -c "${CONFIG_LOCATION}" ${BST_FLAGS:-} "$@" + else + bst -c "${CONFIG_LOCATION}" ${BST_FLAGS:-} "$@" + fi +} + +# report_results +# +# Args: +# test_name ($1) - The name of the test +# success ($2) - A bash truthy integer (0 is True, non 0 is False) +report_results() { + test_name=$1 + success=$2 + + if [ "$success" -eq 0 ]; then + echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + printf "%-34s ${GREEN}%9s${END}\n" "$test_name" "succeeded" + echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + else + echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + printf "%-34s ${RED}%9s${END}\n" "$test_name" "failed" + echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + fi +} + +# compare_results +# +# Compare results to expected files, reporting success/failure for +# each test. +# +# Args: +# test_name ($1) - The name of the test, for error reporting +# result_dir ($2) - The directory containing result files +# expected_dir ($3) - The directory containing expected files +# +# Returns: +# 0 if the files are equal, 1 otherwise. +# +compare_results() ( + set +e + + local test_name="$1" + local result_dir="$2" + local expected_dir="$3" + + ensure_equal "$result_dir/$test_name" "$expected_dir/$test_name" + + local success=$? + report_results $test_name $success + return $success +) + +# comare_results_no_contents +# +# Compare results to expected files, ignoring the contents of the files, +# reporting success/failure for each test. +# +# Args: +# test_name ($1) - The name of the test, for error reporting +# result_dir ($2) - The directory containing result files +# expected_dir ($3) - The directory containing expected files +# +# Returns: +# 1 if the dirs are equivalent, 0 otherwise. +compare_results_no_contents() ( + set +e + + local test_name="$1" + local result_dir="$2" + local expected_dir="$3" + + diff <(cd $result_dir/$test_name && find . | sort) <(cd $expected_dir/$test_name && find . | sort) + local success=$? + report_results $test_name $success + return $success +) |