diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index a846b72705c40e33beaf6f3da1c7e3a0e67c6585..7dc9a63592ebc34472be36f23975219beeacc490 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -40,7 +40,7 @@ import net.i2p.data.DataHelper; * @author zzz */ public abstract class Addresses { - + private static final File IF_INET6_FILE = new File("/proc/net/if_inet6"); private static final long INET6_CACHE_EXPIRE = 10*60*1000; private static final boolean INET6_CACHE_ENABLED = !SystemVersion.isMac() && !SystemVersion.isWindows() && @@ -122,10 +122,9 @@ public abstract class Addresses { * * Warning, very slow on Windows, appx. 200ms + 50ms/interface * - * @return a sorted set of all addresses including wildcard * @param includeLocal whether to include local * @param includeIPv6 whether to include IPV6 - * @return a Set of all addresses + * @return a sorted set of all addresses including wildcard * @since 0.8.3 */ public static SortedSet<String> getAddresses(boolean includeLocal, boolean includeIPv6) { @@ -141,11 +140,10 @@ public abstract class Addresses { * * Warning, very slow on Windows, appx. 200ms + 50ms/interface * - * @return a sorted set of all addresses * @param includeSiteLocal whether to include private like 192.168.x.x * @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0 * @param includeIPv6 whether to include IPV6 - * @return a Set of all addresses + * @return a sorted set of all addresses * @since 0.9.4 */ public static SortedSet<String> getAddresses(boolean includeSiteLocal, @@ -163,12 +161,11 @@ public abstract class Addresses { * * Warning, very slow on Windows, appx. 200ms + 50ms/interface * - * @return a sorted set of all addresses * @param includeSiteLocal whether to include private like 192.168.x.x * @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0 * @param includeIPv6 whether to include IPV6 * @param includeIPv6Temporary whether to include IPV6 temporary addresses - * @return a Set of all addresses + * @return a sorted set of all addresses * @since 0.9.46 */ public static SortedSet<String> getAddresses(boolean includeSiteLocal, @@ -343,7 +340,7 @@ public abstract class Addresses { return "(bad IP length " + addr.length + "):" + port; } } - + /** * Convenience method to convert and validate a port String * without throwing an exception. @@ -402,7 +399,7 @@ public abstract class Addresses { * @since 0.9.3 */ public static byte[] getIP(String host) { - if (host == null) + if (host == null || host.isEmpty()) return null; byte[] rv; synchronized (_IPAddress) { diff --git a/core/java/test/junit/net/i2p/util/AddressesTest.java b/core/java/test/junit/net/i2p/util/AddressesTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1b4abd7c34c4f23dcdebcc1c4fc1f8b810072b19 --- /dev/null +++ b/core/java/test/junit/net/i2p/util/AddressesTest.java @@ -0,0 +1,145 @@ +package net.i2p.util; + +import org.junit.Test; + +import java.net.Inet6Address; +import java.net.UnknownHostException; + +import static org.junit.Assert.*; + +/** + * @since 0.9.49 + */ +public class AddressesTest { + + @Test + public void getIPNull() { + assertNull(Addresses.getIP(null)); + } + + @Test + public void getIPEmptyString() { + assertNull(Addresses.getIP("")); + } + + @Test + public void getIPWithIPString() { + byte[] address = { + 1, 2, 3, 4 + }; + assertArrayEquals(address, Addresses.getIP("1.2.3.4")); + } + + @Test + public void getPort() { + assertEquals(80, Addresses.getPort("80")); + } + + @Test + public void getPort__invalidPort() { + String[] strings = { + "", + " 80", + "-100", + "a", + "99999", + null + }; + for (String string : strings) { + assertEquals(0, Addresses.getPort(string)); + } + } + + @Test + public void isIPAddress() { + assertTrue(Addresses.isIPAddress("127.0.0.1")); + assertTrue(Addresses.isIPAddress("::1")); + } + + @Test + public void isIPv6Address() { + assertTrue(Addresses.isIPv6Address("::1")); + assertFalse(Addresses.isIPv6Address("")); + } + + @Test + public void isIPv4Address() { + assertTrue(Addresses.isIPv4Address("127.0.0.1")); + assertFalse(Addresses.isIPv4Address("")); + } + + /** + * Should always return false when the address isn't in the cache + */ + @Test + public void isDynamic() throws UnknownHostException { + String host = "localhost"; + byte[] address = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; + assertFalse(Addresses.isDynamic((Inet6Address) Inet6Address.getByAddress(host, address))); + } + + /** + * Should always return false when the address isn't in the cache + */ + @Test + public void isDeprecated() throws UnknownHostException { + String host = "localhost"; + byte[] address = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; + assertFalse(Addresses.isDeprecated((Inet6Address) Inet6Address.getByAddress(host, address))); + } + + @Test + public void testToString() { + byte[] address = {127, 0, 0, 1}; + assertEquals("127.0.0.1", Addresses.toString(address)); + } + + @Test + public void testToString__ipv4withPort() { + byte[] address = {127, 0, 0, 1}; + assertEquals("127.0.0.1:80", Addresses.toString(address, 80)); + } + + @Test + public void testToString__ipv6withPort() { + byte[] address = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + }; + assertEquals("[0:0:0:0:0:0:0:1]:80", Addresses.toString(address, 80)); + } + + @Test + public void testToString__null() { + assertEquals("null", Addresses.toString(null)); + } + + @Test + public void testToString__nullWithPort() { + assertEquals("null:80", Addresses.toString(null, 80)); + } + + @Test + public void testToString__badLength() { + byte[] address = {1}; + assertTrue(Addresses.toString(address).startsWith("bad IP length")); + } + + @Test + public void testToString__badLengthWithPort() { + byte[] address = {1}; + String string = Addresses.toString(address, 80); + String expectedStartString = "(bad IP length"; + assertTrue( + String.format("%s doesn't start with: %s", string, expectedStartString), + string.startsWith(expectedStartString) + ); + String expectedEndString = "80"; + assertTrue( + String.format("%s doesn't end with: %s", string, expectedEndString), + string.endsWith(expectedEndString) + ); + } +}