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();
-    }
-}

Reply via email to