#!/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 TIMEOUT		180s
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		""

# 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]
       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)
    -V    Enable VHE configuration
    -N    Disable protected KVM configuration
    -G    Enable debugging of emulated system with GDB
EOF
}

while getopts ":k:d:o:vVNGqh" OPT; do
	case "${OPT}" in
	k)	KERNEL="${OPTARG}"		;;
	d)	DISPLAY_NAME="${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}" -t "${TIMEOUT}")

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)
fi

# 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

	"${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
