#!/bin/bash

# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

# Run multiple early-boot entropy collector tests, with different kernel cmdlines.
#
# This script listens on stdin for Zircon cmdlines. For each line passed to stdin, a new early boot
# test is run with that line passed as the kernel cmdline.

# This script requires an output directory, passed as the first (and only) non-option command line
# argument. There are also a number of options, described in the HELP function below.

set -e -u
CDPATH=
ZIRCONDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"

# Print help message and exit
function HELP {
    if [[ $HELPFLAG -lt 2 ]]; then
        echo "Usage: $0 [options] -- <cmdline1> <cmdline2> ..." >&2
        echo >&2
        echo "Repeatedly runs boot tests, using each provided cmdline in turn" >&2
        echo "Mind your shell escapes when calling this script." >&2
    fi
    echo "Mandatory options (if omitted, you will be prompted):" >&2
    echo "    -n <name>   : nodename (only mandatory for non-qemu (netboot) targets)" >&2
    echo "    -o <dir>    : output directory" >&2
    echo "    -s <source> : entropy source to test: hw_rng, jitterentropy" >&2
    echo "    -t <target> : qemu-x86, qemu-arm64, x64, odroidc2, or rpi3" >&2
    echo >&2
    echo "Optional options (if omitted, default as specified):" >&2
    echo "    -b <dir>    : build directory [default: autodetected from -t]" >&2
    echo "    -h          : show help then terminate" >&2
    if [[ $HELPFLAG -lt 2 ]]; then
        echo "                : if passed twice, only print options (meant for" >&2
        echo "                : use by scripts that call $0)" >&2
    fi
    echo "    -l <len>    : bytes of data to collect  [default: 1024*1024]" >&2
    echo "    -r          : Use release build [default: false]" >&2
    exit 1
}

# build-related options
ARCH=
BUILDDIR=
BUILD_ARGS=
BUILD_LEN=$((1024*1024))
BUILD_PROJECT=
BUILDDIR_SUFFIX=
HELPFLAG=0
METHOD=
LEN=$((1024*1024))
NODENAME=
OUTDIR=
SOURCE=
TARGET=

while getopts "b:hl:n:o:rs:t:" FLAG; do
    case "$FLAG" in
        b) BUILDDIR="$OPTARG";;
        h) HELPFLAG=$((HELPFLAG + 1));;
        l)
            LEN="$OPTARG"
            if [[ $LEN -gt $BUILD_LEN ]]; then BUILD_LEN="$LEN"; fi
            ;;
        n) NODENAME="$OPTARG";;
        o) OUTDIR="$OPTARG";;
        r)
            BUILDDIR_SUFFIX+="-release"
            BUILD_ARGS+="DEBUG=0 "
            ;;
        s) SOURCE="$OPTARG";;
        t) TARGET="$OPTARG";;
        \?)
            echo "unrecognized option" >&2
            HELP
            ;;
    esac
done

if (( $HELPFLAG )); then
    HELP
fi


LASTOPT=$((OPTIND-1))
if [[ $LASTOPT -lt 1 || ${!LASTOPT} != "--" ]]; then
    echo "didn't see '--' at end of options" >&2
    HELP
else
    shift $((OPTIND-1))
fi

if [[ -z $OUTDIR ]]; then
    echo -n "output directory: " >&2
    read -r OUTDIR
fi
if [[ ! -d $OUTDIR ]]; then
    echo "missing output directory (tried '$OUTDIR')" >&2
    HELP
fi

# prompt for SOURCE if needed
if [[ -z $SOURCE ]]; then
    echo "choose entropy source:" >&2
    select SOURCE in "hw_rng" "jitterentropy"; do
        if [[ -n $SOURCE ]]; then break; fi
    done
fi
if ! [[ $SOURCE = "hw_rng" || $SOURCE = "jitterentropy" ]]; then
    echo "unrecognized source '$SOURCE'" >&2
    HELP
fi
# handle the TARGET variable
if [[ -z $TARGET ]]; then
    echo "choose target:" >&2
    select TARGET in "qemu-x86" "qemu-arm64" "x64" "odroidc2" "rpi3"; do
        if [[ -n $TARGET ]]; then break; fi
    done
fi
case "$TARGET" in
    qemu-x86)
        ARCH="x86"
        BUILD_PROJECT="x86"
        METHOD=qemu
        ;;
    qemu-arm64)
        ARCH="arm64"
        BUILD_PROJECT="arm64"
        METHOD=qemu
        ;;
    x64)
        ARCH="x86"
        BUILD_PROJECT="x86"
        METHOD=netboot
        ;;
    odroidc2 | rpi3)
        ARCH="arm64"
        BUILD_PROJECT="$TARGET"
        METHOD=netboot
        ;;
    *)
        echo "unrecognized target '$TARGET'" >&2
        HELP
        ;;
esac
if [[ -z $BUILDDIR ]]; then
    BUILDDIR="$ZIRCONDIR/build-$BUILD_PROJECT$BUILDDIR_SUFFIX"
fi

# build Zircon
(
    cd "$ZIRCONDIR"
    scripts/entropy-test/make-parallel -l "$BUILD_LEN" $BUILD_ARGS "$BUILD_PROJECT"
) || exit 1

# choose nodename (after build, since we need netls)
if [[ $METHOD = netboot && -z $NODENAME ]]; then
    readarray -t NODENAMES < <($BUILDDIR/tools/netls --nowait --timeout=1000 |
        sed 's/^\s*device\s\+//;s/\s\+([a-fA-F0-9:/]\+)\s*$//')
    echo "choose device to run on:" >&2
    select NODENAME in "${NODENAMES[@]}"; do
        if [[ -n $NODENAME ]]; then break; fi
    done
fi

# NODENAME is magic: if omitted, we don't pass -n to run-boot-test.
# So, make NODENAME split into either 0 or 2 words when passed unquoted.
if [[ -n $NODENAME ]]; then
    NODENAME="$(printf -- "-n %q" "$NODENAME")"
fi

# run the tests
for CMDLINE in "$@"; do
    STATUS="bad"
    for ((tries = 0; tries < 5; tries++)); do
        # $NODENAME is intentionally not quoted. See above.
        if "$ZIRCONDIR"/scripts/entropy-test/run-boot-test -a "$ARCH" -c "$CMDLINE" -l "$LEN" \
            -m "$METHOD" $NODENAME  -o "$BUILDDIR" -s "$SOURCE" "$OUTDIR"; then
            STATUS="good"
            break
        fi
    done
    if [[ $STATUS != "good" ]]; then
        echo "Failed too many times. Aborting." >&2
        echo "Failed cmdline: $CMDLINE" >&2
        exit 1
    fi
done
