ci: remove the testlib and gitlab-ci boilerplate associated with it
We no longer need it, since things running CI directly in pmaports are now using the packaged version of testlib and abuild check Signed-off-by: Pablo Correa Gómez <pabloyoyoista@postmarketos.org> Part-of: <https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/9349>
This commit is contained in:
@@ -1,283 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Unit testing framework for shell scripts
|
||||
# Invoke with the path to a tests/ subdir of a package and the
|
||||
# package name as arguments. Or source it with the following
|
||||
# variables set:
|
||||
# * results_dir - second argument to the test script
|
||||
|
||||
set -e
|
||||
|
||||
# Colors :D
|
||||
RED="\e[31m"
|
||||
GREEN="\e[32m"
|
||||
YELLOW="\e[33m"
|
||||
BLUE="\e[34m"
|
||||
BOLDBLUE="\e[1;34m"
|
||||
RESET="\e[0m"
|
||||
|
||||
testlib_path="$(realpath "$0")"
|
||||
|
||||
_test_assert_failed=""
|
||||
_test_testn=1
|
||||
_test_passedn=0
|
||||
_test_failedn=0
|
||||
_test_current_test=""
|
||||
_test_statefile="$(mktemp)"
|
||||
_test_original_pwd=""
|
||||
_test_temp_root=""
|
||||
# Set by each test
|
||||
results_dir="${results_dir:-}"
|
||||
|
||||
test_log() {
|
||||
# ash supports echo -e
|
||||
# shellcheck disable=SC3037
|
||||
echo -e "$*" >&2
|
||||
}
|
||||
|
||||
test_info() {
|
||||
# shellcheck disable=SC3037
|
||||
echo -e "${BLUE}$*${RESET}" >&2
|
||||
}
|
||||
|
||||
test_debug() {
|
||||
# shellcheck disable=SC3037
|
||||
echo -e "${YELLOW}$*${RESET}" >&2
|
||||
}
|
||||
|
||||
create_test_root() {
|
||||
_test_original_pwd="$(pwd)"
|
||||
_test_temp_root="$(mktemp -d)"
|
||||
cd "$_test_temp_root"
|
||||
}
|
||||
|
||||
cleanup_test_root() {
|
||||
if [ -n "$_test_original_pwd" ]; then
|
||||
cd "$_test_original_pwd"
|
||||
fi
|
||||
if [ -n "$_test_temp_root" ] && [ -d "$_test_temp_root" ]; then
|
||||
rm -rf "$_test_temp_root"
|
||||
fi
|
||||
_test_original_pwd=""
|
||||
_test_temp_root=""
|
||||
}
|
||||
|
||||
assert_strequal() {
|
||||
# $1: first string
|
||||
# $2: second string
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
test_log "ERROR: assert_equal: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
if [ "$1" != "$2" ]; then
|
||||
_test_assert_failed="$1 != $2"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
fi
|
||||
test_log " ✅ $1 == $2"
|
||||
}
|
||||
|
||||
assert_equal() {
|
||||
# $1: name of variable
|
||||
# $2: value to compare
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
test_log "ERROR: assert_equal: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
val="$(eval echo "\$$1")"
|
||||
if [ "$val" != "$2" ]; then
|
||||
_test_assert_failed="\$$1 != $2 (got $val)"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
fi
|
||||
test_log " ✅ \$$1 == $2"
|
||||
}
|
||||
|
||||
assert_unset() {
|
||||
if [ -z "$1" ]; then
|
||||
test_log "ERROR: assert_unset: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
val="$(eval echo \$"$1")"
|
||||
if [ -n "$val" ]; then
|
||||
_test_assert_failed="\$$1 should be unset (has value '$val')"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
fi
|
||||
test_log " ✅ \$$1 is unset"
|
||||
}
|
||||
|
||||
assert_exists() {
|
||||
# $1: filename to test
|
||||
if [ -z "$1" ]; then
|
||||
test_log "ERROR: assert_exists: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
if ! [ -e "$1" ]; then
|
||||
_test_assert_failed="\$$1 should exist but does not"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
fi
|
||||
test_log " ✅ \$$1 exists"
|
||||
}
|
||||
|
||||
assert_not_exists() {
|
||||
if [ -z "$1" ]; then
|
||||
test_log "ERROR: assert_not_exists: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
if [ -e "$1" ]; then
|
||||
_test_assert_failed="\$$1 should NOT exist but does"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
fi
|
||||
test_log " ✅ \$$1 does not exist"
|
||||
}
|
||||
|
||||
assert_contains() {
|
||||
# $1: string to search in
|
||||
# $2: substring to find
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
test_log "ERROR: assert_contains: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
case "$1" in
|
||||
*"$2"*)
|
||||
test_log " ✅ '$2' found in '$1'"
|
||||
;;
|
||||
*)
|
||||
_test_assert_failed="'$2' not found in '$1'"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
assert_not_contains() {
|
||||
# $1: string to search in
|
||||
# $2: substring that should not be found
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
test_log "ERROR: assert_not_contains: not enough arguments given"
|
||||
exit 1
|
||||
fi
|
||||
case "$1" in
|
||||
*"$2"*)
|
||||
_test_assert_failed="'$2' found in '$1' but should not be"
|
||||
test_log " ❌ $_test_assert_failed"
|
||||
return
|
||||
;;
|
||||
*)
|
||||
test_log " ✅ '$2' not found in '$1'"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Log some expression and evaluate it
|
||||
logeval() {
|
||||
eval "$*"
|
||||
test_log "${YELLOW}+ $*${RESET}"
|
||||
}
|
||||
|
||||
# Start a test. Shell scripts involved in the test should be sourced AFTER calling this function!
|
||||
start_test() {
|
||||
if [ -n "$_test_current_test" ]; then
|
||||
test_log "ERROR: multiple calls to start_test without calling end_test first!"
|
||||
test_log "Current test: $_test_current_test"
|
||||
exit 1
|
||||
fi
|
||||
test_log "==> Test $_test_testn: $1"
|
||||
_test_current_test="$1"
|
||||
set > "$_test_statefile"
|
||||
}
|
||||
|
||||
# End a test and reset the environment.
|
||||
end_test() {
|
||||
local msg
|
||||
local save_assert_failed
|
||||
|
||||
# Restore environment
|
||||
save_assert_failed="$_test_assert_failed"
|
||||
|
||||
# Splitting is intentional
|
||||
# shellcheck disable=SC2046
|
||||
unset $(set | grep "='" | cut -d= -f1 | grep -vE "(PATH|IFS|TERM|LANG|HOME|PWD|SHELL|USER|save_assert_failed|_test_statefile)" )
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
. "$_test_statefile"
|
||||
_test_assert_failed="$save_assert_failed"
|
||||
|
||||
if [ -n "$_test_assert_failed" ]; then
|
||||
msg="${RED}Failed! ❌ ${_test_assert_failed}${RESET}"
|
||||
echo "Test $_test_testn: $_test_assert_failed" >> "$results_dir/failed"
|
||||
_test_failedn=$((_test_failedn+1))
|
||||
echo "$_test_failedn" > "$results_dir/failedn"
|
||||
unset _test_assert_failed
|
||||
else
|
||||
msg="${GREEN}Passed!${RESET}"
|
||||
_test_passedn=$((_test_passedn+1))
|
||||
echo "$_test_passedn" > "$results_dir/passedn"
|
||||
fi
|
||||
test_log "<== Test $_test_testn: $msg $_test_current_test\n"
|
||||
_test_testn=$((_test_testn+1))
|
||||
_test_current_test=""
|
||||
}
|
||||
|
||||
# Call at the end of each testsuite shell script
|
||||
end_testsuite() {
|
||||
if [ -n "$_test_current_test" ]; then
|
||||
test_log "${RED}ERROR: end_testsuite called without calling end_test first!${RESET}"
|
||||
test_log "${RED}Current test: $_test_current_test${RESET}"
|
||||
exit 1
|
||||
fi
|
||||
if [ -f "$results_dir/failed" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
run_tests() {
|
||||
local failed test_results_base
|
||||
local test name total passedn failedn t_passed t_failed
|
||||
|
||||
test_results_base="$(mktemp -d)"
|
||||
test_log "Running tests for $2"
|
||||
|
||||
# FIXME: yeah this isn't quite the best way to iterate the files
|
||||
# shellcheck disable=SC2010
|
||||
for name in $(ls "$1" | grep "\.sh$"); do
|
||||
test="$1/$name"
|
||||
mkdir "$test_results_base/$name"
|
||||
echo 0 > "$test_results_base/$name/passedn"
|
||||
echo 0 > "$test_results_base/$name/failedn"
|
||||
test_log
|
||||
test_log "${BOLDBLUE}# Test suite ${name}${RESET}"
|
||||
$test "$testlib_path" "$test_results_base/$name" || failed="$failed $name"
|
||||
t_passed=$(cat "$test_results_base/$name/passedn")
|
||||
t_failed=$(cat "$test_results_base/$name/failedn")
|
||||
passedn=$((passedn+t_passed))
|
||||
failedn=$((failedn+t_failed))
|
||||
total=$((total+t_passed+t_failed))
|
||||
done
|
||||
if [ -n "$failed" ]; then
|
||||
test_log
|
||||
test_log "Some tests failed:"
|
||||
for test in $failed; do
|
||||
test_log "❌ $test"
|
||||
test_log " ${RED}$(cat "$test_results_base/$test/failed")${RESET}"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $passedn -lt $total ]; then
|
||||
test_log "[${RED}$passedn/$total tests passed${RESET}]"
|
||||
else
|
||||
test_log "[${GREEN}$passedn/$total tests passed!${RESET}]"
|
||||
fi
|
||||
test_log
|
||||
|
||||
if [ -n "$failed" ]; then exit 1; else exit 0; fi
|
||||
}
|
||||
|
||||
# FIXME: probably not the best way to determine if this was sourced
|
||||
if [ $# -gt 0 ]; then
|
||||
run_tests "$1" "$2"
|
||||
fi
|
||||
@@ -1,19 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Description: run unit-tests for packages
|
||||
# https://postmarketos.org/pmb-ci
|
||||
#
|
||||
# This script only exists to allow running unit-tests locally.
|
||||
# In actual CI the package tests/ subdir has it's own YAML
|
||||
# fine defining a job which calls testlib for that package.
|
||||
# This way we can run all the package unit-tests locally but
|
||||
# have them be individual jobs in GitLab.
|
||||
|
||||
if [ "$(id -u)" = 0 ]; then
|
||||
set -x
|
||||
exec su "${TESTUSER:-build}" -c "sh -e $0"
|
||||
fi
|
||||
|
||||
find . -type d -name "tests" | while read -r testdir; do
|
||||
pkg="$(basename "$(dirname "$testdir")")"
|
||||
.ci/lib/testlib.sh "$testdir" "$pkg"
|
||||
done
|
||||
+1
-3
@@ -30,9 +30,7 @@ workflow:
|
||||
# Run scheduled pipeline for autoupdate or manually triggered pipeline
|
||||
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"
|
||||
|
||||
# Some packages have their own yaml files defining tests. All of these should contain
|
||||
# only jobs which extend the .package-test job!
|
||||
include: "**/.gitlab-ci.yml"
|
||||
include: "cross/.gitlab-ci.yml"
|
||||
|
||||
# device documentation
|
||||
wiki:
|
||||
|
||||
Reference in New Issue
Block a user