TestEventPublisher: performance improvement

Separate handling of when an event is expected to exist and not.

* Return early if event exists
  Checking every 50 ms saves 10-15 seconds on the current execution
  time of the entire test-suite since the event is most often
  available before the wait-timeout (500 ms) is complete.
* Handle expected missing events in TestEventsPublisher
  By calling the TestEventPublisher to check if an event is missing we
  can skip the check-every-x-seconds loop.
  This has the added benefit that it removes a lot of copy-paste code
  from the test-cases.

Change-Id: I764e87100f2f768d628facd4393b0fc0479aeaef
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/TestEventPublisher.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/TestEventPublisher.java
index 37e93f2..7b4569e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/TestEventPublisher.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/TestEventPublisher.java
@@ -16,6 +16,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNull;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -32,6 +33,9 @@
 
 @Ignore
 public class TestEventPublisher implements Runnable, EiffelEventHub.Consumer {
+  /* Milliseconds after which the publisher-thread is expected to have handled the event. */
+  public static int MILLIS_TO_WAIT = 500;
+
   Map<EventKey, EiffelEvent> publishedEvents = Maps.newConcurrentMap();
   List<EventKey> actualOrder = Lists.newArrayList();
   boolean keepTrying = true;
@@ -88,8 +92,20 @@
         keys.size());
   }
 
-  public EiffelEvent getPublished(EventKey key) {
+  public void assertNotPublished(EventKey key, String message) {
     waitForIt();
+    EiffelEvent event = publishedEvents.getOrDefault(key, null);
+    assertNull(message, event);
+  }
+
+  public EiffelEvent getPublished(EventKey key) {
+    int wait = 50;
+    for (int totalWait = 0; totalWait < MILLIS_TO_WAIT; totalWait += wait) {
+      if (publishedEvents.containsKey(key)) {
+        return publishedEvents.get(key);
+      }
+      waitFor(wait);
+    }
     return publishedEvents.getOrDefault(key, null);
   }
 
@@ -106,10 +122,13 @@
     pause = true;
   }
 
-  /* Give the publisher-thread some time to handle events. */
   private void waitForIt() {
+    waitFor(MILLIS_TO_WAIT);
+  }
+
+  private void waitFor(int millis) {
     try {
-      Thread.sleep(500);
+      Thread.sleep(millis);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
index 126eb50..3d93b80 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -19,7 +19,6 @@
 import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCS;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 
 import com.google.common.collect.Lists;
 import com.google.gerrit.acceptance.PushOneCommit;
@@ -86,8 +85,8 @@
 
   @Test
   public void patchSetCreatedForMetaDoesntResultsInEvent() throws Exception {
-    EiffelEvent event = publisher.getPublished(toSccKey(createMetaConfigChange()));
-    assertNull("refs/meta/config change shouldn't result in event", event);
+    publisher.assertNotPublished(
+        toSccKey(createMetaConfigChange()), "refs/meta/config change shouldn't result in event");
   }
 
   @Test
@@ -153,49 +152,45 @@
   @Test
   public void patchSetSubmittedForMetaDoesntResultsInEvent() throws Exception {
     PushOneCommit.Result res = createMetaConfigChange();
-    SourceChangeEventKey sccKey = toSccKey(res);
-    EiffelEvent sccEvent = publisher.getPublished(sccKey);
-    assertNull("refs/meta/config change shouldn't result in event", sccEvent);
+    publisher.assertNotPublished(
+        toSccKey(res), "refs/meta/config change shouldn't result in event");
+
     merge(res);
-    EiffelEvent scsEvent = publisher.getPublished(sccKey.copy(SCS));
-    assertNull("refs/meta/config change shouldn't result in event", scsEvent);
+    publisher.assertNotPublished(
+        toScsKey(res), "refs/meta/config change shouldn't result in event");
   }
 
   @Test
   public void noEventsCreatedWhenDisabled() throws Exception {
     TestEventListenerConfigProvider.disable();
     PushOneCommit.Result res = createChange();
-    SourceChangeEventKey sccKey = toSccKey(res);
-    EiffelEvent sccEvent = publisher.getPublished(sccKey);
-    assertNull("Patch-set created shouldn't result in event when disabled", sccEvent);
+    publisher.assertNotPublished(
+        toSccKey(res), "Patch-set created shouldn't result in event when disabled");
     merge(res);
-    EiffelEvent scsEvent = publisher.getPublished(sccKey.copy(SCS));
-    assertNull("Patch-set submitted shouldn't result in event when disabled", scsEvent);
+    publisher.assertNotPublished(
+        toScsKey(res), "Patch-set submitted shouldn't result in event when disabled");
   }
 
   @Test
   public void noEventsCreatedWhenRefIsBlocked() throws Exception {
     TestEventListenerConfigProvider.setBlockedRefPatterns("refs/heads/master");
     PushOneCommit.Result res = createChange();
-    SourceChangeEventKey sccKey = toSccKey(res);
-    EiffelEvent sccEvent = publisher.getPublished(sccKey);
-    assertNull("Patch-set created shouldn't result in event when target ref is blocked", sccEvent);
+    publisher.assertNotPublished(
+        toSccKey(res), "Patch-set created shouldn't result in event when target ref is blocked");
     merge(res);
-    EiffelEvent scsEvent = publisher.getPublished(sccKey.copy(SCS));
-    assertNull(
-        "Patch-set submitted shouldn't result in event when target ref is blocked", scsEvent);
+    publisher.assertNotPublished(
+        toScsKey(res), "Patch-set submitted shouldn't result in event when target ref is blocked");
   }
 
   @Test
   public void noEventsCreatedWhenProjectIsBlocked() throws Exception {
     TestEventListenerConfigProvider.setBlockedProjectPatterns(project.get());
     PushOneCommit.Result res = createChange();
-    SourceChangeEventKey sccKey = toSccKey(res);
-    EiffelEvent sccEvent = publisher.getPublished(sccKey);
-    assertNull("Patch-set created shouldn't result in event when project is blocked", sccEvent);
+    publisher.assertNotPublished(
+        toSccKey(res), "Patch-set created shouldn't result in event when project is blocked");
     merge(res);
-    EiffelEvent scsEvent = publisher.getPublished(sccKey.copy(SCS));
-    assertNull("Patch-set submitted shouldn't result in event when project is blocked", scsEvent);
+    publisher.assertNotPublished(
+        toScsKey(res), "Patch-set submitted shouldn't result in event when project is blocked");
   }
 
   @Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/rest/EventsEiffelRestIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/rest/EventsEiffelRestIT.java
index d483a66..cb77c91 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/rest/EventsEiffelRestIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/rest/EventsEiffelRestIT.java
@@ -18,7 +18,6 @@
 import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCC;
 import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCS;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 
 import com.google.gerrit.acceptance.PushOneCommit;
 import com.google.gerrit.acceptance.RestResponse;
@@ -84,9 +83,8 @@
   @Test
   public void createSccsAsNonAdminForbidden() throws Exception {
     createSccs("master", false).assertStatus(403);
-    SourceChangeEventKey scc = keyFromMaster(SCC);
-    EiffelEvent event = publisher.getPublished(scc);
-    assertNull(event);
+    publisher.assertNotPublished(
+        keyFromMaster(SCC), "SCC event creation should be blocked for non admin");
   }
 
   @Test
@@ -111,9 +109,8 @@
   @Test
   public void createScssAsNonAdminForbidden() throws Exception {
     createScss("master", false).assertStatus(403);
-    SourceChangeEventKey scs = keyFromMaster(SCS);
-    EiffelEvent event = publisher.getPublished(scs);
-    assertNull(event);
+    publisher.assertNotPublished(
+        keyFromMaster(SCS), "SCS event creation should be blocked for non admin");
   }
 
   @Test
@@ -136,9 +133,9 @@
     createScss("master", true).assertStatus(202);
     String tagName = createTagRef(true).substring(RefNames.REFS_TAGS.length());
     createArtcs(tagName, false).assertStatus(403);
-    ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), tagName));
-    EiffelEvent event = publisher.getPublished(artc);
-    assertNull(event);
+    publisher.assertNotPublished(
+        ArtifactEventKey.create(tagPURL(project.get(), tagName)),
+        "ArtC event creation should be blocked for non admin");
   }
 
   @Test