Clean up ReplicationQueue tests ReplicationQueueIT integration test class was introduced in stable-2.15 branch to test fix for dropping events during the start. In stable-3.0 there is a ReplicationIT test class which contains tests for the same part of the code. Merging both classes allows to avoid a lot of boilerplate code and making tests easier to understand. Bug: Issue 11573 Change-Id: I2ec71933f3657401932f1b3a1f371f0784a374a4
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java index 191bae1..a6a8ac8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java
@@ -306,8 +306,26 @@ } } - private Project.NameKey createTestProject(String name) throws Exception { - return projectOperations.newProject().name(name).create(); + @Test + public void shouldNotDropEventsWhenStarting() throws Exception { + Project.NameKey targetProject = createTestProject(project + "replica"); + + setReplicationDestination("foo", "replica", ALL_PROJECTS); + reloadConfig(); + + replicationQueueStop(); + Result pushResult = createChange(); + replicationQueueStart(); + + RevCommit sourceCommit = pushResult.getCommit(); + String sourceRef = pushResult.getPatchSet().getRefName(); + + try (Repository repo = repoManager.openRepository(targetProject)) { + waitUntil(() -> checkedGetRef(repo, sourceRef) != null); + Ref targetBranchRef = getRef(repo, sourceRef); + assertThat(targetBranchRef).isNotNull(); + assertThat(targetBranchRef.getObjectId()).isEqualTo(sourceCommit.getId()); + } } private Ref getRef(Repository repo, String branchName) throws IOException { @@ -347,11 +365,35 @@ } private void reloadConfig() { - plugin.getSysInjector().getInstance(AutoReloadConfigDecorator.class).forceReload(); + getAutoReloadConfigDecoratorInstance().forceReload(); } private void shutdownConfig() { - plugin.getSysInjector().getInstance(AutoReloadConfigDecorator.class).shutdown(); + getAutoReloadConfigDecoratorInstance().shutdown(); + } + + private void replicationQueueStart() { + getReplicationQueueInstance().start(); + } + + private void replicationQueueStop() { + getReplicationQueueInstance().stop(); + } + + private AutoReloadConfigDecorator getAutoReloadConfigDecoratorInstance() { + return getInstance(AutoReloadConfigDecorator.class); + } + + private ReplicationQueue getReplicationQueueInstance() { + return getInstance(ReplicationQueue.class); + } + + private <T> T getInstance(Class<T> classObj) { + return plugin.getSysInjector().getInstance(classObj); + } + + private Project.NameKey createTestProject(String name) throws Exception { + return projectOperations.newProject().name(name).create(); } private List<ReplicateRefUpdate> listReplicationTasks(String refRegex) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationQueueIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationQueueIT.java deleted file mode 100644 index 0f27669..0000000 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationQueueIT.java +++ /dev/null
@@ -1,141 +0,0 @@ -// Copyright (C) 2019 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; - -import static com.google.common.truth.Truth.assertThat; -import static java.util.stream.Collectors.toList; - -import com.google.common.base.Stopwatch; -import com.google.gerrit.acceptance.LightweightPluginDaemonTest; -import com.google.gerrit.acceptance.PushOneCommit.Result; -import com.google.gerrit.acceptance.TestPlugin; -import com.google.gerrit.acceptance.UseLocalDisk; -import com.google.gerrit.acceptance.testsuite.project.ProjectOperations; -import com.google.gerrit.reviewdb.client.Project; -import com.google.gerrit.server.config.SitePaths; -import com.google.inject.Inject; -import java.io.IOException; -import java.nio.file.Path; -import java.time.Duration; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.storage.file.FileBasedConfig; -import org.eclipse.jgit.util.FS; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@UseLocalDisk -@TestPlugin( - name = "replication", - sysModule = "com.googlesource.gerrit.plugins.replication.ReplicationModule") -public class ReplicationQueueIT extends LightweightPluginDaemonTest { - private static final Logger logger = LoggerFactory.getLogger(ReplicationQueueIT.class); - - private static final int TEST_REPLICATION_DELAY = 1; - private static final Duration TEST_TIMEOUT = Duration.ofSeconds(TEST_REPLICATION_DELAY * 2); - - @Inject private SitePaths sitePaths; - @Inject private ProjectOperations projectOperations; - - private Path gitPath; - private FileBasedConfig config; - - @Override - public void setUpTestPlugin() throws Exception { - gitPath = sitePaths.site_path.resolve("git"); - config = - new FileBasedConfig(sitePaths.etc_dir.resolve("replication.config").toFile(), FS.DETECTED); - - setReplicationDestination("foo", "replica"); - super.setUpTestPlugin(); - } - - @Test - public void shouldNotDropEventsWhenStarting() throws Exception { - Project.NameKey targetProject = createTestProject(project + "replica"); - - replicationQueueStop(); - Result pushResult = createChange(); - replicationQueueStart(); - - RevCommit sourceCommit = pushResult.getCommit(); - String sourceRef = pushResult.getPatchSet().getRefName(); - - try (Repository repo = repoManager.openRepository(targetProject)) { - waitUntil(() -> checkedGetRef(repo, sourceRef) != null); - Ref targetBranchRef = getRef(repo, sourceRef); - assertThat(targetBranchRef).isNotNull(); - assertThat(targetBranchRef.getObjectId()).isEqualTo(sourceCommit.getId()); - } - } - - private Ref getRef(Repository repo, String branchName) throws IOException { - return repo.getRefDatabase().exactRef(branchName); - } - - private Ref checkedGetRef(Repository repo, String branchName) { - try { - return repo.getRefDatabase().exactRef(branchName); - } catch (Exception e) { - logger.error("failed to get ref %s in repo %s", branchName, repo); - return null; - } - } - - private Project.NameKey createTestProject(String name) throws Exception { - return projectOperations.newProject().name(name).create(); - } - - private void setReplicationDestination(String remoteName, String replicaSuffix) - throws IOException { - setReplicationDestination(remoteName, Arrays.asList(replicaSuffix)); - } - - private void setReplicationDestination(String remoteName, List<String> replicaSuffixes) - throws IOException { - - List<String> replicaUrls = - replicaSuffixes.stream() - .map(suffix -> gitPath.resolve("${name}" + suffix + ".git").toString()) - .collect(toList()); - config.setStringList("remote", remoteName, "url", replicaUrls); - config.setInt("remote", remoteName, "replicationDelay", TEST_REPLICATION_DELAY); - config.save(); - } - - private void waitUntil(Supplier<Boolean> waitCondition) throws InterruptedException { - Stopwatch stopwatch = Stopwatch.createStarted(); - while (!waitCondition.get()) { - if (stopwatch.elapsed().compareTo(TEST_TIMEOUT) > 0) { - throw new InterruptedException(); - } - TimeUnit.MILLISECONDS.sleep(50); - } - } - - private void replicationQueueStart() { - plugin.getSysInjector().getInstance(ReplicationQueue.class).start(); - } - - private void replicationQueueStop() { - plugin.getSysInjector().getInstance(ReplicationQueue.class).stop(); - } -}