diff options
author | Adithya Chakilam <achakila@codeaurora.org> | 2020-08-05 15:56:20 -0500 |
---|---|---|
committer | Adithya Chakilam <achakila@codeaurora.org> | 2020-10-13 10:03:44 -0500 |
commit | 2e3d4f2472bcc97ee4e99a33510a2efca0fd096c (patch) | |
tree | e4a73f082828b13027dad1440a31c30f491901a4 | |
parent | d3cb4ca519f1f7372aa35ea356d2a7fb48865b1b (diff) |
ReplicationTasksStorage.Task: Add multi-primary unit tests
These tests examine the replication scenarios under
multi-primary setup making use of the api calls present
in ReplicationTasksStorage.Task class similarly as done in
single master setup.
These tests ensure that the replication compatability in
multi-primary setup is not broken.
Change-Id: I980e8286bf11d31c6ab89e49ef065fdde1118181
2 files changed, 200 insertions, 6 deletions
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskMPTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskMPTest.java new file mode 100644 index 0000000..23d6759 --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskMPTest.java @@ -0,0 +1,194 @@ +// Copyright (C) 2020 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.googlesource.gerrit.plugins.replication.ReplicationTasksStorageTaskTest.assertIsRunning; +import static com.googlesource.gerrit.plugins.replication.ReplicationTasksStorageTaskTest.assertIsWaiting; +import static com.googlesource.gerrit.plugins.replication.ReplicationTasksStorageTaskTest.assertNotRunning; +import static com.googlesource.gerrit.plugins.replication.ReplicationTasksStorageTaskTest.assertNotWaiting; + +import com.google.common.jimfs.Configuration; +import com.google.common.jimfs.Jimfs; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import org.eclipse.jgit.transport.URIish; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ReplicationTasksStorageTaskMPTest { + protected static final String PROJECT = "myProject"; + protected static final String REF = "myRef"; + protected static final String REMOTE = "myDest"; + protected static final URIish URISH = + ReplicationTasksStorageTest.getUrish("http://example.com/" + PROJECT + ".git"); + protected static final ReplicationTasksStorage.ReplicateRefUpdate REF_UPDATE = + new ReplicationTasksStorage.ReplicateRefUpdate(PROJECT, REF, URISH, REMOTE); + + protected FileSystem fileSystem; + protected Path storageSite; + protected ReplicationTasksStorage nodeA; + protected ReplicationTasksStorage nodeB; + protected ReplicationTasksStorage.Task taskA; + protected ReplicationTasksStorage.Task taskB; + + @Before + public void setUp() throws Exception { + fileSystem = Jimfs.newFileSystem(Configuration.unix()); + storageSite = fileSystem.getPath("replication_site"); + nodeA = new ReplicationTasksStorage(storageSite); + nodeB = new ReplicationTasksStorage(storageSite); + taskA = nodeA.new Task(REF_UPDATE); + taskB = nodeB.new Task(REF_UPDATE); + } + + @After + public void tearDown() throws Exception { + fileSystem.close(); + } + + @Test + public void waitingTaskCanBeCompletedByOtherNode() { + taskA.create(); + + taskB.start(); + assertIsRunning(taskA); + + taskB.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void resetTaskCanBeCompletedByOtherNode() { + taskA.create(); + taskA.start(); + + taskA.reset(); + assertIsWaiting(taskA); + + taskB.start(); + assertIsRunning(taskA); + assertIsRunning(taskB); + + taskB.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void retryCanBeRetriedAndCompletedByOtherNode() { + taskA.create(); + taskA.start(); + taskA.reset(); + taskB.start(); + + taskB.reset(); + assertIsWaiting(taskA); + + taskB.start(); + assertIsRunning(taskA); + + taskB.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void retryCanBeRetriedOtherNodeAndCompletedByOriginalNode() { + taskA.create(); + taskA.start(); + taskA.reset(); + taskB.start(); + taskB.reset(); + + taskA.start(); + assertIsRunning(taskA); + + taskA.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void canBeResetAllAndCompletedByOtherNode() { + taskA.create(); + taskA.start(); + + nodeB.resetAll(); + assertIsWaiting(taskA); + + taskB.create(); + taskB.start(); + assertIsRunning(taskA); + + taskA.finish(); + // Bug: https://crbug.com/gerrit/12973 + // assertIsRunning(taskB); + + taskB.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void resetAllAndCompletedByOtherNodeWhenTaskAFinishesBeforeTaskB() { + taskA.create(); + taskA.start(); + nodeB.resetAll(); + + taskA.finish(); + assertIsWaiting(taskA); + + taskB.start(); + assertIsRunning(taskA); + + taskB.finish(); + assertNotRunning(taskA); + assertNotWaiting(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } + + @Test + public void resetAllAndCompletedByOtherNodeWhenTaskAFinishesAfterTaskB() { + taskA.create(); + taskA.start(); + nodeB.resetAll(); + + taskB.start(); + assertIsRunning(taskA); + + taskB.finish(); + assertNotWaiting(taskA); + assertNotRunning(taskA); + + taskA.finish(); + assertNotWaiting(taskA); + assertNotRunning(taskA); + assertNotRunning(taskB); + assertNotWaiting(taskB); + } +} diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskTest.java index ca69644..38c2905 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageTaskTest.java @@ -346,27 +346,27 @@ public class ReplicationTasksStorageTaskTest { assertIsWaiting(persistedView); } - private void assertIsWaiting(Task task) { + protected static void assertIsWaiting(Task task) { assertTrue(whiteBoxIsWaiting(task)); } - private void assertNotWaiting(Task task) { + protected static void assertNotWaiting(Task task) { assertFalse(whiteBoxIsWaiting(task)); } - private void assertIsRunning(Task task) { + protected static void assertIsRunning(Task task) { assertTrue(whiteBoxIsRunning(task)); } - private void assertNotRunning(Task task) { + protected static void assertNotRunning(Task task) { assertFalse(whiteBoxIsRunning(task)); } - private boolean whiteBoxIsRunning(Task task) { + private static boolean whiteBoxIsRunning(Task task) { return Files.exists(task.running); } - private boolean whiteBoxIsWaiting(Task task) { + private static boolean whiteBoxIsWaiting(Task task) { return Files.exists(task.waiting); } |