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