Blob Blame History Raw
#!/bin/sh

# Find the top of the BIND9 tree.
export TOP=@abs_top_builddir@
KYUA=@KYUA@
UNITTESTS=@UNITTESTS@
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
}

status=0
if [ -n "${UNITTESTS}" ] && [ -f Kyuafile ]
then
	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)"
fi
exit ${status}