xref: /kvm-unit-tests/scripts/runtime.bash (revision 1abbc2cedc79eeee2efa0ef7425310a600fd7461)
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ář{
11e9ae9613SRadim Krčmář    tail -1 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/$/)/'
12e9ae9613SRadim Krčmář}
13e9ae9613SRadim Krčmář
146a53fc26SRadim Krčmářfunction run()
156a53fc26SRadim Krčmář{
166a53fc26SRadim Krčmář    local testname="$1"
176a53fc26SRadim Krčmář    local groups="$2"
186a53fc26SRadim Krčmář    local smp="$3"
196a53fc26SRadim Krčmář    local kernel="$4"
206a53fc26SRadim Krčmář    local opts="$5"
216a53fc26SRadim Krčmář    local arch="$6"
22e9bdb8b5SAndrew Jones    local check="${CHECK:-$7}"
23e9bdb8b5SAndrew Jones    local accel="${ACCEL:-$8}"
24fd149358SAndrew Jones    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default
256a53fc26SRadim Krčmář
266a53fc26SRadim Krčmář    if [ -z "$testname" ]; then
276a53fc26SRadim Krčmář        return
286a53fc26SRadim Krčmář    fi
296a53fc26SRadim Krčmář
306a53fc26SRadim Krčmář    if [ -n "$only_group" ] && ! grep -q "$only_group" <<<$groups; then
316a53fc26SRadim Krčmář        return
326a53fc26SRadim Krčmář    fi
336a53fc26SRadim Krčmář
346a53fc26SRadim Krčmář    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
359c51d8c9SRadim Krčmář        echo "`SKIP` $1 ($arch only)"
36a3831260SAndrew Jones        return 2
376a53fc26SRadim Krčmář    fi
386a53fc26SRadim Krčmář
396a53fc26SRadim Krčmář    # check a file for a particular value before running a test
406a53fc26SRadim Krčmář    # the check line can contain multiple files to check separated by a space
416a53fc26SRadim Krčmář    # but each check parameter needs to be of the form <path>=<value>
426a53fc26SRadim Krčmář    for check_param in ${check[@]}; do
436a53fc26SRadim Krčmář        path=${check_param%%=*}
446a53fc26SRadim Krčmář        value=${check_param#*=}
456a53fc26SRadim Krčmář        if [ "$path" ] && [ "$(cat $path)" != "$value" ]; then
469c51d8c9SRadim Krčmář            echo "`SKIP` $1 ($path not equal to $value)"
47a3831260SAndrew Jones            return 2
486a53fc26SRadim Krčmář        fi
496a53fc26SRadim Krčmář    done
506a53fc26SRadim Krčmář
51fd149358SAndrew Jones    cmdline="TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
525b842da9SAndrew Jones    if [ "$verbose" = "yes" ]; then
536a53fc26SRadim Krčmář        echo $cmdline
546a53fc26SRadim Krčmář    fi
556a53fc26SRadim Krčmář
566a53fc26SRadim Krčmář    # extra_params in the config file may contain backticks that need to be
57e9ae9613SRadim Krčmář    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
58e9ae9613SRadim Krčmář    # preserve the exit status.
59*1abbc2ceSRadim Krčmář    summary=$(eval $cmdline 2> >(RUNTIME_log_stderr) \
60*1abbc2ceSRadim Krčmář                             > >(tee >(RUNTIME_log_stdout $kernel) | extract_summary))
615af378ddSRadim Krčmář    ret=$?
626a53fc26SRadim Krčmář
63b2a2aa5dSAndrew Jones    if [ $ret -eq 0 ]; then
64e9ae9613SRadim Krčmář        echo "`PASS` $1 $summary"
65a0833bfcSRadim Krčmář    elif [ $ret -eq 77 ]; then
66e9ae9613SRadim Krčmář        echo "`SKIP` $1 $summary"
67fd149358SAndrew Jones    elif [ $ret -eq 124 ]; then
689c51d8c9SRadim Krčmář        echo "`FAIL` $1 (timeout; duration=$timeout)"
696a53fc26SRadim Krčmář    else
70e9ae9613SRadim Krčmář        echo "`FAIL` $1 $summary"
716a53fc26SRadim Krčmář    fi
725af378ddSRadim Krčmář
735af378ddSRadim Krčmář    return $ret
746a53fc26SRadim Krčmář}
756a53fc26SRadim Krčmář
76bc52c0c8SAndrew Jones#
77bc52c0c8SAndrew Jones# Probe for MAX_SMP, in case it's less than the number of host cpus.
78bc52c0c8SAndrew Jones#
79bc52c0c8SAndrew Jones# This probing currently only works for ARM, as x86 bails on another
80bc52c0c8SAndrew Jones# error first. Also, this probing isn't necessary for any ARM hosts
81bc52c0c8SAndrew Jones# running kernels later than v4.3, i.e. those including ef748917b52
82bc52c0c8SAndrew Jones# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
83bc52c0c8SAndrew Jones# point when maintaining the while loop gets too tiresome, we can
84bc52c0c8SAndrew Jones# just remove it...
85bc52c0c8SAndrew Joneswhile $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
86bc52c0c8SAndrew Jones		|& grep -qi 'exceeds max CPUs'; do
876a53fc26SRadim Krčmář	((--MAX_SMP))
886a53fc26SRadim Krčmářdone
89