package net.tomp2p.rpc; import java.util.ArrayList; import java.util.List; import net.tomp2p.connection2.Bindings; import net.tomp2p.connection2.ChannelCreator; import net.tomp2p.connection2.DefaultConnectionConfiguration; import net.tomp2p.futures.BaseFutureAdapter; import net.tomp2p.futures.FutureChannelCreator; import net.tomp2p.futures.FutureResponse; import net.tomp2p.p2p.Peer; import net.tomp2p.p2p.PeerReachable; import net.tomp2p.p2p.PeerMaker; import net.tomp2p.peers.Number160; import net.tomp2p.rpc.PingRPC; import net.tomp2p.utils.Timings; import net.tomp2p.utils.Utils; import org.junit.Assert; import org.junit.Test; public class TestPing { static Bindings bindings = new Bindings(); static { bindings.addInterface("lo"); } @Test public void testPingTCP() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTCP2() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); FutureResponse fr2 = recv1.getHandshakeRPC().pingTCP(sender.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr2.awaitUninterruptibly(); Assert.assertEquals(true, fr2.isSuccess()); Assert.assertEquals(true, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTCPDeadLock2() throws Exception { Peer sender1 = null; Peer recv11 = null; ChannelCreator cc = null; try { final Peer sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); sender1 = sender; final Peer recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); recv11 = recv1; FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); final ChannelCreator cc1 = cc; FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); fr.addListener(new BaseFutureAdapter<FutureResponse>() { @Override public void operationComplete(final FutureResponse future) throws Exception { FutureResponse fr2 = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc1, new DefaultConnectionConfiguration()); try { fr2.await(); } catch (IllegalStateException ise) { Assert.fail(); } } }); Timings.sleep(1000); Assert.assertEquals(true, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender1 != null) { sender1.shutdown().await(); } if (recv11 != null) { recv11.shutdown().await(); } } } @Test public void testPingUDP() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); PingRPC handshake = new PingRPC(sender.getPeerBean(), sender.getConnectionBean()); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); new PingRPC(recv1.getPeerBean(), recv1.getConnectionBean()); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = handshake.pingUDP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(true, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingHandlerError() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); PingRPC handshake = new PingRPC(sender.getPeerBean(), sender.getConnectionBean(), false, true, false); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); new PingRPC(recv1.getPeerBean(), recv1.getConnectionBean(), false, true, false); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = handshake.pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(false, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTimeoutTCP() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); PingRPC handshake = new PingRPC(sender.getPeerBean(), sender.getConnectionBean(), false, true, true); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); new PingRPC(recv1.getPeerBean(), recv1.getConnectionBean(), false, true, true); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = handshake.pingTCP(recv1.getPeerBean().serverPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(false, fr.isSuccess()); Assert.assertEquals(false, fr.getFailedReason().contains("exception on the other side")); Assert.assertEquals(true, fr.getFailedReason().contains("channel is idle")); System.err.println("done:" + fr.getFailedReason()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingHandlerFailure() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); PingRPC handshake = new PingRPC(sender.getPeerBean(), sender.getConnectionBean(), false, true, false); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); new PingRPC(recv1.getPeerBean(), recv1.getConnectionBean(), false, true, false); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = handshake.pingUDP(recv1.getPeerBean().serverPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(false, fr.isSuccess()); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTimeoutUDP() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); PingRPC handshake = new PingRPC(sender.getPeerBean(), sender.getConnectionBean(), false, true, true); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); new PingRPC(recv1.getPeerBean(), recv1.getConnectionBean(), false, true, true); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(1, 0); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); FutureResponse fr = handshake.pingUDP(recv1.getPeerBean().serverPeerAddress(), cc, new DefaultConnectionConfiguration()); fr.awaitUninterruptibly(); Assert.assertEquals(false, fr.isSuccess()); Assert.assertEquals(false, fr.getFailedReason().contains("exception on the other side")); Assert.assertEquals(true, fr.getFailedReason().contains("channel is idle")); } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTCPPool() throws Exception { Peer sender = null; Peer recv1 = null; ChannelCreator cc = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); List<FutureResponse> list = new ArrayList<FutureResponse>(50); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 50); fcc.awaitUninterruptibly(); cc = fcc.getChannelCreator(); for (int i = 0; i < 50; i++) { FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); list.add(fr); } for (FutureResponse fr2 : list) { fr2.awaitUninterruptibly(); Assert.assertTrue(fr2.isSuccess()); } } finally { if (cc != null) { cc.shutdown().await(); } if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingTCPPool2() throws Exception { Peer p[] = new Peer[50]; try { for (int i = 0; i < p.length; i++) { p[i] = new PeerMaker(Number160.createHash(i)).p2pId(55).ports(2424 + i).makeAndListen(); } List<FutureResponse> list = new ArrayList<FutureResponse>(); for (int i = 0; i < p.length; i++) { FutureChannelCreator fcc = p[0].getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.getChannelCreator(); FutureResponse fr = p[0].getHandshakeRPC().pingTCP(p[i].getPeerAddress(), cc, new DefaultConnectionConfiguration()); Utils.addReleaseListener(cc, fr); list.add(fr); } for (FutureResponse fr2 : list) { fr2.awaitUninterruptibly(); boolean success = fr2.isSuccess(); if (!success) { System.err.println("FAIL."); Assert.fail(); } } System.err.println("DONE."); } finally { for (int i = 0; i < p.length; i++) { p[i].shutdown().await(); } } } @Test public void testPingTime() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); long start = System.currentTimeMillis(); List<FutureResponse> list = new ArrayList<FutureResponse>(100); for (int i = 0; i < 20; i++) { FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 50); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.getChannelCreator(); for (int j = 0; j < 50; j++) { FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); list.add(fr); } for (FutureResponse fr2 : list) { fr2.awaitUninterruptibly(); if (!fr2.isSuccess()) System.err.println("fail " + fr2.getFailedReason()); Assert.assertEquals(true, fr2.isSuccess()); } list.clear(); cc.shutdown().await(); } System.out.println("TCP time: " + (System.currentTimeMillis() - start)); for (FutureResponse fr2 : list) { fr2.awaitUninterruptibly(); Assert.assertEquals(true, fr2.isSuccess()); } // start = System.currentTimeMillis(); list = new ArrayList<FutureResponse>(50); for (int i = 0; i < 20; i++) { FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(50, 0); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.getChannelCreator(); for (int j = 0; j < 50; j++) { FutureResponse fr = sender.getHandshakeRPC().pingUDP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); list.add(fr); } int ii = 0; for (FutureResponse fr2 : list) { System.err.println("waiting for " + (ii++) + fr2.getRequest()); fr2.awaitUninterruptibly(); Assert.assertEquals(true, fr2.isSuccess()); } list.clear(); cc.shutdown().await(); } System.out.println("UDP time: " + (System.currentTimeMillis() - start)); } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } @Test public void testPingReserveLoop() throws Exception { for (int i = 0; i < 100; i++) { testPingReserve(); } } @Test public void testPingReserve() throws Exception { Peer sender = null; Peer recv1 = null; try { sender = new PeerMaker(new Number160("0x9876")).p2pId(55).ports(2424).makeAndListen(); recv1 = new PeerMaker(new Number160("0x1234")).p2pId(55).ports(8088).makeAndListen(); FutureChannelCreator fcc = recv1.getConnectionBean().reservation().create(0, 1); fcc.awaitUninterruptibly(); ChannelCreator cc = fcc.getChannelCreator(); FutureResponse fr = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); Utils.addReleaseListener(cc, fr); fr.awaitUninterruptibly(); fr.awaitListeners(); Assert.assertEquals(true, fr.isSuccess()); FutureResponse fr2 = sender.getHandshakeRPC().pingTCP(recv1.getPeerAddress(), cc, new DefaultConnectionConfiguration()); fr2.awaitUninterruptibly(); fr2.awaitListeners(); // we have released the reservation here // System.err.println(fr2.getFailedReason()); Assert.assertEquals(false, fr2.isSuccess()); } finally { if (sender != null) { sender.shutdown().await(); } if (recv1 != null) { recv1.shutdown().await(); } } } }