Commit c4ee8991 authored by Patrick D. Hunt's avatar Patrick D. Hunt
Browse files

ZOOKEEPER-1388. Client side 'PathValidation' is missing for the...

ZOOKEEPER-1388. Client side 'PathValidation' is missing for the multi-transaction api. (Rakesh R via marshallm, phunt)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/branches/branch-3.4@1551625 13f79535-47bb-0310-9956-ffa450edef68
parent 96714da5
......@@ -194,6 +194,9 @@ BUGFIXES:
ZOOKEEPER-1756. zookeeper_interest() in C client can return a timeval of 0
(Eric Lindvall via michim)
ZOOKEEPER-1388. Client side 'PathValidation' is missing for the
multi-transaction api. (Rakesh R via marshallm, phunt)
IMPROVEMENTS:
ZOOKEEPER-1564. Allow JUnit test build with IBM Java
......
......@@ -83,8 +83,10 @@ public enum CreateMode {
case 3: return CreateMode.EPHEMERAL_SEQUENTIAL ;
default:
LOG.error("Received an invalid flag value to convert to a CreateMode");
throw new KeeperException.BadArgumentsException();
String errMsg = "Received an invalid flag value: " + flag
+ " to convert to a CreateMode";
LOG.error(errMsg);
throw new KeeperException.BadArgumentsException(errMsg);
}
}
}
......@@ -18,6 +18,7 @@
package org.apache.zookeeper;
import org.apache.jute.Record;
import org.apache.zookeeper.common.PathUtils;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.proto.CheckVersionRequest;
import org.apache.zookeeper.proto.CreateRequest;
......@@ -162,6 +163,18 @@ public abstract class Op {
*/
abstract Op withChroot(String addRootPrefix);
/**
* Performs client path validations.
*
* @throws IllegalArgumentException
* if an invalid path is specified
* @throws KeeperException.BadArgumentsException
* if an invalid create mode flag is specified
*/
void validate() throws KeeperException {
PathUtils.validatePath(path);
}
//////////////////
// these internal classes are public, but should not generally be referenced.
//
......@@ -222,6 +235,12 @@ public abstract class Op {
Op withChroot(String path) {
return new Create(path, data, acl, flags);
}
@Override
void validate() throws KeeperException {
CreateMode createMode = CreateMode.fromFlag(flags);
PathUtils.validatePath(getPath(), createMode.isSequential());
}
}
public static class Delete extends Op {
......
......@@ -899,10 +899,14 @@ public class ZooKeeper {
* partially succeeded if this exception is thrown.
* @throws KeeperException If the operation could not be completed
* due to some error in doing one of the specified ops.
* @throws IllegalArgumentException if an invalid path is specified
*
* @since 3.4.0
*/
public List<OpResult> multi(Iterable<Op> ops) throws InterruptedException, KeeperException {
for (Op op : ops) {
op.validate();
}
// reconstructing transaction with the chroot prefix
List<Op> transaction = new ArrayList<Op>();
for (Op op : ops) {
......
......@@ -60,7 +60,106 @@ public class MultiTransactionTest extends ClientBase {
zk = createClient();
}
/**
* Test verifies the multi calls with invalid znode path
*/
@Test(timeout = 90000)
public void testInvalidPath() throws Exception {
// create with CreateMode
List<Op> opList = Arrays.asList(Op.create("/multi0", new byte[0],
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.create(
"/multi1/", new byte[0], Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT), Op.create("/multi2", new byte[0],
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
// create with valid sequential flag
opList = Arrays.asList(Op.create("/multi0", new byte[0],
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.create(
"multi1/", new byte[0], Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL.toFlag()), Op.create("/multi2",
new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
// check
opList = Arrays.asList(Op.check("/multi0", -1),
Op.check("/multi1/", 100), Op.check("/multi2", 5));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
// delete
opList = Arrays.asList(Op.delete("/multi0", -1),
Op.delete("/multi1/", 100), Op.delete("/multi2", 5));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
// setdata
opList = Arrays.asList(Op.setData("/multi0", new byte[0], -1),
Op.setData("/multi1/", new byte[0], -1),
Op.setData("/multi2", new byte[0], -1),
Op.setData("multi3", new byte[0], -1));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* Test verifies the multi calls with blank znode path
*/
@Test(timeout = 90000)
public void testBlankPath() throws Exception {
// delete
List<Op> opList = Arrays.asList(Op.delete("/multi0", -1),
Op.delete(null, 100), Op.delete("/multi2", 5),
Op.delete("", -1));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* Test verifies the multi.create with invalid createModeFlag
*/
@Test(timeout = 90000)
public void testInvalidCreateModeFlag() throws Exception {
int createModeFlag = 6789;
List<Op> opList = Arrays.asList(Op.create("/multi0", new byte[0],
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT), Op.create(
"/multi1", new byte[0], Ids.OPEN_ACL_UNSAFE, createModeFlag),
Op.create("/multi2", new byte[0], Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT));
try {
zk.multi(opList);
Assert.fail("Shouldn't have validated in ZooKeeper client!");
} catch (KeeperException.BadArgumentsException e) {
// expected
}
}
@Test
public void testChRootCreateDelete() throws Exception {
// creating the subtree for chRoot clients.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment