package net.tomp2p.rpc;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import java.util.LinkedHashMap;
import java.util.Map;
import net.tomp2p.connection.ChannelClientConfiguration;
import net.tomp2p.connection.ChannelCreator;
import net.tomp2p.connection.ChannelServerConfiguration;
import net.tomp2p.connection.PeerConnection;
import net.tomp2p.futures.BaseFutureAdapter;
import net.tomp2p.futures.FutureChannelCreator;
import net.tomp2p.futures.FutureDirect;
import net.tomp2p.futures.FutureDoneAttachment;
import net.tomp2p.futures.FutureResponse;
import net.tomp2p.connection.CountConnectionOutboundHandler;
import net.tomp2p.futures.FuturePeerConnection;
import net.tomp2p.p2p.Peer;
import net.tomp2p.p2p.PeerBuilder;
import net.tomp2p.p2p.builder.SendDirectBuilder;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.utils.Pair;
import net.tomp2p.utils.Utils;
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;
public class TestDirect {
@Rule
public TestRule watcher = new TestWatcher() {
protected void starting(Description description) {
System.out.println("Starting test: " + description.getMethodName());
}
};
@Test
public void testDirectMessage1() throws Exception {
Peer sender = null;
Peer recv1 = null;
ChannelCreator cc = null;
try {
sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).start();
recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).start();
recv1.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
return "yes";
}
});
FutureChannelCreator fcc = sender.connectionBean().reservation().create(0, 2);
fcc.awaitUninterruptibly();
cc = fcc.channelCreator();
SendDirectBuilder sendDirectBuilder = new SendDirectBuilder(sender, (PeerAddress) null);
sendDirectBuilder.object("test");
FutureResponse fd1 = sender.directDataRPC()
.send(recv1.peerAddress(), sendDirectBuilder, cc);
FutureResponse fd2 = sender.directDataRPC()
.send(recv1.peerAddress(), sendDirectBuilder, cc);
fd1.awaitUninterruptibly();
fd2.awaitUninterruptibly();
System.err.println(fd1.failedReason());
Assert.assertEquals(true, fd1.isSuccess());
Assert.assertEquals(true, fd2.isSuccess());
Object ret = fd1.responseMessage().buffer(0).object();
Assert.assertEquals("yes", ret);
fd1.release();
fd2.release();
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (sender != null) {
sender.shutdown().await();
}
if (recv1 != null) {
recv1.shutdown().await();
}
}
}
@Test
public void testOrder() throws Exception {
Peer sender = null;
Peer recv1 = null;
ChannelCreator cc = null;
try {
sender = new PeerBuilder(new Number160("0x9876")).p2pId(55).ports(2424).start();
recv1 = new PeerBuilder(new Number160("0x1234")).p2pId(55).ports(8088).start();
recv1.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
Integer i = (Integer) request;
System.err.println("got " + i);
return i + 1;
}
});
for (int i = 0; i < 500; i++) {
FutureChannelCreator fcc = sender.connectionBean().reservation().create(0, 1);
fcc.awaitUninterruptibly();
cc = fcc.channelCreator();
SendDirectBuilder sendDirectBuilder = new SendDirectBuilder(sender, (PeerAddress) null);
sendDirectBuilder.object((Object) Integer.valueOf(i));
final FutureResponse futureData = sender.directDataRPC().send(recv1.peerAddress(),
sendDirectBuilder, cc);
Utils.addReleaseListener(cc, futureData);
futureData.addListener(new BaseFutureAdapter<FutureResponse>() {
@Override
public void operationComplete(FutureResponse future) throws Exception {
// the future object might be null if the future failed,
// e.g due to shutdown
System.err.println(future.responseMessage().buffer(0).object());
futureData.release();
}
});
Thread.sleep(200);
}
System.err.println("done");
Thread.sleep(2000);
} finally {
if (cc != null) {
cc.shutdown().awaitListenersUninterruptibly();
}
if (sender != null) {
sender.shutdown().await();
}
if (recv1 != null) {
recv1.shutdown().await();
}
}
}
@Test
public void testDirectReconnect() throws Exception {
Peer sender = null;
Peer recv1 = null;
try {
//final CountConnectionOutboundHandler ccohTCP = new CountConnectionOutboundHandler();
//final CountConnectionOutboundHandler ccohUDP = new CountConnectionOutboundHandler();
ChannelServerConfiguration csc = PeerBuilder.createDefaultChannelServerConfiguration();
ChannelClientConfiguration ccc = PeerBuilder.createDefaultChannelClientConfiguration();
sender = new PeerBuilder(new Number160("0x50")).p2pId(55).enableMaintenance(false).ports(2424).channelClientConfiguration(ccc).channelServerConfiguration(csc).start();
recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).enableMaintenance(false).ports(8088).channelClientConfiguration(ccc).channelServerConfiguration(csc).start();
recv1.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
return "yes";
}
});
FuturePeerConnection peerConnection = sender.createPeerConnection(recv1.peerAddress());
sender.connectionBean().connect().counterTCP().reset();
sender.connectionBean().connect().counterUDP().reset();
FutureDirect fd1 = sender.sendDirect(peerConnection).object("test")
.connectionTimeoutTCPMillis(2000).idleTCPMillis(10 * 1000).start();
fd1.awaitUninterruptibly();
fd1.awaitListenersUninterruptibly();
Assert.assertEquals(true, fd1.isSuccess());
Assert.assertEquals(1, sender.connectionBean().connect().counterTCP().total());
Assert.assertEquals(0, sender.connectionBean().connect().counterUDP().total());
Thread.sleep(2000);
System.err.println("send second with the same connection");
FutureDirect fd2 = sender.sendDirect(peerConnection).object("test").start();
fd2.awaitUninterruptibly();
Assert.assertEquals(1, sender.connectionBean().connect().counterTCP().total());
Assert.assertEquals(0, sender.connectionBean().connect().counterUDP().total());
Assert.assertEquals(true, fd2.isSuccess());
peerConnection.object().close().await();
System.err.println("done");
} finally {
if (sender != null) {
sender.shutdown().await();
}
if (recv1 != null) {
recv1.shutdown().await();
}
}
}
@Test
public void testDirect2() throws Exception {
Peer sender = null;
Peer recv1 = null;
try {
//final CountConnectionOutboundHandler ccohTCP = new CountConnectionOutboundHandler();
//final CountConnectionOutboundHandler ccohUDP = new CountConnectionOutboundHandler();
ChannelServerConfiguration csc = PeerBuilder.createDefaultChannelServerConfiguration();
ChannelClientConfiguration ccc = PeerBuilder.createDefaultChannelClientConfiguration();
sender = new PeerBuilder(new Number160("0x50")).p2pId(55).ports(2424).enableMaintenance(false)
.channelClientConfiguration(ccc).channelServerConfiguration(csc).start();
recv1 = new PeerBuilder(new Number160("0x20")).p2pId(55).ports(8088).enableMaintenance(false)
.channelClientConfiguration(ccc).channelServerConfiguration(csc).start();
recv1.objectDataReply(new ObjectDataReply() {
@Override
public Object reply(PeerAddress sender, Object request) throws Exception {
return "yes";
}
});
FuturePeerConnection peerConnection = sender.createPeerConnection(recv1.peerAddress(), 8000, 2000);
sender.connectionBean().connect().counterTCP().reset();
sender.connectionBean().connect().counterUDP().reset();
FutureDirect fd1 = sender.sendDirect(peerConnection).object("test")
.connectionTimeoutTCPMillis(2000).idleTCPMillis(5 * 1000).start();
fd1.awaitUninterruptibly();
Assert.assertTrue(fd1.isSuccess());
Assert.assertEquals(1, sender.connectionBean().connect().counterTCP().total());
Thread.sleep(7000);
System.out.println("request 2");
FutureDirect fd2 = sender.sendDirect(peerConnection).object("test").start();
fd2.awaitUninterruptibly();
peerConnection.object().close().await();
Assert.assertEquals(2, sender.connectionBean().connect().counterTCP().total());
System.out.println("done");
} finally {
if (sender != null) {
sender.shutdown().await();
}
if (recv1 != null) {
recv1.shutdown().await();
}
}
}
}