CheckProjectStatisticsAfterGc: Make tests circular

Rename that scenario to CheckProjectStatisticsUpToGc and make it fully
circular. Make the scenario periodically check for garbage collection,
up to 10 seconds.

CheckProjectStatisticsUpToGc reports Gatling KOs for every check not
lending a done gc at the time of that period. Typically, the scenario
starts reporting Gatling OKs once garbage collection gets completely
executed. The OK/KO ratio may then be a measure of the jgit-based gc
performance within plugin's gc-executor component.

For example, the last local tests reported 5 KOs on average with
gc-executor's current 2.14 version (EOL), which runs jgit version
4.7.9.201904161809-r. Meaning, a gc that takes around 5 seconds to
complete for the hereby amended CreateChangesTriggeringGc scenario.

Increase the amount of "garbage" to collect in CreateChangesTriggeringGc
by multiplying changes up to over a thousand. Do so to increase gc times
thus making them easier to report about this way. Fix that scenario's
relativeRuntimeWeight, which was too high before and made this change
harder to realize.

Make the first changesPerSecond value letter lowercase as it becomes
calculated (a Scala convention).

Change-Id: I1af15c1294f54fff3a08efdd5c2fafa77be92b88
diff --git a/src/test/resources/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsAfterGc.json b/src/test/resources/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsUpToGc.json
similarity index 100%
rename from src/test/resources/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsAfterGc.json
rename to src/test/resources/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsUpToGc.json
diff --git a/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsAfterGc.scala b/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsUpToGc.scala
similarity index 77%
rename from src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsAfterGc.scala
rename to src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsUpToGc.scala
index fa43e22..33fe109 100644
--- a/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsAfterGc.scala
+++ b/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CheckProjectStatisticsUpToGc.scala
@@ -20,8 +20,14 @@
 import io.gatling.core.structure.ScenarioBuilder
 import io.gatling.http.Predef._
 
-class CheckProjectStatisticsAfterGc extends ProjectSimulation {
-  private val data: FeederBuilder = jsonFile(resource).convert(keys).queue
+import scala.concurrent.duration._
+
+class CheckProjectStatisticsUpToGc extends ProjectSimulation {
+  private val data: FeederBuilder = jsonFile(resource).convert(keys).circular
+  lazy val MaxSecondsForGcToComplete = 10
+  val ChecksPerSecond = 1
+
+  override def relativeRuntimeWeight: Int = MaxSecondsForGcToComplete / SecondsPerWeightUnit
 
   def this(default: String) {
     this()
@@ -36,6 +42,6 @@
 
   setUp(
     test.inject(
-      atOnceUsers(1)
+      constantUsersPerSec(ChecksPerSecond) during (MaxSecondsForGcToComplete seconds),
     )).protocols(httpProtocol)
 }
diff --git a/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CreateChangesTriggeringGc.scala b/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CreateChangesTriggeringGc.scala
index a61b376..b6e3011 100644
--- a/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CreateChangesTriggeringGc.scala
+++ b/src/test/scala/com/ericsson/gerrit/plugins/gcconductor/scenarios/CreateChangesTriggeringGc.scala
@@ -28,20 +28,18 @@
   private val numberKey = "_number"
 
   private lazy val DefaultSecondsToNextEvaluation = 60
-  private lazy val DefaultSecondsToNextGcDequeue = 60
   private lazy val DefaultLooseObjectsToEnqueueGc = 400
   private lazy val LooseObjectsPerChange = 2
-  private lazy val ChangesPerSecond = 4
+  private lazy val ChangesMultiplier = 5
+  private lazy val changesPerSecond = 4 * ChangesMultiplier
   private val ChangesForLastEvaluation = 1
 
   private lazy val secondsForLastEvaluation = SecondsPerWeightUnit * 2
-  private lazy val secondsForLastGcExecution = secondsForLastEvaluation * 2
-  private lazy val changesToEnqueueGc = DefaultLooseObjectsToEnqueueGc / LooseObjectsPerChange
-  private lazy val secondsToChanges = changesToEnqueueGc / ChangesPerSecond
+  private lazy val changesToEnqueueGc = DefaultLooseObjectsToEnqueueGc * ChangesMultiplier / LooseObjectsPerChange
+  private lazy val secondsToChanges = changesToEnqueueGc / changesPerSecond
   private lazy val maxSecondsToEnqueueGc = secondsToChanges + DefaultSecondsToNextEvaluation + secondsForLastEvaluation
-  private lazy val maxSecondsToExecuteGc = maxSecondsToEnqueueGc + DefaultSecondsToNextGcDequeue + secondsForLastGcExecution
 
-  override def relativeRuntimeWeight: Int = maxSecondsToExecuteGc / SecondsPerWeightUnit
+  override def relativeRuntimeWeight: Int = maxSecondsToEnqueueGc / SecondsPerWeightUnit
 
   private val test: ScenarioBuilder = scenario(unique)
     .feed(data)
@@ -54,7 +52,7 @@
     })
 
   private val createProject = new CreateProject(default)
-  private val checkStatsAfterGc = new CheckProjectStatisticsAfterGc(default)
+  private val checkStatsUpToGc = new CheckProjectStatisticsUpToGc(default)
   private val deleteChanges = new DeleteChangesAfterGc
   private val deleteProject = new DeleteProject(default)
 
@@ -65,19 +63,19 @@
     ),
     test.inject(
       nothingFor(stepWaitTime(this) seconds),
-      constantUsersPerSec(ChangesPerSecond) during (secondsToChanges seconds),
+      constantUsersPerSec(changesPerSecond) during (secondsToChanges seconds),
       nothingFor(DefaultSecondsToNextEvaluation seconds),
       nothingFor(secondsForLastEvaluation / 2 seconds),
       atOnceUsers(ChangesForLastEvaluation),
       nothingFor(secondsForLastEvaluation / 2 seconds)
     ),
-    checkStatsAfterGc.test.inject(
-      nothingFor(stepWaitTime(checkStatsAfterGc) seconds),
-      atOnceUsers(1)
+    checkStatsUpToGc.test.inject(
+      nothingFor(stepWaitTime(checkStatsUpToGc) seconds),
+      constantUsersPerSec(checkStatsUpToGc.ChecksPerSecond) during (checkStatsUpToGc.MaxSecondsForGcToComplete seconds)
     ),
     deleteChanges.test.inject(
       nothingFor(stepWaitTime(deleteChanges) seconds),
-      constantUsersPerSec(ChangesPerSecond) during (secondsToChanges seconds),
+      constantUsersPerSec(changesPerSecond) during (secondsToChanges seconds),
       atOnceUsers(ChangesForLastEvaluation)
     ),
     deleteProject.test.inject(