xref: /kvm-unit-tests/scripts/runtime.bash (revision 5f65d6f45348deeba633f1079dfb8f0ad253cebb)
1103832e8SRadim Krčmář: "${RUNTIME_arch_run?}"
21c0ab4e2SAndrew Jones: ${MAX_SMP:=$(getconf _NPROCESSORS_ONLN)}
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ář{
11a38015d8SPeng Hao    local cr=$'\r'
12a38015d8SPeng Hao    tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
13e9ae9613SRadim Krčmář}
14e9ae9613SRadim Krčmář
15d5f55dccSRadim Krčmář# We assume that QEMU is going to work if it tried to load the kernel
16d5f55dccSRadim Krčmářpremature_failure()
17d5f55dccSRadim Krčmář{
18d5f55dccSRadim Krčmář    local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"
19d5f55dccSRadim Krčmář
20df477983SLukáš Doktor    echo "$log" | grep "_NO_FILE_4Uhere_" |
2147a228b0SThomas Huth        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
22d5f55dccSRadim Krčmář        return 1
23d5f55dccSRadim Krčmář
24d5f55dccSRadim Krčmář    RUNTIME_log_stderr <<< "$log"
25d5f55dccSRadim Krčmář
26df477983SLukáš Doktor    echo "$log"
27d5f55dccSRadim Krčmář    return 0
28d5f55dccSRadim Krčmář}
29d5f55dccSRadim Krčmář
30d5f55dccSRadim Krčmářget_cmdline()
31d5f55dccSRadim Krčmář{
32d5f55dccSRadim Krčmář    local kernel=$1
33d5f55dccSRadim Krčmář    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
34d5f55dccSRadim Krčmář}
35d5f55dccSRadim Krčmář
369a008986SSuraj Jitindar Singhskip_nodefault()
379a008986SSuraj Jitindar Singh{
387430e2c5SAndrew Jones    [ "$run_all_tests" = "yes" ] && return 1
3957ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && return 0
409a008986SSuraj Jitindar Singh
419a008986SSuraj Jitindar Singh    while true; do
42d76bf076SAndrew Jones        read -r -p "Test marked not to be run by default, are you sure (y/N)? " yn
439a008986SSuraj Jitindar Singh        case $yn in
449a008986SSuraj Jitindar Singh            "Y" | "y" | "Yes" | "yes")
459a008986SSuraj Jitindar Singh                return 1
469a008986SSuraj Jitindar Singh                ;;
479a008986SSuraj Jitindar Singh            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
489a008986SSuraj Jitindar Singh                return 0
499a008986SSuraj Jitindar Singh                ;;
509a008986SSuraj Jitindar Singh        esac
519a008986SSuraj Jitindar Singh    done
529a008986SSuraj Jitindar Singh}
539a008986SSuraj Jitindar Singh
54851a00dfSSergey Bronnikovfunction print_result()
55851a00dfSSergey Bronnikov{
56851a00dfSSergey Bronnikov    local status="$1"
57851a00dfSSergey Bronnikov    local testname="$2"
58851a00dfSSergey Bronnikov    local summary="$3"
59851a00dfSSergey Bronnikov    local reason="$4"
60851a00dfSSergey Bronnikov
61851a00dfSSergey Bronnikov    if [ -z "$reason" ]; then
62851a00dfSSergey Bronnikov        echo "`$status` $testname $summary"
63851a00dfSSergey Bronnikov    else
64851a00dfSSergey Bronnikov        echo "`$status` $testname ($reason)"
65851a00dfSSergey Bronnikov    fi
66851a00dfSSergey Bronnikov}
67851a00dfSSergey Bronnikov
68b3733048SPaolo Bonzinifunction find_word()
69b3733048SPaolo Bonzini{
70b3733048SPaolo Bonzini    grep -Fq " $1 " <<< " $2 "
71b3733048SPaolo Bonzini}
72b3733048SPaolo Bonzini
736a53fc26SRadim Krčmářfunction run()
746a53fc26SRadim Krčmář{
756a53fc26SRadim Krčmář    local testname="$1"
766a53fc26SRadim Krčmář    local groups="$2"
776a53fc26SRadim Krčmář    local smp="$3"
786a53fc26SRadim Krčmář    local kernel="$4"
796a53fc26SRadim Krčmář    local opts="$5"
806a53fc26SRadim Krčmář    local arch="$6"
81e9bdb8b5SAndrew Jones    local check="${CHECK:-$7}"
82a61dedddSAndrew Jones    local accel="$8"
83fd149358SAndrew Jones    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default
846a53fc26SRadim Krčmář
85c98ce6e0SAlexandru Elisei    if [ "${CONFIG_EFI}" == "y" ]; then
869509ddf6SMarc Orr        kernel=$(basename $kernel .flat)
879509ddf6SMarc Orr    fi
889509ddf6SMarc Orr
896a53fc26SRadim Krčmář    if [ -z "$testname" ]; then
906a53fc26SRadim Krčmář        return
916a53fc26SRadim Krčmář    fi
926a53fc26SRadim Krčmář
93b3733048SPaolo Bonzini    if [ -n "$only_tests" ] && ! find_word "$testname" "$only_tests"; then
94231a2e75SPaolo Bonzini        return
95231a2e75SPaolo Bonzini    fi
96231a2e75SPaolo Bonzini
97b3733048SPaolo Bonzini    if [ -n "$only_group" ] && ! find_word "$only_group" "$groups"; then
986a53fc26SRadim Krčmář        return
996a53fc26SRadim Krčmář    fi
1006a53fc26SRadim Krčmář
101b3733048SPaolo Bonzini    if [ -z "$only_group" ] && find_word nodefault "$groups" &&
1029a008986SSuraj Jitindar Singh            skip_nodefault; then
103851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "test marked as manual run only"
1049a008986SSuraj Jitindar Singh        return;
1059a008986SSuraj Jitindar Singh    fi
1069a008986SSuraj Jitindar Singh
1076a53fc26SRadim Krčmář    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
108851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "$arch only"
109a3831260SAndrew Jones        return 2
1106a53fc26SRadim Krčmář    fi
1116a53fc26SRadim Krčmář
112a61dedddSAndrew Jones    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
113a61dedddSAndrew Jones        print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
114a61dedddSAndrew Jones        return 2
115a61dedddSAndrew Jones    elif [ -n "$ACCEL" ]; then
116a61dedddSAndrew Jones        accel="$ACCEL"
117a61dedddSAndrew Jones    fi
118a61dedddSAndrew Jones
1196a53fc26SRadim Krčmář    # check a file for a particular value before running a test
1206a53fc26SRadim Krčmář    # the check line can contain multiple files to check separated by a space
1216a53fc26SRadim Krčmář    # but each check parameter needs to be of the form <path>=<value>
122cde27d4cSPaolo Bonzini    if [ "$check" ]; then
123d76bf076SAndrew Jones        for check_param in "${check[@]}"; do
1246a53fc26SRadim Krčmář            path=${check_param%%=*}
1256a53fc26SRadim Krčmář            value=${check_param#*=}
126cde27d4cSPaolo Bonzini            if ! [ -f "$path" ] || [ "$(cat $path)" != "$value" ]; then
127851a00dfSSergey Bronnikov                print_result "SKIP" $testname "" "$path not equal to $value"
128a3831260SAndrew Jones                return 2
1296a53fc26SRadim Krčmář            fi
1306a53fc26SRadim Krčmář        done
131cde27d4cSPaolo Bonzini    fi
1326a53fc26SRadim Krčmář
1338727c886SAndrew Jones    last_line=$(premature_failure > >(tail -1)) && {
1349509ddf6SMarc Orr        skip=true
1359b33567bSSean Christopherson        if [ "${CONFIG_EFI}" == "y" ] && [[ "${last_line}" =~ "Dummy Hello World!" ]]; then
1369509ddf6SMarc Orr            skip=false
1379509ddf6SMarc Orr        fi
1389509ddf6SMarc Orr        if [ ${skip} == true ]; then
139851a00dfSSergey Bronnikov            print_result "SKIP" $testname "" "$last_line"
140d5f55dccSRadim Krčmář            return 77
1419509ddf6SMarc Orr        fi
142d5f55dccSRadim Krčmář    }
143d5f55dccSRadim Krčmář
144d5f55dccSRadim Krčmář    cmdline=$(get_cmdline $kernel)
145745f5eb8SAndrew Jones    if find_word "migration" "$groups"; then
14637abdda9SThomas Huth        cmdline="MIGRATION=yes $cmdline"
14737abdda9SThomas Huth    fi
148*5f65d6f4SNico Boehr    if find_word "panic" "$groups"; then
149*5f65d6f4SNico Boehr        cmdline="PANIC=yes $cmdline"
150*5f65d6f4SNico Boehr    fi
1515b842da9SAndrew Jones    if [ "$verbose" = "yes" ]; then
1526a53fc26SRadim Krčmář        echo $cmdline
1536a53fc26SRadim Krčmář    fi
1546a53fc26SRadim Krčmář
1556a53fc26SRadim Krčmář    # extra_params in the config file may contain backticks that need to be
156e9ae9613SRadim Krčmář    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
157e9ae9613SRadim Krčmář    # preserve the exit status.
158e01499dbSMarc Hartmayer    summary=$(eval $cmdline 2> >(RUNTIME_log_stderr $testname) \
159e01499dbSMarc Hartmayer                             > >(tee >(RUNTIME_log_stdout $testname $kernel) | extract_summary))
1605af378ddSRadim Krčmář    ret=$?
16157ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $testname $kernel)
1626a53fc26SRadim Krčmář
163b2a2aa5dSAndrew Jones    if [ $ret -eq 0 ]; then
164851a00dfSSergey Bronnikov        print_result "PASS" $testname "$summary"
165a0833bfcSRadim Krčmář    elif [ $ret -eq 77 ]; then
166851a00dfSSergey Bronnikov        print_result "SKIP" $testname "$summary"
167fd149358SAndrew Jones    elif [ $ret -eq 124 ]; then
168851a00dfSSergey Bronnikov        print_result "FAIL" $testname "" "timeout; duration=$timeout"
1698375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
1708375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: timeout; duration=$timeout" >&3
1718375379fSNico Boehr        fi
1728727c886SAndrew Jones    elif [ $ret -gt 127 ]; then
1738375379fSNico Boehr        signame="SIG"$(kill -l $(($ret - 128)))
1748375379fSNico Boehr        print_result "FAIL" $testname "" "terminated on $signame"
1758375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
1768375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: terminated on $signame" >&3
1778375379fSNico Boehr        fi
1788375379fSNico Boehr    elif [ $ret -eq 127 ] && [ "$tap_output" = "yes" ]; then
1798375379fSNico Boehr        echo "not ok TEST_NUMBER - ${testname}: aborted" >&3
1806a53fc26SRadim Krčmář    else
181851a00dfSSergey Bronnikov        print_result "FAIL" $testname "$summary"
1826a53fc26SRadim Krčmář    fi
1835af378ddSRadim Krčmář
1845af378ddSRadim Krčmář    return $ret
1856a53fc26SRadim Krčmář}
1866a53fc26SRadim Krčmář
187bc52c0c8SAndrew Jones#
188bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus.
189bc52c0c8SAndrew Jones#
190bc52c0c8SAndrew Jones# This probing currently only works for ARM, as x86 bails on another
191bc52c0c8SAndrew Jones# error first. Also, this probing isn't necessary for any ARM hosts
192bc52c0c8SAndrew Jones# running kernels later than v4.3, i.e. those including ef748917b52
193bc52c0c8SAndrew Jones# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
194bc52c0c8SAndrew Jones# point when maintaining the while loop gets too tiresome, we can
195bc52c0c8SAndrew Jones# just remove it...
196bc52c0c8SAndrew Joneswhile $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
197bc52c0c8SAndrew Jones		|& grep -qi 'exceeds max CPUs'; do
19897b3ae9aSChristoffer Dall	MAX_SMP=$((MAX_SMP >> 1))
1996a53fc26SRadim Krčmářdone
200