blob: 78b9a6f56aba1d85c94382f0ae440f3dc019901a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cassandra.locator;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class InetAddressAndPortTest
{
private static interface ThrowingRunnable
{
public void run() throws Throwable;
}
@Test
public void getByNameIPv4Test() throws Exception
{
//Negative port
shouldThrow(() -> InetAddressAndPort.getByName("127.0.0.1:-1"), IllegalArgumentException.class);
//Too large port
shouldThrow(() -> InetAddressAndPort.getByName("127.0.0.1:65536"), IllegalArgumentException.class);
//bad address, caught by InetAddress
shouldThrow(() -> InetAddressAndPort.getByName("127.0.0.1.0"), UnknownHostException.class);
//Test default port
InetAddressAndPort address = InetAddressAndPort.getByName("127.0.0.1");
assertEquals(InetAddress.getByName("127.0.0.1"), address.address);
assertEquals(InetAddressAndPort.defaultPort, address.port);
//Test overriding default port
address = InetAddressAndPort.getByName("127.0.0.1:42");
assertEquals(InetAddress.getByName("127.0.0.1"), address.address);
assertEquals(42, address.port);
}
@Test
public void getByNameIPv6Test() throws Exception
{
//Negative port
shouldThrow(() -> InetAddressAndPort.getByName("[2001:0db8:0000:0000:0000:ff00:0042:8329]:-1"), IllegalArgumentException.class);
//Too large port
shouldThrow(() -> InetAddressAndPort.getByName("[2001:0db8:0000:0000:0000:ff00:0042:8329]:65536"), IllegalArgumentException.class);
//bad address, caught by InetAddress
shouldThrow(() -> InetAddressAndPort.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329:8329"), UnknownHostException.class);
//Test default port
InetAddressAndPort address = InetAddressAndPort.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329");
assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.address);
assertEquals(InetAddressAndPort.defaultPort, address.port);
//Test overriding default port
address = InetAddressAndPort.getByName("[2001:0db8:0000:0000:0000:ff00:0042:8329]:42");
assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.address);
assertEquals(42, address.port);
}
@Test
public void compareAndEqualsAndHashCodeTest() throws Exception
{
InetAddressAndPort address1 = InetAddressAndPort.getByName("127.0.0.1:42");
InetAddressAndPort address4 = InetAddressAndPort.getByName("127.0.0.1:43");
InetAddressAndPort address5 = InetAddressAndPort.getByName("127.0.0.1:41");
InetAddressAndPort address6 = InetAddressAndPort.getByName("127.0.0.2:42");
InetAddressAndPort address7 = InetAddressAndPort.getByName("127.0.0.0:42");
assertEquals(0, address1.compareTo(address1));
assertEquals(-1, address1.compareTo(address4));
assertEquals(1, address1.compareTo(address5));
assertEquals(-1, address1.compareTo(address6));
assertEquals(1, address1.compareTo(address7));
assertEquals(address1, address1);
assertEquals(address1.hashCode(), address1.hashCode());
assertEquals(address1, InetAddressAndPort.getByName("127.0.0.1:42"));
assertEquals(address1.hashCode(), InetAddressAndPort.getByName("127.0.0.1:42").hashCode());
assertEquals(address1, InetAddressAndPort.getByNameOverrideDefaults("127.0.0.1", 42));
assertEquals(address1.hashCode(), InetAddressAndPort.getByNameOverrideDefaults("127.0.0.1", 42).hashCode());
int originalPort = InetAddressAndPort.defaultPort;
InetAddressAndPort.initializeDefaultPort(42);
try
{
assertEquals(address1, InetAddressAndPort.getByName("127.0.0.1"));
assertEquals(address1.hashCode(), InetAddressAndPort.getByName("127.0.0.1").hashCode());
}
finally
{
InetAddressAndPort.initializeDefaultPort(originalPort);
}
assertTrue(!address1.equals(address4));
assertTrue(!address1.equals(address5));
assertTrue(!address1.equals(address6));
assertTrue(!address1.equals(address7));
}
@Test
public void toStringTest() throws Exception
{
InetAddress resolvedIPv4 = InetAddress.getByAddress("resolved4", new byte[] { 127, 0, 0, 1});
assertEquals("resolved4", resolvedIPv4.getHostName());
assertEquals("resolved4/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(resolvedIPv4, 42).toString());
InetAddress strangeIPv4 = InetAddress.getByAddress("strange/host/name4", new byte[] { 127, 0, 0, 1});
assertEquals("strange/host/name4", strangeIPv4.getHostName());
assertEquals("strange/host/name4/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(strangeIPv4, 42).toString());
InetAddress unresolvedIPv4 = InetAddress.getByAddress(null, new byte[] { 127, 0, 0, 1}); // don't call getHostName and resolve
assertEquals("/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(unresolvedIPv4, 42).toString());
InetAddress resolvedIPv6 = InetAddress.getByAddress("resolved6", new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29});
assertEquals("resolved6", resolvedIPv6.getHostName());
assertEquals("resolved6/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(resolvedIPv6, 42).toString());
InetAddress strangeIPv6 = InetAddress.getByAddress("strange/host/name6", new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29});
assertEquals("strange/host/name6", strangeIPv6.getHostName());
assertEquals("strange/host/name6/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(strangeIPv6, 42).toString());
InetAddress unresolvedIPv6 = InetAddress.getByAddress(null, new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29});
assertEquals("/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(unresolvedIPv6, 42).toString());
}
@Test
public void getHostAddressAndPortTest() throws Exception
{
String ipv4withoutPort = "127.0.0.1";
String ipv6withoutPort = "2001:db8:0:0:0:ff00:42:8329";
String ipv4 = ipv4withoutPort + ":42";
String ipv6 = "[" + ipv6withoutPort + "]:42";
String ipv4forJMX = ipv4.replace("[", "_").replace("]", "_").replace(":","_");
String ipv6forJMX = ipv6.replace("[", "_").replace("]", "_").replace(":","_");
assertEquals(ipv4, InetAddressAndPort.getByName(ipv4).getHostAddressAndPort());
assertEquals(ipv6, InetAddressAndPort.getByName(ipv6).getHostAddressAndPort());
assertEquals(ipv4, InetAddressAndPort.getByName(ipv4).getHostAddress(true));
assertEquals(ipv6, InetAddressAndPort.getByName(ipv6).getHostAddress(true));
assertEquals(ipv4withoutPort, InetAddressAndPort.getByName(ipv4).getHostAddress(false));
assertEquals(ipv6withoutPort, InetAddressAndPort.getByName(ipv6).getHostAddress(false));
assertEquals(ipv4forJMX, InetAddressAndPort.getByName(ipv4).getHostAddressAndPortForJMX());
assertEquals(ipv6forJMX, InetAddressAndPort.getByName(ipv6).getHostAddressAndPortForJMX());
}
private void shouldThrow(ThrowingRunnable t, Class expectedClass)
{
try
{
t.run();
}
catch (Throwable thrown)
{
assertEquals(thrown.getClass(), expectedClass);
return;
}
fail("Runnable didn't throw");
}
}