diff --git a/test/macros.cmake b/test/macros.cmake index c854745..e255828 100644 --- a/test/macros.cmake +++ b/test/macros.cmake @@ -68,11 +68,22 @@ function(ovni_test source) "${OVNI_TEST_NAME}" WORKING_DIRECTORY "${OVNI_TEST_BUILD_DIR}") else() - add_test(NAME "${OVNI_TEST_NAME}" - COMMAND - "${driver}" - "${OVNI_TEST_NAME}" - WORKING_DIRECTORY "${OVNI_TEST_BUILD_DIR}") + if(OVNI_TEST_REGEX) + # Custom error handler for ok too + add_test(NAME "${OVNI_TEST_NAME}" + COMMAND + "${OVNI_TEST_SOURCE_DIR}/match-ok.sh" + "${OVNI_TEST_REGEX}" + "${driver}" + "${OVNI_TEST_NAME}" + WORKING_DIRECTORY "${OVNI_TEST_BUILD_DIR}") + else() + add_test(NAME "${OVNI_TEST_NAME}" + COMMAND + "${driver}" + "${OVNI_TEST_NAME}" + WORKING_DIRECTORY "${OVNI_TEST_BUILD_DIR}") + endif() endif() set_tests_properties("${OVNI_TEST_NAME}" diff --git a/test/match-ok.sh b/test/match-ok.sh new file mode 100755 index 0000000..1af0c0a --- /dev/null +++ b/test/match-ok.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Copyright (c) 2022 Barcelona Supercomputing Center (BSC) +# SPDX-License-Identifier: GPL-3.0-or-later + +# This script return 0 if and only if the given program returns zero +# AND the regex matches the output + +# $1 = the regex as grep +# $2... The program + +regex="$1" +shift + +"${@}" 2>&1 | stdbuf -i0 -o0 tee /dev/stderr | grep -q "${regex}" + +rcprog=${PIPESTATUS[0]} rcgrep=${PIPESTATUS[2]} + +echo "rcprog='$rcprog' rcgrep='$rcgrep'" + +if [ "$rcprog" = 0 ] && [ "$rcgrep" = 0 ]; then + echo "ok: program succeded and grep matched the error line" + exit 0 +else + if [ "$rcprog" != 0 ]; then + echo "error: program exited with \"$rcprog\" rather than 0" + fi + if [ "$rcgrep" != 0 ]; then + echo "error: regex \"${regex}\" not matched" + fi + exit 1 +fi