diff --git a/src/main/java/io/bitsquare/gui/components/TxIdTextField.java b/src/main/java/io/bitsquare/gui/components/TxIdTextField.java index eeaa607822..8e553dd01e 100644 --- a/src/main/java/io/bitsquare/gui/components/TxIdTextField.java +++ b/src/main/java/io/bitsquare/gui/components/TxIdTextField.java @@ -89,7 +89,8 @@ public class TxIdTextField extends AnchorPane { textField.setText(txID); textField.setOnMouseClicked(mouseEvent -> { try { - Desktop.getDesktop().browse(URI.create("https://blockchain.info/address/" + txID)); + // TODO get the url form the app preferences + Desktop.getDesktop().browse(URI.create("https://blockchain.info/tx/" + txID)); } catch (IOException e) { log.warn(e.getMessage()); Popups.openWarningPopup("Warning", "Opening blockchain.info failed. Please check your internet " + diff --git a/src/main/java/io/bitsquare/msg/actor/DHTManager.java b/src/main/java/io/bitsquare/msg/actor/DHTManager.java index c5acfb21dc..ad7355677d 100644 --- a/src/main/java/io/bitsquare/msg/actor/DHTManager.java +++ b/src/main/java/io/bitsquare/msg/actor/DHTManager.java @@ -86,9 +86,13 @@ public class DHTManager extends AbstractActor { /* if (ip.getBootstrapPeers() != null && ip.getBootstrapPeers().size() > 0) { peer.bootstrap().bootstrapTo(ip.getBootstrapPeers()).start(); }*/ + + // Needed for DHT support peerDHT = new PeerBuilderDHT(peer).start(); + // Needed for NAT support peerNAT = new PeerBuilderNAT(peer).start(); + new PeerBuilderNAT(peer).start(); peer.peerBean().peerMap().addPeerMapChangeListener(new PeerMapChangeListener() { @Override public void peerInserted(PeerAddress peerAddress, boolean verified) { diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index dcf292b153..cffac7cb40 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -25,14 +25,14 @@ - - + + - + diff --git a/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java b/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java index 30036be4fc..4d39f76fb5 100644 --- a/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java +++ b/src/test/java/io/bitsquare/msg/SeedNodeForTesting.java @@ -19,8 +19,11 @@ package io.bitsquare.msg; import io.bitsquare.network.Node; +import net.tomp2p.connection.Bindings; +import net.tomp2p.connection.ChannelServerConfiguration; +import net.tomp2p.connection.Ports; +import net.tomp2p.connection.StandardProtocolFamily; import net.tomp2p.dht.PeerBuilderDHT; -import net.tomp2p.dht.PeerDHT; import net.tomp2p.nat.PeerBuilderNAT; import net.tomp2p.p2p.Peer; import net.tomp2p.p2p.PeerBuilder; @@ -37,38 +40,41 @@ public class SeedNodeForTesting { private static final Logger log = LoggerFactory.getLogger(SeedNodeForTesting.class); public static void main(String[] args) throws Exception { - // Define your seed node IP and port - // "127.0.0.1" for localhost or SEED_ID_WAN_1 - new SeedNodeForTesting().startSeedNode("localhost", Node.DEFAULT_PORT); - } + Peer peer = null; + try { + ChannelServerConfiguration csc = PeerBuilder.createDefaultChannelServerConfiguration(); + csc.ports(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); + csc.portsForwarding(new Ports(Node.DEFAULT_PORT, Node.DEFAULT_PORT)); + csc.connectionTimeoutTCPMillis(10 * 1000); + csc.idleTCPSeconds(10); + csc.idleUDPSeconds(10); - public Thread startSeedNode(String seedNodeId, int seedNodePort) { - Thread thread = new Thread(() -> { - Peer peer = null; - try { - peer = new PeerBuilder(Number160.createHash(seedNodeId)).ports(seedNodePort).start(); - PeerDHT peerDHT = new PeerBuilderDHT(peer).start(); - peerDHT.peer().objectDataReply((sender, request) -> { - log.trace("received request: ", request.toString()); - return "pong"; - }); + Bindings bindings = new Bindings(); + bindings.addProtocol(StandardProtocolFamily.INET); - new PeerBuilderNAT(peer).start(); + peer = new PeerBuilder(Number160.createHash("localhost")).bindings(bindings) + .channelServerConfiguration(csc).ports(Node.DEFAULT_PORT).start(); - log.debug("SeedNode started."); - for (; ; ) { - for (PeerAddress pa : peer.peerBean().peerMap().all()) { - log.debug("peer online:" + pa); - } - Thread.sleep(2000); + peer.objectDataReply((sender, request) -> { + log.trace("received request: ", request.toString()); + return "pong"; + }); + + // Needed for DHT support + new PeerBuilderDHT(peer).start(); + // Needed for NAT support + new PeerBuilderNAT(peer).start(); + + log.debug("SeedNode started."); + for (; ; ) { + for (PeerAddress pa : peer.peerBean().peerMap().all()) { + log.debug("peer online:" + pa); } - } catch (Exception e) { - if (peer != null) - peer.shutdown().awaitUninterruptibly(); + Thread.sleep(2000); } - }); - thread.start(); - return thread; + } catch (Exception e) { + if (peer != null) + peer.shutdown().awaitUninterruptibly(); + } } - } diff --git a/src/test/java/io/bitsquare/msg/TomP2PTests.java b/src/test/java/io/bitsquare/msg/TomP2PTests.java index afc9bca3cf..205d9e986e 100644 --- a/src/test/java/io/bitsquare/msg/TomP2PTests.java +++ b/src/test/java/io/bitsquare/msg/TomP2PTests.java @@ -20,6 +20,7 @@ package io.bitsquare.msg; import io.bitsquare.network.BootstrapNodes; import io.bitsquare.network.Node; import io.bitsquare.util.Repeat; +import io.bitsquare.util.RepeatRule; import java.io.IOException; @@ -30,7 +31,9 @@ import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import net.tomp2p.connection.Bindings; import net.tomp2p.connection.Ports; +import net.tomp2p.connection.StandardProtocolFamily; import net.tomp2p.dht.FutureGet; import net.tomp2p.dht.FuturePut; import net.tomp2p.dht.FutureRemove; @@ -53,6 +56,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; import org.slf4j.Logger; @@ -78,7 +82,7 @@ public class TomP2PTests { } // If you want to test in one specific connection mode define it directly, otherwise use UNKNOWN - private static final ConnectionType FORCED_CONNECTION_TYPE = ConnectionType.DIRECT; + private static final ConnectionType FORCED_CONNECTION_TYPE = ConnectionType.NAT; // Typically you run the seed node in localhost to test direct connection. // If you have a setup where you are not behind a router you can also use a WAN side seed node. @@ -100,7 +104,8 @@ public class TomP2PTests { // If cache is used tests get faster as it doesn't create and bootstrap a new node at every test. // Need to observe if it can have some side effects. - private static final boolean CACHE_CLIENTS = true; + // In cached mode I observed more failures, need investigation why but might be a test setup problem. + private static final boolean CACHE_CLIENTS = false; // Use to stress tests by repeating them private static final int STRESS_TEST_COUNT = 1; @@ -113,6 +118,7 @@ public class TomP2PTests { private int client1Port; private int client2Port; private ConnectionType resolvedConnectionType; + public @Rule RepeatRule repeatRule = new RepeatRule(); @Before public void setUp() { @@ -175,7 +181,6 @@ public class TomP2PTests { futurePut.awaitUninterruptibly(); assertTrue(futurePut.isSuccess()); - peer2DHT = getDHTPeer("node_2", client2Port); FutureGet futureGet = peer2DHT.get(Number160.createHash("key")).start(); futureGet.awaitUninterruptibly(); @@ -190,21 +195,19 @@ public class TomP2PTests { FuturePut futurePut1 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo1")).start(); futurePut1.awaitUninterruptibly(); assertTrue(futurePut1.isSuccess()); - - FuturePut futurePut2 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo2")).start(); - futurePut2.awaitUninterruptibly(); - assertTrue(futurePut2.isSuccess()); } @Test @Repeat(STRESS_TEST_COUNT) public void testAddGet() throws Exception { peer1DHT = getDHTPeer("node_1", client1Port); - FuturePut futurePut1 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo1")).start(); + FuturePut futurePut1 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo1")) + .start(); futurePut1.awaitUninterruptibly(); assertTrue(futurePut1.isSuccess()); - FuturePut futurePut2 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo2")).start(); + FuturePut futurePut2 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo2")) + .start(); futurePut2.awaitUninterruptibly(); assertTrue(futurePut2.isSuccess()); @@ -223,11 +226,13 @@ public class TomP2PTests { @Repeat(STRESS_TEST_COUNT) public void testAddRemove() throws Exception { peer1DHT = getDHTPeer("node_1", client1Port); - FuturePut futurePut1 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo1")).start(); + FuturePut futurePut1 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo1")) + .start(); futurePut1.awaitUninterruptibly(); assertTrue(futurePut1.isSuccess()); - FuturePut futurePut2 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo2")).start(); + FuturePut futurePut2 = peer1DHT.add(Number160.createHash("locationKey")).data(new Data("hallo2")) + .start(); futurePut2.awaitUninterruptibly(); assertTrue(futurePut2.isSuccess()); @@ -257,7 +262,6 @@ public class TomP2PTests { @Test @Repeat(STRESS_TEST_COUNT) public void testSendDirectBetweenLocalPeers() throws Exception { - // if (FORCED_CONNECTION_TYPE != ConnectionType.NAT && resolvedConnectionType != ConnectionType.NAT) { peer1DHT = getDHTPeer("node_1", client1Port); peer2DHT = getDHTPeer("node_2", client2Port); @@ -283,7 +287,6 @@ public class TomP2PTests { assertTrue(futureDirect.isSuccess()); log.debug(futureDirect.object().toString()); assertEquals("pong", futureDirect.object()); - // } } // That test should always succeed as we use the server seed node as receiver. @@ -292,7 +295,6 @@ public class TomP2PTests { @Repeat(STRESS_TEST_COUNT) public void testSendDirectToSeedNode() throws Exception { peer1DHT = getDHTPeer("node_1", client1Port); - FuturePeerConnection futurePeerConnection = peer1DHT.peer().createPeerConnection(BOOTSTRAP_NODE_ADDRESS, 500); FutureDirect futureDirect = peer1DHT.peer().sendDirect(futurePeerConnection).object("hallo").start(); @@ -301,7 +303,6 @@ public class TomP2PTests { assertEquals("pong", futureDirect.object()); } - private Peer bootstrapDirectConnection(String clientId, int clientPort) { final String id = clientId + clientPort; if (CACHE_CLIENTS && cachedPeers.containsKey(id)) { @@ -309,7 +310,8 @@ public class TomP2PTests { } Peer peer = null; try { - peer = new PeerBuilder(Number160.createHash(clientId)).ports(clientPort).start(); + peer = new PeerBuilder(Number160.createHash(clientId)).bindings(getBindings()) + .ports(clientPort).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); futureDiscover.awaitUninterruptibly(); if (futureDiscover.isSuccess()) { @@ -339,7 +341,9 @@ public class TomP2PTests { } Peer peer = null; try { - peer = new PeerBuilder(Number160.createHash(clientId)).ports(clientPort).behindFirewall().start(); + peer = new PeerBuilder(Number160.createHash(clientId)).bindings(getBindings()).behindFirewall() + .ports(clientPort).start(); + PeerNAT peerNAT = new PeerBuilderNAT(peer).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); FutureNAT futureNAT = peerNAT.startSetupPortforwarding(futureDiscover); @@ -386,7 +390,9 @@ public class TomP2PTests { Peer peer = null; try { - peer = new PeerBuilder(Number160.createHash(clientId)).ports(clientPort).behindFirewall().start(); + peer = new PeerBuilder(Number160.createHash(clientId)).bindings(getBindings()).behindFirewall() + .ports(clientPort).start(); + PeerNAT peerNAT = new PeerBuilderNAT(peer).start(); FutureDiscover futureDiscover = peer.discover().peerAddress(BOOTSTRAP_NODE_ADDRESS).start(); FutureNAT futureNAT = peerNAT.startSetupPortforwarding(futureDiscover); @@ -468,4 +474,10 @@ public class TomP2PTests { return newPort; } + + private Bindings getBindings() { + Bindings bindings = new Bindings(); + bindings.addProtocol(StandardProtocolFamily.INET); + return bindings; + } }