From 4c7a49a83e082a7bfff85a9305882f0912655123 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 23 Oct 2023 10:12:25 -0400 Subject: tests: Run test cases in parallel --- GNUmakefile | 7 ++++++- tests/getopts.sh | 12 +++++++++++ tests/run.sh | 61 ++++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 64 insertions(+), 16 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 45797e2..62f24fb 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -287,8 +287,13 @@ check: $(CHECKS) $(UNIT_CHECKS): check-%: $(BIN)/tests/% $< +JOBS := $(filter -j%,$(MAKEFLAGS)) +ifndef JOBS + JOBS := -j1 +endif + $(STRATEGY_CHECKS): check-%: $(BIN)/bfs $(TEST_UTILS) - ./tests/tests.sh --bfs="$(BIN)/bfs -S $*" $(TEST_FLAGS) + ./tests/tests.sh $(JOBS) --bfs="$(BIN)/bfs -S $*" $(TEST_FLAGS) # Custom test flags for distcheck DISTCHECK_FLAGS := -s TEST_FLAGS="--sudo --verbose=skipped" diff --git a/tests/getopts.sh b/tests/getopts.sh index 7d3ef4b..d34df4f 100644 --- a/tests/getopts.sh +++ b/tests/getopts.sh @@ -52,6 +52,7 @@ EOF # Parse the command line parse_args() { + JOBS=0 PATTERNS=() SUDO=() STOP=0 @@ -64,6 +65,9 @@ parse_args() { for arg; do case "$arg" in + -j*) + JOBS="${arg#-j}" + ;; --bfs=*) BFS="${arg#*=}" ;; @@ -127,6 +131,14 @@ parse_args() { esac done + if ((JOBS == 0)); then + if command -v nproc &>/dev/null; then + JOBS=$(nproc) + else + JOBS=1 + fi + fi + # Try to resolve the path to $BFS before we cd, while also supporting # --bfs="./bin/bfs -S ids" read -a BFS <<<"${BFS:-$BIN/bfs}" diff --git a/tests/run.sh b/tests/run.sh index 28801f4..b46fde6 100644 --- a/tests/run.sh +++ b/tests/run.sh @@ -42,6 +42,42 @@ run_test() ( source "$@" ) +# Run a test in the background +bg_test() { + if ((VERBOSE_ERRORS)); then + run_test "$1" + else + run_test "$1" 2>"$TMP/TEST.err" + fi + ret=$? + + if ((ret != 0 && ret != EX_SKIP)); then + ((VERBOSE_ERRORS)) || cat "$TMP/$TEST.err" >&2 + color printf "${BOL}${RED}%s failed!${RST}\n" "$TEST" + fi + + return $ret +} + +# Reap a background job +reap() { + wait -n + ret=$? + ((BG--)) + + case $ret in + 0) + ((++passed)) + ;; + $EX_SKIP) + ((++skipped)) + ;; + *) + ((++failed)) + ;; + esac +} + # Run all the tests run_tests() { if ((VERBOSE_TESTS)); then @@ -70,6 +106,8 @@ run_tests() { TEST_FMT="." fi + BG=0 + # Turn off set -e (but turn it back on in run_test) set +e @@ -79,23 +117,16 @@ run_tests() { mkdir -p "$TMP/$TEST" OUT="$TMP/$TEST.out" - if ((VERBOSE_ERRORS)); then - run_test "$TESTS/$TEST.sh" - else - run_test "$TESTS/$TEST.sh" 2>"$TMP/$TEST.err" + if ((BG >= JOBS)); then + reap fi - status=$? + ((++BG)) - if ((status == 0)); then - ((++passed)) - elif ((status == EX_SKIP)); then - ((++skipped)) - else - ((++failed)) - ((VERBOSE_ERRORS)) || cat "$TMP/$TEST.err" >&2 - color printf "${BOL}${RED}%s failed!${RST}\n" "$TEST" - ((STOP)) && break - fi + bg_test "$TESTS/$TEST.sh" & + done + + while ((BG > 0)); do + reap done printf "${BOL}" -- cgit v1.2.3