diff options
Diffstat (limited to '')
-rwxr-xr-x | test/run-integration-tests.sh | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/test/run-integration-tests.sh b/test/run-integration-tests.sh new file mode 100755 index 0000000..2a2b075 --- /dev/null +++ b/test/run-integration-tests.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +set -e + +if [ "$NO_BUILD" ]; then + BUILD_DIR="" +elif BUILD_DIR="$("$(dirname "$0")/../tools/find-build-dir.sh")"; then + ninja -C "$BUILD_DIR" +else + echo "No build found, please set BUILD_DIR or NO_BUILD" >&2 + exit 1 +fi + +if [ $# -gt 0 ]; then + args="$*" +else + args="setup run clean-again" +fi + +VALID_TARGETS="all setup run clean clean-again" + +is_valid_target() { + for target in $VALID_TARGETS; do + [ "$1" = "$target" ] && return 0 + done + return 1 +} + +# reject invalid make targets in $args +for arg in $args; do + if ! is_valid_target "$arg"; then + echo "Invalid target: $arg" >&2 + exit 1 + fi +done + +CLEAN=0 +CLEANAGAIN=0 + +# separate 'clean' and 'clean-again' operations +[[ "$args" =~ "clean-again" ]] && CLEANAGAIN=1 +args=${args/clean-again} +[[ "$args" =~ "clean" ]] && CLEAN=1 +args=${args/clean} + +declare -A results +declare -A times + +COUNT=0 +FAILURES=0 + +cd "$(dirname "$0")" + +pass_deny_list() { + for marker in $DENY_LIST_MARKERS $BLACKLIST_MARKERS; do + if [ -f "$1/$marker" ]; then + echo "========== DENY-LISTED: $1 ($marker) ==========" + return 1 + fi + done + return 0 +} + +SELECTED_TESTS="${SELECTED_TESTS:-TEST-??-*}" + +# Let's always do the cleaning operation first, because it destroys the image +# cache. +if [ $CLEAN = 1 ]; then + for TEST in $SELECTED_TESTS; do + ( set -x ; make -C "$TEST" clean ) + done +fi + +# Run actual tests (if requested) +if [[ $args =~ [a-z] ]]; then + for TEST in $SELECTED_TESTS; do + COUNT=$((COUNT+1)) + + pass_deny_list "$TEST" || continue + start=$(date +%s) + + echo -e "\n[$(date +%R:%S)] --x-- Running $TEST --x--" + set +e + # shellcheck disable=SC2086 + ( set -x ; make -C "$TEST" $args ) + RESULT=$? + set -e + echo "[$(date +%R:%S)] --x-- Result of $TEST: $RESULT --x--" + + results["$TEST"]="$RESULT" + times["$TEST"]=$(( $(date +%s) - start )) + + [ "$RESULT" -ne "0" ] && FAILURES=$((FAILURES+1)) + done +fi + +# Run clean-again, if requested, and if no tests failed +if [[ $FAILURES -eq 0 && $CLEANAGAIN -eq 1 ]]; then + for TEST in "${!results[@]}"; do + ( set -x ; make -C "$TEST" clean-again ) + done +fi + +echo "" + +for TEST in "${!results[@]}"; do + RESULT="${results[$TEST]}" + time="${times[$TEST]}" + string=$([ "$RESULT" = "0" ] && echo "SUCCESS" || echo "FAIL") + printf "%-35s %-8s (%3s s)\n" "${TEST}:" "${string}" "$time" +done | sort + +if [ "$FAILURES" -eq 0 ] ; then + echo -e "\nALL $COUNT TESTS PASSED" +else + echo -e "\nTOTAL FAILURES: $FAILURES OF $COUNT" +fi + +# If we have coverage files, merge them into a single report for upload +if [ -n "${ARTIFACT_DIRECTORY}" ]; then + lcov_args=() + + while read -r info_file; do + lcov_args+=(--add-tracefile "${info_file}") + done < <(find "${ARTIFACT_DIRECTORY}" -maxdepth 1 -name "*.coverage-info") + + if [ ${#lcov_args[@]} -gt 1 ]; then + lcov "${lcov_args[@]}" --output-file "${ARTIFACT_DIRECTORY}/merged.coverage-info" + fi +fi + +exit "$FAILURES" |