You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ca...@apache.org on 2015/05/14 01:33:53 UTC
curator git commit: CURATOR-161 - Fixed up some potential race
conditions with unit tests.
Repository: curator
Updated Branches:
refs/heads/CURATOR-161 ba4da2c3c -> a47c03671
CURATOR-161 - Fixed up some potential race conditions with unit tests.
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/a47c0367
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/a47c0367
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/a47c0367
Branch: refs/heads/CURATOR-161
Commit: a47c03671452a20e70deb2b8668d70bd92d78ce7
Parents: ba4da2c
Author: Cameron McKenzie <ca...@unico.com.au>
Authored: Thu May 14 09:33:22 2015 +1000
Committer: Cameron McKenzie <ca...@unico.com.au>
Committed: Thu May 14 09:33:22 2015 +1000
----------------------------------------------------------------------
.../framework/imps/TestRemoveWatches.java | 55 ++++++++++++++++----
1 file changed, 46 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/curator/blob/a47c0367/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java
index fc15f0c..49f34ea 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestRemoveWatches.java
@@ -4,6 +4,7 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -30,23 +31,51 @@ import org.testng.annotations.Test;
public class TestRemoveWatches extends BaseClassForTests
{
- private boolean blockUntilDesiredConnectionState(CuratorFramework client, Timing timing, final ConnectionState desiredState)
+ private AtomicReference<ConnectionState> registerConnectionStateListener(CuratorFramework client)
{
- final CountDownLatch latch = new CountDownLatch(1);
+ final AtomicReference<ConnectionState> state = new AtomicReference<ConnectionState>();
client.getConnectionStateListenable().addListener(new ConnectionStateListener()
{
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState)
{
- if(newState == desiredState)
+ state.set(newState);
+ synchronized(state)
{
- latch.countDown();
+ state.notify();
}
}
});
- return timing.awaitLatch(latch);
+ return state;
+ }
+
+ private boolean blockUntilDesiredConnectionState(AtomicReference<ConnectionState> stateRef, Timing timing, final ConnectionState desiredState)
+ {
+ if(stateRef.get() == desiredState)
+ {
+ return true;
+ }
+
+ synchronized(stateRef)
+ {
+ if(stateRef.get() == desiredState)
+ {
+ return true;
+ }
+
+ try
+ {
+ stateRef.wait(timing.milliseconds());
+ return stateRef.get() == desiredState;
+ }
+ catch(InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ return false;
+ }
+ }
}
@Test
@@ -337,6 +366,8 @@ public class TestRemoveWatches extends BaseClassForTests
{
client.start();
+ AtomicReference<ConnectionState> stateRef = registerConnectionStateListener(client);
+
final String path = "/";
final CountDownLatch removedLatch = new CountDownLatch(1);
@@ -348,7 +379,7 @@ public class TestRemoveWatches extends BaseClassForTests
//Stop the server so we can check if we can remove watches locally when offline
server.stop();
- blockUntilDesiredConnectionState(client, timing, ConnectionState.SUSPENDED);
+ Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
client.watches().removeAll().locally().forPath(path);
@@ -371,6 +402,8 @@ public class TestRemoveWatches extends BaseClassForTests
{
client.start();
+ AtomicReference<ConnectionState> stateRef = registerConnectionStateListener(client);
+
final String path = "/";
final CountDownLatch removedLatch = new CountDownLatch(1);
@@ -382,7 +415,7 @@ public class TestRemoveWatches extends BaseClassForTests
//Stop the server so we can check if we can remove watches locally when offline
server.stop();
- blockUntilDesiredConnectionState(client, timing, ConnectionState.SUSPENDED);
+ Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
client.watches().removeAll().locally().inBackground().forPath(path);
@@ -470,6 +503,8 @@ public class TestRemoveWatches extends BaseClassForTests
try
{
client.start();
+
+ AtomicReference<ConnectionState> stateRef = registerConnectionStateListener(client);
String path = "/";
@@ -480,7 +515,7 @@ public class TestRemoveWatches extends BaseClassForTests
server.stop();
- blockUntilDesiredConnectionState(client, timing, ConnectionState.SUSPENDED);
+ Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
//Remove the watch while we're not connected
try
@@ -511,6 +546,8 @@ public class TestRemoveWatches extends BaseClassForTests
try
{
client.start();
+
+ AtomicReference<ConnectionState> stateRef = registerConnectionStateListener(client);
final CountDownLatch guaranteeAddedLatch = new CountDownLatch(1);
@@ -533,7 +570,7 @@ public class TestRemoveWatches extends BaseClassForTests
client.checkExists().usingWatcher(watcher).forPath(path);
server.stop();
- blockUntilDesiredConnectionState(client, timing, ConnectionState.SUSPENDED);
+ Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
//Remove the watch while we're not connected
client.watches().remove(watcher).guaranteed().inBackground().forPath(path);