blob: c292d98de72ef1b24f2a3148ff2450a5ab35c25a [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.
exit_status=0
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
test_dir=""
test_script="${script_dir}/../kvm-unit-tests/run_test.sh"
log_dir=${LOG_DIR:-out/test/kvm-unit-tests}
exclude_regex=""
j=1
linux=""
rootfs=""
verbose=${VERBOSE:-0}
qemu=${QEMU:-qemu-system-aarch64}
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 wait_free_job_slots()
{
while (( $(jobs | wc -l) == j )); do
# Wait for enough jobs to finish
wait -n || exit_status=1
done
}
function wait_background_jobs()
{
while (( $(jobs | wc -l) > 0 )); do
# Wait for background jobs
wait -n || exit_status=1
done
}
function run_job()
{
wait_free_job_slots
if [ "$j" = 1 ]; then
bash -c "$@" || exit_status=1
else
bash -c "$@" &
fi
}
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 [ -n "${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 "$log_dir"/logs.old
if [ -d "$log_dir"/logs ]; then
mv "$log_dir"/logs "$log_dir"/logs.old
fi
mkdir -p "$log_dir"/logs/vhe || exit 2
mkdir -p "$log_dir"/logs/nvhe || exit 2
for test in "${test_dir}"/*; do
test_name=$(basename "${test}")
if [[ -n "${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 "${test_script} -V -k ${linux} \
-o ${log_dir}/logs/vhe/${test_name}.log \
-d \"${test_name} (vhe)\" ${test} \
-- -e ${qemu} -r ${rootfs} \
&> >(tail -1)"
run_job "${test_script} -k ${linux} \
-o ${log_dir}/logs/nvhe/${test_name}.log \
-d \"${test_name} (nvhe)\" ${test} \
-- -e ${qemu} -r ${rootfs} \
&> >(tail -1)"
done
wait_background_jobs
exit $exit_status