blob: de1fbdc1dcb55a1af2d2b8ec00e0e0a46e11c671 [file] [log] [blame]
/**
* 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.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiPredicate;
import org.apache.zookeeper.AsyncCallback.Children2Callback;
import org.apache.zookeeper.AsyncCallback.ChildrenCallback;
import org.apache.zookeeper.AsyncCallback.DataCallback;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.AsyncCallback.VoidCallback;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;
import org.objenesis.instantiator.ObjectInstantiator;
/**
* mock zookeeper with different session based on {@link MockZooKeeper}.
*/
public class MockZooKeeperSession extends ZooKeeper {
private MockZooKeeper mockZooKeeper;
private long sessionId = 0L;
private static final Objenesis objenesis = new ObjenesisStd();
private static final AtomicInteger sessionIdGenerator = new AtomicInteger(1000);
public static MockZooKeeperSession newInstance(MockZooKeeper mockZooKeeper) {
ObjectInstantiator<MockZooKeeperSession> instantiator = objenesis.getInstantiatorOf(MockZooKeeperSession.class);
MockZooKeeperSession mockZooKeeperSession = instantiator.newInstance();
mockZooKeeperSession.mockZooKeeper = mockZooKeeper;
mockZooKeeperSession.sessionId = sessionIdGenerator.getAndIncrement();
return mockZooKeeperSession;
}
private MockZooKeeperSession(String quorum) throws Exception {
// This constructor is never called
super(quorum, 1, event -> {
});
assert false;
}
@Override
public int getSessionTimeout() {
return mockZooKeeper.getSessionTimeout();
}
@Override
public States getState() {
return mockZooKeeper.getState();
}
@Override
public void register(Watcher watcher) {
mockZooKeeper.register(watcher);
}
@Override
public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
throws KeeperException, InterruptedException {
try {
mockZooKeeper.overrideEpheralOwner(getSessionId());
return mockZooKeeper.create(path, data, acl, createMode);
} finally {
mockZooKeeper.removeEpheralOwnerOverride();
}
}
@Override
public void create(final String path, final byte[] data, final List<ACL> acl, CreateMode createMode,
final AsyncCallback.StringCallback cb, final Object ctx) {
try {
mockZooKeeper.overrideEpheralOwner(getSessionId());
mockZooKeeper.create(path, data, acl, createMode, cb, ctx);
} finally {
mockZooKeeper.removeEpheralOwnerOverride();
}
}
@Override
public byte[] getData(String path, Watcher watcher, Stat stat) throws KeeperException {
return mockZooKeeper.getData(path, watcher, stat);
}
@Override
public void getData(final String path, boolean watch, final DataCallback cb, final Object ctx) {
mockZooKeeper.getData(path, watch, cb, ctx);
}
@Override
public void getData(final String path, final Watcher watcher, final DataCallback cb, final Object ctx) {
mockZooKeeper.getData(path, watcher, cb, ctx);
}
@Override
public void getChildren(final String path, final Watcher watcher, final ChildrenCallback cb, final Object ctx) {
mockZooKeeper.getChildren(path, watcher, cb, ctx);
}
@Override
public List<String> getChildren(String path, Watcher watcher) throws KeeperException {
return mockZooKeeper.getChildren(path, watcher);
}
@Override
public List<String> getChildren(String path, boolean watch) throws KeeperException, InterruptedException {
return mockZooKeeper.getChildren(path, watch);
}
@Override
public void getChildren(final String path, boolean watcher, final Children2Callback cb, final Object ctx) {
mockZooKeeper.getChildren(path, watcher, cb, ctx);
}
@Override
public Stat exists(String path, boolean watch) throws KeeperException, InterruptedException {
return mockZooKeeper.exists(path, watch);
}
@Override
public Stat exists(String path, Watcher watcher) throws KeeperException, InterruptedException {
return mockZooKeeper.exists(path, watcher);
}
@Override
public void exists(String path, boolean watch, StatCallback cb, Object ctx) {
mockZooKeeper.exists(path, watch, cb, ctx);
}
@Override
public void exists(String path, Watcher watcher, StatCallback cb, Object ctx) {
mockZooKeeper.exists(path, watcher, cb, ctx);
}
@Override
public void sync(String path, VoidCallback cb, Object ctx) {
mockZooKeeper.sync(path, cb, ctx);
}
@Override
public Stat setData(final String path, byte[] data, int version) throws KeeperException, InterruptedException {
return mockZooKeeper.setData(path, data, version);
}
@Override
public void setData(final String path, final byte[] data, int version, final StatCallback cb, final Object ctx) {
mockZooKeeper.setData(path, data, version, cb, ctx);
}
@Override
public void delete(final String path, int version) throws InterruptedException, KeeperException {
mockZooKeeper.delete(path, version);
}
@Override
public void delete(final String path, int version, final VoidCallback cb, final Object ctx) {
mockZooKeeper.delete(path, version, cb, ctx);
}
@Override
public void multi(Iterable<org.apache.zookeeper.Op> ops, AsyncCallback.MultiCallback cb, Object ctx) {
mockZooKeeper.multi(ops, cb, ctx);
}
@Override
public List<OpResult> multi(Iterable<org.apache.zookeeper.Op> ops) throws InterruptedException, KeeperException {
return mockZooKeeper.multi(ops);
}
@Override
public void addWatch(String basePath, Watcher watcher, AddWatchMode mode, VoidCallback cb, Object ctx) {
mockZooKeeper.addWatch(basePath, watcher, mode, cb, ctx);
}
@Override
public void addWatch(String basePath, Watcher watcher, AddWatchMode mode)
throws KeeperException, InterruptedException {
mockZooKeeper.addWatch(basePath, watcher, mode);
}
@Override
public void addWatch(String basePath, AddWatchMode mode) throws KeeperException, InterruptedException {
mockZooKeeper.addWatch(basePath, mode);
}
@Override
public void addWatch(String basePath, AddWatchMode mode, VoidCallback cb, Object ctx) {
mockZooKeeper.addWatch(basePath, mode, cb, ctx);
}
@Override
public void close() throws InterruptedException {
mockZooKeeper.close();
}
public void shutdown() throws InterruptedException {
mockZooKeeper.shutdown();
}
Optional<KeeperException.Code> programmedFailure(MockZooKeeper.Op op, String path) {
return mockZooKeeper.programmedFailure(op, path);
}
void maybeThrowProgrammedFailure(MockZooKeeper.Op op, String path) throws KeeperException {
mockZooKeeper.maybeThrowProgrammedFailure(op, path);
}
public void failConditional(KeeperException.Code rc, BiPredicate<MockZooKeeper.Op, String> predicate) {
mockZooKeeper.failConditional(rc, predicate);
}
public void setAlwaysFail(KeeperException.Code rc) {
mockZooKeeper.setAlwaysFail(rc);
}
public void unsetAlwaysFail() {
mockZooKeeper.unsetAlwaysFail();
}
public void setSessionId(long id) {
sessionId = id;
}
@Override
public long getSessionId() {
return sessionId;
}
@Override
public String toString() {
return "MockZooKeeperSession{" + "sessionId=" + sessionId + '}';
}
}