summaryrefslogtreecommitdiffstatshomepage
path: root/test/lib
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-10-04 21:41:24 +0500
committerEgor Tensin <egor@tensin.name>2026-10-04 21:41:24 +0500
commit57109eace4733153d4897cce42e44520f4efffae (patch)
treea220463377c288cad059fc587078b08a1e7d7f63 /test/lib
parentdebian: ditch Vagrant, switch to Docker (diff)
parentworkflows/ci: minor formatting fixes (diff)
downloadlinux-status-57109eace4733153d4897cce42e44520f4efffae.tar.gz
linux-status-57109eace4733153d4897cce42e44520f4efffae.zip
Merge tag 'v2.4.13' into debian
v2.4.13
Diffstat (limited to 'test/lib')
-rw-r--r--test/lib/log.sh139
-rw-r--r--test/lib/test.sh62
2 files changed, 201 insertions, 0 deletions
diff --git a/test/lib/log.sh b/test/lib/log.sh
new file mode 100644
index 0000000..35b7a2d
--- /dev/null
+++ b/test/lib/log.sh
@@ -0,0 +1,139 @@
+# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
+# This file is part of the "linux-status" project.
+# For details, see https://github.com/egor-tensin/linux-status
+# 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 <<EOF >&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 <<EOF >&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 <<EOF >&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 <<EOF >&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 <<EOF >&2
+FAIL: $test_file
+EOF
+ done
+
+ cat <<EOF >&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
new file mode 100644
index 0000000..ee35b05
--- /dev/null
+++ b/test/lib/test.sh
@@ -0,0 +1,62 @@
+# Copyright (c) 2026 Egor Tensin <egor@tensin.name>
+# This file is part of the "linux-status" project.
+# For details, see https://github.com/egor-tensin/linux-status
+# Distributed under the MIT License.
+
+test_should_fail=
+test_root_dir=
+
+test_server_port=35605
+test_server_pid=
+
+_test_run_server() {
+ log "Starting up server..."
+ log_run "$script_dir/../src/server.py" --port "$test_server_port"
+ "$script_dir/../src/server.py" --port "$test_server_port" >&2 &
+ test_server_pid="$!"
+ log "Server's PID: $test_server_pid"
+ sleep 5
+}
+
+_test_kill_server() {
+ if [ -n "$test_server_pid" ]; then
+ log "Stopping server: $test_server_pid"
+ kill "$test_server_pid"
+ log "Waiting for it to terminate..."
+ wait "$test_server_pid" || true
+ fi
+}
+
+test_setup() {
+ test_root_dir="$( mktemp -d )"
+ _test_run_server
+}
+
+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_kill_server
+}
+
+test_check_output() {
+ if [ "$#" -lt 1 ]; then
+ log "usage: ${FUNCNAME[0]} PATH [KEYWORD...]"
+ return 1
+ fi
+
+ local path="$1"
+ shift
+
+ local keyword
+ for keyword; do
+ if ! grep --fixed-strings --quiet -- "$keyword" "$path"; then
+ fail "The following pattern hasn't been found in $path:"
+ fail_details "$keyword"
+ log "Output:"
+ cat -- "$path" >&2
+ return 1
+ fi
+ done
+}