#!/usr/bin/env bash

readlink --canonicalize / &> /dev/null || readlink() { greadlink "$@" ; } # for MacOS
MYDIR=$(dirname -- "$(readlink -f -- "$0")")
ARTIFACTS=$MYDIR/gerrit/artifacts
PLUGIN=depends-on
BAZEL_BUILT_JAR=$MYDIR/../../bazel-bin/$PLUGIN.jar

die() { echo -e "\nERROR: $@" ; kill $$ ; exit 1 ; } # error_message

progress() { # message cmd [args]...
    local message=$1 ; shift
    echo -n "$message"
    "$@" &
    local pid=$!
    while kill -0 $pid 2> /dev/null ; do
        echo -n "."
        sleep 2
    done
    echo
    wait "$pid"
}

usage() { # [error_message]
    local prog=$(basename "$0")
    cat <<EOF
Usage:
    $prog [--plugin <plugin name> <JAR path>] [--gerrit-war|-g <FILE_PATH>]

    This tool runs the plugin functional tests in a Docker environment built
    from the gerritcodereview/gerrit base Docker image.

    Options:
    --help|-h
    --gerrit-war|-g                 optional path to Gerrit WAR file. Will
                                    likely not function correctly if it's a
                                    different MAJOR.MINOR version than the
                                    default version in
                                    test/docker/gerrit/Dockerfile.
    --plugin                        optional plugin name and path to JAR file
                                    Defaults to 'depends-on' '$BAZEL_BUILT_JAR'
                                    Can be repeated to install additional
                                    plugins.

EOF

    [ -n "$1" ] && echo -e "\nERROR: $1" && exit 1
    exit 0
}

check_prerequisite() {
    docker --version > /dev/null || die "docker is not installed"
    docker-compose --version > /dev/null || die "docker-compose is not installed"
}

build_images() {
    docker-compose "${COMPOSE_ARGS[@]}" build --quiet
}

run_depends_on_plugin_tests() {
    docker-compose "${COMPOSE_ARGS[@]}" up --detach
    docker-compose "${COMPOSE_ARGS[@]}" exec -T --user=admin run_tests \
        '/depends_on/test/docker/run_tests/start.sh'
}

fetch_artifact() { # source_location output_path
    if [[ "$1" =~ ^file://|^http://|^https:// ]] ; then
        curl --silent --fail --netrc "$1" --output "$2" --create-dirs || die "unable to fetch $1"
    else
        cp -f "$1" "$2" || die "unable to copy $1"
    fi
}

fetch_artifacts() {
    local plugin_name
    [ -n "$GERRIT_WAR" ] && fetch_artifact "$GERRIT_WAR" "$ARTIFACTS/bin/gerrit.war"
    for plugin_name in "${!PLUGIN_JAR_BY_NAME[@]}" ; do
        if [ -n "${PLUGIN_JAR_BY_NAME["$plugin_name"]}" ] ; then
            fetch_artifact "${PLUGIN_JAR_BY_NAME[$plugin_name]}" \
                "$ARTIFACTS/plugins/$plugin_name.jar"
        fi
    done
}

cleanup() {
    docker-compose "${COMPOSE_ARGS[@]}" down -v --rmi local 2>/dev/null
    rm -rf "$ARTIFACTS"
}

declare -A PLUGIN_JAR_BY_NAME
while (( "$#" )); do
    case "$1" in
        --help|-h)                    usage ;;
        --gerrit-war|-g)              shift ; GERRIT_WAR=$1 ;;
        --plugin)                     shift ; PLUGIN_JAR_BY_NAME["$1"]=$2 ; shift ;;
        *)                            usage "invalid argument $1" ;;
    esac
    shift
done

PROJECT_NAME="depends_on_$$"
COMPOSE_YAML="$MYDIR/docker-compose.yaml"
COMPOSE_ARGS=(--project-name "$PROJECT_NAME" -f "$COMPOSE_YAML")
check_prerequisite
mkdir -p -- "$ARTIFACTS/bin" "$ARTIFACTS/plugins"
if [ -z "${PLUGIN_JAR_BY_NAME["$PLUGIN"]}" ] ; then
    PLUGIN_JAR_BY_NAME["$PLUGIN"]=$BAZEL_BUILT_JAR
fi
if [ ! -e "${PLUGIN_JAR_BY_NAME["$PLUGIN"]}" ] ; then
    usage "Cannot find plugin jar, did you forget --plugin?"
fi
progress "Fetching artifacts" fetch_artifacts
( trap cleanup EXIT SIGTERM
    progress "Building docker images" build_images
    run_depends_on_plugin_tests
)
