Register ProjectDeletion events for gson serialization ProjectDeletion events were not registered event types. This caused failures when EventGson tried to serialize/deserialize objects having those events as field, Throwing the JsonParseException: ``` Unknown event type: project-deletion-replication-scheduled ``` Register ProjectDeletion event types, similarly to what already done for Ref replication events (RefReplicatedEvent, RefReplicationDoneEvent, RefReplicationScheduledEvent). Bug: Issue 14628 Change-Id: I7471e9a0f8ea8ec27d5800f785d1c7006b35055c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java index 4d2faed..75fa5b3 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
@@ -32,6 +32,10 @@ import com.google.inject.Scopes; import com.google.inject.assistedinject.FactoryModuleBuilder; import com.google.inject.internal.UniqueAnnotations; +import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationDoneEvent; +import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationFailedEvent; +import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationScheduledEvent; +import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationSucceededEvent; import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionState; import com.googlesource.gerrit.plugins.replication.events.RefReplicatedEvent; import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent; @@ -105,6 +109,16 @@ EventTypes.register(RefReplicatedEvent.TYPE, RefReplicatedEvent.class); EventTypes.register(RefReplicationDoneEvent.TYPE, RefReplicationDoneEvent.class); EventTypes.register(ReplicationScheduledEvent.TYPE, ReplicationScheduledEvent.class); + EventTypes.register( + ProjectDeletionReplicationScheduledEvent.TYPE, + ProjectDeletionReplicationScheduledEvent.class); + EventTypes.register( + ProjectDeletionReplicationFailedEvent.TYPE, ProjectDeletionReplicationFailedEvent.class); + EventTypes.register( + ProjectDeletionReplicationSucceededEvent.TYPE, + ProjectDeletionReplicationSucceededEvent.class); + EventTypes.register( + ProjectDeletionReplicationDoneEvent.TYPE, ProjectDeletionReplicationDoneEvent.class); bind(SshSessionFactory.class).toProvider(ReplicationSshSessionFactoryProvider.class); bind(TransportFactory.class).to(TransportFactoryImpl.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java index 4e66743..ebd7202 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java
@@ -14,6 +14,7 @@ package com.googlesource.gerrit.plugins.replication.events; +import com.google.common.base.Objects; import com.google.gerrit.entities.Project; import com.google.gerrit.server.events.ProjectEvent; @@ -31,4 +32,18 @@ public Project.NameKey getProjectNameKey() { return Project.nameKey(project); } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ProjectDeletionReplicationDoneEvent)) { + return false; + } + ProjectDeletionReplicationDoneEvent that = (ProjectDeletionReplicationDoneEvent) o; + return Objects.equal(project, that.project); + } + + @Override + public int hashCode() { + return Objects.hashCode(project); + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java index e350716..da75208 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.replication.events; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; import com.google.gerrit.entities.Project; import com.google.gerrit.server.events.ProjectEvent; import org.eclipse.jgit.transport.URIish; @@ -40,4 +41,18 @@ public String getTargetUri() { return targetUri; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ProjectDeletionReplicationFailedEvent)) { + return false; + } + ProjectDeletionReplicationFailedEvent that = (ProjectDeletionReplicationFailedEvent) o; + return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri); + } + + @Override + public int hashCode() { + return Objects.hashCode(project, targetUri); + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java index d179106..48e621b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.replication.events; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; import com.google.gerrit.entities.Project; import com.google.gerrit.server.events.ProjectEvent; import org.eclipse.jgit.transport.URIish; @@ -40,4 +41,18 @@ public String getTargetUri() { return targetUri; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ProjectDeletionReplicationScheduledEvent)) { + return false; + } + ProjectDeletionReplicationScheduledEvent that = (ProjectDeletionReplicationScheduledEvent) o; + return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri); + } + + @Override + public int hashCode() { + return Objects.hashCode(project, targetUri); + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java index 852c9fe..6f881cf 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.replication.events; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; import com.google.gerrit.entities.Project; import com.google.gerrit.server.events.ProjectEvent; import org.eclipse.jgit.transport.URIish; @@ -40,4 +41,18 @@ public String getTargetUri() { return targetUri; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ProjectDeletionReplicationSucceededEvent)) { + return false; + } + ProjectDeletionReplicationSucceededEvent that = (ProjectDeletionReplicationSucceededEvent) o; + return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri); + } + + @Override + public int hashCode() { + return Objects.hashCode(project, targetUri); + } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java index 13afc0d..2d69a47 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java
@@ -16,6 +16,7 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.common.base.Objects; import com.google.gerrit.acceptance.PushOneCommit.Result; import com.google.gerrit.acceptance.Sandboxed; import com.google.gerrit.acceptance.TestPlugin; @@ -27,9 +28,12 @@ import com.google.gerrit.extensions.events.ProjectDeletedListener; import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.extensions.registration.DynamicSet; +import com.google.gerrit.server.events.Event; import com.google.gerrit.server.events.EventDispatcher; +import com.google.gerrit.server.events.EventGsonProvider; import com.google.gerrit.server.events.ProjectEvent; import com.google.gerrit.server.events.RefEvent; +import com.google.gson.Gson; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationDoneEvent; import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationFailedEvent; @@ -43,6 +47,7 @@ import java.util.Optional; import java.util.function.Predicate; import java.util.function.Supplier; +import org.eclipse.jgit.transport.URIish; import org.junit.Before; import org.junit.Test; @@ -57,6 +62,7 @@ @Inject private DynamicSet<ProjectDeletedListener> deletedListeners; @Inject private DynamicItem<EventDispatcher> eventDispatcher; private TestDispatcher testDispatcher; + private Gson eventGson; @Before public void setup() throws Exception { @@ -68,6 +74,7 @@ setUpTestPlugin(); testDispatcher = new TestDispatcher(); eventDispatcher.set(testDispatcher, eventDispatcher.getPluginName()); + eventGson = new EventGsonProvider().get(); } @Test @@ -252,6 +259,55 @@ e -> project.equals(e.getProjectNameKey())); } + @Test + public void shouldSerializeObjectsHavingProjectDeletionReplicationScheduledEventAsField() + throws Exception { + EventWrapper origEvent = + new EventWrapper( + new ProjectDeletionReplicationScheduledEvent( + project.get(), new URIish(String.format("git://someHost/%s.git", project.get())))); + + EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass()); + + assertThat(origEvent).isEqualTo(gotEvent); + } + + @Test + public void shouldSerializeObjectsHavingProjectDeletionReplicationSucceededEventAsField() + throws Exception { + EventWrapper origEvent = + new EventWrapper( + new ProjectDeletionReplicationSucceededEvent( + project.get(), new URIish(String.format("git://someHost/%s.git", project.get())))); + + EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass()); + + assertThat(origEvent).isEqualTo(gotEvent); + } + + @Test + public void shouldSerializeObjectsHavingProjectDeletionReplicationFailedEventAsField() + throws Exception { + EventWrapper origEvent = + new EventWrapper( + new ProjectDeletionReplicationFailedEvent( + project.get(), new URIish(String.format("git://someHost/%s.git", project.get())))); + + EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass()); + + assertThat(origEvent).isEqualTo(gotEvent); + } + + @Test + public void shouldSerializeObjectsHavingProjectDeletionReplicationDoneEventAsField() { + EventWrapper origEvent = + new EventWrapper(new ProjectDeletionReplicationDoneEvent(project.get())); + + EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass()); + + assertThat(origEvent).isEqualTo(gotEvent); + } + private <T extends RefEvent> void waitForRefEvent(Supplier<List<T>> events, String refName) throws InterruptedException { WaitUtil.waitUntil( @@ -274,4 +330,26 @@ private <T extends ProjectEvent> void assertThatAnyMatch(List<T> events, Predicate<T> p) { assertThat(events.stream().anyMatch(p)).isTrue(); } + + private static class EventWrapper { + private final Event event; + + public EventWrapper(Event event) { + this.event = event; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof EventWrapper)) { + return false; + } + EventWrapper eventWrapper = (EventWrapper) o; + return Objects.equal(event, eventWrapper.event); + } + + @Override + public int hashCode() { + return Objects.hashCode(event); + } + } }