The Python-based test infrastructure (pytest, tox, testinfra) is replaced with BATS (Bash Automated Testing System), matching the approach already used in FTL Changes: - Add test/run.sh — single entry point replacing all 15 tox.*.ini files; accepts DISTRO env var, builds the test image, installs BATS on demand, and selects test files based on distro family (debian/alpine/rhel) - Add test/helpers/mocks.bash — bash equivalents of conftest.py's mock_command*, mock_command_2, and mock_command_passthrough helpers; uses base64 transfer to write mock scripts into containers safely - Add test/test_automated_install.bats — replaces test_any_automated_install.py - Add test/test_utils.bats — replaces test_any_utils.py - Add test/test_selinux.bats — replaces test_centos_fedora_common_support.py; only run on CentOS/Fedora (rhel family) - Remove conftest.py, requirements.txt, setup.py, __init__.py - Remove all 15 tox.*.ini files - Remove all three Python test files - Update .github/workflows/test.yml: drop Python setup, tox invocation, and black formatting check; distro-test job now runs bash test/run.sh - Update .gitignore: remove Python-specific entries, add test/libs/ Signed-off-by: PromoFaux <PromoFaux@users.noreply.github.com> Signed-off-by: Adam Warner <me@adamwarner.co.uk>
107 lines
3.5 KiB
Bash
Executable File
107 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Mock command helpers for BATS tests.
|
|
#
|
|
# These are the BATS equivalents of the mock_command* functions in conftest.py.
|
|
# Each function writes a bash case-statement script to /usr/local/bin/<name>
|
|
# inside the container, allowing tests to intercept command invocations.
|
|
#
|
|
# Usage:
|
|
# mock_command CONTAINER SCRIPT ARG1 OUTPUT1 RC1 [ARG2 OUTPUT2 RC2 ...]
|
|
# mock_command_2 CONTAINER SCRIPT ARG1 OUTPUT1 RC1 [ARG2 OUTPUT2 RC2 ...]
|
|
# mock_command_passthrough CONTAINER SCRIPT ARG1 OUTPUT1 RC1 [...]
|
|
#
|
|
# mock_command: matches on $1 (first argument); unquoted case pattern
|
|
# mock_command_2: matches on "$1 $2" (first two args joined); quoted pattern
|
|
# mock_command_passthrough: like mock_command but falls through to real binary
|
|
#
|
|
# Use '*' as ARG for a catch-all case (only works in mock_command and
|
|
# mock_command_passthrough; in mock_command_2 it matches the literal string '*').
|
|
#
|
|
# Content is transferred to the container via base64 to avoid quoting issues.
|
|
|
|
_write_mock_to_container() {
|
|
local container="$1" script_name="$2" script_content="$3"
|
|
# base64 alphabet is [A-Za-z0-9+/=] — safe to single-quote in the shell
|
|
local encoded
|
|
encoded=$(printf '%s' "$script_content" | base64 | tr -d '\n')
|
|
docker exec "$container" bash -c \
|
|
"printf '%s' '${encoded}' | base64 -d > /usr/local/bin/${script_name} && chmod +x /usr/local/bin/${script_name} && rm -f /var/log/${script_name}"
|
|
}
|
|
|
|
# mock_command — matches on $1
|
|
mock_command() {
|
|
local container="$1" script_name="$2"
|
|
shift 2
|
|
|
|
local script
|
|
script='#!/bin/bash -e'$'\n'
|
|
script+="echo \"\$0 \$@\" >> /var/log/${script_name}"$'\n'
|
|
script+='case "$1" in'$'\n'
|
|
|
|
while (( $# >= 3 )); do
|
|
local arg="$1" output="$2" rc="$3"
|
|
shift 3
|
|
script+=" ${arg})"$'\n'
|
|
script+=" echo ${output}"$'\n'
|
|
script+=" exit ${rc}"$'\n'
|
|
script+=" ;;"$'\n'
|
|
done
|
|
script+='esac'$'\n'
|
|
|
|
_write_mock_to_container "$container" "$script_name" "$script"
|
|
}
|
|
|
|
# mock_command_2 — matches on "$1 $2" (quoted pattern, quoted echo output)
|
|
mock_command_2() {
|
|
local container="$1" script_name="$2"
|
|
shift 2
|
|
|
|
local script
|
|
script='#!/bin/bash -e'$'\n'
|
|
script+="echo \"\$0 \$@\" >> /var/log/${script_name}"$'\n'
|
|
script+='case "$1 $2" in'$'\n'
|
|
|
|
while (( $# >= 3 )); do
|
|
local arg="$1" output="$2" rc="$3"
|
|
shift 3
|
|
script+=" \"${arg}\")"$'\n'
|
|
script+=" echo \"${output}\""$'\n'
|
|
script+=" exit ${rc}"$'\n'
|
|
script+=" ;;"$'\n'
|
|
done
|
|
script+='esac'$'\n'
|
|
|
|
_write_mock_to_container "$container" "$script_name" "$script"
|
|
}
|
|
|
|
# mock_command_passthrough — matches on $1; falls through to real binary for
|
|
# unmatched arguments
|
|
mock_command_passthrough() {
|
|
local container="$1" script_name="$2"
|
|
shift 2
|
|
|
|
# Find the real binary path before we shadow it
|
|
local orig_path
|
|
orig_path=$(docker exec "$container" bash -c "command -v ${script_name}")
|
|
|
|
local script
|
|
script='#!/bin/bash -e'$'\n'
|
|
script+="echo \"\$0 \$@\" >> /var/log/${script_name}"$'\n'
|
|
script+='case "$1" in'$'\n'
|
|
|
|
while (( $# >= 3 )); do
|
|
local arg="$1" output="$2" rc="$3"
|
|
shift 3
|
|
script+=" ${arg})"$'\n'
|
|
script+=" echo ${output}"$'\n'
|
|
script+=" exit ${rc}"$'\n'
|
|
script+=" ;;"$'\n'
|
|
done
|
|
script+=' *)'$'\n'
|
|
script+=" ${orig_path} \"\$@\""$'\n'
|
|
script+=' ;;'$'\n'
|
|
script+='esac'$'\n'
|
|
|
|
_write_mock_to_container "$container" "$script_name" "$script"
|
|
}
|