86 lines
2.8 KiB
Bash
Executable File
86 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
umask 077
|
|
|
|
readonly TESTS_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=helpers.sh
|
|
source "${TESTS_DIR}/helpers.sh"
|
|
|
|
setup_test_environment
|
|
|
|
begin_test 'sourcing entry point does not execute main'
|
|
source_output=$(bash -c 'source "$1"; printf sourced' _ "${PROJECT_DIR}/wg-manager.sh")
|
|
assert_equal sourced "$source_output" 'безопасная загрузка'
|
|
|
|
begin_test 'help succeeds without root or dependencies'
|
|
set +e
|
|
help_output=$("${PROJECT_DIR}/wg-manager.sh" help 2>&1)
|
|
help_status=$?
|
|
set -e
|
|
assert_success "$help_status" 'команда help'
|
|
assert_contains 'Использование:' "$help_output" 'справка'
|
|
|
|
begin_test 'unknown command fails'
|
|
set +e
|
|
unknown_output=$("${PROJECT_DIR}/wg-manager.sh" unknown 2>&1)
|
|
unknown_status=$?
|
|
set -e
|
|
assert_failure "$unknown_status" 'неизвестная команда'
|
|
assert_contains 'неизвестная команда' "$unknown_output" 'сообщение об ошибке'
|
|
|
|
begin_test 'help works outside project directory'
|
|
set +e
|
|
outside_output=$(cd /tmp && "${PROJECT_DIR}/wg-manager.sh" help 2>&1)
|
|
outside_status=$?
|
|
set -e
|
|
assert_success "$outside_status" 'запуск из /tmp'
|
|
assert_contains 'Использование:' "$outside_output" 'справка из /tmp'
|
|
|
|
begin_test 'mock guard accepts only explicitly supported empty invocation'
|
|
set +e
|
|
MOCK_ALLOW_EMPTY_INVOCATION=wg wg
|
|
expected_mock_status=$?
|
|
wg
|
|
unapproved_empty_status=$?
|
|
wg unexpected
|
|
unexpected_mock_status=$?
|
|
set -e
|
|
assert_success "$expected_mock_status" 'разрешённый вызов мока'
|
|
assert_failure "$unapproved_empty_status" 'неразрешённый пустой вызов мока'
|
|
assert_failure "$unexpected_mock_status" 'неожиданный вызов мока'
|
|
expected_mock_log=$'wg\nwg\nwg unexpected\n'
|
|
actual_mock_log=$(<"$TEST_MOCK_LOG")
|
|
actual_mock_log+=$'\n'
|
|
assert_equal "$expected_mock_log" "$actual_mock_log" 'точный журнал вызовов мока'
|
|
|
|
begin_test 'test writes stay below isolated root'
|
|
assert_file_exists "${TEST_ROOT}/wg0.conf" 'копия фикстуры'
|
|
assert_equal "$TEST_ROOT" "${TEST_MOCK_LOG%/*}" 'журнал находится в тестовом корне'
|
|
|
|
scan_test_sources_for_host_path() {
|
|
local forbidden_path='/etc'
|
|
forbidden_path+='/wireguard'
|
|
|
|
scan_path() {
|
|
local path line
|
|
for path in "$1"/*; do
|
|
if [[ -d "$path" ]]; then
|
|
scan_path "$path"
|
|
elif [[ -f "$path" ]]; then
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
if [[ "$line" == *"$forbidden_path"* ]]; then
|
|
record_failure "тестовый файл содержит запрещённый путь: ${path}"
|
|
return
|
|
fi
|
|
done <"$path"
|
|
fi
|
|
done
|
|
}
|
|
|
|
scan_path "$TESTS_DIR"
|
|
}
|
|
|
|
scan_test_sources_for_host_path
|
|
|
|
finish_tests
|