If a process fails in the background, bash ignores it even when running with set -e. To address it, we store a token in a file per each rank, which only gets written when each process finishes properly. Then we make sure that each rank has completed successfully, otherwise we fail the test.
72 lines
1.5 KiB
Bash
Executable File
72 lines
1.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# Copyright (c) 2021-2025 Barcelona Supercomputing Center (BSC)
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
set -ex
|
|
|
|
if [ -n "$OVNI_TEST_VERBOSE" ]; then
|
|
set -x
|
|
fi
|
|
|
|
dir=$(readlink -f "${OVNI_CURRENT_DIR}")
|
|
testname="$dir/$1"
|
|
workdir="${testname}.dir"
|
|
tracedir="${workdir}/ovni"
|
|
|
|
export PATH="${OVNI_BUILD_DIR}:$PATH"
|
|
export OVNI_TEST_BIN="$testname"
|
|
|
|
rm -rf "${workdir}"
|
|
mkdir -p "${workdir}"
|
|
cd "${workdir}"
|
|
|
|
if [ -z "$OVNI_NPROCS" ]; then
|
|
OVNI_NPROCS=1
|
|
fi
|
|
|
|
# Let the test run its own driver
|
|
if [ -n "$OVNI_DRIVER" ]; then
|
|
. "$OVNI_DRIVER"
|
|
else
|
|
if [ "$OVNI_NPROCS" -gt 1 ]; then
|
|
for i in $(seq 1 "$OVNI_NPROCS"); do
|
|
rank=$(($i-1))
|
|
# Run the test in the background
|
|
(OVNI_RANK=$rank OVNI_NRANKS=$OVNI_NPROCS "$testname" && echo ok > ovni.rc.$rank) &
|
|
done
|
|
wait
|
|
all_good=1
|
|
for i in $(seq 1 "$OVNI_NPROCS"); do
|
|
rank=$(($i-1))
|
|
# Run the test in the background
|
|
if ! grep -q ok "ovni.rc.$rank"; then
|
|
echo "Test for rank $rank failed"
|
|
all_good=0
|
|
fi
|
|
done
|
|
if [ "$all_good" != 1 ]; then
|
|
echo "Some tests failed"
|
|
exit 1
|
|
fi
|
|
else
|
|
"$testname"
|
|
fi
|
|
|
|
if [ -n "$OVNI_DO_SORT" ]; then
|
|
ovnisort "$tracedir"
|
|
fi
|
|
|
|
if [ -z "$OVNI_NOEMU" ]; then
|
|
# Then launch the emulator in lint mode
|
|
ovniemu $OVNI_EMU_ARGS -l "$tracedir"
|
|
fi
|
|
fi
|
|
|
|
# Run any post script that was generated
|
|
ls -1 *.sh | while read sh; do
|
|
echo "Running '$sh'"
|
|
bash -ex $sh
|
|
done
|
|
|
|
#rm -rf $tracedir
|