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