blob: 6372b4980e418251b94a3bdfd99c3a5a520a4f9e [file] [log] [blame]
#!/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 MODE ""
default_var KERNEL ""
default_var FIRMWARE ""
default_var TEST_PATH ""
default_var DISPLAY_NAME ""
default_var OUTPUT ""
default_var TIMEOUT ""
DEFAULT_TIMEOUT=180s
RESULT_ALIGN=60
function usage() {
cat <<EOF
Usage: $0 [-h] [-v] [-q] [-G]
[-k KERNEL] [-F firmware] [-d DISPLAY_NAME] [-o OUTPUT] [-t TIMEOUT]
[-M KVM_MODE]
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
-F Firmware
-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
-M Select KVM mode
-G Enable debugging of emulated system with GDB
EOF
}
while getopts ":k:F:d:o:t:M:vGqh" OPT; do
case "${OPT}" in
k) KERNEL="${OPTARG}" ;;
F) FIRMWARE="${OPTARG}" ;;
d) DISPLAY_NAME="${OPTARG}" ;;
t) TIMEOUT="${OPTARG}" ;;
M) MODE="${OPTARG}" ;;
v) VERBOSE=1 ;;
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 [ -n "${VERBOSE}" ]; then
CMD+=(-v)
fi
if [ -n "${MODE}" ]; then
CMD+=(-M "${MODE}")
fi
if [ -n "${KERNEL}" ]; then
CMD+=(-k "${KERNEL}")
fi
if [ -n "${FIRMWARE}" ]; then
CMD+=(-F "${FIRMWARE}")
fi
if [ "${GDB}" -eq 1 ]; then
CMD+=(-G)
# Disable timeout unless overridden by user.
if [ -z "${TIMEOUT}" ]; then
TIMEOUT=0s
fi
>&2 echo "Test will wait for GDB connection. Connect with"
>&2 echo "$ build/aarch64/run_gdb.sh -e gdb-multiarch"
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=$?
PASS=$(grep -E -h --color=never $'(PASS|SKIP)\x1b' "${OUTPUT}")
FAIL=$(grep -E -h --color=never $'FAIL\x1b' "${OUTPUT}")
# Check FAIL eagerly.
if [ -n "${FAIL}" ]; then
RESULT="${FAIL}"
EXIT_STATUS=1
elif [ -n "${PASS}" ]; then
RESULT="${PASS}"
else
RESULT="\e[31;1mTIMEOUT/CRASH\e[0m"
EXIT_STATUS=1
fi
printf "%-${RESULT_ALIGN}s " "${DISPLAY_NAME}"
echo -e "${RESULT}"
exit ${EXIT_STATUS}
fi