package net.tomp2p.holep.manual; import java.io.IOException; import java.io.Serializable; import java.util.Random; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import net.tomp2p.futures.BaseFuture; import net.tomp2p.futures.FutureDirect; import net.tomp2p.futures.FutureDiscover; import net.tomp2p.p2p.Peer; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.peers.PeerSocketAddress; import net.tomp2p.peers.PeerSocketAddress.PeerSocket4Address; //travis-ci cannot test this, the kernel does not support all the required features: //Perhaps iptables or your kernel needs to be upgraded //see also here: https://github.com/travis-ci/travis-ci/issues/1341 @Ignore public class TestNATForwarding implements Serializable { final static private Random RND = new Random(42); static private Number160 relayPeerId = new Number160(RND); //### CHANGE THIS TO YOUR INTERFACE### final static private String INF = "enp0s25"; @Before public void before() throws IOException, InterruptedException { LocalNATUtils.executeNatSetup("start", "0", "sym"); LocalNATUtils.executeNatSetup("start", "1", "sym"); LocalNATUtils.executeNatSetup("forward", "0", "4000", "10.0.0.2", "5000"); LocalNATUtils.executeNatSetup("forward", "1", "4000", "10.0.1.2", "5000"); } @After public void after() throws IOException, InterruptedException { LocalNATUtils.executeNatSetup("stop", "0"); LocalNATUtils.executeNatSetup("stop", "1"); } @Test public void testForwardTwoPeers() throws Exception { Peer relayPeer = null; RemotePeer unr1 = null; RemotePeer unr2 = null; try { relayPeer = LocalNATUtils.createRealNode(relayPeerId, INF, 5002); final PeerSocket4Address relayAddress = relayPeer.peerAddress().ipv4Socket(); final PeerAddress relay = relayPeer.peerAddress(); System.out.println("relay peer at: "+relay); //final Peer relayPeer1Copy = relayPeer1; CommandSync sync = new CommandSync(2); unr1 = LocalNATUtils.executePeer(0, sync, new Command() { @Override public Serializable execute() throws Exception { Peer peer1 = LocalNATUtils.createNattedPeer("10.0.0.2", 5000, 0, 4000, "peer1"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start().awaitUninterruptibly(); Assert.assertTrue(fd1.isDiscoveredTCP()); Thread.sleep(2000); System.out.println("relay peer at1: "+relay); BaseFuture fb = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); Thread.sleep(2000); System.err.println(fb.failedReason()); Assert.assertTrue(fb.isSuccess()); return "done startup1"; } }, new Command() { @Override public Serializable execute() throws Exception { final Peer peer1 = (Peer) get("p1"); PeerAddress peer2 = PeerAddress.create(Number160.createHash(1), "172.20.1.1", 4000, 4000, 4001); FutureDirect fdir = peer1.sendDirect(peer2).object("test").start().awaitUninterruptibly(); Assert.assertEquals("peer2", fdir.object()); return "done"; } }, new Command() { @Override public Serializable execute() throws Exception { Thread.sleep(2000); System.err.println("shutdown"); return LocalNATUtils.shutdown((Peer)get("p1")); } }); unr2 = LocalNATUtils.executePeer(1, sync, new Command() { @Override public Serializable execute() throws Exception { Peer peer1 = LocalNATUtils.createNattedPeer("10.0.1.2", 5000, 1, 4000, "peer2"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start().awaitUninterruptibly(); Assert.assertTrue(fd1.isDiscoveredTCP()); Thread.sleep(2000); System.out.println("relay peer at2: "+relay); BaseFuture fb = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); Thread.sleep(2000); Assert.assertTrue(fb.isSuccess()); return "done startup1"; } }, new Command() { @Override public Serializable execute() throws Exception { final Peer peer1 = (Peer) get("p1"); PeerAddress peer2 = PeerAddress.create(Number160.createHash(0), "172.20.0.1", 4000, 4000, 4001); FutureDirect fdir = peer1.sendDirect(peer2).object("test").start().awaitUninterruptibly(); Assert.assertEquals("peer1", fdir.object()); return "done"; } }, new Command() { @Override public Serializable execute() throws Exception { Thread.sleep(2000); System.err.println("shutdown"); return LocalNATUtils.shutdown((Peer)get("p1")); } }); unr1.waitFor(); unr2.waitFor(); Assert.assertEquals("done", unr1.getResult(1)); Assert.assertEquals("done", unr2.getResult(1)); } finally { System.out.print("LOCAL> shutdown."); LocalNATUtils.shutdown(relayPeer); System.out.print("."); LocalNATUtils.shutdown(unr1); System.out.println("."); } } @Test public void testForwardTwoPlusOne() throws Exception { Peer relayPeer = null; RemotePeer unr1 = null; RemotePeer unr2 = null; try { relayPeer = LocalNATUtils.createRealNode(relayPeerId, INF, 5002); final Peer regularPeer = LocalNATUtils.createRealNode(Number160.createHash(77), INF, 5003); final PeerSocket4Address relayAddress = relayPeer.peerAddress().ipv4Socket(); final PeerAddress relay = relayPeer.peerAddress(); System.out.println("relay peer at: "+relay); CommandSync sync = new CommandSync(2); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(5000); PeerAddress peer2 = PeerAddress.create(Number160.createHash(1), "172.20.1.1", 4000, 4000, 4001); FutureDirect fdir = regularPeer.sendDirect(peer2).object("test").start().awaitUninterruptibly(); Assert.assertEquals("peer2", fdir.object()); } catch (Exception e) { e.printStackTrace(); } finally { regularPeer.shutdown().awaitUninterruptibly(); } } }).start(); //final Peer relayPeer1Copy = relayPeer1; unr1 = LocalNATUtils.executePeer(0, sync, new Command() { @Override public Serializable execute() throws Exception { Peer peer1 = LocalNATUtils.createNattedPeer("10.0.0.2", 5000, 0, 4000, "peer1"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start().awaitUninterruptibly(); Assert.assertTrue(fd1.isDiscoveredTCP()); Thread.sleep(2000); System.out.println("relay peer at1: "+relay); BaseFuture fb = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); Thread.sleep(2000); System.err.println(fb.failedReason()); Assert.assertTrue(fb.isSuccess()); return "done startup1"; } }, new Command() { @Override public Serializable execute() throws Exception { final Peer peer1 = (Peer) get("p1"); PeerAddress peer2 = PeerAddress.create(Number160.createHash(1), "172.20.1.1", 4000, 4000, 4001); FutureDirect fdir = peer1.sendDirect(peer2).object("test").start().awaitUninterruptibly(); Assert.assertEquals("peer2", fdir.object()); return "done"; } }, new Command() { @Override public Serializable execute() throws Exception { Thread.sleep(5000); System.err.println("shutdown"); return LocalNATUtils.shutdown((Peer)get("p1")); } }); unr2 = LocalNATUtils.executePeer(1, sync, new Command() { @Override public Serializable execute() throws Exception { Peer peer1 = LocalNATUtils.createNattedPeer("10.0.1.2", 5000, 1, 4000, "peer2"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start().awaitUninterruptibly(); Assert.assertTrue(fd1.isDiscoveredTCP()); Thread.sleep(2000); System.out.println("relay peer at2: "+relay); BaseFuture fb = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); Thread.sleep(2000); Assert.assertTrue(fb.isSuccess()); return "done startup1"; } }, new Command() { @Override public Serializable execute() throws Exception { final Peer peer1 = (Peer) get("p1"); PeerAddress peer2 = PeerAddress.create(Number160.createHash(0), "172.20.0.1", 4000, 4000, 4001); FutureDirect fdir = peer1.sendDirect(peer2).object("test").start().awaitUninterruptibly(); Assert.assertEquals("peer1", fdir.object()); return "done"; } }, new Command() { @Override public Serializable execute() throws Exception { Thread.sleep(5000); System.err.println("shutdown"); return LocalNATUtils.shutdown((Peer)get("p1")); } }); unr1.waitFor(); unr2.waitFor(); Assert.assertEquals("done", unr1.getResult(1)); Assert.assertEquals("done", unr2.getResult(1)); } finally { System.out.print("LOCAL> shutdown."); LocalNATUtils.shutdown(relayPeer); System.out.print("."); LocalNATUtils.shutdown(unr1); System.out.println("."); } } }