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).

This change cherry-picks change [1]

[1]https://gerrit-review.googlesource.com/c/plugins/replication/+/308383

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);
+    }
+  }
 }