#!/usr/bin/env bash

# Copyright 2020 The Android KVM Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

source "$(dirname "${BASH_SOURCE[0]}")/../common.inc"

default_var VHE			0
default_var VERBOSE		0
default_var QUIET		0
default_var GDB			0
default_var KVM_PROTECTED	1
default_var KERNEL		""
default_var TEST_PATH		""
default_var DISPLAY_NAME	""
default_var OUTPUT		""
default_var TIMEOUT		""

DEFAULT_TIMEOUT=180s

# QEMU CPUs to use for VHE and nVHE runs
CPU_VHE="max"
CPU_NVHE="cortex-a53"

RESULT_ALIGN=40

function usage() {
	cat <<EOF

Usage: $0 [-h] [-v] [-q] [-G] [-V]
       [-k KERNEL] [-d DISPLAY_NAME] [-o OUTPUT] [-t TIMEOUT]
       PATH [-- RUN_QEMU_ARGS]

    PATH  Path to test binary. Basenames are resolved in the default output folder.
    -h    Output this help text
    -v    Print invoked command
    -q    Print only the result of the test
    -k    Kernel image
    -d    Override test name displayed in result
    -o    Redirect stdout/stderr output to given file (implies -q)
    -t    kill test after given number of seconds
    -V    Enable VHE configuration
    -N    Disable protected KVM configuration
    -G    Enable debugging of emulated system with GDB
EOF
}

while getopts ":k:d:o:t:vVNGqh" OPT; do
	case "${OPT}" in
	k)	KERNEL="${OPTARG}"		;;
	d)	DISPLAY_NAME="${OPTARG}"	;;
	t)	TIMEOUT="${OPTARG}"		;;
	v)	VERBOSE=1			;;
	V)	VHE=1				;;
	N)	KVM_PROTECTED=0			;;
	q)	QUIET=1				;;
	G)	GDB=1				;;
	o)
		OUTPUT="${OPTARG}"
		QUIET=1
		;;
	h)
		usage
		exit 0
		;;
	\?)
		echo "Invalid option: -${OPTARG}" 1>&2
		usage 1>&2
		exit 1
		;;
	:)
		echo "Invalid option: -${OPTARG} requires an argument" 1>&2
		usage 1>&2
		exit 1
		;;
    esac
done
shift $((OPTIND -1))

# Parse test name from a positional argument.
if [ $# -eq 0 ]; then
	usage 1>&2
	exit 1
fi
TEST_PATH="$1"
shift 1

# Default display name is the basename from TEST_PATH.
if [ -z "${DISPLAY_NAME}" ]; then
	DISPLAY_NAME="$(basename "${TEST_PATH}")"
fi

# If TEST_PATH is just a basename, search for the test in
# the kvm-unit-tests' default output folder.
if [ "$(basename "${TEST_PATH}")" = "${TEST_PATH}" ]; then
	TEST_PATH="${KUT_TEST_DIR}/${TEST_PATH}"
fi

CMD=("${SCRIPT_RUN_QEMU}" -R "${TEST_PATH}")

if [ "${VHE}" -eq 1 ]; then
	CMD+=(-c "${CPU_VHE}")
else
	CMD+=(-c "${CPU_NVHE}")
fi

if [ "${KVM_PROTECTED}" -ne 1 ]; then
	CMD+=(-N)
fi

if [ -n "${KERNEL}" ]; then
	CMD+=(-k "${KERNEL}")
fi

if [ "${GDB}" -eq 1 ]; then
	CMD+=(-G)
	# Disable timeout unless overridden by user.
	if [ -z "${TIMEOUT}" ]; then
		TIMEOUT=0s
	fi
fi

# If not otherwise specified, use default timeout value.
if [ -z "${TIMEOUT}" ]; then
	TIMEOUT="${DEFAULT_TIMEOUT}"
fi
CMD+=(-t "${TIMEOUT}")

# If there are arguments after "--", pass them to the underlying run_qemu.sh.
if [ $# -gt 0 ]; then
	if [ $1 = "--" ]; then
		shift 1
		# Note: Due to a bug in older versions of Bash, use'${array[@]+"${array[@]}"}'
		# to expand potentially empty arrays. '${array[@]}' is treated as undefined.
		CMD+=(${@+"$@"})
	else
		echo "Unrecognized options: $@" 1>&2
		usage 1>&2
		exit 1
	fi
fi

# Disable exiting on failure.
set +eo pipefail

if [ "${VERBOSE}" -eq 1 ]; then
	echo "+ ${CMD[@]}" 1>&2
fi

if [ "${QUIET}" -eq 0 ]; then
	exec "${CMD[@]}"
else
	if [ -z "${OUTPUT}" ]; then
		OUTPUT="$(mktemp)"
	fi

	mkdir -p "$(dirname "${OUTPUT}")"
	"${CMD[@]}" &> "${OUTPUT}"
	EXIT_STATUS=$?

	RESULT=$(grep -E -h --color=never "[^ ](PASS|FAIL|SKIP)[^:]" "${OUTPUT}")
	if [ -z "${RESULT}" ]; then
		RESULT="\e[31;1mTIMEOUT/CRASH\e[0m"
		EXIT_STATUS=1
	fi

	printf "%-${RESULT_ALIGN}s " "${DISPLAY_NAME}"
	echo -e "${RESULT}"
	exit ${EXIT_STATUS}
fi
