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.dht.FuturePut; import net.tomp2p.dht.PeerBuilderDHT; import net.tomp2p.dht.PeerDHT; import net.tomp2p.futures.BaseFuture; import net.tomp2p.futures.FutureDiscover; import net.tomp2p.nat.FutureNAT; import net.tomp2p.nat.PeerBuilderNAT; import net.tomp2p.nat.PeerNAT; import net.tomp2p.p2p.Peer; import net.tomp2p.peers.Number160; import net.tomp2p.peers.PeerAddress; import net.tomp2p.peers.PeerSocketAddress.PeerSocket4Address; import net.tomp2p.storage.Data; //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 TestUPNP 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("upnp", "0"); LocalNATUtils.executeNatSetup("upnp", "1"); } @After public void after() throws IOException, InterruptedException { LocalNATUtils.executeNatSetup("stop", "0"); LocalNATUtils.executeNatSetup("stop", "1"); } @Test public void testUPNP() throws Exception { Peer relayPeer = null; PeerDHT pd = null; RemotePeer unr1 = null; RemotePeer unr2 = null; try { relayPeer = LocalNATUtils.createRealNode(relayPeerId, INF, 5002); pd = new PeerBuilderDHT(relayPeer).start(); final PeerSocket4Address relayAddress = relayPeer.peerAddress().ipv4Socket(); final PeerAddress relay = relayPeer.peerAddress(); System.out.println("relay peer at: "+relay); 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, "peer1"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start(); PeerNAT pn = new PeerBuilderNAT(peer1).start(); FutureNAT fn = pn.portForwarding(fd1).awaitUninterruptibly(); System.err.println("fn: "+fn.failedReason()); Assert.assertTrue(fn.isSuccess()); BaseFuture fb1 = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); System.err.println(fb1.failedReason()); Assert.assertTrue(fb1.isSuccess()); PeerDHT pd = new PeerBuilderDHT(peer1).start(); put("pd", pd); BaseFuture fb2 = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); System.err.println(fb2.failedReason()); Assert.assertTrue(fb2.isSuccess()); Assert.assertEquals(1, peer1.peerBean().peerMap().all().size()); return ""+(peer1.peerBean().peerMap().all().size() == 1); } }, new Command() { @Override public Serializable execute() throws Exception { return "true"; } }, new Command() { @Override public Serializable execute() throws Exception { PeerDHT pd = (PeerDHT) get("pd"); FuturePut fp = pd.put(Number160.ONE).data(new Data("test1")).start().awaitUninterruptibly(); Assert.assertTrue(fp.isSuccess()); return "" + fp.isSuccess(); } }, new Command() { @Override public Serializable execute() throws Exception { //Thread.sleep(2000); PeerDHT pd = (PeerDHT) get("pd"); String retVal = "" + (1 == pd.storageLayer().get().size()); Assert.assertEquals(1, pd.storageLayer().get().size()); System.err.println("shutdown"); LocalNATUtils.shutdown((Peer)get("p1")); return retVal; } }); unr2 = LocalNATUtils.executePeer(1, sync, new Command() { @Override public Serializable execute() throws Exception { return "true"; } }, new Command() { @Override public Serializable execute() throws Exception { Peer peer1 = LocalNATUtils.createNattedPeer("10.0.1.2", 5000, 1, "peer2"); put("p1", peer1); FutureDiscover fd1 = peer1.discover().peerSocketAddress(relayAddress).start(); PeerNAT pn = new PeerBuilderNAT(peer1).start(); FutureNAT fn = pn.portForwarding(fd1).awaitUninterruptibly(); System.err.println("fn: "+fn.failedReason()); Assert.assertTrue(fn.isSuccess()); BaseFuture fb1 = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); System.err.println(fb1.failedReason()); Assert.assertTrue(fb1.isSuccess()); PeerDHT pd = new PeerBuilderDHT(peer1).start(); put("pd", pd); //Thread.sleep(5000); BaseFuture fb2 = peer1.bootstrap().peerAddress(relay).start().awaitUninterruptibly(); System.err.println(fb2.failedReason()); Assert.assertTrue(fb2.isSuccess()); Assert.assertEquals(2, peer1.peerBean().peerMap().all().size()); return "" + (peer1.peerBean().peerMap().all().size() == 2); } }, new Command() { @Override public Serializable execute() throws Exception { return "true"; } }, new Command() { @Override public Serializable execute() throws Exception { PeerDHT pd = (PeerDHT) get("pd"); String retVal = "" + (1 == pd.storageLayer().get().size()); Assert.assertEquals(1, pd.storageLayer().get().size()); System.err.println("shutdown"); LocalNATUtils.shutdown((Peer)get("p1")); return retVal; } }); unr1.waitFor(); unr2.waitFor(); Assert.assertEquals(1, pd.storageLayer().get().size()); for(int i=0;i<unr1.resultSize();i++) { Assert.assertEquals("true", unr1.getResult(i)); } for(int i=0;i<unr2.resultSize();i++) { Assert.assertEquals("true", unr1.getResult(i)); } } finally { System.out.print("LOCAL> shutdown."); LocalNATUtils.shutdown(relayPeer); System.out.print("."); LocalNATUtils.shutdown(unr1); System.out.println("."); } } }