Repository: curator Updated Branches: refs/heads/persistent-watch 6cfd38c25 -> 40a985243
finished porting TreeCache tests Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/40a98524 Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/40a98524 Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/40a98524 Branch: refs/heads/persistent-watch Commit: 40a985243d2959a2fff397eeebb9ff844f6a154c Parents: 6cfd38c Author: randgalt <randg...@apache.org> Authored: Sat Dec 31 19:48:10 2016 -0500 Committer: randgalt <randg...@apache.org> Committed: Sat Dec 31 19:48:10 2016 -0500 ---------------------------------------------------------------------- .../framework/recipes/watch/TestTreeCache.java | 140 +++++++++++++++++++ 1 file changed, 140 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/40a98524/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestTreeCache.java ---------------------------------------------------------------------- diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestTreeCache.java index fe3a681..fb05bd3 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestTreeCache.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestTreeCache.java @@ -19,9 +19,11 @@ package org.apache.curator.framework.recipes.watch; import org.apache.curator.test.KillServerSession; +import org.apache.curator.utils.CloseableUtils; import org.apache.zookeeper.CreateMode; import org.testng.Assert; import org.testng.annotations.Test; +import java.util.concurrent.Semaphore; public class TestTreeCache extends BaseTestTreeCache { @@ -409,4 +411,142 @@ public class TestTreeCache extends BaseTestTreeCache assertNoMoreEvents(); } + + @Test + public void testBasics() throws Exception + { + client.create().forPath("/test"); + + cache = newTreeCacheWithListeners(client, "/test"); + cache.start(); + assertEvent(CacheEvent.NODE_CREATED, "/test"); + assertEvent(CacheEvent.CACHE_REFRESHED); + assertChildNodeNames("/test"); + Assert.assertNull(cache.get("/t")); + Assert.assertNull(cache.get("/testing")); + + client.create().forPath("/test/one", "hey there".getBytes()); + assertEvent(CacheEvent.NODE_CREATED, "/test/one"); + assertChildNodeNames("/test", "one"); + Assert.assertEquals(new String(cache.get("/test/one").getData()), "hey there"); + assertChildNodeNames("/test/one"); + Assert.assertNull(cache.get("/test/o")); + Assert.assertNull(cache.get("/test/onely")); + + client.setData().forPath("/test/one", "sup!".getBytes()); + assertEvent(CacheEvent.NODE_CHANGED, "/test/one"); + assertChildNodeNames("/test", "one"); + Assert.assertEquals(new String(cache.get("/test/one").getData()), "sup!"); + + client.delete().forPath("/test/one"); + assertEvent(CacheEvent.NODE_DELETED, "/test/one", "sup!".getBytes()); + assertChildNodeNames("/test"); + + assertNoMoreEvents(); + } + + @Test + public void testBasicsOnTwoCaches() throws Exception + { + CuratorCache cache2 = newTreeCacheWithListeners(client, "/test"); + cache2.getListenable().removeListener(eventListener); // Don't listen on the second cache. + + // Just ensures the same event count; enables test flow control on cache2. + final Semaphore semaphore = new Semaphore(0); + cache2.getListenable().addListener(new CacheListener() + { + @Override + public void process(CacheEvent event, String path, CachedNode affectedNode) + { + semaphore.release(); + } + }); + + try + { + client.create().forPath("/test"); + + cache = newTreeCacheWithListeners(client, "/test"); + cache.start(); + cache2.start(); + + assertEvent(CacheEvent.NODE_CREATED, "/test"); + assertEvent(CacheEvent.CACHE_REFRESHED); + semaphore.acquire(2); + + client.create().forPath("/test/one", "hey there".getBytes()); + assertEvent(CacheEvent.NODE_CREATED, "/test/one"); + Assert.assertEquals(new String(cache.get("/test/one").getData()), "hey there"); + semaphore.acquire(); + Assert.assertEquals(new String(cache2.get("/test/one").getData()), "hey there"); + + client.setData().forPath("/test/one", "sup!".getBytes()); + assertEvent(CacheEvent.NODE_CHANGED, "/test/one"); + Assert.assertEquals(new String(cache.get("/test/one").getData()), "sup!"); + semaphore.acquire(); + Assert.assertEquals(new String(cache2.get("/test/one").getData()), "sup!"); + + client.delete().forPath("/test/one"); + assertEvent(CacheEvent.NODE_DELETED, "/test/one", "sup!".getBytes()); + Assert.assertNull(cache.get("/test/one")); + semaphore.acquire(); + Assert.assertNull(cache2.get("/test/one")); + + assertNoMoreEvents(); + Assert.assertEquals(semaphore.availablePermits(), 0); + } + finally + { + CloseableUtils.closeQuietly(cache2); + } + } + + @Test + public void testDeleteNodeAfterCloseDoesntCallExecutor() throws Exception + { + client.create().forPath("/test"); + + cache = newTreeCacheWithListeners(client, "/test"); + cache.start(); + assertEvent(CacheEvent.NODE_CREATED, "/test"); + assertEvent(CacheEvent.CACHE_REFRESHED); + + client.create().forPath("/test/one", "hey there".getBytes()); + assertEvent(CacheEvent.NODE_CREATED, "/test/one"); + Assert.assertEquals(new String(cache.get("/test/one").getData()), "hey there"); + + cache.close(); + assertNoMoreEvents(); + + client.delete().forPath("/test/one"); + assertNoMoreEvents(); + } + + /** + * Make sure TreeCache gets to a sane state when we can't initially connect to server. + */ + @Test + public void testServerNotStartedYet() throws Exception + { + // Stop the existing server. + server.stop(); + + // Shutdown the existing client and re-create it started. + client.close(); + initCuratorFramework(); + + // Start the client disconnected. + cache = newTreeCacheWithListeners(client, "/test"); + cache.start(); + assertNoMoreEvents(); + + // Now restart the server. + server.restart(); + assertEvent(CacheEvent.CACHE_REFRESHED); + + client.create().forPath("/test"); + + assertEvent(CacheEvent.NODE_CREATED, "/test"); + assertNoMoreEvents(); + } }