Add Gatling e2e-test for rename-project

A successful test will guarantee all the steps as performed. This tests
the plugin feature through creating a project, then renaming it, and
then deleting the renamed project. If the rename fails, then only the
project gets created. If the rename goes through but gives unexpected
results, then the project deletion step will fail due to not finding
the renamed project (to delete).

Add a README file that introduces how to start using this new test.

The test project is renamed to a unique new name, _RENAMED in the json,
automatically set by the test implementation. This is in line with how
such a use of an underscode prefix was documented in [1]. The original
project name is also automatically set that way. Both names are based on
the name of the test class, so named after "RenameProject".

[1] https://gerrit-documentation.storage.googleapis.com/Documentation/3.0.12/dev-e2e-tests.html#_environment_properties

Change-Id: If086299127b8eb418c693e07ce221dd29cc5468d
(cherry picked from commit 98e1df4b5d7a89e67dd75fee54c79d6dc9fc2d10)
diff --git a/src/test/README.md b/src/test/README.md
new file mode 100644
index 0000000..f6147ff
--- /dev/null
+++ b/src/test/README.md
@@ -0,0 +1,16 @@
+# How to e2e-test this plugin
+
+Consider the
+[instructions](https://gerrit-review.googlesource.com/Documentation/dev-e2e-tests.html)
+on how to use Gerrit core's Gatling framework, to run non-core test
+scenarios such as this plugin one below:
+
+```
+  $ sbt "gatling:testOnly com.googlesource.gerrit.plugins.renameproject.scenarios.RenameProject"
+```
+
+Scenario scala source files and their companion json resource ones are
+stored under the usual src/test directories. That structure follows the
+scala package one from the scenario classes. The core framework expects
+such a directory structure for both the scala and resources (json data)
+files.
diff --git a/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject-body.json b/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject-body.json
new file mode 100644
index 0000000..fd49984
--- /dev/null
+++ b/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject-body.json
@@ -0,0 +1,3 @@
+{
+  "name": "${project}"
+}
diff --git a/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.json b/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.json
new file mode 100644
index 0000000..6be790c
--- /dev/null
+++ b/src/test/resources/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.json
@@ -0,0 +1,6 @@
+[
+  {
+    "url": "HTTP_SCHEME://HOSTNAME:HTTP_PORT/a/projects/_PROJECT/rename-project~rename",
+    "project": "_RENAMED"
+  }
+]
diff --git a/src/test/scala/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.scala b/src/test/scala/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.scala
new file mode 100644
index 0000000..744f245
--- /dev/null
+++ b/src/test/scala/com/googlesource/gerrit/plugins/renameproject/scenarios/RenameProject.scala
@@ -0,0 +1,55 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.renameproject.scenarios
+
+import com.google.gerrit.scenarios.{CreateProject, DeleteProject, GerritSimulation}
+import io.gatling.core.Predef._
+import io.gatling.core.feeder.FeederBuilder
+import io.gatling.core.structure.ScenarioBuilder
+
+import scala.concurrent.duration._
+
+class RenameProject extends GerritSimulation {
+  private val data: FeederBuilder = jsonFile(resource).convert(keys).queue
+  private val default = name
+  private val renamedTo = unique
+
+  override def replaceOverride(in: String): String = {
+    val next = replaceKeyWith("_project", default, in)
+    replaceKeyWith("_renamed", renamedTo, next)
+  }
+
+  private val createProject = new CreateProject(default)
+  private val deleteProject = new DeleteProject(renamedTo)
+
+  private val test: ScenarioBuilder = scenario(unique)
+    .feed(data)
+    .exec(httpRequest.body(ElFileBody(body)).asJson)
+
+  setUp(
+    createProject.test.inject(
+      nothingFor(stepWaitTime(createProject) seconds),
+      atOnceUsers(1)
+    ),
+    test.inject(
+      nothingFor(stepWaitTime(this) seconds),
+      atOnceUsers(1)
+    ),
+    deleteProject.test.inject(
+      nothingFor(stepWaitTime(deleteProject) seconds),
+      atOnceUsers(1)
+    ),
+  ).protocols(httpProtocol)
+}