xref: /kvm-unit-tests/scripts/runtime.bash (revision a481914fd0aa0ccc7eb78238a5d24043b7908ddd)
1103832e8SRadim Krčmář: "${RUNTIME_arch_run?}"
220a879faSNicholas Piggin: "${MAX_SMP:=$(getconf _NPROCESSORS_ONLN)}"
320a879faSNicholas Piggin: "${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ář{
18b7e5dfd3SNicholas Piggin    local log
19b7e5dfd3SNicholas Piggin
20b7e5dfd3SNicholas Piggin    log="$(eval "$(get_cmdline _NO_FILE_4Uhere_)" 2>&1)"
21d5f55dccSRadim Krčmář
22df477983SLukáš Doktor    echo "$log" | grep "_NO_FILE_4Uhere_" |
236e67f74aSAndrew Jones        grep -q -e "could not \(load\|open\) kernel" -e "error loading" -e "failed to load" &&
24d5f55dccSRadim Krčmář        return 1
25d5f55dccSRadim Krčmář
26d5f55dccSRadim Krčmář    RUNTIME_log_stderr <<< "$log"
27d5f55dccSRadim Krčmář
28df477983SLukáš Doktor    echo "$log"
29d5f55dccSRadim Krčmář    return 0
30d5f55dccSRadim Krčmář}
31d5f55dccSRadim Krčmář
32d5f55dccSRadim Krčmářget_cmdline()
33d5f55dccSRadim Krčmář{
34d5f55dccSRadim Krčmář    local kernel=$1
35d5f55dccSRadim Krčmář    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
36d5f55dccSRadim Krčmář}
37d5f55dccSRadim Krčmář
389a008986SSuraj Jitindar Singhskip_nodefault()
399a008986SSuraj Jitindar Singh{
407430e2c5SAndrew Jones    [ "$run_all_tests" = "yes" ] && return 1
4157ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && return 0
429a008986SSuraj Jitindar Singh
439a008986SSuraj Jitindar Singh    while true; do
44d76bf076SAndrew Jones        read -r -p "Test marked not to be run by default, are you sure (y/N)? " yn
459a008986SSuraj Jitindar Singh        case $yn in
469a008986SSuraj Jitindar Singh            "Y" | "y" | "Yes" | "yes")
479a008986SSuraj Jitindar Singh                return 1
489a008986SSuraj Jitindar Singh                ;;
499a008986SSuraj Jitindar Singh            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
509a008986SSuraj Jitindar Singh                return 0
519a008986SSuraj Jitindar Singh                ;;
529a008986SSuraj Jitindar Singh        esac
539a008986SSuraj Jitindar Singh    done
549a008986SSuraj Jitindar Singh}
559a008986SSuraj Jitindar Singh
56851a00dfSSergey Bronnikovfunction print_result()
57851a00dfSSergey Bronnikov{
58851a00dfSSergey Bronnikov    local status="$1"
59851a00dfSSergey Bronnikov    local testname="$2"
60851a00dfSSergey Bronnikov    local summary="$3"
61851a00dfSSergey Bronnikov    local reason="$4"
62851a00dfSSergey Bronnikov
63851a00dfSSergey Bronnikov    if [ -z "$reason" ]; then
6409e55926SNicholas Piggin        echo "$($status) $testname $summary"
65851a00dfSSergey Bronnikov    else
6609e55926SNicholas Piggin        echo "$($status) $testname ($reason)"
67851a00dfSSergey Bronnikov    fi
68851a00dfSSergey Bronnikov}
69851a00dfSSergey Bronnikov
70b3733048SPaolo Bonzinifunction find_word()
71b3733048SPaolo Bonzini{
72b3733048SPaolo Bonzini    grep -Fq " $1 " <<< " $2 "
73b3733048SPaolo Bonzini}
74b3733048SPaolo Bonzini
756a53fc26SRadim Krčmářfunction run()
766a53fc26SRadim Krčmář{
776a53fc26SRadim Krčmář    local testname="$1"
786a53fc26SRadim Krčmář    local groups="$2"
796a53fc26SRadim Krčmář    local smp="$3"
806a53fc26SRadim Krčmář    local kernel="$4"
816a53fc26SRadim Krčmář    local opts="$5"
826a53fc26SRadim Krčmář    local arch="$6"
83e9bdb8b5SAndrew Jones    local check="${CHECK:-$7}"
84a61dedddSAndrew Jones    local accel="$8"
85fd149358SAndrew Jones    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default
866a53fc26SRadim Krčmář
87c98ce6e0SAlexandru Elisei    if [ "${CONFIG_EFI}" == "y" ]; then
8896875e96SAndrew Jones        kernel=${kernel/%.flat/.efi}
899509ddf6SMarc Orr    fi
909509ddf6SMarc Orr
916a53fc26SRadim Krčmář    if [ -z "$testname" ]; then
926a53fc26SRadim Krčmář        return
936a53fc26SRadim Krčmář    fi
946a53fc26SRadim Krčmář
95b3733048SPaolo Bonzini    if [ -n "$only_tests" ] && ! find_word "$testname" "$only_tests"; then
96231a2e75SPaolo Bonzini        return
97231a2e75SPaolo Bonzini    fi
98231a2e75SPaolo Bonzini
99b3733048SPaolo Bonzini    if [ -n "$only_group" ] && ! find_word "$only_group" "$groups"; then
1006a53fc26SRadim Krčmář        return
1016a53fc26SRadim Krčmář    fi
1026a53fc26SRadim Krčmář
103e306ff04SNico Boehr    if [ -z "$GEN_SE_HEADER" ] && find_word "pv-host" "$groups"; then
104e306ff04SNico Boehr        print_result "SKIP" $testname "" "no gen-se-header available for pv-host test"
105e306ff04SNico Boehr        return
106e306ff04SNico Boehr    fi
107e306ff04SNico Boehr
108b3733048SPaolo Bonzini    if [ -z "$only_group" ] && find_word nodefault "$groups" &&
1099a008986SSuraj Jitindar Singh            skip_nodefault; then
110851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "test marked as manual run only"
1119a008986SSuraj Jitindar Singh        return;
1129a008986SSuraj Jitindar Singh    fi
1139a008986SSuraj Jitindar Singh
1146a53fc26SRadim Krčmář    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
115851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "$arch only"
116a3831260SAndrew Jones        return 2
1176a53fc26SRadim Krčmář    fi
1186a53fc26SRadim Krčmář
119a61dedddSAndrew Jones    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
120a61dedddSAndrew Jones        print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
121a61dedddSAndrew Jones        return 2
122a61dedddSAndrew Jones    elif [ -n "$ACCEL" ]; then
123a61dedddSAndrew Jones        accel="$ACCEL"
124a61dedddSAndrew Jones    fi
125a61dedddSAndrew Jones
1266a53fc26SRadim Krčmář    # check a file for a particular value before running a test
1276a53fc26SRadim Krčmář    # the check line can contain multiple files to check separated by a space
1286a53fc26SRadim Krčmář    # but each check parameter needs to be of the form <path>=<value>
129cde27d4cSPaolo Bonzini    if [ "$check" ]; then
1303df129a6SNicholas Piggin        # There is no globbing or whitespace allowed in check parameters.
1313df129a6SNicholas Piggin        # shellcheck disable=SC2206
132bc40a32aSSean Christopherson        check=($check)
133d76bf076SAndrew Jones        for check_param in "${check[@]}"; do
1346a53fc26SRadim Krčmář            path=${check_param%%=*}
1356a53fc26SRadim Krčmář            value=${check_param#*=}
136cde27d4cSPaolo Bonzini            if ! [ -f "$path" ] || [ "$(cat $path)" != "$value" ]; then
137851a00dfSSergey Bronnikov                print_result "SKIP" $testname "" "$path not equal to $value"
138a3831260SAndrew Jones                return 2
1396a53fc26SRadim Krčmář            fi
1406a53fc26SRadim Krčmář        done
141cde27d4cSPaolo Bonzini    fi
1426a53fc26SRadim Krčmář
1432607d2d6SNikos Nikoleris    log=$(premature_failure) && {
1449509ddf6SMarc Orr        skip=true
1452607d2d6SNikos Nikoleris        if [ "${CONFIG_EFI}" == "y" ]; then
1462607d2d6SNikos Nikoleris            if [ "$ARCH" == "x86_64" ] &&
1472607d2d6SNikos Nikoleris               [[ "$(tail -1 <<<"$log")" =~ "Dummy Hello World!" ]]; then
1482607d2d6SNikos Nikoleris                   skip=false
1492607d2d6SNikos Nikoleris            elif [ "$ARCH" == "arm64" ] &&
1502607d2d6SNikos Nikoleris               [[ "$(tail -2 <<<"$log" | head -1)" =~ "Dummy Hello World!" ]]; then
1519509ddf6SMarc Orr                   skip=false
1529509ddf6SMarc Orr            fi
1532607d2d6SNikos Nikoleris        fi
1542607d2d6SNikos Nikoleris
1559509ddf6SMarc Orr        if [ ${skip} == true ]; then
156a99b4e2eSShaoqin Huang            print_result "SKIP" $testname "" "$(tail -1 <<<"$log")"
157d5f55dccSRadim Krčmář            return 77
1589509ddf6SMarc Orr        fi
159d5f55dccSRadim Krčmář    }
160d5f55dccSRadim Krčmář
161d5f55dccSRadim Krčmář    cmdline=$(get_cmdline $kernel)
162745f5eb8SAndrew Jones    if find_word "migration" "$groups"; then
16337abdda9SThomas Huth        cmdline="MIGRATION=yes $cmdline"
16437abdda9SThomas Huth    fi
1655f65d6f4SNico Boehr    if find_word "panic" "$groups"; then
1665f65d6f4SNico Boehr        cmdline="PANIC=yes $cmdline"
1675f65d6f4SNico Boehr    fi
1685b842da9SAndrew Jones    if [ "$verbose" = "yes" ]; then
1696a53fc26SRadim Krčmář        echo $cmdline
1706a53fc26SRadim Krčmář    fi
1716a53fc26SRadim Krčmář
1726a53fc26SRadim Krčmář    # extra_params in the config file may contain backticks that need to be
173e9ae9613SRadim Krčmář    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
174e9ae9613SRadim Krčmář    # preserve the exit status.
1754dd0bbe3SNina Schoetterl-Glausch    summary=$(eval "$cmdline" 2> >(RUNTIME_log_stderr $testname) \
176e01499dbSMarc Hartmayer                             > >(tee >(RUNTIME_log_stdout $testname $kernel) | extract_summary))
1775af378ddSRadim Krčmář    ret=$?
17857ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $testname $kernel)
1796a53fc26SRadim Krčmář
180b2a2aa5dSAndrew Jones    if [ $ret -eq 0 ]; then
181851a00dfSSergey Bronnikov        print_result "PASS" $testname "$summary"
182a0833bfcSRadim Krčmář    elif [ $ret -eq 77 ]; then
183851a00dfSSergey Bronnikov        print_result "SKIP" $testname "$summary"
184fd149358SAndrew Jones    elif [ $ret -eq 124 ]; then
185851a00dfSSergey Bronnikov        print_result "FAIL" $testname "" "timeout; duration=$timeout"
1868375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
1878375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: timeout; duration=$timeout" >&3
1888375379fSNico Boehr        fi
1898727c886SAndrew Jones    elif [ $ret -gt 127 ]; then
1908375379fSNico Boehr        signame="SIG"$(kill -l $(($ret - 128)))
1918375379fSNico Boehr        print_result "FAIL" $testname "" "terminated on $signame"
1928375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
1938375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: terminated on $signame" >&3
1948375379fSNico Boehr        fi
1958375379fSNico Boehr    elif [ $ret -eq 127 ] && [ "$tap_output" = "yes" ]; then
1968375379fSNico Boehr        echo "not ok TEST_NUMBER - ${testname}: aborted" >&3
1976a53fc26SRadim Krčmář    else
198851a00dfSSergey Bronnikov        print_result "FAIL" $testname "$summary"
1996a53fc26SRadim Krčmář    fi
2005af378ddSRadim Krčmář
2015af378ddSRadim Krčmář    return $ret
2026a53fc26SRadim Krčmář}
2036a53fc26SRadim Krčmář
204bc52c0c8SAndrew Jones#
205bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus.
206bc52c0c8SAndrew Jones#
2075dd20ec7SAndrew Jonesfunction probe_maxsmp()
2085dd20ec7SAndrew Jones{
2095dd20ec7SAndrew Jones	local smp
2105dd20ec7SAndrew Jones
211*a481914fSAndrew Jones	if smp=$($RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP |& grep 'SMP CPUs'); then
2125dd20ec7SAndrew Jones		smp=${smp##* }
213*a481914fSAndrew Jones		smp=${smp/\(}
214*a481914fSAndrew Jones		smp=${smp/\)}
2155dd20ec7SAndrew Jones		echo "Restricting MAX_SMP from ($MAX_SMP) to the max supported ($smp)" >&2
2165dd20ec7SAndrew Jones		MAX_SMP=$smp
21717b23734SColton Lewis	fi
2185dd20ec7SAndrew Jones}
219