summaryrefslogtreecommitdiffstats
path: root/test/run-integration-tests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'test/run-integration-tests.sh')
-rwxr-xr-xtest/run-integration-tests.sh132
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"