http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/RemoveWatchesTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/RemoveWatchesTest.java b/zookeeper-common/src/test/java/org/apache/zookeeper/RemoveWatchesTest.java deleted file mode 100644 index 931bb6f..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/RemoveWatchesTest.java +++ /dev/null @@ -1,1258 +0,0 @@ -/** - * 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.zookeeper; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.KeeperException.NoWatcherException; -import org.apache.zookeeper.Watcher.Event.EventType; -import org.apache.zookeeper.Watcher.WatcherType; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.client.ZKClientConfig; -import org.apache.zookeeper.server.ServerCnxn; -import org.apache.zookeeper.test.ClientBase; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Verifies removing watches using ZooKeeper client apis - */ -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(ZKParameterized.RunnerFactory.class) -public class RemoveWatchesTest extends ClientBase { - private static final Logger LOG = LoggerFactory - .getLogger(RemoveWatchesTest.class); - private ZooKeeper zk1 = null; - private ZooKeeper zk2 = null; - - @Override - public void setUp() throws Exception { - super.setUp(); - zk1 = createClient(); - zk2 = createClient(); - } - - @Override - public void tearDown() throws Exception { - if (zk1 != null) - zk1.close(); - if (zk2 != null) - zk2.close(); - super.tearDown(); - } - - private final boolean useAsync; - - public RemoveWatchesTest(boolean useAsync) { - this.useAsync = useAsync; - } - - @Parameters - public static Collection<Object[]> configs() { - return Arrays.asList(new Object[][] { { false }, { true }, }); - } - - private void removeWatches(ZooKeeper zk, String path, Watcher watcher, - WatcherType watcherType, boolean local, KeeperException.Code rc) - throws InterruptedException, KeeperException { - LOG.info( - "Sending removeWatches req using zk {} path: {} type: {} watcher: {} ", - new Object[] { zk, path, watcherType, watcher }); - if (useAsync) { - MyCallback c1 = new MyCallback(rc.intValue(), path); - zk.removeWatches(path, watcher, watcherType, local, c1, null); - Assert.assertTrue("Didn't succeeds removeWatch operation", - c1.matches()); - if (KeeperException.Code.OK.intValue() != c1.rc) { - KeeperException ke = KeeperException - .create(KeeperException.Code.get(c1.rc)); - throw ke; - } - } else { - zk.removeWatches(path, watcher, watcherType, local); - } - } - - private void removeAllWatches(ZooKeeper zk, String path, - WatcherType watcherType, boolean local, KeeperException.Code rc) - throws InterruptedException, KeeperException { - LOG.info("Sending removeWatches req using zk {} path: {} type: {} ", - new Object[] { zk, path, watcherType }); - if (useAsync) { - MyCallback c1 = new MyCallback(rc.intValue(), path); - zk.removeAllWatches(path, watcherType, local, c1, null); - Assert.assertTrue("Didn't succeeds removeWatch operation", - c1.matches()); - if (KeeperException.Code.OK.intValue() != c1.rc) { - KeeperException ke = KeeperException - .create(KeeperException.Code.get(c1.rc)); - throw ke; - } - } else { - zk.removeAllWatches(path, watcherType, local); - } - } - - /** - * Test verifies removal of single watcher when there is server connection - */ - @Test(timeout = 90000) - public void testRemoveSingleWatcher() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); - zk1.create("/node2", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); - MyWatcher w1 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - MyWatcher w2 = new MyWatcher("/node2", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node2", w2)); - removeWatches(zk2, "/node1", w1, WatcherType.Data, false, Code.OK); - Assert.assertEquals("Didn't find data watcher", 1, - zk2.getDataWatches().size()); - Assert.assertEquals("Didn't find data watcher", "/node2", - zk2.getDataWatches().get(0)); - removeWatches(zk2, "/node2", w2, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", w2.matches()); - // closing session should remove ephemeral nodes and trigger data - // watches if any - if (zk1 != null) { - zk1.close(); - zk1 = null; - } - - List<EventType> events = w1.getEventsAfterWatchRemoval(); - Assert.assertFalse( - "Shouldn't get NodeDeletedEvent after watch removal", - events.contains(EventType.NodeDeleted)); - Assert.assertEquals( - "Shouldn't get NodeDeletedEvent after watch removal", 0, - events.size()); - } - - /** - * Test verifies removal of multiple data watchers when there is server - * connection - */ - @Test(timeout = 90000) - public void testMultipleDataWatchers() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); - MyWatcher w1 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - removeWatches(zk2, "/node1", w2, WatcherType.Data, false, Code.OK); - Assert.assertEquals("Didn't find data watcher", 1, - zk2.getDataWatches().size()); - Assert.assertEquals("Didn't find data watcher", "/node1", - zk2.getDataWatches().get(0)); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", w2.matches()); - // closing session should remove ephemeral nodes and trigger data - // watches if any - if (zk1 != null) { - zk1.close(); - zk1 = null; - } - - List<EventType> events = w2.getEventsAfterWatchRemoval(); - Assert.assertEquals( - "Shouldn't get NodeDeletedEvent after watch removal", 0, - events.size()); - } - - /** - * Test verifies removal of multiple child watchers when there is server - * connection - */ - @Test(timeout = 90000) - public void testMultipleChildWatchers() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - removeWatches(zk2, "/node1", w2, WatcherType.Children, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - Assert.assertEquals("Didn't find child watcher", 1, zk2 - .getChildWatches().size()); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w1.matches()); - // create child to see NodeChildren notification - zk1.create("/node1/node2", null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - // waiting for child watchers to be notified - int count = 30; - while (count > 0) { - if (w1.getEventsAfterWatchRemoval().size() > 0) { - break; - } - count--; - Thread.sleep(100); - } - // watcher2 - List<EventType> events = w2.getEventsAfterWatchRemoval(); - Assert.assertEquals("Shouldn't get NodeChildrenChanged event", 0, - events.size()); - } - - /** - * Test verifies null watcher with WatcherType.Any - remove all the watchers - * data, child, exists - */ - @Test(timeout = 90000) - public void testRemoveAllWatchers() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 2); - MyWatcher w2 = new MyWatcher("/node1", 2); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - removeWatches(zk2, "/node1", w2, WatcherType.Any, false, Code.OK); - zk1.create("/node1/child", null, Ids.OPEN_ACL_UNSAFE, - CreateMode.EPHEMERAL); - Assert.assertTrue("Didn't remove data watcher", w1.matches()); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - } - - /** - * Test verifies null watcher with WatcherType.Data - remove all data - * watchers. Child watchers shouldn't be removed - */ - @Test(timeout = 90000) - public void testRemoveAllDataWatchers() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 1); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - removeWatches(zk2, "/node1", w1, WatcherType.Data, false, Code.OK); - removeWatches(zk2, "/node1", w2, WatcherType.Data, false, Code.OK); - zk1.create("/node1/child", null, Ids.OPEN_ACL_UNSAFE, - CreateMode.EPHEMERAL); - Assert.assertTrue("Didn't remove data watcher", w1.matches()); - Assert.assertTrue("Didn't remove data watcher", w2.matches()); - // waiting for child watchers to be notified - int count = 10; - while (count > 0) { - if (w1.getEventsAfterWatchRemoval().size() > 0 - && w2.getEventsAfterWatchRemoval().size() > 0) { - break; - } - count--; - Thread.sleep(1000); - } - // watcher1 - List<EventType> events = w1.getEventsAfterWatchRemoval(); - Assert.assertEquals("Didn't get NodeChildrenChanged event", 1, - events.size()); - Assert.assertTrue("Didn't get NodeChildrenChanged event", - events.contains(EventType.NodeChildrenChanged)); - // watcher2 - events = w2.getEventsAfterWatchRemoval(); - Assert.assertEquals("Didn't get NodeChildrenChanged event", 1, - events.size()); - Assert.assertTrue("Didn't get NodeChildrenChanged event", - events.contains(EventType.NodeChildrenChanged)); - } - - /** - * Test verifies null watcher with WatcherType.Children - remove all child - * watchers. Data watchers shouldn't be removed - */ - @Test(timeout = 90000) - public void testRemoveAllChildWatchers() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 1); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - removeWatches(zk2, "/node1", w1, WatcherType.Children, false, Code.OK); - removeWatches(zk2, "/node1", w2, WatcherType.Children, false, Code.OK); - zk1.setData("/node1", "test".getBytes(), -1); - Assert.assertTrue("Didn't remove child watcher", w1.matches()); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - // waiting for child watchers to be notified - int count = 10; - while (count > 0) { - if (w1.getEventsAfterWatchRemoval().size() > 0 - && w2.getEventsAfterWatchRemoval().size() > 0) { - break; - } - count--; - Thread.sleep(1000); - } - // watcher1 - List<EventType> events = w1.getEventsAfterWatchRemoval(); - Assert.assertEquals("Didn't get NodeDataChanged event", 1, - events.size()); - Assert.assertTrue("Didn't get NodeDataChanged event", - events.contains(EventType.NodeDataChanged)); - // watcher2 - events = w2.getEventsAfterWatchRemoval(); - Assert.assertEquals("Didn't get NodeDataChanged event", 1, - events.size()); - Assert.assertTrue("Didn't get NodeDataChanged event", - events.contains(EventType.NodeDataChanged)); - } - - /** - * Test verifies given watcher doesn't exists! - */ - @Test(timeout = 90000) - public void testNoWatcherException() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 2); - MyWatcher w2 = new MyWatcher("/node1", 2); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNull("Didn't set data watches", zk2.exists("/node2", w2)); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - - // New Watcher which will be used for removal - MyWatcher w3 = new MyWatcher("/node1", 2); - - try { - removeWatches(zk2, "/node1", w3, WatcherType.Any, false, - Code.NOWATCHER); - Assert.fail("Should throw exception as given watcher doesn't exists"); - } catch (KeeperException.NoWatcherException nwe) { - // expected - } - try { - removeWatches(zk2, "/node1", w3, WatcherType.Children, false, - Code.NOWATCHER); - Assert.fail("Should throw exception as given watcher doesn't exists"); - } catch (KeeperException.NoWatcherException nwe) { - // expected - } - try { - removeWatches(zk2, "/node1", w3, WatcherType.Data, false, - Code.NOWATCHER); - Assert.fail("Should throw exception as given watcher doesn't exists"); - } catch (KeeperException.NoWatcherException nwe) { - // expected - } - try { - removeWatches(zk2, "/nonexists", w3, WatcherType.Data, false, - Code.NOWATCHER); - Assert.fail("Should throw exception as given watcher doesn't exists"); - } catch (KeeperException.NoWatcherException nwe) { - // expected - } - } - - /** - * Test verifies WatcherType.Any - removes only the configured data watcher - * function - */ - @Test(timeout = 90000) - public void testRemoveAnyDataWatcher() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 1); - MyWatcher w2 = new MyWatcher("/node1", 2); - // Add multiple data watches - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - // Add child watch - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w2); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", w1.matches()); - Assert.assertEquals("Didn't find child watcher", 1, zk2 - .getChildWatches().size()); - Assert.assertEquals("Didn't find data watcher", 1, zk2 - .getDataWatches().size()); - removeWatches(zk2, "/node1", w2, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - } - - /** - * Test verifies WatcherType.Any - removes only the configured child watcher - * function - */ - @Test(timeout = 90000) - public void testRemoveAnyChildWatcher() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 2); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w2); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w1); - removeWatches(zk2, "/node1", w2, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - Assert.assertEquals("Didn't find child watcher", 1, zk2 - .getChildWatches().size()); - Assert.assertEquals("Didn't find data watcher", 1, zk2 - .getDataWatches().size()); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove watchers", w1.matches()); - } - - /** - * Test verifies when there is no server connection. Remove watches when - * local=true, otw should retain it - */ - @Test(timeout = 90000) - public void testRemoveWatcherWhenNoConnection() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 2); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w1); - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w2); - stopServer(); - removeWatches(zk2, "/node1", w2, WatcherType.Any, true, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - Assert.assertFalse("Shouldn't remove data watcher", w1.matches()); - try { - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, - Code.CONNECTIONLOSS); - Assert.fail("Should throw exception as last watch removal requires server connection"); - } catch (KeeperException.ConnectionLossException nwe) { - // expected - } - Assert.assertFalse("Shouldn't remove data watcher", w1.matches()); - - // when local=true, here if connection not available, simply removes - // from local session - removeWatches(zk2, "/node1", w1, WatcherType.Any, true, Code.OK); - Assert.assertTrue("Didn't remove data watcher", w1.matches()); - } - - /** - * Test verifies many pre-node watchers. Also, verifies internal - * datastructure 'watchManager.existWatches' - */ - @Test(timeout = 90000) - public void testManyPreNodeWatchers() throws Exception { - int count = 50; - List<MyWatcher> wList = new ArrayList<MyWatcher>(count); - MyWatcher w; - String path = "/node"; - // Exists watcher - for (int i = 0; i < count; i++) { - final String nodePath = path + i; - w = new MyWatcher(nodePath, 1); - wList.add(w); - LOG.info("Adding pre node watcher {} on path {}", new Object[] { w, - nodePath }); - zk1.exists(nodePath, w); - } - Assert.assertEquals("Failed to add watchers!", count, zk1 - .getExistWatches().size()); - for (int i = 0; i < count; i++) { - final MyWatcher watcher = wList.get(i); - removeWatches(zk1, path + i, watcher, WatcherType.Data, false, - Code.OK); - Assert.assertTrue("Didn't remove data watcher", watcher.matches()); - } - Assert.assertEquals("Didn't remove watch references!", 0, zk1 - .getExistWatches().size()); - } - - /** - * Test verifies many child watchers. Also, verifies internal datastructure - * 'watchManager.childWatches' - */ - @Test(timeout = 90000) - public void testManyChildWatchers() throws Exception { - int count = 50; - List<MyWatcher> wList = new ArrayList<MyWatcher>(count); - MyWatcher w; - String path = "/node"; - - // Child watcher - for (int i = 0; i < count; i++) { - String nodePath = path + i; - zk1.create(nodePath, null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - nodePath += "/"; - } - for (int i = 0; i < count; i++) { - String nodePath = path + i; - w = new MyWatcher(path + i, 1); - wList.add(w); - LOG.info("Adding child watcher {} on path {}", new Object[] { w, - nodePath }); - zk1.getChildren(nodePath, w); - nodePath += "/"; - } - Assert.assertEquals("Failed to add watchers!", count, zk1 - .getChildWatches().size()); - for (int i = 0; i < count; i++) { - final MyWatcher watcher = wList.get(i); - removeWatches(zk1, path + i, watcher, WatcherType.Children, false, - Code.OK); - Assert.assertTrue("Didn't remove child watcher", watcher.matches()); - } - Assert.assertEquals("Didn't remove watch references!", 0, zk1 - .getChildWatches().size()); - } - - /** - * Test verifies many data watchers. Also, verifies internal datastructure - * 'watchManager.dataWatches' - */ - @Test(timeout = 90000) - public void testManyDataWatchers() throws Exception { - int count = 50; - List<MyWatcher> wList = new ArrayList<MyWatcher>(count); - MyWatcher w; - String path = "/node"; - - // Data watcher - for (int i = 0; i < count; i++) { - String nodePath = path + i; - w = new MyWatcher(path + i, 1); - wList.add(w); - zk1.create(nodePath, null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - LOG.info("Adding data watcher {} on path {}", new Object[] { w, - nodePath }); - zk1.getData(nodePath, w, null); - nodePath += "/"; - } - Assert.assertEquals("Failed to add watchers!", count, zk1 - .getDataWatches().size()); - for (int i = 0; i < count; i++) { - final MyWatcher watcher = wList.get(i); - removeWatches(zk1, path + i, watcher, WatcherType.Data, false, - Code.OK); - Assert.assertTrue("Didn't remove data watcher", watcher.matches()); - } - Assert.assertEquals("Didn't remove watch references!", 0, zk1 - .getDataWatches().size()); - } - - /** - * Test verifies removal of many watchers locally when no connection and - * WatcherType#Any. Also, verifies internal watchManager datastructures - */ - @Test(timeout = 90000) - public void testManyWatchersWhenNoConnection() throws Exception { - int count = 3; - List<MyWatcher> wList = new ArrayList<MyWatcher>(count); - MyWatcher w; - String path = "/node"; - - // Child watcher - for (int i = 0; i < count; i++) { - String nodePath = path + i; - zk1.create(nodePath, null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - nodePath += "/"; - } - for (int i = 0; i < count; i++) { - String nodePath = path + i; - w = new MyWatcher(path + i, 2); - wList.add(w); - LOG.info("Adding child watcher {} on path {}", new Object[] { w, - nodePath }); - zk1.getChildren(nodePath, w); - nodePath += "/"; - } - Assert.assertEquals("Failed to add watchers!", count, zk1 - .getChildWatches().size()); - - // Data watcher - for (int i = 0; i < count; i++) { - String nodePath = path + i; - w = wList.get(i); - LOG.info("Adding data watcher {} on path {}", new Object[] { w, - nodePath }); - zk1.getData(nodePath, w, null); - nodePath += "/"; - } - Assert.assertEquals("Failed to add watchers!", count, zk1 - .getDataWatches().size()); - stopServer(); - for (int i = 0; i < count; i++) { - final MyWatcher watcher = wList.get(i); - removeWatches(zk1, path + i, watcher, WatcherType.Any, true, - Code.OK); - Assert.assertTrue("Didn't remove watcher", watcher.matches()); - } - Assert.assertEquals("Didn't remove watch references!", 0, zk1 - .getChildWatches().size()); - Assert.assertEquals("Didn't remove watch references!", 0, zk1 - .getDataWatches().size()); - } - - /** - * Test verifies removing watcher having namespace - */ - @Test(timeout = 90000) - public void testChRootRemoveWatcher() throws Exception { - // creating the subtree for chRoot clients. - String chRoot = "/appsX"; - zk1.create("/appsX", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - if (zk1 != null) { - zk1.close(); - } - if (zk2 != null) { - zk2.close(); - } - // Creating chRoot client. - zk1 = createClient(this.hostPort + chRoot); - zk2 = createClient(this.hostPort + chRoot); - - LOG.info("Creating child znode /node1 using chRoot client"); - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - MyWatcher w1 = new MyWatcher("/node1", 2); - MyWatcher w2 = new MyWatcher("/node1", 1); - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - zk2.getChildren("/node1", w2); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - zk2.getChildren("/node1", w1); - removeWatches(zk2, "/node1", w1, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w1.matches()); - Assert.assertEquals("Didn't find child watcher", 1, zk2 - .getChildWatches().size()); - removeWatches(zk2, "/node1", w2, WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", w2.matches()); - } - - /** - * Verify that if a given watcher doesn't exist, the server properly - * returns an error code for it. - * - * In our Java client implementation, we check that a given watch exists at - * two points: - * - * 1) before submitting the RemoveWatches request - * 2) after a successful server response, when the watcher needs to be - * removed - * - * Since this can be racy (i.e. a watch can fire while a RemoveWatches - * request is in-flight), we need to verify that the watch was actually - * removed (i.e. from ZKDatabase and DataTree) and return NOWATCHER if - * needed. - * - * Also, other implementations might not do a client side check before - * submitting a RemoveWatches request. If we don't do a server side check, - * we would just return ZOK even if no watch was removed. - * - */ - @Test(timeout = 90000) - public void testNoWatcherServerException() - throws InterruptedException, IOException, TimeoutException { - CountdownWatcher watcher = new CountdownWatcher(); - MyZooKeeper zk = new MyZooKeeper(hostPort, CONNECTION_TIMEOUT, watcher); - boolean nw = false; - - watcher.waitForConnected(CONNECTION_TIMEOUT); - - try { - zk.removeWatches("/nowatchhere", watcher, WatcherType.Data, false); - } catch (KeeperException nwe) { - if (nwe.code().intValue() == Code.NOWATCHER.intValue()) { - nw = true; - } - } - - Assert.assertTrue("Server didn't return NOWATCHER", - zk.getRemoveWatchesRC() == Code.NOWATCHER.intValue()); - Assert.assertTrue("NoWatcherException didn't happen", nw); - } - - /** - * Test verifies given watcher doesn't exists! - */ - @Test(timeout = 90000) - public void testRemoveAllNoWatcherException() throws IOException, - InterruptedException, KeeperException { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - try { - removeAllWatches(zk2, "/node1", WatcherType.Any, false, - Code.NOWATCHER); - Assert.fail("Should throw exception as given watcher doesn't exists"); - } catch (KeeperException.NoWatcherException nwe) { - // expected - } - } - - /** - * Test verifies null watcher - */ - @Test(timeout = 30000) - public void testNullWatcherReference() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - try { - if (useAsync) { - zk1.removeWatches("/node1", null, WatcherType.Data, false, - null, null); - } else { - zk1.removeWatches("/node1", null, WatcherType.Data, false); - } - Assert.fail("Must throw IllegalArgumentException as watcher is null!"); - } catch (IllegalArgumentException iae) { - // expected - } - } - - /** - * Test verifies WatcherType.Data - removes only the configured data watcher - * function - */ - @Test(timeout = 90000) - public void testRemoveWhenMultipleDataWatchesOnAPath() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - final CountDownLatch dataWatchCount = new CountDownLatch(1); - final CountDownLatch rmWatchCount = new CountDownLatch(1); - Watcher w1 = new Watcher() { - @Override - public void process(WatchedEvent event) { - if (event.getType() == EventType.DataWatchRemoved) { - rmWatchCount.countDown(); - } - } - }; - Watcher w2 = new Watcher() { - @Override - public void process(WatchedEvent event) { - if (event.getType() == EventType.NodeDataChanged) { - dataWatchCount.countDown(); - } - } - }; - // Add multiple data watches - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - - removeWatches(zk2, "/node1", w1, WatcherType.Data, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", - rmWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - - zk1.setData("/node1", "test".getBytes(), -1); - LOG.info("Waiting for data watchers to be notified"); - Assert.assertTrue("Didn't get data watch notification!", - dataWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - } - - /** - * Test verifies WatcherType.Children - removes only the configured child - * watcher function - */ - @Test(timeout = 90000) - public void testRemoveWhenMultipleChildWatchesOnAPath() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - final CountDownLatch childWatchCount = new CountDownLatch(1); - final CountDownLatch rmWatchCount = new CountDownLatch(1); - Watcher w1 = new Watcher() { - @Override - public void process(WatchedEvent event) { - if (event.getType() == EventType.ChildWatchRemoved) { - rmWatchCount.countDown(); - } - } - }; - Watcher w2 = new Watcher() { - @Override - public void process(WatchedEvent event) { - if (event.getType() == EventType.NodeChildrenChanged) { - childWatchCount.countDown(); - } - } - }; - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w1).size()); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w2).size()); - - removeWatches(zk2, "/node1", w1, WatcherType.Children, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", - rmWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - - zk1.create("/node1/node2", null, Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT); - LOG.info("Waiting for child watchers to be notified"); - Assert.assertTrue("Didn't get child watch notification!", - childWatchCount - .await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - } - - /** - * Test verifies WatcherType.Data - removes only the configured data watcher - * function - */ - @Test(timeout = 90000) - public void testRemoveAllDataWatchesOnAPath() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - final CountDownLatch dWatchCount = new CountDownLatch(2); - final CountDownLatch rmWatchCount = new CountDownLatch(2); - Watcher w1 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case DataWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeDataChanged: - dWatchCount.countDown(); - break; - default: - break; - } - } - }; - Watcher w2 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case DataWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeDataChanged: - dWatchCount.countDown(); - break; - default: - break; - } - } - }; - // Add multiple data watches - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - - Assert.assertTrue("Server session is not a watcher", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Data)); - removeAllWatches(zk2, "/node1", WatcherType.Data, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", - rmWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - - Assert.assertFalse("Server session is still a watcher after removal", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Data)); - } - - /** - * Test verifies WatcherType.Children - removes only the configured child - * watcher function - */ - @Test(timeout = 90000) - public void testRemoveAllChildWatchesOnAPath() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - final CountDownLatch cWatchCount = new CountDownLatch(2); - final CountDownLatch rmWatchCount = new CountDownLatch(2); - Watcher w1 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case ChildWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeChildrenChanged: - cWatchCount.countDown(); - break; - default: - break; - } - } - }; - Watcher w2 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case ChildWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeChildrenChanged: - cWatchCount.countDown(); - break; - default: - break; - } - } - }; - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w1).size()); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w2).size()); - - Assert.assertTrue("Server session is not a watcher", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Children)); - removeAllWatches(zk2, "/node1", WatcherType.Children, false, Code.OK); - Assert.assertTrue("Didn't remove child watcher", - rmWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - - Assert.assertFalse("Server session is still a watcher after removal", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Children)); - } - - /** - * Test verifies WatcherType.Any - removes all the configured child,data - * watcher functions - */ - @Test(timeout = 90000) - public void testRemoveAllWatchesOnAPath() throws Exception { - zk1.create("/node1", null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - final CountDownLatch watchCount = new CountDownLatch(2); - final CountDownLatch rmWatchCount = new CountDownLatch(4); - Watcher w1 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case ChildWatchRemoved: - case DataWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeChildrenChanged: - case NodeDataChanged: - watchCount.countDown(); - break; - default: - break; - } - } - }; - Watcher w2 = new Watcher() { - @Override - public void process(WatchedEvent event) { - switch (event.getType()) { - case ChildWatchRemoved: - case DataWatchRemoved: - rmWatchCount.countDown(); - break; - case NodeChildrenChanged: - case NodeDataChanged: - watchCount.countDown(); - break; - default: - break; - } - } - }; - // Add multiple child watches - LOG.info("Adding child watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w1).size()); - LOG.info("Adding child watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertEquals("Didn't set child watches", 0, - zk2.getChildren("/node1", w2).size()); - - // Add multiple data watches - LOG.info("Adding data watcher {} on path {}", new Object[] { w1, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w1)); - LOG.info("Adding data watcher {} on path {}", new Object[] { w2, - "/node1" }); - Assert.assertNotNull("Didn't set data watches", - zk2.exists("/node1", w2)); - - Assert.assertTrue("Server session is not a watcher", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Data)); - removeAllWatches(zk2, "/node1", WatcherType.Any, false, Code.OK); - Assert.assertTrue("Didn't remove data watcher", - rmWatchCount.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)); - Assert.assertFalse("Server session is still a watcher after removal", - isServerSessionWatcher(zk2.getSessionId(), "/node1", - WatcherType.Data)); - Assert.assertEquals("Received watch notification after removal!", 2, - watchCount.getCount()); - } - - /* a mocked ZK class that doesn't do client-side verification - * before/after calling removeWatches */ - private class MyZooKeeper extends ZooKeeper { - class MyWatchManager extends ZKWatchManager { - public MyWatchManager(boolean disableAutoWatchReset) { - super(disableAutoWatchReset); - } - - public int lastrc; - - /* Pretend that any watcher exists */ - void containsWatcher(String path, Watcher watcher, - WatcherType watcherType) throws NoWatcherException { - } - - /* save the return error code by the server */ - protected boolean removeWatches( - Map<String, Set<Watcher>> pathVsWatcher, - Watcher watcher, String path, boolean local, int rc, - Set<Watcher> removedWatchers) throws KeeperException { - lastrc = rc; - return false; - } - } - - public MyZooKeeper(String hp, int timeout, Watcher watcher) - throws IOException { - super(hp, timeout, watcher, false); - } - - private MyWatchManager myWatchManager; - - protected ZKWatchManager defaultWatchManager() { - myWatchManager = new MyWatchManager(getClientConfig().getBoolean(ZKClientConfig.DISABLE_AUTO_WATCH_RESET)); - return myWatchManager; - } - - public int getRemoveWatchesRC() { - return myWatchManager.lastrc; - } - } - - private class MyWatcher implements Watcher { - private final String path; - private String eventPath; - private CountDownLatch latch; - private List<EventType> eventsAfterWatchRemoval = new ArrayList<EventType>(); - MyWatcher(String path, int count) { - this.path = path; - latch = new CountDownLatch(count); - } - - public void process(WatchedEvent event) { - LOG.debug("Event path : {}, eventPath : {}" - + new Object[] { path, event.getPath() }); - this.eventPath = event.getPath(); - // notifies watcher removal - if (latch.getCount() == 0) { - if (event.getType() != EventType.None) { - eventsAfterWatchRemoval.add(event.getType()); - } - } - if (event.getType() == EventType.ChildWatchRemoved - || event.getType() == EventType.DataWatchRemoved) { - latch.countDown(); - } - } - - /** - * Returns true if the watcher was triggered. Try to avoid using this - * method with assertFalse statements. A false return depends on a timed - * out wait on a latch, which makes tests run long. - * - * @return true if the watcher was triggered, false otherwise - * @throws InterruptedException if interrupted while waiting on latch - */ - public boolean matches() throws InterruptedException { - if (!latch.await(CONNECTION_TIMEOUT/5, TimeUnit.MILLISECONDS)) { - LOG.error("Failed waiting to remove the watches"); - return false; - } - LOG.debug("Client path : {} eventPath : {}", new Object[] { path, - eventPath }); - return path.equals(eventPath); - } - - public List<EventType> getEventsAfterWatchRemoval() { - return eventsAfterWatchRemoval; - } - } - - private class MyCallback implements AsyncCallback.VoidCallback { - private final String path; - private final int rc; - private String eventPath; - int eventRc; - private CountDownLatch latch = new CountDownLatch(1); - - public MyCallback(int rc, String path) { - this.rc = rc; - this.path = path; - } - - @Override - public void processResult(int rc, String eventPath, Object ctx) { - System.out.println("latch:" + path + " " + eventPath); - this.eventPath = eventPath; - this.eventRc = rc; - this.latch.countDown(); - } - - /** - * Returns true if the callback was triggered. Try to avoid using this - * method with assertFalse statements. A false return depends on a timed - * out wait on a latch, which makes tests run long. - * - * @return true if the watcher was triggered, false otherwise - * @throws InterruptedException if interrupted while waiting on latch - */ - public boolean matches() throws InterruptedException { - if (!latch.await(CONNECTION_TIMEOUT/5, TimeUnit.MILLISECONDS)) { - return false; - } - return path.equals(eventPath) && rc == eventRc; - } - } - - /** - * Checks if a session is registered with the server as a watcher. - * - * @param long sessionId the session ID to check - * @param path the path to check for watchers - * @param type the type of watcher - * @return true if the client session is a watcher on path for the type - */ - private boolean isServerSessionWatcher(long sessionId, String path, - WatcherType type) { - Set<ServerCnxn> cnxns = new HashSet<>(); - CollectionUtils.addAll(cnxns, serverFactory.getConnections().iterator()); - for (ServerCnxn cnxn : cnxns) { - if (cnxn.getSessionId() == sessionId) { - return getServer(serverFactory).getZKDatabase().getDataTree() - .containsWatcher(path, type, cnxn); - } - } - return false; - } -}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/SaslAuthTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/SaslAuthTest.java b/zookeeper-common/src/test/java/org/apache/zookeeper/SaslAuthTest.java deleted file mode 100644 index 088fe1f..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/SaslAuthTest.java +++ /dev/null @@ -1,252 +0,0 @@ -/** - * 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.zookeeper; - -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.apache.zookeeper.ClientCnxn.EventThread; -import org.apache.zookeeper.ClientCnxn.SendThread; -import org.apache.zookeeper.Watcher.Event.KeeperState; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.test.ClientBase; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -public class SaslAuthTest extends ClientBase { - @BeforeClass - public static void init() { - System.setProperty("zookeeper.authProvider.1", - "org.apache.zookeeper.server.auth.SASLAuthenticationProvider"); - try { - File tmpDir = createTmpDir(); - File saslConfFile = new File(tmpDir, "jaas.conf"); - String jaasContent = getJaasFileContent(); - FileWriter fwriter = new FileWriter(saslConfFile); - fwriter.write(jaasContent); - fwriter.close(); - System.setProperty("java.security.auth.login.config", saslConfFile.getAbsolutePath()); - } catch (IOException e) { - // could not create tmp directory to hold JAAS conf file : test will - // fail now. - } - } - - private static String getJaasFileContent() { - StringBuilder jaasContent=new StringBuilder(); - String newLine = System.getProperty("line.separator"); - jaasContent.append("Server {"); - jaasContent.append(newLine); - jaasContent.append("org.apache.zookeeper.server.auth.DigestLoginModule required"); - jaasContent.append(newLine); - jaasContent.append("user_super=\"test\";"); - jaasContent.append(newLine); - jaasContent.append("};"); - jaasContent.append(newLine); - jaasContent.append("Client {"); - jaasContent.append(newLine); - jaasContent.append("org.apache.zookeeper.server.auth.DigestLoginModule required"); - jaasContent.append(newLine); - jaasContent.append("username=\"super\""); - jaasContent.append(newLine); - jaasContent.append("password=\"test\";"); - jaasContent.append(newLine); - jaasContent.append("};"); - jaasContent.append(newLine); - return jaasContent.toString(); - } - - @AfterClass - public static void clean() { - System.clearProperty("zookeeper.authProvider.1"); - System.clearProperty("java.security.auth.login.config"); - } - - private final CountDownLatch authFailed = new CountDownLatch(1); - - @Override - protected TestableZooKeeper createClient(String hp) - throws IOException, InterruptedException - { - MyWatcher watcher = new MyWatcher(); - return createClient(watcher, hp); - } - - private class MyWatcher extends CountdownWatcher { - @Override - public synchronized void process(WatchedEvent event) { - if (event.getState() == KeeperState.AuthFailed) { - authFailed.countDown(); - } - else { - super.process(event); - } - } - } - - @Test - public void testAuth() throws Exception { - ZooKeeper zk = createClient(); - try { - zk.create("/path1", null, Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); - Thread.sleep(1000); - } finally { - zk.close(); - } - } - - @Test - public void testValidSaslIds() throws Exception { - ZooKeeper zk = createClient(); - - List<String> validIds = new ArrayList<String>(); - validIds.add("user"); - validIds.add("service/host.name.com"); - validIds.add("user@KERB.REALM"); - validIds.add("service/host.name.com@KERB.REALM"); - - int i = 0; - for(String validId: validIds) { - List<ACL> aclList = new ArrayList<ACL>(); - ACL acl = new ACL(0,new Id("sasl",validId)); - aclList.add(acl); - zk.create("/valid"+i,null,aclList,CreateMode.PERSISTENT); - i++; - } - } - - @Test - public void testInvalidSaslIds() throws Exception { - ZooKeeper zk = createClient(); - - List<String> invalidIds = new ArrayList<String>(); - invalidIds.add("user@KERB.REALM/server.com"); - invalidIds.add("user@KERB.REALM1@KERB.REALM2"); - - int i = 0; - for(String invalidId: invalidIds) { - List<ACL> aclList = new ArrayList<ACL>(); - try { - ACL acl = new ACL(0,new Id("sasl",invalidId)); - aclList.add(acl); - zk.create("/invalid"+i,null,aclList,CreateMode.PERSISTENT); - Assert.fail("SASLAuthenticationProvider.isValid() failed to catch invalid Id."); - } - catch (KeeperException.InvalidACLException e) { - // ok. - } - finally { - i++; - } - } - } - - @Test - public void testZKOperationsAfterClientSaslAuthFailure() throws Exception { - CountdownWatcher watcher = new CountdownWatcher(); - ZooKeeper zk = new ZooKeeper(hostPort, CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(CONNECTION_TIMEOUT); - try { - setSaslFailureFlag(zk); - - // try node creation for around 15 second, - int totalTry = 10; - int tryCount = 0; - - boolean success = false; - while (!success && tryCount++ <= totalTry) { - try { - zk.create("/saslAuthFail", "data".getBytes(), Ids.OPEN_ACL_UNSAFE, - CreateMode.PERSISTENT_SEQUENTIAL); - success = true; - } catch (KeeperException.ConnectionLossException e) { - Thread.sleep(1000); - // do nothing - } - } - assertTrue("ZNode creation is failing continuously after Sasl auth failure.", success); - - } finally { - zk.close(); - } - } - - // set saslLoginFailed to true to simulate the LoginException - private void setSaslFailureFlag(ZooKeeper zk) throws Exception { - Field cnxnField = zk.getClass().getDeclaredField("cnxn"); - cnxnField.setAccessible(true); - ClientCnxn clientCnxn = (ClientCnxn) cnxnField.get(zk); - Field sendThreadField = clientCnxn.getClass().getDeclaredField("sendThread"); - sendThreadField.setAccessible(true); - SendThread sendThread = (SendThread) sendThreadField.get(clientCnxn); - Field saslLoginFailedField = sendThread.getClass().getDeclaredField("saslLoginFailed"); - saslLoginFailedField.setAccessible(true); - saslLoginFailedField.setBoolean(sendThread, true); - } - - @Test - public void testThreadsShutdownOnAuthFailed() throws Exception { - MyWatcher watcher = new MyWatcher(); - ZooKeeper zk = null; - try { - zk = new ZooKeeper(hostPort, CONNECTION_TIMEOUT, watcher); - watcher.waitForConnected(CONNECTION_TIMEOUT); - try { - zk.addAuthInfo("FOO", "BAR".getBytes()); - zk.getData("/path1", false, null); - Assert.fail("Should get auth state error"); - } catch (KeeperException.AuthFailedException e) { - if (!authFailed.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS)) { - Assert.fail("Should have called my watcher"); - } - } - Field cnxnField = zk.getClass().getDeclaredField("cnxn"); - cnxnField.setAccessible(true); - ClientCnxn clientCnxn = (ClientCnxn) cnxnField.get(zk); - Field sendThreadField = clientCnxn.getClass().getDeclaredField("sendThread"); - sendThreadField.setAccessible(true); - SendThread sendThread = (SendThread) sendThreadField.get(clientCnxn); - Field eventThreadField = clientCnxn.getClass().getDeclaredField("eventThread"); - eventThreadField.setAccessible(true); - EventThread eventThread = (EventThread) eventThreadField.get(clientCnxn); - sendThread.join(CONNECTION_TIMEOUT); - eventThread.join(CONNECTION_TIMEOUT); - Assert.assertFalse("SendThread did not shutdown after authFail", sendThread.isAlive()); - Assert.assertFalse("EventThread did not shutdown after authFail", - eventThread.isAlive()); - } finally { - if (zk != null) { - zk.close(); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/ServerConfigTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/ServerConfigTest.java b/zookeeper-common/src/test/java/org/apache/zookeeper/ServerConfigTest.java deleted file mode 100644 index 27faa74..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/ServerConfigTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * 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.zookeeper; - -import org.apache.zookeeper.server.ServerConfig; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.File; - -public class ServerConfigTest { - - private ServerConfig serverConfig; - - @Before - public void setUp() { - serverConfig = new ServerConfig(); - } - - @Test(expected=IllegalArgumentException.class) - public void testFewArguments() { - String[] args = {"2181"}; - serverConfig.parse(args); - } - - @Test - public void testValidArguments() { - String[] args = {"2181", "/data/dir", "60000", "10000"}; - serverConfig.parse(args); - - assertEquals(2181, serverConfig.getClientPortAddress().getPort()); - assertTrue(checkEquality("/data/dir", serverConfig.getDataDir())); - assertEquals(60000, serverConfig.getTickTime()); - assertEquals(10000, serverConfig.getMaxClientCnxns()); - } - - @Test(expected=IllegalArgumentException.class) - public void testTooManyArguments() { - String[] args = {"2181", "/data/dir", "60000", "10000", "9999"}; - serverConfig.parse(args); - } - - boolean checkEquality(String a, String b) { - assertNotNull(a); - assertNotNull(b); - return a.equals(b); - } - - boolean checkEquality(String a, File b) { - assertNotNull(a); - assertNotNull(b); - return new File(a).equals(b); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/TestableZooKeeper.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/TestableZooKeeper.java b/zookeeper-common/src/test/java/org/apache/zookeeper/TestableZooKeeper.java deleted file mode 100644 index bb1bd12..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/TestableZooKeeper.java +++ /dev/null @@ -1,128 +0,0 @@ -/** - * 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.zookeeper; - -import java.io.IOException; -import java.net.SocketAddress; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.apache.jute.Record; -import org.apache.zookeeper.admin.ZooKeeperAdmin; -import org.apache.zookeeper.proto.ReplyHeader; -import org.apache.zookeeper.proto.RequestHeader; - -public class TestableZooKeeper extends ZooKeeperAdmin { - - public TestableZooKeeper(String host, int sessionTimeout, - Watcher watcher) throws IOException { - super(host, sessionTimeout, watcher); - } - - @Override - public List<String> getChildWatches() { - return super.getChildWatches(); - } - - - @Override - public List<String> getDataWatches() { - return super.getDataWatches(); - } - - - @Override - public List<String> getExistWatches() { - return super.getExistWatches(); - } - - /** - * Cause this ZooKeeper object to disconnect from the server. It will then - * later attempt to reconnect. - */ - public void testableConnloss() throws IOException { - synchronized(cnxn) { - cnxn.sendThread.testableCloseSocket(); - } - } - - /** - * Cause this ZooKeeper object to stop receiving from the ZooKeeperServer - * for the given number of milliseconds. - * @param ms the number of milliseconds to pause. - * @return true if the connection is paused, otherwise false - */ - public boolean pauseCnxn(final long ms) { - final CountDownLatch initiatedPause = new CountDownLatch(1); - new Thread() { - public void run() { - synchronized(cnxn) { - try { - try { - cnxn.sendThread.testableCloseSocket(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - initiatedPause.countDown(); - } - Thread.sleep(ms); - } catch (InterruptedException e) { - } - } - } - }.start(); - - try { - return initiatedPause.await(ms, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - return false; - } - } - - public SocketAddress testableLocalSocketAddress() { - return super.testableLocalSocketAddress(); - } - - public SocketAddress testableRemoteSocketAddress() { - return super.testableRemoteSocketAddress(); - } - - /** - * @return the last zxid as seen by the client session - */ - public long testableLastZxid() { - return cnxn.getLastZxid(); - } - - public ReplyHeader submitRequest(RequestHeader h, Record request, - Record response, WatchRegistration watchRegistration) throws InterruptedException { - return cnxn.submitRequest(h, request, response, watchRegistration); - } - - /** Testing only!!! Really!!!! This is only here to test when the client - * disconnects from the server w/o sending a session disconnect (ie - * ending the session cleanly). The server will eventually notice the - * client is no longer pinging and will timeout the session. - */ - public void disconnect() { - cnxn.disconnect(); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/VerGenTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/VerGenTest.java b/zookeeper-common/src/test/java/org/apache/zookeeper/VerGenTest.java deleted file mode 100644 index 1d99e45..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/VerGenTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * 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.zookeeper; - -import java.io.File; -import java.util.Arrays; -import java.util.Collection; - -import org.apache.zookeeper.test.ClientBase; -import org.apache.zookeeper.version.util.VerGen; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - - -/** - * Test VerGen, used during the build. - * - */ -@RunWith(Parameterized.class) -@Parameterized.UseParametersRunnerFactory(ZKParameterized.RunnerFactory.class) -public class VerGenTest extends ZKTestCase { - @Parameters - public static Collection<Object[]> data() { - return Arrays.asList(new Object[][] { - {"1.2.3", new Object[] {1, 2, 3, null}}, - {"1.2.3-dev", new Object[] {1, 2, 3, "dev"}}, - {"1.2.3-SNAPSHOT", new Object[] {1, 2, 3, "SNAPSHOT"}}, - {"1.2.3-SNAPSHOT", new Object[] {1, 2, 3, "SNAPSHOT"}}, - {"1.2.3-foo-bar+123", new Object[] {1, 2, 3, "foo-bar+123"}}, - {"1.2.3.4.5-SNAPSHOT", new Object[] {1, 2, 3, "SNAPSHOT"}}, - {"1.2.3.4.5-foo-bar+123", new Object[] {1, 2, 3, "foo-bar+123"}} - }); - } - - private String input; - - private Object[] expected; - - public VerGenTest(String input, Object[] expected) { - this.input = input; - this.expected = expected; - } - - @Test - public void testParser() { - VerGen.Version v = VerGen.parseVersionString(input); - Assert.assertEquals(expected[0], v.maj); - Assert.assertEquals(expected[1], v.min); - Assert.assertEquals(expected[2], v.micro); - Assert.assertEquals(expected[3], v.qualifier); - } - - @Test - public void testGenFile() throws Exception { - VerGen.Version v = VerGen.parseVersionString(input); - File outputDir = ClientBase.createTmpDir(); - VerGen.generateFile(outputDir, v, "1", "Nov1"); - ClientBase.recursiveDelete(outputDir); - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/ZKParameterized.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/ZKParameterized.java b/zookeeper-common/src/test/java/org/apache/zookeeper/ZKParameterized.java deleted file mode 100644 index 1a049fb..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/ZKParameterized.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * 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 - * <p/> - * http://www.apache.org/licenses/LICENSE-2.0 - * <p/> - * 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.zookeeper; - -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; -import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters; -import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersFactory; -import org.junit.runners.parameterized.TestWithParameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -public class ZKParameterized { - private static final Logger LOG = LoggerFactory.getLogger(ZKParameterized.class); - public static class RunnerFactory extends BlockJUnit4ClassRunnerWithParametersFactory { - @Override - public org.junit.runner.Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError { - return new ZKParameterized.Runner(test); - } - } - - public static class Runner extends BlockJUnit4ClassRunnerWithParameters { - public Runner(TestWithParameters test) throws InitializationError { - super(test); - } - - - @Override - protected List<FrameworkMethod> computeTestMethods() { - return JUnit4ZKTestRunner.computeTestMethodsForClass(getTestClass().getJavaClass(), super.computeTestMethods()); - } - - - @Override - protected Statement methodInvoker(FrameworkMethod method, Object test) { - return new JUnit4ZKTestRunner.LoggedInvokeMethod(method, test); - } - } -} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/43d71c2e/zookeeper-common/src/test/java/org/apache/zookeeper/ZKTestCase.java ---------------------------------------------------------------------- diff --git a/zookeeper-common/src/test/java/org/apache/zookeeper/ZKTestCase.java b/zookeeper-common/src/test/java/org/apache/zookeeper/ZKTestCase.java deleted file mode 100644 index 54a6be5..0000000 --- a/zookeeper-common/src/test/java/org/apache/zookeeper/ZKTestCase.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * 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.zookeeper; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.junit.Rule; -import org.junit.rules.MethodRule; -import org.junit.rules.TestWatchman; -import org.junit.runner.RunWith; -import org.junit.runners.model.FrameworkMethod; - -/** - * Base class for a non-parameterized ZK test. - * - * Basic utilities shared by all tests. Also logging of various events during - * the test execution (start/stop/success/failure/etc...) - */ -@SuppressWarnings("deprecation") -@RunWith(JUnit4ZKTestRunner.class) -public class ZKTestCase { - private static final Logger LOG = LoggerFactory.getLogger(ZKTestCase.class); - - private String testName; - - protected String getTestName() { - return testName; - } - - @Rule - public MethodRule watchman = new TestWatchman() { - @Override - public void starting(FrameworkMethod method) { - // By default, disable starting a JettyAdminServer in tests to avoid - // accidentally attempting to start multiple admin servers on the - // same port. - System.setProperty("zookeeper.admin.enableServer", "false"); - // ZOOKEEPER-2693 disables all 4lw by default. - // Here we enable the 4lw which ZooKeeper tests depends. - System.setProperty("zookeeper.4lw.commands.whitelist", "*"); - testName = method.getName(); - LOG.info("STARTING " + testName); - } - - @Override - public void finished(FrameworkMethod method) { - LOG.info("FINISHED " + testName); - } - - @Override - public void succeeded(FrameworkMethod method) { - LOG.info("SUCCEEDED " + testName); - } - - @Override - public void failed(Throwable e, FrameworkMethod method) { - LOG.info("FAILED " + testName, e); - } - - }; - -}