# #-- 02-unittest.test --#
# source the master var file when it's there
[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
# use .tpkg.var.test for in test variable passing
[ -f .tpkg.var.test ] && source .tpkg.var.test

. ../common.sh
PRE="../.."
get_make
(cd $PRE ; $MAKE unittest; $MAKE lock-verify; $MAKE unbound-dnstap-socket)

if test -f $PRE/unbound_do_valgrind_in_test; then
	DO_VALGRIND=yes
else
	DO_VALGRIND=no
fi
VALGRIND_FLAGS="--leak-check=full --show-leak-kinds=all"

# Run a unit test; it exits on failure
# $1: the command to start the unit test
run_unittest () {
	unit_cmd=$1
	echo "> testing $unit_cmd"
	if test $DO_VALGRIND = "yes"; then
		echo "valgrind yes"
		echo
		tmpout=/tmp/tmpout.$$
		if (cd $PRE; valgrind $VALGRIND_FLAGS ./$unit_cmd >$tmpout 2>&1); then
			echo "unit test worked."
		else
			echo "unit test failed."
			exit 1
		fi
		if grep "All heap blocks were freed -- no leaks are possible" $tmpout; then
			:  # clean
		else
			cat $tmpout
			echo "Memory leaked in unit test"
			grep "in use at exit" $tmpout
			exit 1
		fi
		if grep "ERROR SUMMARY: 0 errors from 0 contexts" $tmpout; then
			:  # clean
		else
			cat $tmpout
			echo "Errors in unit test"
			grep "ERROR SUMMARY" $tmpout
			exit 1
		fi
		rm -f $tmpout
	else
		# without valgrind
		if (cd $PRE; ./$unit_cmd); then
			echo "unit test worked."
		else
			echo "unit test failed."
			exit 1
		fi
	fi
	if test -f $PRE/ublocktrace.0; then
		if (cd $PRE; ./lock-verify ublocktrace.*); then
			echo "lock-verify test worked."
		else
			echo "lock-verify test failed."
			exit 1
		fi
	fi
}

run_unittest "unittest"
if grep "define UNBOUND_DEBUG" $PRE/config.h >/dev/null;  then
	run_unittest "unbound-dnstap-socket -c"
fi

exit 0
