Blob Blame History Raw
#!/usr/bin/env sh
[ -z "$BASEDIR" ] && BASEDIR=$(realpath $(dirname "$0"))
[ -z "$TESTDIR" ] && TESTDIR=$(realpath $BASEDIR/../)
[ -z "$TEST_BASE_IMAGE" ] && TEST_BASE_IMAGE=$TESTDIR/output/test-base-image

[[ ! -e $TEST_BASE_IMAGE ]] && echo "Test base image not found." && exit 1

DEFAULT_QEMU_CMD="-nodefaults \
-nographic \
-smp 2 \
-m 768M \
-monitor none"

_YELLOW='\033[1;33m'
_GREEN='\033[0;32m'
_RED='\033[0;31m'
_NC='\033[0m' # No Color

get_test_path() {
	local script=$1
	local testname=$(basename $(dirname $script))
	local output=$TESTDIR/output/$testname

	echo $output
}

get_test_entry_name() {
	echo $(basename ${1%.*})
}

get_test_image() {
	local script=$1
	local testout=$(get_test_path $script)
	local entry=$(get_test_entry_name $script)

	echo $testout/$entry.img
}

get_test_qemu_cmd_file() {
	local script=$1
	local testout=$(get_test_path $script)
	local entry=$(get_test_entry_name $script)

	echo $testout/$entry.qemu_cmd
}

get_test_qemu_cmd() {
	cat $(get_test_qemu_cmd_file $1)
}

get_test_output_file() {
	local script=$1
	local testout=$(get_test_path $script)
	local entry=$(get_test_entry_name $script)

	echo $testout/$entry.output
}

get_test_console_file() {
	local script=$1
	local testout=$(get_test_path $script)
	local entry=$(get_test_entry_name $script)

	echo $testout/$entry.console
}

get_test_output() {
	local output=$(get_test_output_file $1)
	if [ -e "$output" ]; then
		cat $(get_test_output_file $1)
	else
		echo "<No Output>"
	fi
}

build_test_image() {
	local script=$1
	local test_image=$(get_test_image $script)
	mkdir -p $(dirname $test_image)

	$BASEDIR/build-image.sh \
		$TEST_BASE_IMAGE \
		$test_image \
		$BASEDIR/build-scripts/test-image.sh \
		$script
}

run_test_sync() {
	local qemu_cmd=$(get_test_qemu_cmd $1)

	if [ -n "$qemu_cmd" ]; then
		timeout --foreground 10m qemu-kvm $(get_test_qemu_cmd $1)
	else
		echo "error: test qemu command line is not configured" > /dev/stderr
		return 1
	fi
}

_check_test_result() {
	grep "TEST PASSED" $1 2>/dev/null
	[ $? -eq 0 ] && return 0

	grep "TEST FAILED" $1 2>/dev/null
	[ $? -eq 0 ] && return 1

	grep "TEST ABORTED" $1 2>/dev/null
	[ $? -eq 0 ] && return 2

	return 255
}

# Print test result and return below value:
# 0: Test passed
# 1: Test failed
# 2: Test aborted, test scripts errored out
# 3: Test exited unexpectely, VM got killed early, or time out
gather_test_result() {
	local ret=255
	local res=""

	for i in $@; do
		res=$(_check_test_result $i)
		ret=$?

		if [ $ret -ne 255 ]; then
			echo $res
			return $ret
		fi
	done

	echo "${_RED}TEST RESULT NOT FOUND!${_NC}"
	return 3
}

# Wait and watch for test result
watch_test_outputs() {
	local ret=255
	local res=""
	# If VMs are still running, check for test result, if
	# test finished, kill remaining VMs
	while true; do
		if [ -n "$(jobs -r)" ]; then
			# VMs still running
			for i in $@; do
				res=$(_check_test_result $i)
				ret=$?

				if [ $ret -ne 255 ]; then
					# Test finished, kill VMs
					kill $(jobs -p)
					break 2
				fi
			done
		else
			# VMs exited
			ret=255

			for i in $@; do
				res=$(_check_test_result $i)
				ret=$?

				if [ $ret -ne 255 ]; then
					break 2
				fi
			done

			if [ $ret -eq 255 ]; then
				ret=3
				break
			fi
		fi

		sleep 1
	done

	return $ret
}