diff --git a/CHANGELOG.md b/CHANGELOG.md index 90f55d48..b5469b64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Better troubleshooting for connection problems. + [#127](https://github.com/scionproto-contrib/jpan/pull/127) +- Auto-add port to discovery server setting + better error message. [#128](https://github.com/scionproto-contrib/jpan/pull/128) ### Fixed diff --git a/README.md b/README.md index 01b23fb5..fe62749d 100644 --- a/README.md +++ b/README.md @@ -415,13 +415,9 @@ If you have a topology file, you can specify it via environment variable `SCION_ or via Java property `org.scion.bootstrap.topoFile`: ```java -System.setProperty(Constants.PROPERTY_BOOTSTRAP_HOST, "youtTopoFile.json"); +System.setProperty(Constants.PROPERTY_BOOTSTRAP_HOST, "yourTopoFile.json"); ``` - - - - ### Local testbed (scionproto) does not contain any path A common problem is that the certificates of the testbed have expired (default validity: 3 days). diff --git a/src/main/java/org/scion/jpan/internal/ScionBootstrapper.java b/src/main/java/org/scion/jpan/internal/ScionBootstrapper.java index 6e8448e2..b31002b4 100644 --- a/src/main/java/org/scion/jpan/internal/ScionBootstrapper.java +++ b/src/main/java/org/scion/jpan/internal/ScionBootstrapper.java @@ -44,7 +44,7 @@ public class ScionBootstrapper { private final GlobalTopology world; protected ScionBootstrapper(String topologyServiceAddress) { - this.topologyResource = topologyServiceAddress; + this.topologyResource = IPHelper.ensurePortOrDefault(topologyServiceAddress, 8041); this.localAS = initLocal(); this.world = initGlobal(); } @@ -142,7 +142,7 @@ public String fetchFile(String resource) { return fetchFile(url); } catch (IOException e) { throw new ScionRuntimeException( - "While fetching resource '" + resource + "' from " + topologyResource); + "While fetching resource '" + resource + "' from " + topologyResource, e); } } diff --git a/src/test/java/org/scion/jpan/api/ScionTest.java b/src/test/java/org/scion/jpan/api/ScionTest.java index df7f7e7e..cf4287c5 100644 --- a/src/test/java/org/scion/jpan/api/ScionTest.java +++ b/src/test/java/org/scion/jpan/api/ScionTest.java @@ -145,14 +145,9 @@ void defaultService_bootstrapAddress() { MockNetwork.startTiny(MockNetwork.Mode.BOOTSTRAP); try { - String host; - MockBootstrapServer mts = MockNetwork.getTopoServer(); - if (mts.getAddress().getAddress() instanceof Inet6Address) { - host = "[" + mts.getAddress().getAddress().getHostAddress() + "]"; - } else { - host = mts.getAddress().getHostString(); - } - host += ":" + mts.getAddress().getPort(); + InetSocketAddress discoveryAddress = MockNetwork.getTopoServer().getAddress(); + String host = ToStringUtil.toString(discoveryAddress.getAddress()); + host += ":" + discoveryAddress.getPort(); System.setProperty(Constants.PROPERTY_BOOTSTRAP_HOST, host); ScionService service = Scion.defaultService(); @@ -164,6 +159,23 @@ void defaultService_bootstrapAddress() { } } + @Test + void defaultService_bootstrapAddress_defaultPort() { + MockNetwork.startTiny(MockNetwork.Mode.BOOTSTRAP); + try { + InetSocketAddress discoveryAddress = MockNetwork.getTopoServer().getAddress(); + String host = ToStringUtil.toString(discoveryAddress.getAddress()); + // We do _not_ add a port here. + + System.setProperty(Constants.PROPERTY_BOOTSTRAP_HOST, host); + Throwable t = assertThrows(ScionRuntimeException.class, Scion::defaultService); + // Check that the default port 8041 was added + assertTrue(t.getMessage().contains(host + ":8041")); + } finally { + MockNetwork.stopTiny(); + } + } + @Test void defaultService_bootstrapNaptrRecord() { long dstIA = ScionUtil.parseIA("1-ff00:0:112"); diff --git a/src/test/java/org/scion/jpan/demo/util/ToStringUtil.java b/src/test/java/org/scion/jpan/demo/util/ToStringUtil.java index 2ca4e777..c9a54e60 100644 --- a/src/test/java/org/scion/jpan/demo/util/ToStringUtil.java +++ b/src/test/java/org/scion/jpan/demo/util/ToStringUtil.java @@ -125,4 +125,14 @@ public static String pathLong(byte[] raw) { ph.read(ByteBuffer.wrap(raw)); return ph.toString(); } + + public static String toString(InetAddress address) { + String host; + if (address instanceof Inet6Address) { + host = "[" + address.getHostAddress() + "]"; + } else { + host = address.toString().substring(1); + } + return host; + } }