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