Run apply-object before the ref-updated stream event
The pull-replication plugin's promise is to run apply-object
to replicate the refs in msec, so that the overall end-to-end
operation runs synchronously. However, the ref-updated was
executed before the apply-object, leaving room for the event
consumer to potentially fail when looking at the ref value because
the apply-object may have completed or not.
Use the same EventListener interface used in the stream-event
listeners for making sure that apply-object is always executed
before ref-updated.
Also amend the test environment for the broker scenario for
including the apply-object use-case as well, where the events
broker is used as fallback by putting the events-kafka plugin
to the bottom of the plugin loading priority.
Change-Id: If96082f4338164e1674bae657ab4184577d825f2
diff --git a/example-setup/broker/Dockerfile b/example-setup/broker/Dockerfile
index df097d8..646967e 100644
--- a/example-setup/broker/Dockerfile
+++ b/example-setup/broker/Dockerfile
@@ -9,7 +9,10 @@
COPY --chown=gerrit:gerrit pull-replication.jar /var/gerrit/plugins/pull-replication.jar
COPY --chown=gerrit:gerrit pull-replication.jar /var/gerrit/lib/pull-replication.jar
-COPY --chown=gerrit:gerrit events-kafka.jar /var/gerrit/plugins/events-kafka.jar
+# The message-broker notification needs to be the last in the notification chain
+# hence rename it with a 'z-' prefix because the Gerrit plugin loader starts the
+# plugins in filename alphabetical order.
+COPY --chown=gerrit:gerrit events-kafka.jar /var/gerrit/plugins/z-events-kafka.jar
COPY --chown=gerrit:gerrit libevents-broker.jar /var/gerrit/lib/libevents-broker.jar
COPY --chown=gerrit:gerrit entrypoint.sh /tmp/
diff --git a/example-setup/broker/configs/replication.config.template b/example-setup/broker/configs/replication.config.template
index d464586..e77edeb 100644
--- a/example-setup/broker/configs/replication.config.template
+++ b/example-setup/broker/configs/replication.config.template
@@ -12,6 +12,7 @@
maxApiPayloadSize = 40000
[remote "$REMOTE"]
url = http://$REMOTE_URL:8080/#{name}#.git
+ apiUrl = http://$REMOTE_URL:8080/
fetch = +refs/*:refs/*
mirror = true
timeout = 60 # In seconds
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
index cd19be4..ed3aecb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationModule.java
@@ -19,12 +19,12 @@
import com.google.common.eventbus.EventBus;
import com.google.gerrit.extensions.annotations.Exports;
import com.google.gerrit.extensions.config.CapabilityDefinition;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HeadUpdatedListener;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.events.EventListener;
import com.google.gerrit.server.events.EventTypes;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
@@ -123,7 +123,7 @@
.annotatedWith(UniqueAnnotations.create())
.to(ReplicationQueue.class);
- DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(ReplicationQueue.class);
+ DynamicSet.bind(binder(), EventListener.class).to(ReplicationQueue.class);
bind(ConfigParser.class).to(SourceConfigParser.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
index 380ac8e..b90969b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
@@ -20,13 +20,14 @@
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.Project.NameKey;
import com.google.gerrit.entities.RefNames;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HeadUpdatedListener;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.metrics.Timer1.Context;
import com.google.gerrit.server.events.EventDispatcher;
+import com.google.gerrit.server.events.EventListener;
+import com.google.gerrit.server.events.RefUpdatedEvent;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -64,8 +65,8 @@
public class ReplicationQueue
implements ObservableQueue,
+ EventListener,
LifecycleListener,
- GitReferenceUpdatedListener,
ProjectDeletedListener,
HeadUpdatedListener {
@@ -73,6 +74,8 @@
static final Logger repLog = LoggerFactory.getLogger(PULL_REPLICATION_LOG_NAME);
private static final Integer DEFAULT_FETCH_CALLS_TIMEOUT = 0;
+ private static final String REF_UDPATED_EVENT_TYPE = new RefUpdatedEvent().type;
+ private static final String ZEROS_OBJECTID = ObjectId.zeroId().getName();
private final ReplicationStateListener stateLog;
private final WorkQueue workQueue;
@@ -147,20 +150,24 @@
}
@Override
- public void onGitReferenceUpdated(GitReferenceUpdatedListener.Event event) {
- if (isRefToBeReplicated(event.getRefName())) {
- repLog.info(
- "Ref event received: {} on project {}:{} - {} => {}",
- refUpdateType(event),
- event.getProjectName(),
- event.getRefName(),
- event.getOldObjectId(),
- event.getNewObjectId());
- fire(
- event.getProjectName(),
- ObjectId.fromString(event.getNewObjectId()),
- event.getRefName(),
- event.isDelete());
+ public void onEvent(com.google.gerrit.server.events.Event e) {
+ if (e.type.equals(REF_UDPATED_EVENT_TYPE)) {
+ RefUpdatedEvent event = (RefUpdatedEvent) e;
+
+ if (isRefToBeReplicated(event.getRefName())) {
+ repLog.info(
+ "Ref event received: {} on project {}:{} - {} => {}",
+ refUpdateType(event),
+ event.refUpdate.get().project,
+ event.getRefName(),
+ event.refUpdate.get().oldRev,
+ event.refUpdate.get().newRev);
+ fire(
+ event.refUpdate.get().project,
+ ObjectId.fromString(event.refUpdate.get().newRev),
+ event.getRefName(),
+ ZEROS_OBJECTID.equals(event.refUpdate.get().newRev));
+ }
}
}
@@ -174,14 +181,13 @@
source.getApis().forEach(apiUrl -> source.scheduleDeleteProject(apiUrl, project)));
}
- private static String refUpdateType(GitReferenceUpdatedListener.Event event) {
- String forcedPrefix = event.isNonFastForward() ? "FORCED " : " ";
- if (event.isCreate()) {
- return forcedPrefix + "CREATE";
- } else if (event.isDelete()) {
- return forcedPrefix + "DELETE";
+ private static String refUpdateType(RefUpdatedEvent event) {
+ if (ZEROS_OBJECTID.equals(event.refUpdate.get().oldRev)) {
+ return "CREATE";
+ } else if (ZEROS_OBJECTID.equals(event.refUpdate.get().newRev)) {
+ return "DELETE";
} else {
- return forcedPrefix + "UPDATE";
+ return "UPDATE";
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FakeGitReferenceUpdatedEvent.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FakeGitReferenceUpdatedEvent.java
index 43331dc..47c00c7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FakeGitReferenceUpdatedEvent.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FakeGitReferenceUpdatedEvent.java
@@ -14,81 +14,19 @@
package com.googlesource.gerrit.plugins.replication.pull;
+import com.google.common.base.Suppliers;
import com.google.gerrit.entities.Project;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
-import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import org.eclipse.jgit.transport.ReceiveCommand;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.events.RefUpdatedEvent;
-public class FakeGitReferenceUpdatedEvent implements GitReferenceUpdatedListener.Event {
- private final String projectName;
- private final String ref;
- private final String oldObjectId;
- private final String newObjectId;
- private final ReceiveCommand.Type type;
-
+public class FakeGitReferenceUpdatedEvent extends RefUpdatedEvent {
FakeGitReferenceUpdatedEvent(
- Project.NameKey project,
- String ref,
- String oldObjectId,
- String newObjectId,
- ReceiveCommand.Type type) {
- this.projectName = project.get();
- this.ref = ref;
- this.oldObjectId = oldObjectId;
- this.newObjectId = newObjectId;
- this.type = type;
- }
-
- @Override
- public String getProjectName() {
- return projectName;
- }
-
- @Override
- public String getRefName() {
- return ref;
- }
-
- @Override
- public String getOldObjectId() {
- return oldObjectId;
- }
-
- @Override
- public String getNewObjectId() {
- return newObjectId;
- }
-
- @Override
- public boolean isCreate() {
- return type == ReceiveCommand.Type.CREATE;
- }
-
- @Override
- public boolean isDelete() {
- return type == ReceiveCommand.Type.DELETE;
- }
-
- @Override
- public boolean isNonFastForward() {
- return type == ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
- }
-
- @Override
- public AccountInfo getUpdater() {
- return null;
- }
-
- @Override
- public String toString() {
- return String.format(
- "%s[%s,%s: %s -> %s]",
- getClass().getSimpleName(), projectName, ref, oldObjectId, newObjectId);
- }
-
- @Override
- public NotifyHandling getNotify() {
- return NotifyHandling.ALL;
+ Project.NameKey project, String ref, String oldObjectId, String newObjectId) {
+ RefUpdateAttribute upd = new RefUpdateAttribute();
+ upd.newRev = newObjectId;
+ upd.oldRev = oldObjectId;
+ upd.project = project.get();
+ upd.refName = ref;
+ this.refUpdate = Suppliers.ofInstance(upd);
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationFanoutConfigIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationFanoutConfigIT.java
index ee5876f..1aaf434 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationFanoutConfigIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationFanoutConfigIT.java
@@ -27,7 +27,6 @@
import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.replication.AutoReloadConfigDecorator;
@@ -44,7 +43,6 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileBasedConfig;
-import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.util.FS;
import org.junit.Test;
@@ -105,14 +103,10 @@
String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
@@ -141,14 +135,10 @@
RevCommit sourceCommit = pushResult.getCommit();
final String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
@@ -174,14 +164,10 @@
ReplicationQueue pullReplicationQueue =
plugin.getSysInjector().getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- newBranch,
- ObjectId.zeroId().getName(),
- branchRevision,
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, newBranch, ObjectId.zeroId().getName(), branchRevision);
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project);
Repository sourceRepo = repoManager.openRepository(project)) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationIT.java
index f3c62c5..180094d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationIT.java
@@ -30,7 +30,6 @@
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.api.projects.BranchInput;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.HeadUpdatedListener;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -47,7 +46,6 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.RemoteRefUpdate;
import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
import org.junit.Test;
@@ -91,14 +89,10 @@
String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
@@ -124,14 +118,10 @@
ReplicationQueue pullReplicationQueue =
plugin.getSysInjector().getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- newBranch,
- ObjectId.zeroId().getName(),
- branchRevision,
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, newBranch, ObjectId.zeroId().getName(), branchRevision);
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project);
Repository sourceRepo = repoManager.openRepository(project)) {
@@ -167,14 +157,10 @@
ReplicationQueue pullReplicationQueue =
plugin.getSysInjector().getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- newBranch,
- ObjectId.zeroId().getName(),
- branchRevision,
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, newBranch, ObjectId.zeroId().getName(), branchRevision);
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, newBranch) != null);
@@ -193,14 +179,10 @@
assertThat(pushedRefs).hasSize(1);
assertThat(pushedRefs.iterator().next().getStatus()).isEqualTo(Status.OK);
- GitReferenceUpdatedListener.Event forcedPushEvent =
+ FakeGitReferenceUpdatedEvent forcedPushEvent =
new FakeGitReferenceUpdatedEvent(
- project,
- newBranch,
- branchRevision,
- amendedCommit.getId().getName(),
- ReceiveCommand.Type.UPDATE_NONFASTFORWARD);
- pullReplicationQueue.onGitReferenceUpdated(forcedPushEvent);
+ project, newBranch, branchRevision, amendedCommit.getId().getName());
+ pullReplicationQueue.onEvent(forcedPushEvent);
try (Repository repo = repoManager.openRepository(project);
Repository sourceRepo = repoManager.openRepository(project)) {
@@ -232,14 +214,10 @@
String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
@@ -273,14 +251,10 @@
ReplicationQueue pullReplicationQueue =
plugin.getSysInjector().getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- newBranch,
- ObjectId.zeroId().getName(),
- branchRevision,
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, newBranch, ObjectId.zeroId().getName(), branchRevision);
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project);
Repository sourceRepo = repoManager.openRepository(project)) {
@@ -365,14 +339,10 @@
String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationWithGitHttpTransportProtocolIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationWithGitHttpTransportProtocolIT.java
index d8e5947..40a9d03 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationWithGitHttpTransportProtocolIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/PullReplicationWithGitHttpTransportProtocolIT.java
@@ -21,7 +21,6 @@
import com.google.gerrit.acceptance.TestPlugin;
import com.google.gerrit.acceptance.UseLocalDisk;
import com.google.gerrit.acceptance.config.GerritConfig;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
@@ -29,7 +28,6 @@
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.ReceiveCommand;
import org.junit.Test;
@SkipProjectClone
@@ -82,14 +80,10 @@
String sourceRef = pushResult.getPatchSet().refName();
ReplicationQueue pullReplicationQueue = getInstance(ReplicationQueue.class);
- GitReferenceUpdatedListener.Event event =
+ FakeGitReferenceUpdatedEvent event =
new FakeGitReferenceUpdatedEvent(
- project,
- sourceRef,
- ObjectId.zeroId().getName(),
- sourceCommit.getId().getName(),
- ReceiveCommand.Type.CREATE);
- pullReplicationQueue.onGitReferenceUpdated(event);
+ project, sourceRef, ObjectId.zeroId().getName(), sourceCommit.getId().getName());
+ pullReplicationQueue.onEvent(event);
try (Repository repo = repoManager.openRepository(project)) {
waitUntil(() -> checkedGetRef(repo, sourceRef) != null);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
index 0743cb9..dc6e429 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
@@ -28,18 +28,20 @@
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
+import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
-import com.google.gerrit.extensions.events.GitReferenceUpdatedListener.Event;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventDispatcher;
+import com.google.gerrit.server.events.RefUpdatedEvent;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.replication.ReplicationConfig;
@@ -164,7 +166,7 @@
public void shouldCallSendObjectWhenMetaRef() throws ClientProtocolException, IOException {
Event event = new TestEvent("refs/changes/01/1/meta");
objectUnderTest.start();
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).callSendObjects(any(), anyString(), any(), any());
}
@@ -177,7 +179,7 @@
when(source.isCreateMissingRepositories()).thenReturn(true);
objectUnderTest.start();
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).initProject(any(), any());
}
@@ -190,7 +192,7 @@
when(source.isCreateMissingRepositories()).thenReturn(false);
objectUnderTest.start();
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient, never()).initProject(any(), any());
}
@@ -199,7 +201,7 @@
public void shouldCallSendObjectWhenPatchSetRef() throws ClientProtocolException, IOException {
Event event = new TestEvent("refs/changes/01/1/1");
objectUnderTest.start();
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).callSendObjects(any(), anyString(), any(), any());
}
@@ -212,7 +214,7 @@
when(revReader.read(any(), any(), anyString(), anyInt())).thenThrow(IOException.class);
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).callFetch(any(), anyString(), any());
}
@@ -225,7 +227,7 @@
when(revReader.read(any(), any(), anyString(), anyInt())).thenReturn(Optional.empty());
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).callFetch(any(), anyString(), any());
}
@@ -241,7 +243,7 @@
when(fetchRestApiClient.callSendObjects(any(), anyString(), any(), any()))
.thenReturn(httpResult);
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient).callFetch(any(), anyString(), any());
}
@@ -257,7 +259,7 @@
when(fetchRestApiClient.callSendObjects(any(), anyString(), any(), any()))
.thenReturn(httpResult);
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verify(fetchRestApiClient, times(2))
.callSendObjects(any(), anyString(), revisionsDataCaptor.capture(), any());
@@ -293,7 +295,7 @@
applyObjectMetrics,
fetchMetrics);
Event event = new TestEvent("refs/multi-site/version");
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verifyZeroInteractions(wq, rd, dis, sl, fetchClientFactory, accountInfo);
}
@@ -301,7 +303,7 @@
@Test
public void shouldSkipEventWhenStarredChangesRef() {
Event event = new TestEvent("refs/starred-changes/41/2941/1000000");
- objectUnderTest.onGitReferenceUpdated(event);
+ objectUnderTest.onEvent(event);
verifyZeroInteractions(wq, rd, dis, sl, fetchClientFactory, accountInfo);
}
@@ -366,64 +368,21 @@
return createTempDirectory(prefix);
}
- private class TestEvent implements GitReferenceUpdatedListener.Event {
- private String refName;
- private String projectName;
- private ObjectId newObjectId;
-
+ private class TestEvent extends RefUpdatedEvent {
public TestEvent(String refName) {
- this(refName, "defaultProject", ObjectId.zeroId());
+ this(
+ refName,
+ "defaultProject",
+ ObjectId.fromString("3c1ddc050d7906adb0e29bc3bc46af8749b2f63b"));
}
public TestEvent(String refName, String projectName, ObjectId newObjectId) {
- this.refName = refName;
- this.projectName = projectName;
- this.newObjectId = newObjectId;
- }
-
- @Override
- public String getRefName() {
- return refName;
- }
-
- @Override
- public String getProjectName() {
- return projectName;
- }
-
- @Override
- public NotifyHandling getNotify() {
- return null;
- }
-
- @Override
- public String getOldObjectId() {
- return ObjectId.zeroId().getName();
- }
-
- @Override
- public String getNewObjectId() {
- return newObjectId.getName();
- }
-
- @Override
- public boolean isCreate() {
- return false;
- }
-
- @Override
- public boolean isDelete() {
- return false;
- }
-
- @Override
- public boolean isNonFastForward() {
- return false;
- }
-
- @Override
- public AccountInfo getUpdater() {
- return null;
+ RefUpdateAttribute upd = new RefUpdateAttribute();
+ upd.newRev = newObjectId.getName();
+ upd.oldRev = ObjectId.zeroId().getName();
+ upd.project = projectName;
+ upd.refName = refName;
+ this.refUpdate = Suppliers.ofInstance(upd);
}
}