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