package com.neverwinterdp.registry.zk; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.neverwinterdp.registry.Node; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryConfig; import com.neverwinterdp.registry.event.NodeEvent; import com.neverwinterdp.registry.event.NodeWatcher; import com.neverwinterdp.registry.event.RegistryListener; import com.neverwinterdp.util.FileUtil; import com.neverwinterdp.zk.tool.server.EmbededZKServer; public class RegistryListenerUnitTest { static { System.setProperty("log4j.configuration", "file:src/test/resources/test-log4j.properties") ; } static public String TEST_PATH = "/node/event" ; static private EmbededZKServer zkServerLauncher ; @BeforeClass static public void startServer() throws Exception { FileUtil.removeIfExist("./build/data", false); zkServerLauncher = new EmbededZKServer("./build/data/zookeeper") ; zkServerLauncher.start(); } static public void stopServer() throws Exception { zkServerLauncher.shutdown(); } private Registry registry ; @Before public void setup() throws Exception { registry = newRegistry().connect(); } @After public void teardown() throws Exception { registry.delete(TEST_PATH); registry.disconnect(); } @Test public void testOneTimeCreateWatch() throws Exception { RegistryListener listener = new RegistryListener(registry); NodeEventCatcher nodeEventCatcher = new NodeEventCatcher(); listener.watch(TEST_PATH, nodeEventCatcher, false); Node node = registry.createIfNotExist(TEST_PATH) ; Thread.sleep(100); Assert.assertEquals(0, listener.getWatchers().size()); Assert.assertEquals(NodeEvent.Type.CREATE, nodeEventCatcher.getNodeEvent().getType()); Assert.assertEquals(TEST_PATH, nodeEventCatcher.getNodeEvent().getPath()); } @Test public void testOneTimeModifyWatch() throws Exception { RegistryListener listener = new RegistryListener(registry); Node node = registry.createIfNotExist(TEST_PATH) ; NodeEventCatcher nodeEventCatcher = new NodeEventCatcher(); listener.watch(TEST_PATH, nodeEventCatcher, false); node.setData(new byte[10]); Thread.sleep(100); Assert.assertEquals(0, listener.getWatchers().size()); Assert.assertEquals(NodeEvent.Type.MODIFY, nodeEventCatcher.getNodeEvent().getType()); Assert.assertEquals(TEST_PATH, nodeEventCatcher.getNodeEvent().getPath()); } @Test public void testPersistentWatch() throws Exception { RegistryListener listener = new RegistryListener(registry); NodeEventCatcher nodeEventCatcher = new NodeEventCatcher(); listener.watch(TEST_PATH, nodeEventCatcher, true); Node node = registry.createIfNotExist(TEST_PATH) ; Thread.sleep(100); Assert.assertEquals(1, listener.getWatchers().size()); Assert.assertEquals(NodeEvent.Type.CREATE, nodeEventCatcher.getNodeEvent().getType()); Assert.assertEquals(TEST_PATH, nodeEventCatcher.getNodeEvent().getPath()); node.setData(new byte[10]); Thread.sleep(100); Assert.assertEquals(1, listener.getWatchers().size()); Assert.assertEquals(NodeEvent.Type.MODIFY, nodeEventCatcher.getNodeEvent().getType()); Assert.assertEquals(TEST_PATH, nodeEventCatcher.getNodeEvent().getPath()); listener.dump(System.out); listener.close(); } public class NodeEventCatcher extends NodeWatcher { private NodeEvent nodeEvent ; public void onEvent(NodeEvent event) { this.nodeEvent = event ; } public NodeEvent getNodeEvent() { return this.nodeEvent ; } } private Registry newRegistry() { return new RegistryImpl(RegistryConfig.getDefault()) ; } }