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