Files
wireguard-scripts/tests/helpers.sh
T

108 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
HELPERS_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
readonly HELPERS_DIR
PROJECT_DIR="$(cd -- "${HELPERS_DIR}/.." && pwd)"
readonly PROJECT_DIR
TEST_ROOT=''
TEST_MOCK_LOG=''
TEST_FAILURES=0
TEST_ASSERTIONS=0
setup_test_environment() {
TEST_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/wg-manager-tests.XXXXXX")"
TEST_MOCK_LOG="${TEST_ROOT}/mock-invocations.log"
: >"$TEST_MOCK_LOG"
chmod 700 "$TEST_ROOT"
cp -- "${PROJECT_DIR}/tests/fixtures/wg0.conf" "${TEST_ROOT}/wg0.conf"
export TEST_ROOT TEST_MOCK_LOG
export PATH="${PROJECT_DIR}/tests/mocks/bin:${PATH:-}"
trap cleanup_test_environment EXIT INT TERM
}
cleanup_test_environment() {
local status=$?
trap - EXIT INT TERM
if [[ -n "$TEST_ROOT" && -d "$TEST_ROOT" ]]; then
rm -rf -- "$TEST_ROOT"
fi
return "$status"
}
begin_test() {
printf 'TEST %s\n' "$1"
}
record_failure() {
printf ' FAIL: %s\n' "$1" >&2
((TEST_FAILURES += 1))
}
assert_equal() {
local expected=$1 actual=$2 message=${3:-значения равны}
((TEST_ASSERTIONS += 1))
if [[ "$expected" != "$actual" ]]; then
record_failure "${message}: ожидалось [${expected}], получено [${actual}]"
fi
}
assert_status() {
local expected=$1 actual=$2 message=${3:-код завершения}
assert_equal "$expected" "$actual" "$message"
}
assert_contains() {
local needle=$1 haystack=$2 message=${3:-строка содержит ожидаемый текст}
((TEST_ASSERTIONS += 1))
if [[ "$haystack" != *"$needle"* ]]; then
record_failure "${message}: не найдено [${needle}]"
fi
}
assert_file_exists() {
local path=$1 message=${2:-файл существует}
((TEST_ASSERTIONS += 1))
if [[ ! -e "$path" ]]; then
record_failure "${message}: отсутствует [${path}]"
fi
}
assert_file_absent() {
local path=$1 message=${2:-файл отсутствует}
((TEST_ASSERTIONS += 1))
if [[ -e "$path" ]]; then
record_failure "${message}: найден [${path}]"
fi
}
assert_file_mode() {
local expected=$1 path=$2 actual message
actual=$(stat -c '%a' -- "$path")
message=${3:-режим файла}
assert_equal "$expected" "$actual" "$message"
}
assert_success() {
local status=$1 message=${2:-команда успешна}
assert_status 0 "$status" "$message"
}
assert_failure() {
local status=$1 message=${2:-команда завершилась с ошибкой}
((TEST_ASSERTIONS += 1))
if (( status == 0 )); then
record_failure "$message: ожидался ненулевой код"
fi
}
finish_tests() {
if (( TEST_FAILURES == 0 )); then
printf 'PASS: %d проверок\n' "$TEST_ASSERTIONS"
return 0
fi
printf 'FAIL: %d ошибок из %d проверок\n' "$TEST_FAILURES" "$TEST_ASSERTIONS" >&2
return 1
}