e2e-tests: Add FlushProjectsCacheThenRebuild and ListProjects scenarios

Introduce the FlushProjectsCacheThenRebuild scenario, which differs from
FlushProjectsCache (on which it is based). Make this new scenario assume
an already initialized site with multiple projects. Make it *not* create
a test project then, as opposed to the FlushProjectsCache base scenario.

However, make that new scenario rebuild the site's projects cache, once
done checking the flushing of that cache. Do so to restore the site's
ability to reliably serve all those multiple projects. Use the
list-projects (here REST) command for such a re-warmup purpose. The
requestTimeout may require an increase for that request to return an OK,
in [1] below.

These hereby introduced scenarios are meant as functional e2e test ones.
FlushProjectsCacheThenRebuild reuses ListProjects, but the latter can be
used independently of the former, as well. ListProjects is based on the
REST endpoint [2].

[1] src/test/resources/gatling.conf
[2] https://gerrit-documentation.storage.googleapis.com/Documentation/3.0.11/rest-api-projects.html#list-projects

Change-Id: Ibaa013514989720586e1f8c69620f60f5d76bb52
diff --git a/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.json b/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.json
new file mode 100644
index 0000000..e30a2cf
--- /dev/null
+++ b/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.json
@@ -0,0 +1,5 @@
+[
+  {
+    "url": "HTTP_SCHEME://HOSTNAME:HTTP_PORT/a/config/server/caches/projects/flush"
+  }
+]
diff --git a/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/ListProjects.json b/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/ListProjects.json
new file mode 100644
index 0000000..f6350be
--- /dev/null
+++ b/e2e-tests/src/test/resources/data/com/google/gerrit/scenarios/ListProjects.json
@@ -0,0 +1,5 @@
+[
+  {
+    "url": "HTTP_SCHEME://HOSTNAME:HTTP_PORT/a/projects/"
+  }
+]
diff --git a/e2e-tests/src/test/scala/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.scala b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.scala
new file mode 100644
index 0000000..7d732ea
--- /dev/null
+++ b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/FlushProjectsCacheThenRebuild.scala
@@ -0,0 +1,47 @@
+// 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.google.gerrit.scenarios
+
+import io.gatling.core.Predef._
+import io.gatling.core.feeder.FeederBuilder
+import io.gatling.core.structure.ScenarioBuilder
+
+import scala.concurrent.duration._
+
+class FlushProjectsCacheThenRebuild extends GerritSimulation {
+  private val data: FeederBuilder = jsonFile(resource).convert(keys).queue
+
+  private val test: ScenarioBuilder = scenario(unique)
+      .feed(data)
+      .exec(httpRequest)
+
+  private val checkCacheEntriesAfterFlush = new CheckProjectsCacheFlushEntries
+  private val rebuildCache = new ListProjects
+
+  setUp(
+    test.inject(
+      nothingFor(stepWaitTime(this) seconds),
+      atOnceUsers(single)
+    ),
+    checkCacheEntriesAfterFlush.test.inject(
+      nothingFor(stepWaitTime(checkCacheEntriesAfterFlush) seconds),
+      atOnceUsers(single)
+    ),
+    rebuildCache.test.inject(
+      nothingFor(stepWaitTime(rebuildCache) seconds),
+      atOnceUsers(single)
+    ),
+  ).protocols(httpProtocol)
+}
diff --git a/e2e-tests/src/test/scala/com/google/gerrit/scenarios/ListProjects.scala b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/ListProjects.scala
new file mode 100644
index 0000000..bfc97f4
--- /dev/null
+++ b/e2e-tests/src/test/scala/com/google/gerrit/scenarios/ListProjects.scala
@@ -0,0 +1,33 @@
+// 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.google.gerrit.scenarios
+
+import io.gatling.core.Predef._
+import io.gatling.core.feeder.FeederBuilder
+import io.gatling.core.structure.ScenarioBuilder
+import io.gatling.http.Predef.http
+
+class ListProjects extends GerritSimulation {
+  private val data: FeederBuilder = jsonFile(resource).convert(keys).queue
+
+  val test: ScenarioBuilder = scenario(unique)
+      .feed(data)
+      .exec(http(unique).get("${url}"))
+
+  setUp(
+    test.inject(
+      atOnceUsers(single)
+    )).protocols(httpProtocol)
+}