diff --git a/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java b/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java index cf8b06de..549b8517 100644 --- a/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java +++ b/core/src/test/java/org/bitcoinj/core/PeerAddressTest.java @@ -17,14 +17,15 @@ package org.bitcoinj.core; -import org.bitcoinj.params.MainNetParams; -import org.junit.Test; +import static org.bitcoinj.core.Utils.HEX; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.math.BigInteger; import java.net.InetAddress; -import static org.bitcoinj.core.Utils.HEX; -import static org.junit.Assert.assertEquals; +import org.bitcoinj.params.MainNetParams; +import org.junit.Test; public class PeerAddressTest { private static final NetworkParameters MAINNET = MainNetParams.get(); @@ -33,16 +34,65 @@ public class PeerAddressTest { public void testPeerAddressRoundtrip() throws Exception { // copied verbatim from https://en.bitcoin.it/wiki/Protocol_specification#Network_address String fromSpec = "010000000000000000000000000000000000ffff0a000001208d"; - PeerAddress pa = new PeerAddress(MAINNET, - HEX.decode(fromSpec), 0, 0); + PeerAddress pa = new PeerAddress(MAINNET, HEX.decode(fromSpec), 0, 0); String reserialized = Utils.HEX.encode(pa.unsafeBitcoinSerialize()); - assertEquals(reserialized,fromSpec ); + assertEquals(reserialized, fromSpec); + } + + @Test + public void roundtrip_ipv4_currentProtocolVersion() throws Exception { + long time = Utils.currentTimeSeconds(); + PeerAddress pa = new PeerAddress(MAINNET, InetAddress.getByName("1.2.3.4"), 1234, + NetworkParameters.ProtocolVersion.CURRENT.getBitcoinProtocolVersion(), BigInteger.ZERO); + byte[] serialized = pa.bitcoinSerialize(); + PeerAddress pa2 = new PeerAddress(MAINNET, serialized, 0, + NetworkParameters.ProtocolVersion.CURRENT.getBitcoinProtocolVersion()); + assertEquals("1.2.3.4", pa2.getAddr().getHostAddress()); + assertEquals(1234, pa2.getPort()); + assertEquals(BigInteger.ZERO, pa2.getServices()); + assertTrue(pa2.getTime() >= time && pa2.getTime() < time + 5); // potentially racy + } + + @Test + public void roundtrip_ipv4_ancientProtocolVersion() throws Exception { + PeerAddress pa = new PeerAddress(MAINNET, InetAddress.getByName("1.2.3.4"), 1234, 0, BigInteger.ZERO); + byte[] serialized = pa.bitcoinSerialize(); + PeerAddress pa2 = new PeerAddress(MAINNET, serialized, 0, 0); + assertEquals("1.2.3.4", pa2.getAddr().getHostAddress()); + assertEquals(1234, pa2.getPort()); + assertEquals(BigInteger.ZERO, pa2.getServices()); + assertEquals(-1, pa2.getTime()); + } + + @Test + public void roundtrip_ipv6_currentProtocolVersion() throws Exception { + long time = Utils.currentTimeSeconds(); + PeerAddress pa = new PeerAddress(MAINNET, InetAddress.getByName("2001:db8:85a3:0:0:8a2e:370:7334"), 1234, + NetworkParameters.ProtocolVersion.CURRENT.getBitcoinProtocolVersion(), BigInteger.ZERO); + byte[] serialized = pa.bitcoinSerialize(); + PeerAddress pa2 = new PeerAddress(MAINNET, serialized, 0, + NetworkParameters.ProtocolVersion.CURRENT.getBitcoinProtocolVersion()); + assertEquals("2001:db8:85a3:0:0:8a2e:370:7334", pa2.getAddr().getHostAddress()); + assertEquals(1234, pa2.getPort()); + assertEquals(BigInteger.ZERO, pa2.getServices()); + assertTrue(pa2.getTime() >= time && pa2.getTime() < time + 5); // potentially racy + } + + @Test + public void roundtrip_ipv6_ancientProtocolVersion() throws Exception { + PeerAddress pa = new PeerAddress(MAINNET, InetAddress.getByName("2001:db8:85a3:0:0:8a2e:370:7334"), 1234, 0, + BigInteger.ZERO); + byte[] serialized = pa.bitcoinSerialize(); + PeerAddress pa2 = new PeerAddress(MAINNET, serialized, 0, 0); + assertEquals("2001:db8:85a3:0:0:8a2e:370:7334", pa2.getAddr().getHostAddress()); + assertEquals(1234, pa2.getPort()); + assertEquals(BigInteger.ZERO, pa2.getServices()); + assertEquals(-1, pa2.getTime()); } @Test public void testBitcoinSerialize() throws Exception { PeerAddress pa = new PeerAddress(MAINNET, InetAddress.getByName(null), 8333, 0, BigInteger.ZERO); - assertEquals("000000000000000000000000000000000000ffff7f000001208d", - Utils.HEX.encode(pa.bitcoinSerialize())); + assertEquals("000000000000000000000000000000000000ffff7f000001208d", Utils.HEX.encode(pa.bitcoinSerialize())); } }