tests
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/d518417e Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/d518417e Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/d518417e Branch: refs/heads/CURATOR-397 Commit: d518417e5c1bd2d5e4cd1a31833a28eb9bc9bc0a Parents: 45daa69 Author: randgalt <[email protected]> Authored: Sat Apr 8 23:29:39 2017 -0500 Committer: randgalt <[email protected]> Committed: Sat Apr 8 23:29:39 2017 -0500 ---------------------------------------------------------------------- .../async/modeled/recipes/ModeledNodeCache.java | 2 +- .../details/recipes/TestEventTypeMappings.java | 18 +++ .../modeled/recipes/TestModeledCaches.java | 156 +++++++++++++++++++ .../modeled/recipes/TestModeledNodeCache.java | 43 ----- 4 files changed, 175 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/d518417e/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java index 73949c5..97df1d6 100644 --- a/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java +++ b/curator-x-async/src/main/java/org/apache/curator/x/async/modeled/recipes/ModeledNodeCache.java @@ -39,7 +39,7 @@ public interface ModeledNodeCache<T> extends Closeable * @param serializer for the model * @return new wrapped cache */ - static <T> ModeledNodeCache wrap(NodeCache cache, ModelSerializer<T> serializer) + static <T> ModeledNodeCache<T> wrap(NodeCache cache, ModelSerializer<T> serializer) { return new ModeledNodeCacheImpl<>(cache, serializer); } http://git-wip-us.apache.org/repos/asf/curator/blob/d518417e/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/details/recipes/TestEventTypeMappings.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/details/recipes/TestEventTypeMappings.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/details/recipes/TestEventTypeMappings.java index ea46ab1..73c634f 100644 --- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/details/recipes/TestEventTypeMappings.java +++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/details/recipes/TestEventTypeMappings.java @@ -1,3 +1,21 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.curator.x.async.modeled.details.recipes; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; http://git-wip-us.apache.org/repos/asf/curator/blob/d518417e/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledCaches.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledCaches.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledCaches.java new file mode 100644 index 0000000..65b4e37 --- /dev/null +++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledCaches.java @@ -0,0 +1,156 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.curator.x.async.modeled.recipes; + +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.framework.recipes.cache.NodeCache; +import org.apache.curator.framework.recipes.cache.PathChildrenCache; +import org.apache.curator.retry.RetryOneTime; +import org.apache.curator.utils.CloseableUtils; +import org.apache.curator.x.async.CompletableBaseClassForTests; +import org.apache.curator.x.async.modeled.JacksonModelSerializer; +import org.apache.curator.x.async.modeled.ModeledAsyncCuratorFramework; +import org.apache.curator.x.async.modeled.ZPath; +import org.apache.curator.x.async.modeled.models.TestModel; +import org.apache.zookeeper.data.Stat; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import java.math.BigInteger; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +public class TestModeledCaches extends CompletableBaseClassForTests +{ + private CuratorFramework client; + private JacksonModelSerializer<TestModel> serializer; + private ZPath path; + private ModeledAsyncCuratorFramework<TestModel> modeled; + + @BeforeMethod + @Override + public void setup() throws Exception + { + super.setup(); + + client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1)); + client.start(); + + serializer = JacksonModelSerializer.build(TestModel.class); + + path = ZPath.parse("/test/path"); + modeled = ModeledAsyncCuratorFramework.wrap(client, path, serializer); + } + + @AfterMethod + @Override + public void teardown() throws Exception + { + CloseableUtils.closeQuietly(client); + + super.teardown(); + } + + @Test + public void testModeledNodeCache() throws InterruptedException + { + try ( ModeledNodeCache<TestModel> cache = ModeledNodeCache.wrap(new NodeCache(client, path.fullPath()), serializer) ) + { + cache.start(true); + + Semaphore changesAvailable = new Semaphore(0); + cache.getListenable().addListener(changesAvailable::release); + + TestModel model1 = new TestModel("a", "b", "c", 1, BigInteger.TEN); + TestModel model2 = new TestModel("d", "e", "f", 10, BigInteger.ONE); + + Stat stat = new Stat(); + modeled.create(model1, stat); + Assert.assertTrue(timing.acquireSemaphore(changesAvailable)); + Assert.assertTrue(cache.getCurrentData().isPresent()); + Assert.assertTrue(cache.getCurrentData().get().getData().isPresent()); + Assert.assertEquals(cache.getCurrentData().get().getPath(), path); + Assert.assertEquals(cache.getCurrentData().get().getData().get(), model1); + Assert.assertEquals(cache.getCurrentData().get().getStat(), stat); + + timing.sleepABit(); + Assert.assertEquals(changesAvailable.availablePermits(), 0); + + modeled.update(model2); + Assert.assertTrue(timing.acquireSemaphore(changesAvailable)); + Assert.assertTrue(cache.getCurrentData().isPresent()); + Assert.assertTrue(cache.getCurrentData().get().getData().isPresent()); + Assert.assertEquals(cache.getCurrentData().get().getPath(), path); + Assert.assertEquals(cache.getCurrentData().get().getData().get(), model2); + + modeled.delete(); + Assert.assertTrue(timing.acquireSemaphore(changesAvailable)); + Assert.assertFalse(cache.getCurrentData().isPresent()); + } + } + + @Test + public void testModeledPathChildrenCacheWithData() throws InterruptedException + { + try ( ModeledPathChildrenCache<TestModel> cache = ModeledPathChildrenCache.wrap(new PathChildrenCache(client, path.fullPath(), true), serializer) ) + { + cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE); + + BlockingQueue<ModeledCacheEvent<TestModel>> events = new LinkedBlockingQueue<>(); + ModeledCacheListener<TestModel> listener = events::add; + cache.getListenable().addListener(listener); + + TestModel model1 = new TestModel("a", "b", "c", 1, BigInteger.TEN); + TestModel model2 = new TestModel("d", "e", "f", 10, BigInteger.ONE); + TestModel model3 = new TestModel("g", "h", "i", 100, BigInteger.ZERO); + + modeled.at("1").create(model1).thenApply(__ -> modeled.at("2").create(model2)); + ModeledCacheEvent<TestModel> event1 = events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS); + ModeledCacheEvent<TestModel> event2 = events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS); + Assert.assertNotNull(event1); + Assert.assertNotNull(event2); + Assert.assertEquals(event1.getType(), ModeledCacheEventType.NODE_ADDED); + Assert.assertEquals(event1.getNode().isPresent() ? event1.getNode().get().getData().orElse(null) : null, model1); + Assert.assertEquals(event2.getNode().isPresent() ? event2.getNode().get().getData().orElse(null) : null, model2); + Assert.assertEquals(event1.getNode().get().getPath(), path.at("1")); + Assert.assertEquals(event2.getNode().get().getPath(), path.at("2")); + + modeled.at("1").delete(); + event1 = events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS); + Assert.assertNotNull(event1); + Assert.assertEquals(event1.getType(), ModeledCacheEventType.NODE_REMOVED); + Assert.assertEquals(event1.getNode().get().getPath(), path.at("1")); + + modeled.at("2").update(model3); + event1 = events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS); + Assert.assertNotNull(event1); + Assert.assertEquals(event1.getType(), ModeledCacheEventType.NODE_UPDATED); + Assert.assertEquals(event1.getNode().get().getPath(), path.at("2")); + Assert.assertEquals(event1.getNode().isPresent() ? event1.getNode().get().getData().orElse(null) : null, model3); + + cache.getListenable().removeListener(listener); + modeled.at("2").delete(); + Assert.assertNull(events.poll(timing.forSleepingABit().milliseconds(), TimeUnit.MILLISECONDS)); // listener is removed - shouldn't get an event + } + } +} http://git-wip-us.apache.org/repos/asf/curator/blob/d518417e/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledNodeCache.java ---------------------------------------------------------------------- diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledNodeCache.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledNodeCache.java deleted file mode 100644 index 0f6cd97..0000000 --- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/recipes/TestModeledNodeCache.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.apache.curator.x.async.modeled.recipes; - -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.RetryOneTime; -import org.apache.curator.test.BaseClassForTests; -import org.apache.curator.test.Timing; -import org.apache.curator.utils.CloseableUtils; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -public class TestModeledNodeCache extends BaseClassForTests -{ - private static final Timing timing = new Timing(); - private CuratorFramework client; - - @BeforeMethod - @Override - public void setup() throws Exception - { - super.setup(); - - client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1)); - client.start(); - } - - @AfterMethod - @Override - public void teardown() throws Exception - { - CloseableUtils.closeQuietly(client); - - super.teardown(); - } - - @Test - public void testBasic() - { - ModeledNodeCache nodeCache = null;//ModeledNodeCache.wrap(new NodeCache(client, modeledDetails.getPath().fullPath())); - nodeCache.start(); - } -}
