#!/bin/bash
export STANDALONE=yes
export ENVIRON_DEFAULT=yes
export HOST=$(uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/')
export PRETTY_PRINT_STACKS=no
export ARCH=arm
export ARCH_NAME=arm
export PROCESSOR=cortex-a15
echo BUILD_HEAD=
trap 'rm -f $cleanup' EXIT
ERRATATXT=`mktemp`
cleanup="$ERRATATXT $cleanup"
base64 -d << 'BIN_EOF' | zcat > $ERRATATXT || exit 2
H4sICIvjOl4AA2VycmF0YS50eHQAvZE/b8IwEMX3fIqTMtPWTnAabwywtF27Ro45iEXOifwnIt++
VoFKRS1VF9769O737i5ffJdc3NZf/k/KctADkQlwlgQy1lAkOKCz2MOVJPhIpNyckoxDh0fYmr0J
PjkTOm8Gex25JLP8HgvVWOwqxWtRl0+nwuVD/Uulk68ciVLCy/ubhJGihI05wmrldFdw0LPuMd0o
2oAOlNbofVa1oi1FwZh6Xl4YjN1ifA5PoMczbE2xVwEhdAjrVwZjN3sIhhLD4d74BPOZ0JVabjVy
3hZfGP4fzC5t4lTqDMbCYaJm9No0kx5jM9j7/OMDNZHCJsYCAAA=
BIN_EOF
chmod +x $ERRATATXT
export ERRATATXT
bin=`mktemp`
cleanup="$bin $cleanup"
base64 -d << 'BIN_EOF' | zcat > $bin || exit 2
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
7vjWVs35mx4vtubKPOH4ZT5w0ptXI995YV2ghPCBusoS0EhQxH51HuNoN+G9ebq397Um8lLvuSpG
R+6z+7C3z0loufO3Jz1eshKw5CeEfzMDNpwB2ybLjabqAMt3CMt3Xgd8u2rjqGMev2oR3vcxf28E
U7PR3i+I6pLbMC5Oj9sn59aNW0Y7+95Be9W13Oce9uYj73jrh0+84+XzqNTN97jet7tq5Dw3+QvX
K3933D4Zqw8cODv5HvLwvluwx1V23+tcR2Lo0dRk7ksm8bfYCphRa1IqYXN/Is26NhWcvcPy9mJo
k/uFTIbMx3h6cQzKW4DyDX6PUlTLtUbca6kytsPl/inhlofdnaGQ3OPmv7/trdOgXJh10uOJuqrf
cnOH24D6ye/1qZgyWTdjacoQS1OTjYMO+5VzvLhnTbIT9sEpXt0CZTusyvIHUbdWVbdVzkxZt2rG
lE4w9MUpfrOSdZPr12Pe+nV+k++bCocsk3OP1M2IPz8unWuwuafcjyXNXSLnbG9BX46hf7LPcOjr
Cmtev+51+vWtc/r1a/wGker/r+D9kdaF/p2blnn/WH5vbzX3TnuqKy4GrznvpjxdLWNb8tA3yxkH
Y25LhcxXJQ645/a6d/ptQ0kfBVno4wU597RH6qyUR89KfUF9iwNl0N6hTh1Wdb8G17/gN0M6hKRP
jfUhXao81qGurBd43OthhcNp73r0etU7mevrPXjWJT8D19XI+/CUQDRyKdeHDU5X/zZ9YjWO7+BY
j6MVx8s44jj+y28pL3Mpl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ip
l3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ip
l3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ipl3Ip
l3Ipl3Ipl3Ipl3Lp/+bU0ra+iefF7cbGxvq2dmOOsb5la5vR2rhla1NrYwOfxWqWrjBub2xta2re
bExrmDkNd5s2316/salhxoatm9e34z7h6jdsaNrc1H7njKbNG5pnZL23YQPuLauuXly7eO3V11Uv
XUaYrZsb72hpXN/e2MCy16KQ1sb2ra2bDRSxtXG+sb5+48bG1oVLY6unNVTw2cJpsl4AlqXU3NbU
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
ANo9VMfIIgEA
BIN_EOF
chmod +x $bin
RUNTIME_arch_run=`mktemp`
cleanup="$RUNTIME_arch_run $cleanup"
base64 -d << 'BIN_EOF' | zcat > $RUNTIME_arch_run || exit 2
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
BIN_EOF
chmod +x $RUNTIME_arch_run
exec {stdout}>&1
RUNTIME_log_stdout () { cat >&$stdout; }
RUNTIME_log_stderr () { cat >&2; }
: "${RUNTIME_arch_run?}"
: ${MAX_SMP:=$(getconf _NPROCESSORS_ONLN)}
: ${TIMEOUT:=90s}

PASS() { echo -ne "\e[32mPASS\e[0m"; }
SKIP() { echo -ne "\e[33mSKIP\e[0m"; }
FAIL() { echo -ne "\e[31mFAIL\e[0m"; }

extract_summary()
{
    local cr=$'\r'
    tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
}

# We assume that QEMU is going to work if it tried to load the kernel
premature_failure()
{
    local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"

    echo "$log" | grep "_NO_FILE_4Uhere_" |
        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
        return 1

    RUNTIME_log_stderr <<< "$log"

    echo "$log"
    return 0
}

get_cmdline()
{
    local kernel=$1
    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
}

skip_nodefault()
{
    [ "$run_all_tests" = "yes" ] && return 1
    [ "$STANDALONE" != "yes" ] && return 0

    while true; do
        read -r -p "Test marked not to be run by default, are you sure (y/N)? " yn
        case $yn in
            "Y" | "y" | "Yes" | "yes")
                return 1
                ;;
            "" | "N" | "n" | "No" | "no" | "q" | "quit" | "exit")
                return 0
                ;;
        esac
    done
}

function print_result()
{
    # output test results in a TAP format
    # https://testanything.org/tap-version-13-specification.html

    local status="$1"
    local testname="$2"
    local summary="$3"
    local reason="$4"

    if [ -z "$reason" ]; then
        echo "`$status` $testname $summary"
    else
        echo "`$status` $testname ($reason)"
    fi
}

function run()
{
    local testname="$1"
    local groups="$2"
    local smp="$3"
    local kernel="$4"
    local opts="$5"
    local arch="$6"
    local check="${CHECK:-$7}"
    local accel="${ACCEL:-$8}"
    local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default

    if [ -z "$testname" ]; then
        return
    fi

    if [ -n "$only_tests" ] && ! grep -qw "$testname" <<<$only_tests; then
        return
    fi

    if [ -n "$only_group" ] && ! grep -qw "$only_group" <<<$groups; then
        return
    fi

    if [ -z "$only_group" ] && grep -qw "nodefault" <<<$groups &&
            skip_nodefault; then
        print_result "SKIP" $testname "" "test marked as manual run only"
        return;
    fi

    if [ -n "$arch" ] && [ "$arch" != "$ARCH" ]; then
        print_result "SKIP" $testname "" "$arch only"
        return 2
    fi

    # check a file for a particular value before running a test
    # the check line can contain multiple files to check separated by a space
    # but each check parameter needs to be of the form <path>=<value>
    for check_param in "${check[@]}"; do
        path=${check_param%%=*}
        value=${check_param#*=}
        if [ "$path" ] && [ "$(cat $path)" != "$value" ]; then
            print_result "SKIP" $testname "" "$path not equal to $value"
            return 2
        fi
    done

    last_line=$(premature_failure > >(tail -1)) && {
        print_result "SKIP" $testname "" "$last_line"
        return 77
    }

    cmdline=$(get_cmdline $kernel)
    if grep -qw "migration" <<<$groups ; then
        cmdline="MIGRATION=yes $cmdline"
    fi
    if [ "$verbose" = "yes" ]; then
        echo $cmdline
    fi

    # extra_params in the config file may contain backticks that need to be
    # expanded, so use eval to start qemu.  Use "> >(foo)" instead of a pipe to
    # preserve the exit status.
    summary=$(eval $cmdline 2> >(RUNTIME_log_stderr) \
                             > >(tee >(RUNTIME_log_stdout $kernel) | extract_summary))
    ret=$?
    [ "$STANDALONE" != "yes" ] && echo > >(RUNTIME_log_stdout $kernel)

    if [ $ret -eq 0 ]; then
        print_result "PASS" $testname "$summary"
    elif [ $ret -eq 77 ]; then
        print_result "SKIP" $testname "$summary"
    elif [ $ret -eq 124 ]; then
        print_result "FAIL" $testname "" "timeout; duration=$timeout"
    elif [ $ret -gt 127 ]; then
        print_result "FAIL" $testname "" "terminated on SIG$(kill -l $(($ret - 128)))"
    else
        print_result "FAIL" $testname "$summary"
    fi

    return $ret
}

#
# Probe for MAX_SMP, in case it's less than the number of host cpus.
#
# This probing currently only works for ARM, as x86 bails on another
# error first. Also, this probing isn't necessary for any ARM hosts
# running kernels later than v4.3, i.e. those including ef748917b52
# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
# point when maintaining the while loop gets too tiresome, we can
# just remove it...
while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
		|& grep -qi 'exceeds max CPUs'; do
	MAX_SMP=$((MAX_SMP >> 1))
done
run psci psci \$MAX_SMP $bin '' '' '' '' ''
