test/docker: Support installing multiple plugins

Replace the non-generic '--events-plugin-jar' option with a generic
'--plugin' option that can be specified multiple times to install
additional plugins for testing.

This also makes it easier to build CI systems that can use a common
testing interface.

Change-Id: I1acc33e1062048885c7a045d218501a6029c3664
diff --git a/BUILD b/BUILD
index df9b631..a2152c9 100644
--- a/BUILD
+++ b/BUILD
@@ -38,7 +38,7 @@
     size = "medium",
     srcs = ["test/docker/run.sh"],
     args = [
-        "--events-plugin-jar",
+        "--plugin", plugin_name,
         "$(location :events)",
     ],
     data = [plugin_name] + glob(["test/**"]),
diff --git a/test/docker/gerrit/Dockerfile b/test/docker/gerrit/Dockerfile
index 748ccc4..179348f 100755
--- a/test/docker/gerrit/Dockerfile
+++ b/test/docker/gerrit/Dockerfile
@@ -1,13 +1,14 @@
 FROM gerritcodereview/gerrit:3.5.0.1-ubuntu20
 
+ENV GERRIT_SITE /var/gerrit
+COPY artifacts/plugins/ $GERRIT_SITE/plugins/
+
 USER root
 
-ENV GERRIT_SITE /var/gerrit
 RUN git config -f "$GERRIT_SITE/etc/gerrit.config" auth.type \
     DEVELOPMENT_BECOME_ANY_ACCOUNT
 
-COPY artifacts /tmp/
-RUN cp /tmp/events.jar "$GERRIT_SITE/plugins/events.jar"
+COPY artifacts/bin/ /tmp/
 RUN { [ -e /tmp/gerrit.war ] && cp /tmp/gerrit.war "$GERRIT_SITE/bin/gerrit.war" ; } || true
 
 USER gerrit
diff --git a/test/docker/run.sh b/test/docker/run.sh
index f897104..40aa32e 100755
--- a/test/docker/run.sh
+++ b/test/docker/run.sh
@@ -3,7 +3,8 @@
 readlink -f / &> /dev/null || readlink() { greadlink "$@" ; } # for MacOS
 MYDIR=$(dirname -- "$(readlink -f -- "$0")")
 ARTIFACTS=$MYDIR/gerrit/artifacts
-BAZEL_BUILT_JAR=$MYDIR/../../bazel-bin/events.jar
+PLUGIN=events
+BAZEL_BUILT_JAR=$MYDIR/../../bazel-bin/$PLUGIN.jar
 
 die() { echo -e "\nERROR: $@" ; kill $$ ; exit 1 ; } # error_message
 
@@ -24,7 +25,7 @@
     local prog=$(basename "$0")
     cat <<EOF
 Usage:
-    $prog [--events-plugin-jar|-t <FILE_PATH>] [--gerrit-war|-g <FILE_PATH>]
+    $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.
@@ -35,8 +36,10 @@
                                 not function correctly if it's a different
                                 MAJOR.MINOR version than the image version
                                 in test/docker/gerrit/Dockerfile.
-    --events-plugin-jar|-e      optional path to events plugin JAR file
-                                Defaults to $BAZEL_BUILT_JAR
+    --plugin                    optional plugin name and path to JAR file
+                                Defaults to '$PLUGIN' '$BAZEL_BUILT_JAR'
+                                Can be repeated to install additional
+                                plugins.
 
 EOF
 
@@ -59,16 +62,36 @@
         '/events/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 ;;
-        --events-plugin-jar|-e)       shift ; EVENTS_PLUGIN_JAR=$1 ;;
+        --plugin)                     shift ; PLUGIN_JAR_BY_NAME["$1"]=$2 ; shift ;;
         *)                            usage "invalid argument $1" ;;
     esac
     shift
@@ -78,15 +101,14 @@
 COMPOSE_YAML="$MYDIR/docker-compose.yaml"
 COMPOSE_ARGS=(--project-name "$PROJECT_NAME" -f "$COMPOSE_YAML")
 check_prerequisite
-mkdir -p -- "$ARTIFACTS"
-if [ -n "$EVENTS_PLUGIN_JAR" ] ; then
-    cp -f "$EVENTS_PLUGIN_JAR" "$ARTIFACTS/events.jar"
-elif [ -e "$BAZEL_BUILT_JAR" ] ; then
-    cp -f "$BAZEL_BUILT_JAR" "$ARTIFACTS/events.jar"
-else
-    usage "Cannot find plugin jar, did you forget --events-plugin-jar?"
+mkdir -p -- "$ARTIFACTS/bin" "$ARTIFACTS/plugins"
+if [ -z "${PLUGIN_JAR_BY_NAME["$PLUGIN"]}" ] ; then
+    PLUGIN_JAR_BY_NAME["$PLUGIN"]=$BAZEL_BUILT_JAR
 fi
-[ -n "$GERRIT_WAR" ] && cp -f -- "$GERRIT_WAR" "$ARTIFACTS/gerrit.war"
+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_events_plugin_tests