package com.neverwinterdp.registry.zk; import java.util.ArrayList; import java.util.Collections; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.Transaction; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs.Perms; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Id; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.neverwinterdp.util.FileUtil; import com.neverwinterdp.zk.tool.server.EmbededZKServer; public class ZookeeperTransactionUnitTest { public final Id ANYONE_ID = new Id("world", "anyone"); public final ArrayList<ACL> OPEN_ACL = new ArrayList<ACL>(Collections.singletonList(new ACL(Perms.ALL, ANYONE_ID))); private EmbededZKServer zkServerLauncher ; private ZooKeeper zkClient ; static String connection; @Before public void setup() throws Exception { FileUtil.removeIfExist("./build/data", false); zkServerLauncher = new EmbededZKServer("./build/data/zookeeper") ; zkServerLauncher.start(); Watcher watcher = new Watcher() { public void process(WatchedEvent event) { System.out.println("on event: " + event.getPath() + " - " + event.getType() + " - " + event.getState()); } }; zkClient = new ZooKeeper("127.0.0.1:2181", 15000, watcher); } @After public void teardown() throws Exception { zkClient.close(); zkServerLauncher.shutdown(); } @Test public void testTransaction() throws Exception { zkClient.create("/transaction", "transaction".getBytes(), OPEN_ACL, CreateMode.PERSISTENT) ; Transaction transaction = zkClient.transaction(); transaction.create("/transaction/test", new byte[0], OPEN_ACL, CreateMode.PERSISTENT); transaction.create("/transaction/test/nested", new byte[0], OPEN_ACL, CreateMode.PERSISTENT); transaction.create("/transaction/test/delete", new byte[0], OPEN_ACL, CreateMode.PERSISTENT); transaction.delete("/transaction/test/delete", 0); Assert.assertNull(zkClient.exists("/transaction/test", false)); Assert.assertNull(zkClient.exists("/transaction/test/nested", false)); transaction.commit(); Assert.assertNotNull(zkClient.exists("/transaction/test", false)); Assert.assertNotNull(zkClient.exists("/transaction/test/nested", false)); Assert.assertNull(zkClient.exists("/transaction/test/delete", false)); } @Test public void testInvalidTransactionOperation() throws Exception { zkClient.create("/transaction", "transaction".getBytes(), OPEN_ACL, CreateMode.PERSISTENT) ; Transaction transaction = zkClient.transaction(); transaction.create("/transaction/good", new byte[0], OPEN_ACL, CreateMode.PERSISTENT); transaction.create("/transaction/bad/nested", new byte[0], OPEN_ACL, CreateMode.PERSISTENT); KeeperException expectError = null; try { transaction.commit(); } catch(KeeperException ex) { expectError = ex ; } Assert.assertNotNull(expectError); Assert.assertTrue(expectError instanceof KeeperException.NoNodeException); Assert.assertNull(zkClient.exists("/transaction/good", false)); } }