xref: /kvm-unit-tests/scripts/runtime.bash (revision 7430e2c554924e8ddb6156161708fa402c478b6f)
1103832e8SRadim Krčmář: "${RUNTIME_arch_run?}"
2fd149358SAndrew Jones: ${MAX_SMP:=$(getconf _NPROCESSORS_CONF)}
3fd149358SAndrew Jones: ${TIMEOUT:=90s}
46a53fc26SRadim Krčmář
59c51d8c9SRadim KrčmářPASS() { echo -ne "\e[32mPASS\e[0m"; }
69c51d8c9SRadim KrčmářSKIP() { echo -ne "\e[33mSKIP\e[0m"; }
79c51d8c9SRadim KrčmářFAIL() { echo -ne "\e[31mFAIL\e[0m"; }
89c51d8c9SRadim Krčmář
9e9ae9613SRadim Krčmářextract_summary()
10e9ae9613SRadim Krčmář{
11e9ae9613SRadim Krčmář    tail -1 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/$/)/'
12e9ae9613SRadim Krčmář}
13e9ae9613SRadim Krčmář
14d5f55dccSRadim Krčmář# We assume that QEMU is going to work if it tried to load the kernel
15d5f55dccSRadim Krčmářpremature_failure()
16d5f55dccSRadim Krčmář{
17d5f55dccSRadim Krčmář    local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"
18d5f55dccSRadim Krčmář
19df477983SLukáš Doktor    echo "$log" | grep "_NO_FILE_4Uhere_" |
20df477983SLukáš Doktor        grep -q -e "could not load kernel" -e "error loading" &&
21d5f55dccSRadim Krčmář        return 1
22d5f55dccSRadim Krčmář
23d5f55dccSRadim Krčmář    RUNTIME_log_stderr <<< "$log"
24d5f55dccSRadim Krčmář
25df477983SLukáš Doktor    echo "$log"
26d5f55dccSRadim Krčmář    return 0
27d5f55dccSRadim Krčmář}
28d5f55dccSRadim Krčmář
29d5f55dccSRadim Krčmářget_cmdline()
30d5f55dccSRadim Krčmář{
31d5f55dccSRadim Krčmář    local kernel=$1
32d5f55dccSRadim Krčmář    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
33d5f55dccSRadim Krčmář}
34d5f55dccSRadim Krčmář
359a008986SSuraj Jitindar Singhskip_nodefault()
369a008986SSuraj Jitindar Singh{
37*7430e2c5SAndrew Jones    [ "$run_all_tests" = "yes" ] && return 1
389a008986SSuraj Jitindar Singh    [ "$STANDALONE" != "yes" ] && return 0
399a008986SSuraj Jitindar Singh
409a008986SSuraj Jitindar Singh    while true; do
419a008986SSuraj Jitindar Singh        read -p "Test marked not to be run by default, are you sure (y/N)? " yn
429a008986SSuraj Jitindar Singh        case $yn in
439a008986SSuraj Jitindar Singh            "Y" | "y" | "Yes" | "yes")
449a008986SSuraj Jitindar Singh                return 1
459a008986SSuraj Jitindar Singh                ;;
469a008986SSuraj Jitindar Singh            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
479a008986SSuraj Jitindar Singh                return 0
489a008986SSuraj Jitindar Singh                ;;
499a008986SSuraj Jitindar Singh        esac
509a008986SSuraj Jitindar Singh    done
519a008986SSuraj Jitindar Singh}
529a008986SSuraj Jitindar Singh
536a53fc26SRadim Krčmářfunction run()
546a53fc26SRadim Krčmář{
556a53fc26SRadim Krčmář    local testname="$1"
566a53fc26SRadim Krčmář    local groups="$2"
576a53fc26SRadim Krčmář    local smp="$3"
586a53fc26SRadim Krčmář    local kernel="$4"
596a53fc26SRadim Krčmář    local opts="$5"
606a53fc26SRadim Krčmář    local arch="$6"
61e9bdb8b5SAndrew Jones    local check="${CHECK:-$7}"
62e9bdb8b5SAndrew Jones    local accel="${ACCEL:-$8}"
63fd149358SAndrew Jones    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default
646a53fc26SRadim Krčmář
656a53fc26SRadim Krčmář    if [ -z "$testname" ]; then
666a53fc26SRadim Krčmář        return
676a53fc26SRadim Krčmář    fi
686a53fc26SRadim Krčmář
699a008986SSuraj Jitindar Singh    if [ -n "$only_group" ] && ! grep -qw "$only_group" <<<$groups; then
706a53fc26SRadim Krčmář        return
716a53fc26SRadim Krčmář    fi
726a53fc26SRadim Krčmář
739a008986SSuraj Jitindar Singh    if [ -z "$only_group" ] && grep -qw "nodefault" <<<$groups &&
749a008986SSuraj Jitindar Singh            skip_nodefault; then
759a008986SSuraj Jitindar Singh        echo -e "`SKIP` $testname (test marked as manual run only)"
769a008986SSuraj Jitindar Singh        return;
779a008986SSuraj Jitindar Singh    fi
789a008986SSuraj Jitindar Singh
796a53fc26SRadim Krčmář    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
809c51d8c9SRadim Krčmář        echo "`SKIP` $1 ($arch only)"
81a3831260SAndrew Jones        return 2
826a53fc26SRadim Krčmář    fi
836a53fc26SRadim Krčmář
846a53fc26SRadim Krčmář    # check a file for a particular value before running a test
856a53fc26SRadim Krčmář    # the check line can contain multiple files to check separated by a space
866a53fc26SRadim Krčmář    # but each check parameter needs to be of the form <path>=<value>
876a53fc26SRadim Krčmář    for check_param in ${check[@]}; do
886a53fc26SRadim Krčmář        path=${check_param%%=*}
896a53fc26SRadim Krčmář        value=${check_param#*=}
906a53fc26SRadim Krčmář        if [ "$path" ] && [ "$(cat $path)" != "$value" ]; then
919c51d8c9SRadim Krčmář            echo "`SKIP` $1 ($path not equal to $value)"
92a3831260SAndrew Jones            return 2
936a53fc26SRadim Krčmář        fi
946a53fc26SRadim Krčmář    done
956a53fc26SRadim Krčmář
968727c886SAndrew Jones    last_line=$(premature_failure > >(tail -1)) && {
97d5f55dccSRadim Krčmář        echo "`SKIP` $1 ($last_line)"
98d5f55dccSRadim Krčmář        return 77
99d5f55dccSRadim Krčmář    }
100d5f55dccSRadim Krčmář
101d5f55dccSRadim Krčmář    cmdline=$(get_cmdline $kernel)
1025b842da9SAndrew Jones    if [ "$verbose" = "yes" ]; then
1036a53fc26SRadim Krčmář        echo $cmdline
1046a53fc26SRadim Krčmář    fi
1056a53fc26SRadim Krčmář
1066a53fc26SRadim Krčmář    # extra_params in the config file may contain backticks that need to be
107e9ae9613SRadim Krčmář    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
108e9ae9613SRadim Krčmář    # preserve the exit status.
1091abbc2ceSRadim Krčmář    summary=$(eval $cmdline 2> >(RUNTIME_log_stderr) \
1101abbc2ceSRadim Krčmář                             > >(tee >(RUNTIME_log_stdout $kernel) | extract_summary))
1115af378ddSRadim Krčmář    ret=$?
112f1071c6dSAndrew Jones    [ "$STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $kernel)
1136a53fc26SRadim Krčmář
114b2a2aa5dSAndrew Jones    if [ $ret -eq 0 ]; then
115e9ae9613SRadim Krčmář        echo "`PASS` $1 $summary"
116a0833bfcSRadim Krčmář    elif [ $ret -eq 77 ]; then
117e9ae9613SRadim Krčmář        echo "`SKIP` $1 $summary"
118fd149358SAndrew Jones    elif [ $ret -eq 124 ]; then
1199c51d8c9SRadim Krčmář        echo "`FAIL` $1 (timeout; duration=$timeout)"
1208727c886SAndrew Jones    elif [ $ret -gt 127 ]; then
1218727c886SAndrew Jones        echo "`FAIL` $1 (terminated on SIG$(kill -l $(($ret - 128))))"
1226a53fc26SRadim Krčmář    else
123e9ae9613SRadim Krčmář        echo "`FAIL` $1 $summary"
1246a53fc26SRadim Krčmář    fi
1255af378ddSRadim Krčmář
1265af378ddSRadim Krčmář    return $ret
1276a53fc26SRadim Krčmář}
1286a53fc26SRadim Krčmář
129bc52c0c8SAndrew Jones#
130bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus.
131bc52c0c8SAndrew Jones#
132bc52c0c8SAndrew Jones# This probing currently only works for ARM, as x86 bails on another
133bc52c0c8SAndrew Jones# error first. Also, this probing isn't necessary for any ARM hosts
134bc52c0c8SAndrew Jones# running kernels later than v4.3, i.e. those including ef748917b52
135bc52c0c8SAndrew Jones# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
136bc52c0c8SAndrew Jones# point when maintaining the while loop gets too tiresome, we can
137bc52c0c8SAndrew Jones# just remove it...
138bc52c0c8SAndrew Joneswhile $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
139bc52c0c8SAndrew Jones		|& grep -qi 'exceeds max CPUs'; do
1406a53fc26SRadim Krčmář	((--MAX_SMP))
1416a53fc26SRadim Krčmářdone
142