1103832e8SRadim Krčmář: "${RUNTIME_arch_run?}" 2fd149358SAndrew Jones: ${MAX_SMP:=$(getconf _NPROCESSORS_CONF)} 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ář{ 11*0023f5e4SRadim Krčmář tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/$/)/' 12e9ae9613SRadim Krčmář} 13e9ae9613SRadim Krčmář 14d5f55dccSRadim Krčmář# We assume that QEMU is going to work if it tried to load the kernel 15d5f55dccSRadim Krčmářpremature_failure() 16d5f55dccSRadim Krčmář{ 17d5f55dccSRadim Krčmář local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)" 18d5f55dccSRadim Krčmář 19df477983SLukáš Doktor echo "$log" | grep "_NO_FILE_4Uhere_" | 20df477983SLukáš Doktor grep -q -e "could not load kernel" -e "error loading" && 21d5f55dccSRadim Krčmář return 1 22d5f55dccSRadim Krčmář 23d5f55dccSRadim Krčmář RUNTIME_log_stderr <<< "$log" 24d5f55dccSRadim Krčmář 25df477983SLukáš Doktor echo "$log" 26d5f55dccSRadim Krčmář return 0 27d5f55dccSRadim Krčmář} 28d5f55dccSRadim Krčmář 29d5f55dccSRadim Krčmářget_cmdline() 30d5f55dccSRadim Krčmář{ 31d5f55dccSRadim Krčmář local kernel=$1 32d5f55dccSRadim Krčmář echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts" 33d5f55dccSRadim Krčmář} 34d5f55dccSRadim Krčmář 359a008986SSuraj Jitindar Singhskip_nodefault() 369a008986SSuraj Jitindar Singh{ 377430e2c5SAndrew Jones [ "$run_all_tests" = "yes" ] && return 1 389a008986SSuraj Jitindar Singh [ "$STANDALONE" != "yes" ] && return 0 399a008986SSuraj Jitindar Singh 409a008986SSuraj Jitindar Singh while true; do 419a008986SSuraj Jitindar Singh read -p "Test marked not to be run by default, are you sure (y/N)? " yn 429a008986SSuraj Jitindar Singh case $yn in 439a008986SSuraj Jitindar Singh "Y" | "y" | "Yes" | "yes") 449a008986SSuraj Jitindar Singh return 1 459a008986SSuraj Jitindar Singh ;; 469a008986SSuraj Jitindar Singh "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit") 479a008986SSuraj Jitindar Singh return 0 489a008986SSuraj Jitindar Singh ;; 499a008986SSuraj Jitindar Singh esac 509a008986SSuraj Jitindar Singh done 519a008986SSuraj Jitindar Singh} 529a008986SSuraj Jitindar Singh 536a53fc26SRadim Krčmářfunction run() 546a53fc26SRadim Krčmář{ 556a53fc26SRadim Krčmář local testname="$1" 566a53fc26SRadim Krčmář local groups="$2" 576a53fc26SRadim Krčmář local smp="$3" 586a53fc26SRadim Krčmář local kernel="$4" 596a53fc26SRadim Krčmář local opts="$5" 606a53fc26SRadim Krčmář local arch="$6" 61e9bdb8b5SAndrew Jones local check="${CHECK:-$7}" 62e9bdb8b5SAndrew Jones local accel="${ACCEL:-$8}" 63fd149358SAndrew Jones local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default 646a53fc26SRadim Krčmář 656a53fc26SRadim Krčmář if [ -z "$testname" ]; then 666a53fc26SRadim Krčmář return 676a53fc26SRadim Krčmář fi 686a53fc26SRadim Krčmář 699a008986SSuraj Jitindar Singh if [ -n "$only_group" ] && ! grep -qw "$only_group" <<<$groups; then 706a53fc26SRadim Krčmář return 716a53fc26SRadim Krčmář fi 726a53fc26SRadim Krčmář 739a008986SSuraj Jitindar Singh if [ -z "$only_group" ] && grep -qw "nodefault" <<<$groups && 749a008986SSuraj Jitindar Singh skip_nodefault; then 759a008986SSuraj Jitindar Singh echo -e "`SKIP` $testname (test marked as manual run only)" 769a008986SSuraj Jitindar Singh return; 779a008986SSuraj Jitindar Singh fi 789a008986SSuraj Jitindar Singh 796a53fc26SRadim Krčmář if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then 809c51d8c9SRadim Krčmář echo "`SKIP` $1 ($arch only)" 81a3831260SAndrew Jones return 2 826a53fc26SRadim Krčmář fi 836a53fc26SRadim Krčmář 846a53fc26SRadim Krčmář # check a file for a particular value before running a test 856a53fc26SRadim Krčmář # the check line can contain multiple files to check separated by a space 866a53fc26SRadim Krčmář # but each check parameter needs to be of the form <path>=<value> 876a53fc26SRadim Krčmář for check_param in ${check[@]}; do 886a53fc26SRadim Krčmář path=${check_param%%=*} 896a53fc26SRadim Krčmář value=${check_param#*=} 906a53fc26SRadim Krčmář if [ "$path" ] && [ "$(cat $path)" != "$value" ]; then 919c51d8c9SRadim Krčmář echo "`SKIP` $1 ($path not equal to $value)" 92a3831260SAndrew Jones return 2 936a53fc26SRadim Krčmář fi 946a53fc26SRadim Krčmář done 956a53fc26SRadim Krčmář 968727c886SAndrew Jones last_line=$(premature_failure > >(tail -1)) && { 97d5f55dccSRadim Krčmář echo "`SKIP` $1 ($last_line)" 98d5f55dccSRadim Krčmář return 77 99d5f55dccSRadim Krčmář } 100d5f55dccSRadim Krčmář 101d5f55dccSRadim Krčmář cmdline=$(get_cmdline $kernel) 10237abdda9SThomas Huth if grep -qw "migration" <<<$groups ; then 10337abdda9SThomas Huth cmdline="MIGRATION=yes $cmdline" 10437abdda9SThomas Huth fi 1055b842da9SAndrew Jones if [ "$verbose" = "yes" ]; then 1066a53fc26SRadim Krčmář echo $cmdline 1076a53fc26SRadim Krčmář fi 1086a53fc26SRadim Krčmář 1096a53fc26SRadim Krčmář # extra_params in the config file may contain backticks that need to be 110e9ae9613SRadim Krčmář # expanded, so use eval to start qemu. Use "> >(foo)" instead of a pipe to 111e9ae9613SRadim Krčmář # preserve the exit status. 1121abbc2ceSRadim Krčmář summary=$(eval $cmdline 2> >(RUNTIME_log_stderr) \ 1131abbc2ceSRadim Krčmář > >(tee >(RUNTIME_log_stdout $kernel) | extract_summary)) 1145af378ddSRadim Krčmář ret=$? 115f1071c6dSAndrew Jones [ "$STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $kernel) 1166a53fc26SRadim Krčmář 117b2a2aa5dSAndrew Jones if [ $ret -eq 0 ]; then 118e9ae9613SRadim Krčmář echo "`PASS` $1 $summary" 119a0833bfcSRadim Krčmář elif [ $ret -eq 77 ]; then 120e9ae9613SRadim Krčmář echo "`SKIP` $1 $summary" 121fd149358SAndrew Jones elif [ $ret -eq 124 ]; then 1229c51d8c9SRadim Krčmář echo "`FAIL` $1 (timeout; duration=$timeout)" 1238727c886SAndrew Jones elif [ $ret -gt 127 ]; then 1248727c886SAndrew Jones echo "`FAIL` $1 (terminated on SIG$(kill -l $(($ret - 128))))" 1256a53fc26SRadim Krčmář else 126e9ae9613SRadim Krčmář echo "`FAIL` $1 $summary" 1276a53fc26SRadim Krčmář fi 1285af378ddSRadim Krčmář 1295af378ddSRadim Krčmář return $ret 1306a53fc26SRadim Krčmář} 1316a53fc26SRadim Krčmář 132bc52c0c8SAndrew Jones# 133bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus. 134bc52c0c8SAndrew Jones# 135bc52c0c8SAndrew Jones# This probing currently only works for ARM, as x86 bails on another 136bc52c0c8SAndrew Jones# error first. Also, this probing isn't necessary for any ARM hosts 137bc52c0c8SAndrew Jones# running kernels later than v4.3, i.e. those including ef748917b52 138bc52c0c8SAndrew Jones# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some 139bc52c0c8SAndrew Jones# point when maintaining the while loop gets too tiresome, we can 140bc52c0c8SAndrew Jones# just remove it... 141bc52c0c8SAndrew Joneswhile $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \ 142bc52c0c8SAndrew Jones |& grep -qi 'exceeds max CPUs'; do 1436a53fc26SRadim Krčmář ((--MAX_SMP)) 1446a53fc26SRadim Krčmářdone 145