package edu.uw.zookeeper;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.zookeeper.KeeperException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.Service;
import edu.uw.zookeeper.data.LockableZNodeCache;
import edu.uw.zookeeper.data.Operations;
import edu.uw.zookeeper.data.ZNodeCache;
import edu.uw.zookeeper.client.ClientExecutor;
import edu.uw.zookeeper.client.SubmitGenerator;
import edu.uw.zookeeper.common.Generator;
import edu.uw.zookeeper.common.CountingGenerator;
import edu.uw.zookeeper.common.TimeValue;
import edu.uw.zookeeper.client.random.RandomRequestGenerator;
import edu.uw.zookeeper.common.Pair;
import edu.uw.zookeeper.common.ServiceMonitor;
import edu.uw.zookeeper.protocol.Operation;
import edu.uw.zookeeper.protocol.SessionListener;
import edu.uw.zookeeper.protocol.proto.Records;
@RunWith(JUnit4.class)
public class RandomSingleClientTest {
public static <O extends Operation.ProtocolResponse<?>> LockableZNodeCache<ZNodeCache.SimpleCacheNode, Operation.Request, O> randomCache(
int iterations,
TimeValue timeOut,
ClientExecutor<Operation.Request,O,SessionListener> client,
Logger logger) throws KeeperException, InterruptedException, ExecutionException, TimeoutException {
LockableZNodeCache<ZNodeCache.SimpleCacheNode, Operation.Request, O> cache =
LockableZNodeCache.newInstance(
client);
Generator<Records.Request> requests = RandomRequestGenerator.fromCache(cache);
CountingGenerator<Pair<Records.Request, ListenableFuture<O>>> operations =
CountingGenerator.create(iterations, iterations,
SubmitGenerator.create(requests, cache), logger);
while (operations.hasNext()) {
Pair<Records.Request, ListenableFuture<O>> operation = operations.next();
Operations.unlessError(operation.second().get(timeOut.value(), timeOut.unit()).record());
}
return cache;
}
protected final Logger logger = LogManager.getLogger(this);
@Test(timeout=30000)
public void testRandom() throws Exception {
SimpleServerAndClient client = SimpleServerAndClient.defaults().setDefaults();
ServiceMonitor monitor = client.getRuntimeModule().getServiceMonitor();
for (Service service: client.build()) {
monitor.add(service);
}
monitor.startAsync().awaitRunning();
randomCache(
100,
TimeValue.milliseconds(1000),
client.getClientBuilder().getConnectionClientExecutor(),
logger);
monitor.stopAsync().awaitTerminated();
}
}