108 lines
2.8 KiB
Bash
Executable File
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
|
|
}
|