package edu.uw.zookeeper.net;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import java.util.concurrent.ExecutionException;
import com.google.common.util.concurrent.ListenableFuture;
import edu.uw.zookeeper.common.AbstractPair;
public abstract class ConnectionTestAdapter {
public static class QueuedConnection<I,O,T extends Connection<? super I,? extends O,?>> extends AbstractPair<T, QueueingConnectionListener<O>> {
public static <I,O,T extends Connection<? super I,? extends O,?>> QueuedConnection<I,O,T> create(T connection, QueueingConnectionListener<O> listener) {
listener.subscribe(connection);
return new QueuedConnection<I,O,T>(connection, listener);
}
public QueuedConnection(T connection, QueueingConnectionListener<O> listener) {
super(connection, listener);
}
public T connection() {
return first;
}
public QueueingConnectionListener<O> listener() {
return second;
}
}
protected void pingPong(
QueuedConnection<? super String,? super String,?> c1,
QueuedConnection<? super String,? super String,?> c2) throws InterruptedException, ExecutionException {
String c1Message = "ping";
ListenableFuture<?> future = c1.connection().write(c1Message);
String c2Message = (String) c2.listener().reads().take();
assertSame(c1Message, future.get());
assertEquals(c1Message, c2Message);
c2Message = "pong";
future = c2.connection().write(c2Message);
c1Message = (String) c1.listener().reads().take();
assertSame(c2Message, future.get());
assertEquals(c2Message, c1Message);
}
}