Merge branch 'stable-3.4' * stable-3.4: Fix the default logic in managing refs-filter Reuse Gerrit code for head update Add HEAD update REST API endpoint Add project initialisation during fetch REST Api call Add project delete REST API endpoint Change-Id: I006a7b86b05ac14b87efa6c38c3c4d2fe7e25b12
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java index d4e22d9..a10a658 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchOne.java
@@ -34,7 +34,6 @@ import com.googlesource.gerrit.plugins.replication.pull.fetch.Fetch; import com.googlesource.gerrit.plugins.replication.pull.fetch.FetchFactory; import com.googlesource.gerrit.plugins.replication.pull.fetch.RefUpdateState; -import com.jcraft.jsch.JSchException; import java.io.IOException; import java.util.Collection; import java.util.HashSet; @@ -314,9 +313,7 @@ stateLog.error("Cannot replicate from " + uri, e, getStatesAsArray()); } catch (TransportException e) { Throwable cause = e.getCause(); - if (cause instanceof JSchException && cause.getMessage().startsWith("UnknownHostKey:")) { - repLog.error("Cannot replicate from {}: {}", uri, cause.getMessage()); - } else if (e instanceof LockFailureException) { + if (e instanceof LockFailureException) { lockRetryCount++; // The LockFailureException message contains both URI and reason // for this failure.
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchRefReplicatedEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchRefReplicatedEvent.java index 8bf257e..0eabf42 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchRefReplicatedEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchRefReplicatedEvent.java
@@ -15,30 +15,23 @@ package com.googlesource.gerrit.plugins.replication.pull; import com.google.gerrit.entities.Project; -import com.google.gerrit.server.events.RefEvent; +import com.googlesource.gerrit.plugins.replication.events.RemoteRefReplicationEvent; import java.util.Objects; import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.transport.URIish; -public class FetchRefReplicatedEvent extends RefEvent { +public class FetchRefReplicatedEvent extends RemoteRefReplicationEvent { static final String TYPE = "fetch-ref-replicated"; - final String project; - final String ref; - final String sourceNode; - final String status; final RefUpdate.Result refUpdateResult; public FetchRefReplicatedEvent( String project, String ref, - String sourceNode, + URIish sourceUri, ReplicationState.RefFetchResult status, RefUpdate.Result refUpdateResult) { - super(TYPE); - this.project = project; - this.ref = ref; - this.sourceNode = sourceNode; - this.status = status.toString(); + super(TYPE, project, ref, sourceUri, status.toString()); this.refUpdateResult = refUpdateResult; } @@ -63,7 +56,7 @@ if (!Objects.equals(event.ref, this.ref)) { return false; } - if (!Objects.equals(event.sourceNode, this.sourceNode)) { + if (!Objects.equals(event.targetUri, this.targetUri)) { return false; } if (!Objects.equals(event.status, this.status)) { @@ -81,8 +74,4 @@ public String getRefName() { return ref; } - - public String getSourceNode() { - return sourceNode; - } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchReplicationScheduledEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchReplicationScheduledEvent.java index 9a29c86..4f96a8f 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchReplicationScheduledEvent.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchReplicationScheduledEvent.java
@@ -15,20 +15,14 @@ package com.googlesource.gerrit.plugins.replication.pull; import com.google.gerrit.entities.Project; -import com.google.gerrit.server.events.RefEvent; +import com.googlesource.gerrit.plugins.replication.events.RemoteRefReplicationEvent; +import org.eclipse.jgit.transport.URIish; -public class FetchReplicationScheduledEvent extends RefEvent { +public class FetchReplicationScheduledEvent extends RemoteRefReplicationEvent { static final String TYPE = "fetch-ref-replication-scheduled"; - final String project; - final String ref; - final String sourceNode; - - public FetchReplicationScheduledEvent(String project, String ref, String sourceNode) { - super(TYPE); - this.project = project; - this.ref = ref; - this.sourceNode = sourceNode; + public FetchReplicationScheduledEvent(String project, String ref, URIish sourceUri) { + super(TYPE, project, ref, sourceUri, null); } @Override @@ -40,8 +34,4 @@ public Project.NameKey getProjectNameKey() { return Project.nameKey(project); } - - public String getSourceNode() { - return sourceNode; - } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java index ab16318..eb94ecc 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/FetchResultProcessing.java
@@ -55,7 +55,7 @@ // Default doing nothing } - public static String resolveNodeName(URIish uri) { + private static String resolveNodeName(URIish uri) { StringBuilder sb = new StringBuilder(); if (uri.isRemote()) { sb.append(uri.getHost()); @@ -120,8 +120,7 @@ try { Context.setLocalEvent(true); dispatcher.postEvent( - new FetchRefReplicatedEvent( - project, ref, resolveNodeName(uri), status, refUpdateResult)); + new FetchRefReplicatedEvent(project, ref, uri, status, refUpdateResult)); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log( "Cannot post event for ref '%s', project %s", ref, project); @@ -189,8 +188,7 @@ URIish uri, ReplicationState.RefFetchResult result, RefUpdate.Result refUpdateResult) { - postEvent( - new FetchRefReplicatedEvent(project, ref, resolveNodeName(uri), result, refUpdateResult)); + postEvent(new FetchRefReplicatedEvent(project, ref, uri, result, refUpdateResult)); } @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/Source.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/Source.java index 28aa541..74a4456 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/Source.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/Source.java
@@ -15,7 +15,6 @@ package com.googlesource.gerrit.plugins.replication.pull; import static com.googlesource.gerrit.plugins.replication.ReplicationFileBasedConfig.replaceName; -import static com.googlesource.gerrit.plugins.replication.pull.FetchResultProcessing.resolveNodeName; import static com.googlesource.gerrit.plugins.replication.pull.ReplicationType.SYNC; import com.google.common.base.Throwables; @@ -793,10 +792,9 @@ private void postReplicationScheduledEvent(FetchOne fetchOp, String inputRef) { Set<String> refs = inputRef == null ? fetchOp.getRefs() : ImmutableSet.of(inputRef); Project.NameKey project = fetchOp.getProjectNameKey(); - String targetNode = resolveNodeName(fetchOp.getURI()); for (String ref : refs) { FetchReplicationScheduledEvent event = - new FetchReplicationScheduledEvent(project.get(), ref, targetNode); + new FetchReplicationScheduledEvent(project.get(), ref, fetchOp.getURI()); try { eventDispatcher.get().postEvent(BranchNameKey.create(project, ref), event); } catch (PermissionBackendException e) { @@ -807,13 +805,16 @@ private void postReplicationFailedEvent(FetchOne fetchOp, RefUpdate.Result result) { Project.NameKey project = fetchOp.getProjectNameKey(); - String sourceNode = resolveNodeName(fetchOp.getURI()); try { Context.setLocalEvent(true); for (String ref : fetchOp.getRefs()) { FetchRefReplicatedEvent event = new FetchRefReplicatedEvent( - project.get(), ref, sourceNode, ReplicationState.RefFetchResult.FAILED, result); + project.get(), + ref, + fetchOp.getURI(), + ReplicationState.RefFetchResult.FAILED, + result); try { eventDispatcher.get().postEvent(BranchNameKey.create(project, ref), event); } catch (PermissionBackendException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfiguration.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfiguration.java index ab9c634..aff1266 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfiguration.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfiguration.java
@@ -211,4 +211,9 @@ public int getSlowLatencyThreshold() { return slowLatencyThreshold; } + + @Override + public int getPushBatchSize() { + return 0; + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourcesCollection.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourcesCollection.java index 7be4971..53adaaa 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourcesCollection.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourcesCollection.java
@@ -27,7 +27,11 @@ import com.googlesource.gerrit.plugins.replication.RemoteConfiguration; import com.googlesource.gerrit.plugins.replication.ReplicationConfig; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton @@ -35,7 +39,7 @@ private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final Source.Factory sourceFactory; - private volatile List<Source> sources; + private volatile Map<String, Source> sources; private boolean shuttingDown; private final Provider<ReplicationQueue> replicationQueue; @@ -56,22 +60,26 @@ @Override public List<Source> getAll() { - return sources.stream().filter(Objects::nonNull).collect(toList()); + return sources.values().stream().filter(Objects::nonNull).collect(toList()); } - private List<Source> allSources( + public Optional<Source> getByRemoteName(String remoteName) { + return Optional.ofNullable(sources.get(remoteName)); + } + + private Map<String, Source> allSources( Source.Factory sourceFactory, List<RemoteConfiguration> sourceConfigurations) { return sourceConfigurations.stream() .filter((c) -> c instanceof SourceConfiguration) .map((c) -> (SourceConfiguration) c) .map(sourceFactory::create) - .collect(toList()); + .collect(Collectors.toMap(Source::getRemoteConfigName, Function.identity())); } @Override public void startup(WorkQueue workQueue) { shuttingDown = false; - for (Source cfg : sources) { + for (Source cfg : sources.values()) { cfg.start(workQueue); } } @@ -96,7 +104,7 @@ } int discarded = 0; - for (Source cfg : sources) { + for (Source cfg : sources.values()) { discarded += cfg.shutdown(); } return discarded;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java index 276aa16..3e6c07b 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java
@@ -31,6 +31,8 @@ import com.googlesource.gerrit.plugins.replication.pull.PullReplicationStateLogger; import com.googlesource.gerrit.plugins.replication.pull.ReplicationState; import com.googlesource.gerrit.plugins.replication.pull.ReplicationState.RefFetchResult; +import com.googlesource.gerrit.plugins.replication.pull.Source; +import com.googlesource.gerrit.plugins.replication.pull.SourcesCollection; import com.googlesource.gerrit.plugins.replication.pull.api.data.RevisionData; import com.googlesource.gerrit.plugins.replication.pull.api.exception.MissingParentObjectException; import com.googlesource.gerrit.plugins.replication.pull.api.exception.RefUpdateException; @@ -56,17 +58,20 @@ private final ApplyObject applyObject; private final ApplyObjectMetrics metrics; private final DynamicItem<EventDispatcher> eventDispatcher; + private final SourcesCollection sourcesCollection; @Inject public ApplyObjectCommand( PullReplicationStateLogger fetchStateLog, ApplyObject applyObject, ApplyObjectMetrics metrics, - DynamicItem<EventDispatcher> eventDispatcher) { + DynamicItem<EventDispatcher> eventDispatcher, + SourcesCollection sourcesCollection) { this.fetchStateLog = fetchStateLog; this.applyObject = applyObject; this.metrics = metrics; this.eventDispatcher = eventDispatcher; + this.sourcesCollection = sourcesCollection; } public void applyObject( @@ -80,16 +85,23 @@ try { Context.setLocalEvent(true); + Source source = + sourcesCollection + .getByRemoteName(sourceLabel) + .orElseThrow( + () -> + new IllegalStateException( + String.format("Could not find URI for %s remote", sourceLabel))); eventDispatcher .get() .postEvent( new FetchRefReplicatedEvent( name.get(), refName, - sourceLabel, + source.getURI(name), getStatus(refUpdateState), refUpdateState.getResult())); - } catch (PermissionBackendException e) { + } catch (PermissionBackendException | IllegalStateException e) { logger.atSevere().withCause(e).log( "Cannot post event for ref '%s', project %s", refName, name); } finally {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java index e1ac9ac..8b3c437 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommand.java
@@ -72,8 +72,7 @@ ReplicationState state = fetchReplicationStateFactory.create( new FetchResultProcessing.CommandProcessing(this, eventDispatcher.get())); - Optional<Source> source = - sources.getAll().stream().filter(s -> s.getRemoteConfigName().equals(label)).findFirst(); + Optional<Source> source = sources.getByRemoteName(label); if (!source.isPresent()) { String msg = String.format("Remote configuration section %s not found", label); fetchStateLog.error(msg, state);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java index 77dc947..68044b4 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/FetchGitUpdateProcessingTest.java
@@ -35,6 +35,7 @@ private GitUpdateProcessing gitUpdateProcessing; private CommandProcessing commandProcessing; private Command sshCommandMock; + private static URIish sourceUri; @Before public void setUp() throws Exception { @@ -42,6 +43,7 @@ gitUpdateProcessing = new GitUpdateProcessing(dispatcherMock); sshCommandMock = mock(Command.class); commandProcessing = new CommandProcessing(sshCommandMock, dispatcherMock); + sourceUri = new URIish("git://someHost/someProject.git"); } @Test @@ -51,14 +53,14 @@ new FetchRefReplicatedEvent( "someProject", "refs/heads/master", - "someHost", + sourceUri, RefFetchResult.SUCCEEDED, RefUpdate.Result.NEW); gitUpdateProcessing.onOneProjectReplicationDone( "someProject", "refs/heads/master", - new URIish("git://someHost/someProject.git"), + sourceUri, RefFetchResult.SUCCEEDED, RefUpdate.Result.NEW); verify(dispatcherMock, times(1)).postEvent(eq(expectedEvent)); @@ -71,7 +73,7 @@ new FetchRefReplicatedEvent( "someProject", "refs/heads/master", - "someHost", + sourceUri, RefFetchResult.SUCCEEDED, RefUpdate.Result.NEW); @@ -90,7 +92,7 @@ new FetchRefReplicatedEvent( "someProject", "refs/changes/01/1/1", - "someHost", + sourceUri, RefFetchResult.FAILED, RefUpdate.Result.REJECTED_OTHER_REASON);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java index 51051c0..dfd06f8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java
@@ -31,6 +31,8 @@ import com.googlesource.gerrit.plugins.replication.pull.ApplyObjectMetrics; import com.googlesource.gerrit.plugins.replication.pull.FetchRefReplicatedEvent; import com.googlesource.gerrit.plugins.replication.pull.PullReplicationStateLogger; +import com.googlesource.gerrit.plugins.replication.pull.Source; +import com.googlesource.gerrit.plugins.replication.pull.SourcesCollection; import com.googlesource.gerrit.plugins.replication.pull.api.data.RevisionData; import com.googlesource.gerrit.plugins.replication.pull.api.data.RevisionObjectData; import com.googlesource.gerrit.plugins.replication.pull.api.exception.MissingParentObjectException; @@ -38,8 +40,11 @@ import com.googlesource.gerrit.plugins.replication.pull.fetch.ApplyObject; import com.googlesource.gerrit.plugins.replication.pull.fetch.RefUpdateState; import java.io.IOException; +import java.net.URISyntaxException; +import java.util.Optional; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.transport.URIish; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,6 +59,7 @@ private static final String TEST_REF_NAME = "refs/changes/01/1/1"; private static final NameKey TEST_PROJECT_NAME = Project.nameKey("test-project"); private static final String TEST_REMOTE_NAME = "test-remote-name"; + private static URIish TEST_REMOTE_URI; @Mock private PullReplicationStateLogger fetchStateLog; @Mock private ApplyObject applyObject; @@ -61,20 +67,26 @@ @Mock private DynamicItem<EventDispatcher> eventDispatcherDataItem; @Mock private EventDispatcher eventDispatcher; @Mock private Timer1.Context<String> timetContext; + @Mock private SourcesCollection sourceCollection; + @Mock private Source source; @Captor ArgumentCaptor<Event> eventCaptor; private ApplyObjectCommand objectUnderTest; @Before - public void setup() throws MissingParentObjectException, IOException { + public void setup() throws MissingParentObjectException, IOException, URISyntaxException { RefUpdateState state = new RefUpdateState(TEST_REMOTE_NAME, RefUpdate.Result.NEW); + TEST_REMOTE_URI = new URIish("git://some.remote.uri"); when(eventDispatcherDataItem.get()).thenReturn(eventDispatcher); when(metrics.start(anyString())).thenReturn(timetContext); when(timetContext.stop()).thenReturn(100L); when(applyObject.apply(any(), any(), any())).thenReturn(state); + when(sourceCollection.getByRemoteName(TEST_SOURCE_LABEL)).thenReturn(Optional.of(source)); + when(source.getURI(TEST_PROJECT_NAME)).thenReturn(TEST_REMOTE_URI); objectUnderTest = - new ApplyObjectCommand(fetchStateLog, applyObject, metrics, eventDispatcherDataItem); + new ApplyObjectCommand( + fetchStateLog, applyObject, metrics, eventDispatcherDataItem, sourceCollection); } @Test @@ -90,6 +102,7 @@ FetchRefReplicatedEvent fetchEvent = (FetchRefReplicatedEvent) sentEvent; assertThat(fetchEvent.getProjectNameKey()).isEqualTo(TEST_PROJECT_NAME); assertThat(fetchEvent.getRefName()).isEqualTo(TEST_REF_NAME); + assertThat(fetchEvent.targetUri).isEqualTo(TEST_REMOTE_URI.toASCIIString()); } private RevisionData createSampleRevisionData() {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java index e1ad565..e8d1a0f 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/FetchCommandTest.java
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.google.common.collect.Lists; import com.google.gerrit.entities.Project; import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.server.events.EventDispatcher; @@ -35,6 +34,7 @@ import com.googlesource.gerrit.plugins.replication.pull.SourcesCollection; import com.googlesource.gerrit.plugins.replication.pull.api.exception.RemoteConfigurationMissingException; import java.net.URISyntaxException; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -74,8 +74,7 @@ label = "instance-1-label"; when(fetchReplicationStateFactory.create(any())).thenReturn(state); - when(source.getRemoteConfigName()).thenReturn(label); - when(sources.getAll()).thenReturn(Lists.newArrayList(source)); + when(sources.getByRemoteName(label)).thenReturn(Optional.of(source)); when(source.schedule(eq(projectName), eq(REF_NAME_TO_FETCH), eq(state), any())) .thenReturn(CompletableFuture.completedFuture(null)); objectUnderTest =
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/EventsSerializationTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/EventsSerializationTest.java new file mode 100644 index 0000000..efa521c --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/EventsSerializationTest.java
@@ -0,0 +1,83 @@ +// Copyright (C) 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.googlesource.gerrit.plugins.replication.pull.event; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertTrue; + +import com.google.common.base.Objects; +import com.google.gerrit.server.events.EventGsonProvider; +import com.google.gson.Gson; +import com.googlesource.gerrit.plugins.replication.pull.FetchRefReplicatedEvent; +import com.googlesource.gerrit.plugins.replication.pull.FetchReplicationScheduledEvent; +import com.googlesource.gerrit.plugins.replication.pull.ReplicationState; +import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.transport.URIish; +import org.junit.Before; +import org.junit.Test; + +public class EventsSerializationTest { + private static URIish sourceUri; + private static final Gson eventGson = new EventGsonProvider().get(); + private static final String TEST_PROJECT = "test_project"; + private static final String TEST_REF = "refs/heads/master"; + + @Before + public void setUp() throws Exception { + sourceUri = new URIish(String.format("git://aSourceNode/%s.git", TEST_PROJECT)); + } + + @Test + public void shouldSerializeFetchRefReplicatedEvent() { + FetchRefReplicatedEvent origEvent = + new FetchRefReplicatedEvent( + TEST_PROJECT, + TEST_REF, + sourceUri, + ReplicationState.RefFetchResult.SUCCEEDED, + RefUpdate.Result.FAST_FORWARD); + + assertThat(origEvent) + .isEqualTo(eventGson.fromJson(eventGson.toJson(origEvent), FetchRefReplicatedEvent.class)); + } + + @Test + public void shouldSerializeFetchReplicationScheduledEvent() { + FetchReplicationScheduledEvent origEvent = + new FetchReplicationScheduledEvent(TEST_PROJECT, TEST_REF, sourceUri); + + assertTrue( + equals( + origEvent, + eventGson.fromJson(eventGson.toJson(origEvent), FetchReplicationScheduledEvent.class))); + } + + private boolean equals(FetchReplicationScheduledEvent scheduledEvent, Object other) { + if (!(other instanceof FetchReplicationScheduledEvent)) { + return false; + } + FetchReplicationScheduledEvent event = (FetchReplicationScheduledEvent) other; + if (!Objects.equal(event.project, scheduledEvent.project)) { + return false; + } + if (!Objects.equal(event.ref, scheduledEvent.ref)) { + return false; + } + if (!Objects.equal(event.targetUri, scheduledEvent.targetUri)) { + return false; + } + return Objects.equal(event.status, scheduledEvent.status); + } +}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/FetchRefReplicatedEventHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/FetchRefReplicatedEventHandlerTest.java index e528eca..81a4fc0 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/FetchRefReplicatedEventHandlerTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/event/FetchRefReplicatedEventHandlerTest.java
@@ -28,17 +28,20 @@ import com.googlesource.gerrit.plugins.replication.pull.FetchRefReplicatedEvent; import com.googlesource.gerrit.plugins.replication.pull.ReplicationState; import org.eclipse.jgit.lib.RefUpdate; +import org.eclipse.jgit.transport.URIish; import org.junit.Before; import org.junit.Test; public class FetchRefReplicatedEventHandlerTest { private ChangeIndexer changeIndexerMock; private FetchRefReplicatedEventHandler fetchRefReplicatedEventHandler; + private static URIish sourceUri; @Before public void setUp() throws Exception { changeIndexerMock = mock(ChangeIndexer.class); fetchRefReplicatedEventHandler = new FetchRefReplicatedEventHandler(changeIndexerMock); + sourceUri = new URIish("git://aSourceNode/testProject.git"); } @Test @@ -52,7 +55,7 @@ new FetchRefReplicatedEvent( projectNameKey.get(), ref, - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.SUCCEEDED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, times(1)).index(eq(projectNameKey), eq(changeId)); @@ -70,7 +73,7 @@ new FetchRefReplicatedEvent( projectNameKey.get(), ref, - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.SUCCEEDED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, never()).index(eq(projectNameKey), eq(changeId)); @@ -85,7 +88,7 @@ new FetchRefReplicatedEvent( projectNameKey.get(), ref, - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.SUCCEEDED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, never()).index(eq(projectNameKey), eq(changeId)); @@ -97,7 +100,7 @@ new FetchRefReplicatedEvent( Project.nameKey("testProject").get(), "invalidRef", - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.SUCCEEDED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, never()).index(any(), any()); @@ -111,7 +114,7 @@ new FetchRefReplicatedEvent( projectNameKey.get(), ref, - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.FAILED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, never()).index(any(), any()); @@ -125,7 +128,7 @@ new FetchRefReplicatedEvent( projectNameKey.get(), ref, - "aSourceNode", + sourceUri, ReplicationState.RefFetchResult.NOT_ATTEMPTED, RefUpdate.Result.FAST_FORWARD)); verify(changeIndexerMock, never()).index(any(), any());