xref: /kvm-unit-tests/scripts/runtime.bash (revision 08db0f5cfbca16b36f200b7bc54a78fa4941bcce)
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'
12f3393cdcSNicholas Piggin    tail -5 | 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_" |
23f3393cdcSNicholas Piggin        grep -q -e "[Cc]ould not \(load\|open\) kernel" \
24f3393cdcSNicholas Piggin                -e "error loading" \
25f3393cdcSNicholas Piggin                -e "failed to load" &&
26d5f55dccSRadim Krčmář        return 1
27d5f55dccSRadim Krčmář
28d5f55dccSRadim Krčmář    RUNTIME_log_stderr <<< "$log"
29d5f55dccSRadim Krčmář
30df477983SLukáš Doktor    echo "$log"
31d5f55dccSRadim Krčmář    return 0
32d5f55dccSRadim Krčmář}
33d5f55dccSRadim Krčmář
34d5f55dccSRadim Krčmářget_cmdline()
35d5f55dccSRadim Krčmář{
36d5f55dccSRadim Krčmář    local kernel=$1
37ccb37496SNicholas Piggin    echo "TESTNAME=$testname TIMEOUT=$timeout MACHINE=$machine ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
38d5f55dccSRadim Krčmář}
39d5f55dccSRadim Krčmář
409a008986SSuraj Jitindar Singhskip_nodefault()
419a008986SSuraj Jitindar Singh{
427430e2c5SAndrew Jones    [ "$run_all_tests" = "yes" ] && return 1
4357ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && return 0
449a008986SSuraj Jitindar Singh
459a008986SSuraj Jitindar Singh    while true; do
46d76bf076SAndrew Jones        read -r -p "Test marked not to be run by default, are you sure (y/N)? " yn
479a008986SSuraj Jitindar Singh        case $yn in
489a008986SSuraj Jitindar Singh            "Y" | "y" | "Yes" | "yes")
499a008986SSuraj Jitindar Singh                return 1
509a008986SSuraj Jitindar Singh                ;;
519a008986SSuraj Jitindar Singh            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
529a008986SSuraj Jitindar Singh                return 0
539a008986SSuraj Jitindar Singh                ;;
549a008986SSuraj Jitindar Singh        esac
559a008986SSuraj Jitindar Singh    done
569a008986SSuraj Jitindar Singh}
579a008986SSuraj Jitindar Singh
58851a00dfSSergey Bronnikovfunction print_result()
59851a00dfSSergey Bronnikov{
60851a00dfSSergey Bronnikov    local status="$1"
61851a00dfSSergey Bronnikov    local testname="$2"
62851a00dfSSergey Bronnikov    local summary="$3"
63851a00dfSSergey Bronnikov    local reason="$4"
64851a00dfSSergey Bronnikov
65851a00dfSSergey Bronnikov    if [ -z "$reason" ]; then
6609e55926SNicholas Piggin        echo "$($status) $testname $summary"
67851a00dfSSergey Bronnikov    else
6809e55926SNicholas Piggin        echo "$($status) $testname ($reason)"
69851a00dfSSergey Bronnikov    fi
70851a00dfSSergey Bronnikov}
71851a00dfSSergey Bronnikov
72b3733048SPaolo Bonzinifunction find_word()
73b3733048SPaolo Bonzini{
74b3733048SPaolo Bonzini    grep -Fq " $1 " <<< " $2 "
75b3733048SPaolo Bonzini}
76b3733048SPaolo Bonzini
776a53fc26SRadim Krčmářfunction run()
786a53fc26SRadim Krčmář{
796a53fc26SRadim Krčmář    local testname="$1"
806a53fc26SRadim Krčmář    local groups="$2"
816a53fc26SRadim Krčmář    local smp="$3"
826a53fc26SRadim Krčmář    local kernel="$4"
836a53fc26SRadim Krčmář    local opts="$5"
846a53fc26SRadim Krčmář    local arch="$6"
85ccb37496SNicholas Piggin    local machine="$7"
86ccb37496SNicholas Piggin    local check="${CHECK:-$8}"
87ccb37496SNicholas Piggin    local accel="$9"
88ccb37496SNicholas Piggin    local timeout="${10:-$TIMEOUT}" # unittests.cfg overrides the default
896a53fc26SRadim Krčmář
90c98ce6e0SAlexandru Elisei    if [ "${CONFIG_EFI}" == "y" ]; then
9196875e96SAndrew Jones        kernel=${kernel/%.flat/.efi}
929509ddf6SMarc Orr    fi
939509ddf6SMarc Orr
946a53fc26SRadim Krčmář    if [ -z "$testname" ]; then
956a53fc26SRadim Krčmář        return
966a53fc26SRadim Krčmář    fi
976a53fc26SRadim Krčmář
98b3733048SPaolo Bonzini    if [ -n "$only_tests" ] && ! find_word "$testname" "$only_tests"; then
99231a2e75SPaolo Bonzini        return
100231a2e75SPaolo Bonzini    fi
101231a2e75SPaolo Bonzini
102b3733048SPaolo Bonzini    if [ -n "$only_group" ] && ! find_word "$only_group" "$groups"; then
1036a53fc26SRadim Krčmář        return
1046a53fc26SRadim Krčmář    fi
1056a53fc26SRadim Krčmář
106e306ff04SNico Boehr    if [ -z "$GEN_SE_HEADER" ] && find_word "pv-host" "$groups"; then
107e306ff04SNico Boehr        print_result "SKIP" $testname "" "no gen-se-header available for pv-host test"
108e306ff04SNico Boehr        return
109e306ff04SNico Boehr    fi
110e306ff04SNico Boehr
111b3733048SPaolo Bonzini    if [ -z "$only_group" ] && find_word nodefault "$groups" &&
1129a008986SSuraj Jitindar Singh            skip_nodefault; then
113851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "test marked as manual run only"
1149a008986SSuraj Jitindar Singh        return;
1159a008986SSuraj Jitindar Singh    fi
1169a008986SSuraj Jitindar Singh
1176a53fc26SRadim Krčmář    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
118851a00dfSSergey Bronnikov        print_result "SKIP" $testname "" "$arch only"
119a3831260SAndrew Jones        return 2
1206a53fc26SRadim Krčmář    fi
1216a53fc26SRadim Krčmář
122ccb37496SNicholas Piggin    if [ -n "$machine" ] && [ -n "$MACHINE" ] && [ "$machine" != "$MACHINE" ]; then
123ccb37496SNicholas Piggin        print_result "SKIP" $testname "" "$machine only"
124ccb37496SNicholas Piggin        return 2
125ccb37496SNicholas Piggin    elif [ -n "$MACHINE" ]; then
126ccb37496SNicholas Piggin        machine="$MACHINE"
127ccb37496SNicholas Piggin    fi
128ccb37496SNicholas Piggin
129*08db0f5cSSean Christopherson    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [[ ! "$ACCEL" =~ ^$accel(,|$) ]]; then
130a61dedddSAndrew Jones        print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
131a61dedddSAndrew Jones        return 2
132a61dedddSAndrew Jones    elif [ -n "$ACCEL" ]; then
133a61dedddSAndrew Jones        accel="$ACCEL"
134a61dedddSAndrew Jones    fi
135a61dedddSAndrew Jones
1366a53fc26SRadim Krčmář    # check a file for a particular value before running a test
1376a53fc26SRadim Krčmář    # the check line can contain multiple files to check separated by a space
1386a53fc26SRadim Krčmář    # but each check parameter needs to be of the form <path>=<value>
139cde27d4cSPaolo Bonzini    if [ "$check" ]; then
1403df129a6SNicholas Piggin        # There is no globbing or whitespace allowed in check parameters.
1413df129a6SNicholas Piggin        # shellcheck disable=SC2206
142bc40a32aSSean Christopherson        check=($check)
143d76bf076SAndrew Jones        for check_param in "${check[@]}"; do
1446a53fc26SRadim Krčmář            path=${check_param%%=*}
1456a53fc26SRadim Krčmář            value=${check_param#*=}
146cde27d4cSPaolo Bonzini            if ! [ -f "$path" ] || [ "$(cat $path)" != "$value" ]; then
147851a00dfSSergey Bronnikov                print_result "SKIP" $testname "" "$path not equal to $value"
148a3831260SAndrew Jones                return 2
1496a53fc26SRadim Krčmář            fi
1506a53fc26SRadim Krčmář        done
151cde27d4cSPaolo Bonzini    fi
1526a53fc26SRadim Krčmář
1532607d2d6SNikos Nikoleris    log=$(premature_failure) && {
1549509ddf6SMarc Orr        skip=true
1552607d2d6SNikos Nikoleris        if [ "${CONFIG_EFI}" == "y" ]; then
1562607d2d6SNikos Nikoleris            if [ "$ARCH" == "x86_64" ] &&
1572607d2d6SNikos Nikoleris               [[ "$(tail -1 <<<"$log")" =~ "Dummy Hello World!" ]]; then
1582607d2d6SNikos Nikoleris                   skip=false
1592607d2d6SNikos Nikoleris            elif [ "$ARCH" == "arm64" ] &&
1602607d2d6SNikos Nikoleris               [[ "$(tail -2 <<<"$log" | head -1)" =~ "Dummy Hello World!" ]]; then
1619509ddf6SMarc Orr                   skip=false
1629509ddf6SMarc Orr            fi
1632607d2d6SNikos Nikoleris        fi
1642607d2d6SNikos Nikoleris
1659509ddf6SMarc Orr        if [ ${skip} == true ]; then
166a99b4e2eSShaoqin Huang            print_result "SKIP" $testname "" "$(tail -1 <<<"$log")"
167d5f55dccSRadim Krčmář            return 77
1689509ddf6SMarc Orr        fi
169d5f55dccSRadim Krčmář    }
170d5f55dccSRadim Krčmář
171d5f55dccSRadim Krčmář    cmdline=$(get_cmdline $kernel)
172745f5eb8SAndrew Jones    if find_word "migration" "$groups"; then
17337abdda9SThomas Huth        cmdline="MIGRATION=yes $cmdline"
17437abdda9SThomas Huth    fi
1755f65d6f4SNico Boehr    if find_word "panic" "$groups"; then
1765f65d6f4SNico Boehr        cmdline="PANIC=yes $cmdline"
1775f65d6f4SNico Boehr    fi
1785b842da9SAndrew Jones    if [ "$verbose" = "yes" ]; then
1796a53fc26SRadim Krčmář        echo $cmdline
1806a53fc26SRadim Krčmář    fi
1816a53fc26SRadim Krčmář
1826a53fc26SRadim Krčmář    # extra_params in the config file may contain backticks that need to be
183e9ae9613SRadim Krčmář    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
184e9ae9613SRadim Krčmář    # preserve the exit status.
1854dd0bbe3SNina Schoetterl-Glausch    summary=$(eval "$cmdline" 2> >(RUNTIME_log_stderr $testname) \
186e01499dbSMarc Hartmayer                             > >(tee >(RUNTIME_log_stdout $testname $kernel) | extract_summary))
1875af378ddSRadim Krčmář    ret=$?
18857ab5a6dSThomas Huth    [ "$KUT_STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $testname $kernel)
1896a53fc26SRadim Krčmář
190b2a2aa5dSAndrew Jones    if [ $ret -eq 0 ]; then
191851a00dfSSergey Bronnikov        print_result "PASS" $testname "$summary"
192a0833bfcSRadim Krčmář    elif [ $ret -eq 77 ]; then
193851a00dfSSergey Bronnikov        print_result "SKIP" $testname "$summary"
194fd149358SAndrew Jones    elif [ $ret -eq 124 ]; then
195851a00dfSSergey Bronnikov        print_result "FAIL" $testname "" "timeout; duration=$timeout"
1968375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
1978375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: timeout; duration=$timeout" >&3
1988375379fSNico Boehr        fi
1998727c886SAndrew Jones    elif [ $ret -gt 127 ]; then
2008375379fSNico Boehr        signame="SIG"$(kill -l $(($ret - 128)))
2018375379fSNico Boehr        print_result "FAIL" $testname "" "terminated on $signame"
2028375379fSNico Boehr        if [ "$tap_output" = "yes" ]; then
2038375379fSNico Boehr            echo "not ok TEST_NUMBER - ${testname}: terminated on $signame" >&3
2048375379fSNico Boehr        fi
2058375379fSNico Boehr    elif [ $ret -eq 127 ] && [ "$tap_output" = "yes" ]; then
2068375379fSNico Boehr        echo "not ok TEST_NUMBER - ${testname}: aborted" >&3
2076a53fc26SRadim Krčmář    else
208851a00dfSSergey Bronnikov        print_result "FAIL" $testname "$summary"
2096a53fc26SRadim Krčmář    fi
2105af378ddSRadim Krčmář
2115af378ddSRadim Krčmář    return $ret
2126a53fc26SRadim Krčmář}
2136a53fc26SRadim Krčmář
214bc52c0c8SAndrew Jones#
215bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus.
216bc52c0c8SAndrew Jones#
2175dd20ec7SAndrew Jonesfunction probe_maxsmp()
2185dd20ec7SAndrew Jones{
2195dd20ec7SAndrew Jones	local smp
2205dd20ec7SAndrew Jones
221a481914fSAndrew Jones	if smp=$($RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP |& grep 'SMP CPUs'); then
2225dd20ec7SAndrew Jones		smp=${smp##* }
223a481914fSAndrew Jones		smp=${smp/\(}
224a481914fSAndrew Jones		smp=${smp/\)}
2255dd20ec7SAndrew Jones		echo "Restricting MAX_SMP from ($MAX_SMP) to the max supported ($smp)" >&2
2265dd20ec7SAndrew Jones		MAX_SMP=$smp
22717b23734SColton Lewis	fi
2285dd20ec7SAndrew Jones}
229