package net.tomp2p.p2p;
import java.util.Random;
import net.tomp2p.Utils2;
import net.tomp2p.connection.ConnectionBean;
import net.tomp2p.connection.PeerBean;
import net.tomp2p.connection.PeerConnection;
import net.tomp2p.connection.Responder;
import net.tomp2p.futures.FutureDirect;
import net.tomp2p.futures.FutureDoneAttachment;
import net.tomp2p.futures.FuturePeerConnection;
import net.tomp2p.message.Message;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.rpc.DirectDataRPC;
import net.tomp2p.rpc.ObjectDataReply;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestRelay {
private static final Logger LOG = LoggerFactory.getLogger(TestRelay.class);
private final static Random rnd = new Random(42L);
@Rule
public TestRule watcher = new TestWatcher() {
protected void starting(Description description) {
System.out.println("Starting test: " + description.getMethodName());
}
};
@Test
public void testLoop() throws Exception {
for(int i=0;i<100;i++) {
testPeerConnection();
}
}
@Test
public void testPeerConnection() throws Exception {
Peer master = null;
Peer slave = null;
try {
master = Utils2.createNodes(1, rnd, 4001, null, false)[0];
slave = Utils2.createNodes(1, rnd, 4002, null, false)[0];
System.err.println("master is " + master.peerAddress());
System.err.println("slave is " + slave.peerAddress());
FuturePeerConnection pcMaster = master.createPeerConnection(slave
.peerAddress());
MyDirectDataRPC myDirectDataRPC = new MyDirectDataRPC(
slave.peerBean(), slave.connectionBean());
slave.directDataRPC(myDirectDataRPC);
slave.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request)
throws Exception {
return "yoo!";
}
});
master.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request)
throws Exception {
return "world!";
}
});
FutureDirect futureResponse = master.sendDirect(pcMaster)
.object("test").start().awaitUninterruptibly();
Assert.assertEquals("yoo!", futureResponse.object());
FuturePeerConnection pcSlave = myDirectDataRPC.peerConnection();
futureResponse = slave.sendDirect(pcSlave).object("hello").start()
.awaitUninterruptibly();
System.err.println(futureResponse.failedReason());
Assert.assertEquals("world!", futureResponse.object());
//Thread.sleep(1000);
pcSlave.peerConnection().shutdown().await();
pcMaster.peerConnection().shutdown().await();
System.err.println("done");
} finally {
if (master != null) {
master.shutdown().await();
}
if (slave != null) {
slave.shutdown().await();
}
}
}
private static class MyDirectDataRPC extends DirectDataRPC {
private FuturePeerConnection futurePeerConnection;
MyDirectDataRPC(PeerBean peerBean, ConnectionBean connectionBean) {
super(peerBean, connectionBean);
}
@Override
public void register(Number160 onBehalfOf, final int... names) {
LOG.warn("registering {} for {} with {}", peerBean().serverPeerAddress().peerId(), onBehalfOf, names);
super.register(onBehalfOf, names);
}
@Override
public void handleResponse(Message message,
PeerConnection peerConnection, boolean sign, Responder responder)
throws Exception {
futurePeerConnection = new FuturePeerConnection(message.sender());
futurePeerConnection.done(peerConnection);
LOG.warn("handling response, object reply is {}", hasObjectDataReply());
super.handleResponse(message, peerConnection, sign, responder);
}
public FuturePeerConnection peerConnection() {
return futurePeerConnection;
}
}
}