From a409a15f070902da4f3e4ba963ceb4e01445829a Mon Sep 17 00:00:00 2001 From: Winston Li Date: Tue, 5 Apr 2016 20:39:36 +0100 Subject: [PATCH] Fix #1384, possibly #1174 too --- services/git-bridge/pom.xml | 6 +++++ .../snapshot/push/PostbackManager.java | 26 ++++++++++++------- .../snapshot/push/PostbackManagerTest.java | 20 +++++++++++++- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/services/git-bridge/pom.xml b/services/git-bridge/pom.xml index aef616873b..89b4ff3a9a 100644 --- a/services/git-bridge/pom.xml +++ b/services/git-bridge/pom.xml @@ -123,6 +123,12 @@ slf4j-simple 1.7.13 + + com.google.guava + guava + 19.0 + + org.mock-server mockserver-netty diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManager.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManager.java index 6dca0b6b3d..3cc598b44b 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManager.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManager.java @@ -1,10 +1,13 @@ package uk.ac.ic.wlgitbridge.snapshot.push; -import uk.ac.ic.wlgitbridge.snapshot.push.exception.*; -import uk.ac.ic.wlgitbridge.util.Log; +import com.google.common.base.Preconditions; +import uk.ac.ic.wlgitbridge.snapshot.push.exception.InvalidPostbackKeyException; +import uk.ac.ic.wlgitbridge.snapshot.push.exception.SnapshotPostException; +import uk.ac.ic.wlgitbridge.snapshot.push.exception.UnexpectedPostbackException; import java.math.BigInteger; import java.security.SecureRandom; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -14,11 +17,17 @@ import java.util.Map; public class PostbackManager { private final SecureRandom random; - private final Map postbackContentsTable; + final Map postbackContentsTable; + + PostbackManager(SecureRandom random) { + this.random = random; + postbackContentsTable = Collections.synchronizedMap( + new HashMap() + ); + } public PostbackManager() { - random = new SecureRandom(); - postbackContentsTable = new HashMap(); + this(new SecureRandom()); } public int waitForVersionIdOrThrow(String projectName) @@ -26,10 +35,7 @@ public class PostbackManager { try { PostbackPromise postbackPromise = postbackContentsTable.get(projectName); - if (postbackPromise == null) { - Log.warn("[{}] PostbackPromise was null.", projectName); - throw new InternalErrorException(); - } + Preconditions.checkNotNull(postbackPromise); return postbackPromise.waitForPostback(); } finally { postbackContentsTable.remove(projectName); @@ -56,7 +62,7 @@ public class PostbackManager { private PostbackPromise getPostbackForProject(String projectName) throws UnexpectedPostbackException { - PostbackPromise contents = postbackContentsTable.remove(projectName); + PostbackPromise contents = postbackContentsTable.get(projectName); if (contents == null) { throw new UnexpectedPostbackException(); } diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManagerTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManagerTest.java index f552a4a82a..8575127064 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManagerTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/snapshot/push/PostbackManagerTest.java @@ -6,6 +6,8 @@ import uk.ac.ic.wlgitbridge.snapshot.push.exception.InternalErrorException; import uk.ac.ic.wlgitbridge.snapshot.push.exception.SnapshotPostException; import uk.ac.ic.wlgitbridge.snapshot.push.exception.UnexpectedPostbackException; +import static org.junit.Assert.*; + /** * Created by winston on 05/04/2016. */ @@ -20,7 +22,7 @@ public class PostbackManagerTest { String key = postbackManager.makeKeyForProject("proj"); postbackManager.postVersionIDForProject("proj", 1, key); int versionId = postbackManager.waitForVersionIdOrThrow("proj"); - Assert.assertEquals("Version id didn't match posted", 1, versionId); + assertEquals("Version id didn't match posted", 1, versionId); } @Test @@ -38,4 +40,20 @@ public class PostbackManagerTest { Assert.fail("Exception wasn't thrown as required"); } + @Test + public void testTableConsistency() throws UnexpectedPostbackException, + SnapshotPostException { + String key1 = postbackManager.makeKeyForProject("proj1"); + assertEquals(1, postbackManager.postbackContentsTable.size()); + String key2 = postbackManager.makeKeyForProject("proj2"); + assertEquals(2, postbackManager.postbackContentsTable.size()); + postbackManager.postVersionIDForProject("proj1", 1, key1); + postbackManager.postVersionIDForProject("proj2", 1, key2); + assertEquals(2, postbackManager.postbackContentsTable.size()); + postbackManager.waitForVersionIdOrThrow("proj1"); + assertEquals(1, postbackManager.postbackContentsTable.size()); + postbackManager.waitForVersionIdOrThrow("proj2"); + Assert.assertTrue(postbackManager.postbackContentsTable.isEmpty()); + } + }