From f8fc18e6f03df43b603c96bea6ae0017863de7da Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Wed, 14 Oct 2026 18:11:48 +0500 Subject: test: migrate to test-harness --- .github/workflows/ci.yml | 10 +++- .gitmodules | 3 + test/lib/log.sh | 139 ----------------------------------------------- test/lib/test.sh | 18 +----- test/main.sh | 77 -------------------------- test/runner | 1 + test/tst-mutuals.sh | 2 - test/tst-sessions.sh | 3 +- test/tst-status-once.sh | 2 - test/tst-status.sh | 2 - 10 files changed, 14 insertions(+), 243 deletions(-) create mode 100644 .gitmodules delete mode 100644 test/lib/log.sh delete mode 100755 test/main.sh create mode 160000 test/runner diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40900f6..d935638 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v7 + with: + submodules: recursive - name: Set up Python uses: actions/setup-python@v7 with: @@ -56,7 +58,7 @@ jobs: vk-status --version vk-sessions --version - name: Run tests - run: ./test/main.sh + run: ./test/runner/main.sh test_ubuntu: strategy: @@ -78,8 +80,10 @@ jobs: python3-matplotlib - name: Checkout uses: actions/checkout@v7 + with: + submodules: recursive - name: Run tests - run: ./test/main.sh + run: ./test/runner/main.sh publish_pypi: needs: @@ -91,6 +95,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v7 + with: + submodules: recursive - name: Set up Python uses: actions/setup-python@v7 with: diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..51fedb8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "test/runner"] + path = test/runner + url = https://github.com/egor-tensin/test-harness.git diff --git a/test/lib/log.sh b/test/lib/log.sh deleted file mode 100644 index 48a34cc..0000000 --- a/test/lib/log.sh +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright (c) 2026 Egor Tensin -# This file is part of the "VK scripts" project. -# For details, see https://github.com/egor-tensin/vk-scripts -# Distributed under the MIT License. - -log() { - local msg - for msg; do - echo -e "$test_file | $msg" >&2 - done -} - -log_run() { - if [ "$#" -lt 1 ]; then - log "usage: ${FUNCNAME[0]} ARGV0 [ARG...]" - return 1 - fi - - local msg='Running:' - msg="$msg$( printf -- ' %q' "$@" )" - log "$msg" -} - -fail() { - local msg - for msg; do - log "FAIL: $msg" - done -} - -fail_details() { - local msg - for msg; do - fail " $msg" - done -} - -log_numof_tests_ok=0 -log_numof_tests_failed=0 -declare -a log_tests_failed=() -declare -A log_tests_should_fail=() - -log_test_start() { - if [ "$#" -ne 1 ]; then - echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2 - return 1 - fi - - local test_file="$1" - - if [ -n "${test_should_fail:-}" ]; then - log_tests_should_fail["$test_file"]=1 - fi - - cat <&2 - -====================================================================== -TEST: $test_file -====================================================================== -EOF - - log "Should fail: ${test_should_fail:-No}" -} - -log_test_ok() { - if [ "$#" -ne 1 ]; then - echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2 - return 1 - fi - - log_numof_tests_ok=$((log_numof_tests_ok + 1)) - - cat <&2 ----------------------------------------------------------------------- -OK: $1 ----------------------------------------------------------------------- -EOF -} - -log_test_fail() { - if [ "$#" -ne 1 ]; then - echo "usage: ${FUNCNAME[0]} TEST_FILE" >&2 - return 1 - fi - - log_numof_tests_failed=$((log_numof_tests_failed + 1)) - log_tests_failed+=("$1") - - cat <&2 ----------------------------------------------------------------------- -FAIL: $1 ----------------------------------------------------------------------- -EOF -} - -log_test_finish() { - if [ "$#" -ne 2 ]; then - echo "usage: ${FUNCNAME[0]} TEST_FILE EXIT_CODE" >&2 - return 1 - fi - - local test_file="$1" - local ret="$2" - local test_should_fail - test_should_fail="${log_tests_should_fail["$test_file"]:+x}" - - if [ "$ret" -eq 0 ] || [ -n "$test_should_fail" ]; then - log_test_ok "$test_file" - else - log_test_fail "$test_file" - fi -} - -log_tests_summary() { - cat <&2 - -====================================================================== -SUMMARY -====================================================================== -OK: $log_numof_tests_ok -FAIL: $log_numof_tests_failed -EOF - - local test_file - for test_file in ${log_tests_failed[@]+"${log_tests_failed[@]}"}; do - cat <&2 -FAIL: $test_file -EOF - done - - cat <&2 ----------------------------------------------------------------------- -EOF - - local ret=0 - [ "$log_numof_tests_failed" -gt 0 ] && ret=1 - - return "$ret" -} diff --git a/test/lib/test.sh b/test/lib/test.sh index 4b43562..88e8800 100644 --- a/test/lib/test.sh +++ b/test/lib/test.sh @@ -3,24 +3,8 @@ # For details, see https://github.com/egor-tensin/vk-scripts # Distributed under the MIT License. -test_should_fail= -test_root_dir= - -test_setup() { - test_root_dir="$( mktemp -d )" - - log "Root directory: $test_root_dir" -} - -test_cleanup_default() { - if [ -n "$test_root_dir" ]; then - log "Removing test's root directory: $test_root_dir" - rm -rf -- "$test_root_dir" - fi -} - test_run_module() { local cmd=(python3 -m "$@") log_run "${cmd[@]}" - PYTHONPATH="$script_dir/.." "${cmd[@]}" + PYTHONPATH="$tests_dir/.." "${cmd[@]}" } diff --git a/test/main.sh b/test/main.sh deleted file mode 100755 index 07889ac..0000000 --- a/test/main.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2026 Egor Tensin -# This file is part of the "VK scripts" project. -# For details, see https://github.com/egor-tensin/vk-scripts -# Distributed under the MIT License. - -set -o errexit -o nounset -o pipefail -shopt -s inherit_errexit lastpipe - -script_dir="$( dirname -- "${BASH_SOURCE[0]}" )" -script_dir="$( cd -- "$script_dir" && pwd )" -readonly script_dir -script_name="$( basename -- "${BASH_SOURCE[0]}" )" -readonly script_name - -source "$script_dir/lib/log.sh" - -run_test_file() { - local test_file - for test_file; do - source "$script_dir/lib/test.sh" - source "$script_dir/$test_file" - - log_test_start "$test_file" - - set +e - ( - set -o errexit -o nounset -o pipefail - shopt -s inherit_errexit lastpipe - - if [ "$( type -t test_cleanup )" == function ]; then - trap test_cleanup EXIT - else - trap test_cleanup_default EXIT - fi - - test_run - ) - local ret="$?" - set -e - - log_test_finish "$test_file" "$ret" - done -} - -main() { - if [ "$#" -gt 1 ]; then - echo "usage: $script_name [PATTERN]" >&2 - return 1 - fi - - local -a test_files=() - local test_file - - local pattern='*' - [ "$#" -gt 0 ] && pattern="$1" - - find "$script_dir" \ - -mindepth 1 \ - -maxdepth 1 \ - -type f \ - -regex '.*/tst-.*\.sh$' \ - -regextype posix-basic \ - -name "$pattern" \ - -printf '%P\0' \ - | sort -z \ - | \ - while IFS= read -d '' -r test_file; do - test_files+=("$test_file") - done - - run_test_file ${test_files[@]+"${test_files[@]}"} - log_tests_summary -} - -main "$@" diff --git a/test/runner b/test/runner new file mode 160000 index 0000000..1076ff1 --- /dev/null +++ b/test/runner @@ -0,0 +1 @@ +Subproject commit 1076ff1e8cf55b26997fbb20931b5e8903d91041 diff --git a/test/tst-mutuals.sh b/test/tst-mutuals.sh index 3f40780..7896036 100644 --- a/test/tst-mutuals.sh +++ b/test/tst-mutuals.sh @@ -1,6 +1,4 @@ test_run() { - test_setup - local users=(kreed58 korya_mc) test_run_module vk.mutuals --format csv "${users[@]}" > "$test_root_dir/mutuals.csv" diff --git a/test/tst-sessions.sh b/test/tst-sessions.sh index db4165d..eb73a26 100644 --- a/test/tst-sessions.sh +++ b/test/tst-sessions.sh @@ -1,4 +1,4 @@ -test_db_path="$script_dir/data/test_db.csv" +test_db_path="$tests_dir/data/test_db.csv" readonly test_db_path _test_format() { @@ -38,6 +38,5 @@ _test_main() { } test_run() { - test_setup _test_main } diff --git a/test/tst-status-once.sh b/test/tst-status-once.sh index 1623d25..5083599 100644 --- a/test/tst-status-once.sh +++ b/test/tst-status-once.sh @@ -1,6 +1,4 @@ test_run() { - test_setup - local users=(egor.tensin kreed58) local db_path db_path="$test_root_dir/db.csv" diff --git a/test/tst-status.sh b/test/tst-status.sh index e967ae5..2f38285 100644 --- a/test/tst-status.sh +++ b/test/tst-status.sh @@ -1,6 +1,4 @@ test_run() { - test_setup - local users=(egor.tensin) local log_path -- cgit v1.3