@Test public void TestGetResults() throws Exception { /* Delete of a node folowed by an update of the (now) deleted node */ try { zk.multi(Arrays.asList( Op.create("/multi", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.delete("/multi", 0), Op.setData("/multi", "Y".getBytes(), 0), Op.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) )); Assert.fail("/multi should have been deleted so setData should have failed"); } catch (KeeperException e) { // '/multi' should never have been created as entire op should fail Assert.assertNull(zk.exists("/multi", null)); for (OpResult r : e.getResults()) { LOG.info("RESULT==> " + r); if (r instanceof ErrorResult) { ErrorResult er = (ErrorResult) r; LOG.info("ERROR RESULT: " + er + " ERR=>" + KeeperException.Code.get(er.getErr())); } } } }
/** * Exercise the equals methods of OpResult classes. */ @Test public void testOpResultEquals() { opEquals(new CreateResult("/foo"), new CreateResult("/foo"), new CreateResult("nope")); opEquals(new CheckResult(), new CheckResult(), null); opEquals(new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111))); opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2)); opEquals(new DeleteResult(), new DeleteResult(), null); opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2)); }
private void opEquals(OpResult expected, OpResult value, OpResult near) { assertEquals(value, value); assertFalse(value.equals(new Object())); assertFalse(value.equals(near)); assertFalse(value.equals(value instanceof CreateResult ? new ErrorResult(1) : new CreateResult("nope2"))); assertTrue(value.equals(expected)); }
/** * Exercise the equals methods of OpResult classes. */ @Test public void testOpResultEquals() { opEquals(new CreateResult("/foo"), new CreateResult("/foo"), new CreateResult("nope")); opEquals(new CreateResult("/foo"), new CreateResult("/foo"), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))); opEquals(new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("nope", new Stat(11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111))); opEquals(new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo", new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new CreateResult("/foo")); opEquals(new CheckResult(), new CheckResult(), null); opEquals(new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)), new SetDataResult(new Stat(11, 12, 13, 14, 15, 16, 17, 18, 19, 110, 111))); opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2)); opEquals(new DeleteResult(), new DeleteResult(), null); opEquals(new ErrorResult(1), new ErrorResult(1), new ErrorResult(2)); }
@Test public void TestGetResults() throws Exception { /* Delete of a node folowed by an update of the (now) deleted node */ Iterable<Op> ops = Arrays.asList( Op.create("/multi", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.delete("/multi", 0), Op.setData("/multi", "Y".getBytes(), 0), Op.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) ); List<OpResult> results = null; if (useAsync) { final MultiResult res = new MultiResult(); zk.multi(ops, new MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> opResults) { synchronized (res) { res.rc = rc; res.results = opResults; res.finished = true; res.notifyAll(); } } }, null); synchronized (res) { while (!res.finished) { res.wait(); } } Assert.assertFalse("/multi should have been deleted so setData should have failed", KeeperException.Code.OK.intValue() == res.rc); Assert.assertNull(zk.exists("/multi", null)); results = res.results; } else { try { zk.multi(ops); Assert.fail("/multi should have been deleted so setData should have failed"); } catch (KeeperException e) { // '/multi' should never have been created as entire op should fail Assert.assertNull(zk.exists("/multi", null)); results = e.getResults(); } } Assert.assertNotNull(results); for (OpResult r : results) { LOG.info("RESULT==> " + r); if (r instanceof ErrorResult) { ErrorResult er = (ErrorResult) r; LOG.info("ERROR RESULT: " + er + " ERR=>" + KeeperException.Code.get(er.getErr())); } } }
@Test public void testGetResults() throws Exception { /* Delete of a node folowed by an update of the (now) deleted node */ Iterable<Op> ops = Arrays.asList( Op.create("/multi", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.delete("/multi", 0), Op.setData("/multi", "Y".getBytes(), 0), Op.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) ); List<OpResult> results = null; if (useAsync) { final MultiResult res = new MultiResult(); zk.multi(ops, new MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> opResults) { synchronized (res) { res.rc = rc; res.results = opResults; res.finished = true; res.notifyAll(); } } }, null); synchronized (res) { while (!res.finished) { res.wait(); } } Assert.assertFalse("/multi should have been deleted so setData should have failed", KeeperException.Code.OK.intValue() == res.rc); Assert.assertNull(zk.exists("/multi", null)); results = res.results; } else { try { zk.multi(ops); Assert.fail("/multi should have been deleted so setData should have failed"); } catch (KeeperException e) { // '/multi' should never have been created as entire op should fail Assert.assertNull(zk.exists("/multi", null)); results = e.getResults(); } } Assert.assertNotNull(results); for (OpResult r : results) { LOG.info("RESULT==> {}", r); if (r instanceof ErrorResult) { ErrorResult er = (ErrorResult) r; LOG.info("ERROR RESULT: {} ERR=>{}", er, KeeperException.Code.get(er.getErr())); } } }
/** * ZOOKEEPER-1624: PendingChanges of create sequential node request didn't * get rollbacked correctly when multi-op failed. This cause * create sequential node request in subsequent multi-op to failed because * sequential node name generation is incorrect. * * The check is to make sure that each request in multi-op failed with * the correct reason. */ @Test public void testSequentialNodeCreateInAsyncMulti() throws Exception { final int iteration = 4; final List<MultiResult> results = new ArrayList<MultiResult>(); pendingOps.set(iteration); List<Op> ops = Arrays.asList( Op.create("/node-", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL), Op.create("/dup", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT)); for (int i = 0; i < iteration; ++i) { zk.multi(ops, new MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> opResults) { MultiResult result = new MultiResult(); result.results = opResults; result.rc = rc; results.add(result); finishPendingOps(); } }, null); } waitForPendingOps(CONNECTION_TIMEOUT); // Check that return code of all request are correct assertEquals(KeeperException.Code.OK.intValue(), results.get(0).rc); assertEquals(KeeperException.Code.NODEEXISTS.intValue(), results.get(1).rc); assertEquals(KeeperException.Code.NODEEXISTS.intValue(), results.get(2).rc); assertEquals(KeeperException.Code.NODEEXISTS.intValue(), results.get(3).rc); // Check that the first operation is successful in all request assertTrue(results.get(0).results.get(0) instanceof CreateResult); assertEquals(KeeperException.Code.OK.intValue(), ((ErrorResult) results.get(1).results.get(0)).getErr()); assertEquals(KeeperException.Code.OK.intValue(), ((ErrorResult) results.get(2).results.get(0)).getErr()); assertEquals(KeeperException.Code.OK.intValue(), ((ErrorResult) results.get(3).results.get(0)).getErr()); // Check that the second operation failed after the first request assertEquals(KeeperException.Code.NODEEXISTS.intValue(), ((ErrorResult) results.get(1).results.get(1)).getErr()); assertEquals(KeeperException.Code.NODEEXISTS.intValue(), ((ErrorResult) results.get(2).results.get(1)).getErr()); assertEquals(KeeperException.Code.NODEEXISTS.intValue(), ((ErrorResult) results.get(3).results.get(1)).getErr()); }
@Test public void testGetResults() throws Exception { /* Delete of a node folowed by an update of the (now) deleted node */ Iterable<Op> ops = Arrays.asList( Op.create("/multi", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.delete("/multi", 0), Op.setData("/multi", "Y".getBytes(), 0), Op.create("/foo", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) ); List<OpResult> results = null; if (useAsync) { final MultiResult res = new MultiResult(); zk.multi(ops, new MultiCallback() { @Override public void processResult(int rc, String path, Object ctx, List<OpResult> opResults) { synchronized (res) { res.rc = rc; res.results = opResults; res.finished = true; res.notifyAll(); } } }, null); synchronized (res) { while (!res.finished) { res.wait(); } } Assert.assertFalse("/multi should have been deleted so setData should have failed", KeeperException.Code.OK.intValue() == res.rc); Assert.assertNull(zk.exists("/multi", null)); results = res.results; } else { try { zk.multi(ops); Assert.fail("/multi should have been deleted so setData should have failed"); } catch (KeeperException e) { // '/multi' should never have been created as entire op should fail Assert.assertNull(zk.exists("/multi", null)); results = e.getResults(); } } Assert.assertNotNull(results); for (OpResult r : results) { LOG.info("RESULT==> " + r); if (r instanceof ErrorResult) { ErrorResult er = (ErrorResult) r; LOG.info("ERROR RESULT: " + er + " ERR=>" + KeeperException.Code.get(er.getErr())); } } }