bind9/unit/unittest.sh.in
Ondřej Surý 762a3c866e Skip the unit tests when kyua is not available
The unittest.sh script tried to execute the unit tests when cmocka
development libraries was available, but kyua, the execution engine,
was not.  Now, both need to be installed in the system.
2020-06-17 15:04:43 +02:00

85 lines
2.7 KiB
Bash
Executable file

#!/bin/sh
# Find the top of the BIND9 tree.
export TOP=@abs_top_builddir@
KYUA=@KYUA@
CMOCKA_MESSAGE_OUTPUT=TAP
export CMOCKA_MESSAGE_OUTPUT
GDB="$(command -v gdb)"
kyua_report() {
${KYUA} --logfile /dev/null report --results-file "${KYUA_RESULT:-LATEST}"
}
clear_kyua_work_dir() {
KYUA_WORK_DIR="$(grep -i -m1 "failed" "${1}" | sed -n 's|.*\(/tmp/kyua\.[A-Za-z0-9]*\).*|\1|p')"
if [ -n "${CI}" ] && [ -d "${KYUA_WORK_DIR}" ]; then
find "${KYUA_WORK_DIR}" \( -name 'core*' -o -name '*.core' \) -exec mv -v {} . \;
rm -rf "${KYUA_WORK_DIR}"
fi
}
if [ -z "${KYUA}" ]; then
exit 0
fi
echo "S:unit:$(date)"
echo "T:unit:1:A"
echo "I:unit tests (using kyua)"
${KYUA} -v parallelism="${TEST_PARALLEL_JOBS:-1}" --logfile kyua.log --loglevel debug test --results-file "${KYUA_RESULT:-NEW}"
status=$?
kyua_report
clear_kyua_work_dir kyua.log
# Use kyua-debug(1) facility to gather additional data on failed tests.
# Some runs will just show verbose information from the run, some will
# show backtrace via gdb(1).
USER_ID=$(id -u)
BROKEN_TESTS=$(kyua_report | awk '$2 == "->" && ( $3 == "broken:" || $3 == "failed:" ) { print $1 }')
# Conditions for getting kyua debug info and GDB backtrace: runs under CI
# (safety), GDB present, root privileges, failed tests.
if [ -n "${CI}" ] && [ -n "${GDB}" ] && [ "${USER_ID:-1}" -eq 0 ] && [ -n "${BROKEN_TESTS}" ]; then
if [ "$(uname -s)" = "Linux" ] && ! sysctl -n "kernel.core_pattern" | grep -xq "core.%p"; then
echo "I:*** kernel.core_pattern is not set to 'core.%p'"
echo "I:*** kyua may not be able to find core dumps for broken tests"
fi
if [ "$(uname -s)" = "FreeBSD" ] && ! sysctl -n "kern.corefile" | grep -xq "core.%P"; then
echo "I:*** kern.corefile is not set to 'core.%P'"
echo "I:*** kyua may not be able to find core dumps for broken tests"
fi
if grep '^#define USE_LIBTOOL 1$' "${TOP}/config.h" >/dev/null; then
# kyua debug command misidentifies broken binaries when libtool
# is used (see https://github.com/jmmv/kyua/issues/207).
# Here we try to "trick" kyua to use our custom gdb script instead
# of using gdb(1) directly. Hence this part needs to be run as root
# and, for safety reasons, only in the CI.
mv "${GDB}" "${GDB}.orig"
cp "${TOP}/unit/gdb" "${GDB}"
fi
i=1
for test in ${BROKEN_TESTS}; do
echo
echo "----- $test -----"
KYUA_DEBUG_LOG="kyua.debug.log.${i}"
${KYUA} debug "${test}" 2>&1 | tee "${KYUA_DEBUG_LOG}"
clear_kyua_work_dir "${KYUA_DEBUG_LOG}"
i=$((i + 1))
done
if grep '^#define USE_LIBTOOL 1$' "${TOP}/config.h" >/dev/null; then
mv "${GDB}.orig" "${GDB}"
fi
fi
if [ "${status}" -eq 0 ]
then
rm -f kyua.log
echo "R:PASS"
else
echo "R:FAIL:status:${status}"
fi
echo "E:unit:$(date)"
exit ${status}