blob: 2633451785de9197b567ff8cabdbc8567fd6a195 [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.
# Variables to represent VHE and nVHE emulation parameter
VHE=1
NVHE=0
function get_qemu_binary()
{
local qemucmd
local qemu
qemucmd=${QEMU:-qemu-system-aarch64}
if $qemucmd --help 2>/dev/null | grep -q 'QEMU'; then
qemu="$qemucmd"
fi
if [ -z "${qemu}" ]; then
return
fi
command -v "${qemu}"
}
function get_outcome()
{
grep -E -h --color=never "[^ ](PASS|FAIL|SKIP)[^:]"
}
function usage()
{
cat <<EOF
Usage: $0 [-h] [-t TEST-FILES] [-j NUM-TASKS] [-l KERNEL] [-e QEMU] [-r ROOT]
-h Output this help text
-t kvm-unit-tests standalone directory
-x tests to exclude (regex), can be specified more than once
-j Execute tests in parallel
-l Linux kernel image to use
-e QEMU emulator binary
-r Root file system image to use
EOF
}
function usage_abort()
{
usage
exit 1
}
function run_job()
{
local job="$1"
if [ -z "$job" ]; then
return
fi
while (( $(jobs | wc -l) == $j )); do
# Wait for background jobs
wait -n 2>/dev/null
done
if [ $j = 1 ]; then
bash -c "$@"
else
bash -c "$@" &
fi
}
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
test_dir=""
exclude_regex=""
j=1
linux=""
rootfs=""
verbose=${VERBOSE:-0}
qemu=$(get_qemu_binary)
while getopts ":t:x:j:l:r:e:hv" opt; do
case "${opt}" in
t)
test_dir=${OPTARG}
;;
x)
# OR with the previous regex if specified
if [ ! -z $exclude_regex ]; then
exclude_regex+="|"
fi
exclude_regex+="(^${OPTARG}$)"
;;
j)
j=${OPTARG}
;;
l)
linux=${OPTARG}
;;
r)
rootfs=${OPTARG}
;;
e)
qemu=${OPTARG}
;;
h)
usage
exit 0
;;
v)
verbose=1
;;
*)
usage_abort
;;
esac
done
if ((OPTIND == 1)); then
usage_abort
fi
shift $((OPTIND-1))
if [[ ! -d ${test_dir} ]]; then
echo "No test directory specified."
usage_abort
fi
if [[ ! -f ${linux} ]]; then
echo "Linux kernel image file not found."
usage_abort
fi
if [[ ! -f ${rootfs} ]]; then
echo "Root filesystem image file not found."
usage_abort
fi
if [[ ! -x ${qemu} ]]; then
echo "QEMU executable not found."
usage_abort
fi
rm -rf logs.old
if [ -d logs ]; then
mv logs logs.old
fi
mkdir -p logs/vhe || exit 2
mkdir -p logs/nvhe || exit 2
for test in ${test_dir}/*; do
test_name="$(basename ${test})"
if [[ ! -z $exclude_regex && "${test_name}" =~ ${exclude_regex} ]]; then
if [ "$verbose" != "0" ]; then
echo "Excluding ${test_name}"
fi
continue
fi
if [ "$verbose" != "0" ]; then
echo "Running ${test_name}"
fi
# Redirect output instead of pipe to preserve exit status.
run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${VHE} &> >(tee logs/vhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${NVHE} &> >(tee logs/nvhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
done
wait