package net.jxta.impl.endpoint.netty; import static org.junit.Assert.*; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import net.jxta.endpoint.EndpointAddress; import org.junit.Before; import org.junit.Test; public class InetSocketAddressTranslatorTest { public static final String TEST_PROTO_NAME = "test"; private static final byte[] TEST_IPv6_ADDR_BYTES = new byte[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; private static final byte[] TEST_IPV4_ADDR_BYTES = new byte[] { 1, 1, 1, 1}; public static final Inet6Address TEST_INET6_ADDR = createAddress(TEST_IPv6_ADDR_BYTES, Inet6Address.class); public static final Inet4Address TEST_INET4_ADDR = createAddress(TEST_IPV4_ADDR_BYTES, Inet4Address.class); private static <T extends InetAddress> T createAddress(byte[] addrBytes, Class<T> type) { InetAddress addr; try { addr = InetAddress.getByAddress(addrBytes); if(type.equals(addr.getClass())) { return type.cast(addr); } throw new Error("address was not of the expected type"); } catch(UnknownHostException e) { throw new Error("host resolution failed"); } } private InetSocketAddressTranslator translator; @Before public void setUp() throws Exception { translator = new InetSocketAddressTranslator(TEST_PROTO_NAME); } @Test public void testToEndpointAddress_withIPv6Address() { InetSocketAddress socketAddr = new InetSocketAddress(TEST_INET6_ADDR, 1234); EndpointAddress translated = translator.toEndpointAddress(socketAddr); assertEquals("[101:101:101:101:101:101:101:101]:1234", translated.getProtocolAddress()); } @Test public void testToEndpointAddress_withIPv4Address() { InetSocketAddress socketAddr = new InetSocketAddress(TEST_INET4_ADDR, 12345); EndpointAddress translated = translator.toEndpointAddress(socketAddr); assertEquals("1.1.1.1:12345", translated.getProtocolAddress()); } @Test public void testToEndpointAddress_withUnresolvedHostName() { InetSocketAddress socketAddr = new InetSocketAddress(TEST_INET4_ADDR, 12345); EndpointAddress translated = translator.toEndpointAddress(socketAddr); assertEquals(TEST_PROTO_NAME, translated.getProtocolName()); assertEquals("1.1.1.1:12345", translated.getProtocolAddress()); assertNull(translated.getServiceName()); assertNull(translated.getServiceParameter()); } @Test public void testToSocketAddress() { EndpointAddress addr = new EndpointAddress(TEST_PROTO_NAME, "1.1.1.1:12345", null, null); SocketAddress translated = translator.toSocketAddress(addr); assertTrue(translated instanceof InetSocketAddress); InetSocketAddress socketAddr = (InetSocketAddress)translated; assertEquals(TEST_INET4_ADDR, socketAddr.getAddress()); assertEquals(12345, socketAddr.getPort()); } @Test public void testToSocketAddress_withIPv6Address() { EndpointAddress addr = new EndpointAddress(TEST_PROTO_NAME, "[101:101:101:101:101:101:101:101]:50000", null, null); SocketAddress translated = translator.toSocketAddress(addr); assertTrue(translated instanceof InetSocketAddress); InetSocketAddress socketAddr = (InetSocketAddress)translated; assertEquals(TEST_INET6_ADDR, socketAddr.getAddress()); assertEquals(50000, socketAddr.getPort()); } @Test public void testToSocketAddress_withNoPortSpecified() { checkParseThrowsIllegalArgumentException("1.1.1.1", "No port specified in address <1.1.1.1>"); } @Test public void testToSocketAddress_withNoPortSpecifiedAfterColon() { checkParseThrowsIllegalArgumentException("1.1.1.1:", "No port specified in address <1.1.1.1:>"); } @Test public void testToSocketAddress_withIllegalPortSpecified() { checkParseThrowsIllegalArgumentException("1.1.1.1:70000", "Port specified is not in the legal range <1.1.1.1:70000>"); } @Test public void testToSocketAddress_withNegativePortSpecified() { checkParseThrowsIllegalArgumentException("1.1.1.1:-5", "Port specified is not in the legal range <1.1.1.1:-5>"); } @Test public void testToSocketAddress_withNonNumericPortSpecified() { checkParseThrowsIllegalArgumentException("1.1.1.1:http", "Port specified is not a valid number <1.1.1.1:http>"); } @Test public void testToSocketAddress_withNoHostSpecified() { checkParseThrowsIllegalArgumentException(":5000", "No host specified in address <:5000>"); } @Test public void testToSocketAddress_withNoPortSpecified_IPv6() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101]", "No port specified in IPv6 address <[101:101:101:101:101:101:101:101]>"); } @Test public void testToSocketAddress_withNoPortSpecifiedAfterColon_IPv6() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101]:", "No port specified in IPv6 address <[101:101:101:101:101:101:101:101]:>"); } @Test public void testToSocketAddress_withIllegalPortSpecified_IPv6() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101]:70000", "Port specified is not in the legal range <[101:101:101:101:101:101:101:101]:70000>"); } @Test public void testToSocketAddress_withNegativePortSpecified_IPv6() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101]:-5", "Port specified is not in the legal range <[101:101:101:101:101:101:101:101]:-5>"); } @Test public void testToSocketAddress_withNonNumericPortSpecified_IPv6() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101]:http", "Port specified is not a valid number <[101:101:101:101:101:101:101:101]:http>"); } @Test public void testToSocketAddress_withIncorrectlyEscapedIPv6Address_missingCloseBracket() { checkParseThrowsIllegalArgumentException("[101:101:101:101:101:101:101:101:12345", "Address is not a valid IPv6 address <[101:101:101:101:101:101:101:101:12345>"); } @Test public void testToSocketAddress_withIncorrectlyEscapedIPv6Address_missingOpenBracket() { checkParseThrowsIllegalArgumentException("101:101:101:101:101:101:101:101]:12345", "Address is not a valid IPv6 address <101:101:101:101:101:101:101:101]:12345>"); } private void checkParseThrowsIllegalArgumentException(String addrStr, String exceptionMessage) { EndpointAddress addr = new EndpointAddress(TEST_PROTO_NAME, addrStr, null, null); try { translator.toSocketAddress(addr); fail("Expected IllegalArgumentException"); } catch(IllegalArgumentException e) { assertEquals(exceptionMessage, e.getMessage()); } } }