/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.coordinator.client.service;
import java.net.UnknownHostException;
import org.junit.Test;
import org.junit.Assert;
import org.junit.Ignore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.coordinator.client.service.impl.DualInetAddress;
public class DualInetAddressTest {
private static final Logger log = LoggerFactory.getLogger(DualInetAddressTest.class);
private static String[] normalizedInet4Addresses = { "10.10.191.52", "10.10.191.0", "255.255.255.255",
"255.255.255.0", "0.0.0.0", };
private static String[] invalidInet4Addresses = { null, "10.10.10.10.10", "f0.f0.f0.f0", "999.9.9.9",
"abc", "vipr", "1000", "bourne-23.lss.emc.com", "google.com" };
private static String[] normalizedInet6Addresses = { "fff:fadd::f000:1", "2000::", "::2000", "2002:c0a8:101::42",
"2003:dead:beef:4dad:23:46:bb:101", "ABCD:EF01:2345:6789:ABCD:EF01:2345:6789",
"2001:DB8::8:800:200C:0:417A", "FF01::101", "::1", };
private static String[] invalidInet6Addresses = { null, "fffff:1:1:1:0:0:0:0", "ffff:fffff:1:1:0:0:0:0", "ffff:ffff:1:1:0:0:0:f0000",
"fffff:ffff:1:1::0", "ffff:fffff:1:1::0", "ffff:ffff:1:1::f0000", "1:2:3:4:5:6:7:8:9",
"1:2:3:4:5:6:7:1.2.3.4", "f", "vipr", "abc", "bourne-23.lss.emc.com", "google.com" };
private static String[] invalidFrom4Addresses = { null, "10.10.10.10.10", "f0.f0.f0.f0", "999.9.9.9",
"abc", "vipr", "1000", "f", "vipr", "abc" };
private static String[] invalidFrom6Addresses = { null, "fffff:1:1:1:0:0:0:0", "ffff:fffff:1:1:0:0:0:0", "ffff:ffff:1:1:0:0:0:f0000",
"fffff:ffff:1:1::0", "ffff:fffff:1:1::0", "ffff:ffff:1:1::f0000", "1:2:3:4:5:6:7:8:9",
"1:2:3:4:5:6:7:1.2.3.4", "1000", "f", "vipr", "abc", };
private static String c_ip4 = "10.10.191.52";
private static String c_ip6 = "2620:0:170:2842::1234";
private static String s_ip4 = "10.247.97.152";
private static String s_ip6 = "2620:0:170:2842::7152";
private static String s_host = "lglw7152.lss.emc.com";
@Test
public void testNormalization() {
System.out.println("*** testNormalization: Start");
// Check for blank strings ("")
Assert.assertTrue(DualInetAddress.normalizeInet4Address("") == null);
Assert.assertTrue(DualInetAddress.normalizeInet6Address("") == null);
for (String addr : normalizedInet4Addresses) {
Assert.assertTrue(addr.equals(DualInetAddress.normalizeInet4Address(addr)));
}
for (String addr : invalidInet4Addresses) {
Assert.assertTrue(DualInetAddress.normalizeInet4Address(addr) == null);
}
Assert.assertTrue(DualInetAddress.normalizeInet4Address("10.20.191").equals("10.20.191.0"));
Assert.assertTrue(DualInetAddress.normalizeInet4Address("10.20").equals("10.20.0.0"));
Assert.assertTrue(DualInetAddress.normalizeInet4Address("10").equals("10.0.0.0"));
Assert.assertTrue(DualInetAddress.normalizeInet4Address("0.0.0").equals("0.0.0.0"));
for (String addr : normalizedInet6Addresses) {
// System.out.println(addr + " : " + DualInetAddress.normalizeInet6Address(addr));
Assert.assertTrue(addr.toLowerCase().equals(DualInetAddress.normalizeInet6Address(addr)));
}
for (String addr : invalidInet4Addresses) {
// System.out.println(addr + " : " + DualInetAddress.normalizeInet6Address(addr));
Assert.assertTrue(DualInetAddress.normalizeInet6Address(addr) == null);
}
// System.out.println(DualInetAddress.normalizeInet6Address("0fff:0:0:0:0:0:0:0111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:0:0:0:0:0111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:0:0:0::0111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0::0111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff::0111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:0::0:111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("fff:0:0:0::0111").equals("fff::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:d:0:0:0:0111").equals("fff:0:0:d::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0::d:0:0:0:0111").equals("fff:0:0:d::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff::d:0:0:0:0111").equals("fff:0:0:d::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:00d:0:0:0:0111").equals("fff:0:0:d::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0fff:0:0:000d:0::0111").equals("fff:0:0:d::111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d:0:0:0111").equals("::d:0:0:111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d:0:0:111").equals("::d:0:0:111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d::0111").equals("::d:0:0:111"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d:0:0:0111").equals("::d:0:0:111"));
// System.out.println(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d:0:1.2.3.4"));
Assert.assertTrue(DualInetAddress.normalizeInet6Address("0:0000:0:0:000d:0:1.2.3.4").equals("::d:0:102:304"));
System.out.println("*** testNormalization: End");
}
@Test
public void testFromAddress() {
System.out.println("*** testFromAddress: Start");
for (String addr : normalizedInet4Addresses) {
try {
DualInetAddress d = DualInetAddress.fromAddress(addr);
Assert.assertTrue(addr.equals("0.0.0.0") && !d.hasInet4() || d.hasInet4());
Assert.assertTrue(!d.hasInet6());
Assert.assertTrue(addr.equals("0.0.0.0") && d.getInet4() == null || d.getInet4().equals(addr.toLowerCase()));
Assert.assertTrue(d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
}
for (String addr : invalidInet4Addresses) {
try {
DualInetAddress d = DualInetAddress.fromAddress(addr);
Assert.assertTrue(addr == null && !d.hasInet4() && !d.hasInet6() && d.getInet4() == null && d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(addr != null);
}
}
for (String addr : normalizedInet6Addresses) {
try {
DualInetAddress d = DualInetAddress.fromAddress(addr);
Assert.assertTrue(addr.equals("::0") && !d.hasInet6() || d.hasInet6());
Assert.assertTrue(!d.hasInet4());
Assert.assertTrue(addr.equals("::0") && d.getInet6() == null || d.getInet6().equals(addr.toLowerCase()));
Assert.assertTrue(d.getInet4() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
}
for (String addr : invalidInet6Addresses) {
try {
DualInetAddress d = DualInetAddress.fromAddress(addr);
// System.out.println(addr + " : " + d);
Assert.assertTrue(addr == null && !d.hasInet4() && !d.hasInet6() && d.getInet4() == null && d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(addr != null);
}
}
for (int i = 0; i < 3; i++) {
String ip4 = normalizedInet4Addresses[i];
String ip6 = normalizedInet6Addresses[i];
try {
DualInetAddress d1 = DualInetAddress.fromAddresses(ip4, null);
DualInetAddress d2 = DualInetAddress.fromAddresses(null, ip6);
DualInetAddress d3 = DualInetAddress.fromAddresses(ip4, ip6);
Assert.assertTrue(ip4.equals("0.0.0.0") && !d1.hasInet4() || d1.hasInet4());
Assert.assertTrue(!d1.hasInet6());
Assert.assertTrue(ip4.equals("0.0.0.0") && d1.getInet4() == null || d1.getInet4().equals(ip4.toLowerCase()));
Assert.assertTrue(d1.getInet6() == null);
Assert.assertTrue(ip6.equals("::0") && !d2.hasInet6() || d2.hasInet6());
Assert.assertTrue(!d2.hasInet4());
Assert.assertTrue(ip6.equals("::0") && d2.getInet6() == null || d2.getInet6().equals(ip6.toLowerCase()));
Assert.assertTrue(d2.getInet4() == null);
Assert.assertTrue(ip4.equals("0.0.0.0") && !d3.hasInet4() || d3.hasInet4());
Assert.assertTrue(ip6.equals("::0") && !d3.hasInet6() || d3.hasInet6());
Assert.assertTrue(ip4.equals("0.0.0.0") && d3.getInet4() == null || d3.getInet4().equals(ip4.toLowerCase()));
Assert.assertTrue(ip6.equals("::0") && d3.getInet6() == null || d3.getInet6().equals(ip6.toLowerCase()));
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
}
for (int i = 0; i < 3; i++) {
String ip4 = invalidInet4Addresses[i];
String ip6 = normalizedInet6Addresses[i];
try {
DualInetAddress d1 = DualInetAddress.fromAddresses(ip4, null);
DualInetAddress d2 = DualInetAddress.fromAddresses(ip4, ip6);
// System.out.println(d1 + " " + d2);
Assert.assertTrue(ip4 == null && !d1.hasInet4() && !d2.hasInet4() &&
d1.getInet4() == null && d2.getInet4() == null &&
!d1.hasInet6() && d2.hasInet6() &&
d1.getInet6() == null && d2.getInet6().equals(ip6.toLowerCase()));
} catch (UnknownHostException e) {
Assert.assertTrue(ip4 != null);
}
}
for (int i = 0; i < 3; i++) {
String ip4 = normalizedInet4Addresses[i];
String ip6 = invalidInet6Addresses[i];
try {
DualInetAddress d1 = DualInetAddress.fromAddresses(null, ip6);
DualInetAddress d2 = DualInetAddress.fromAddresses(ip4, ip6);
// System.out.println(d1 + " " + d2);
Assert.assertTrue(ip6 == null && !d1.hasInet6() && !d2.hasInet6() &&
d1.getInet6() == null && d2.getInet6() == null &&
!d1.hasInet4() && d2.hasInet4() &&
d1.getInet4() == null && d2.getInet4().equals(ip4.toLowerCase()));
} catch (UnknownHostException e) {
Assert.assertTrue(ip4 != null);
}
}
System.out.println("*** testFromAddress: End");
}
// This test requires internal accessible hosts and therefore is not viable for public/external builds of CoprHD, therefore disabling by default.
@Ignore
@Test
public void testFromHostname() {
System.out.println("*** testFromHostname: Start");
for (String addr : normalizedInet4Addresses) {
try {
DualInetAddress d = DualInetAddress.fromHostname(addr);
Assert.assertTrue(addr.equals("0.0.0.0") && !d.hasInet4() || d.hasInet4());
Assert.assertTrue(!d.hasInet6());
Assert.assertTrue(addr.equals("0.0.0.0") && d.getInet4() == null || d.getInet4().equals(addr.toLowerCase()));
Assert.assertTrue(d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
}
for (String addr : invalidFrom4Addresses) {
try {
DualInetAddress d = DualInetAddress.fromHostname(addr);
Assert.assertTrue(addr == null && !d.hasInet4() && !d.hasInet6() && d.getInet4() == null && d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(addr != null);
}
}
for (String addr : normalizedInet6Addresses) {
try {
DualInetAddress d = DualInetAddress.fromHostname(addr);
Assert.assertTrue(addr.equals("::0") && !d.hasInet6() || d.hasInet6());
Assert.assertTrue(!d.hasInet4());
Assert.assertTrue(addr.equals("::0") && d.getInet6() == null || d.getInet6().equals(addr.toLowerCase()));
Assert.assertTrue(d.getInet4() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
}
for (String addr : invalidFrom6Addresses) {
try {
DualInetAddress d = DualInetAddress.fromHostname(addr);
// System.out.println(addr + " : " + d);
Assert.assertTrue(addr == null && !d.hasInet4() && !d.hasInet6() && d.getInet4() == null && d.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(addr != null);
}
}
try {
DualInetAddress d = DualInetAddress.fromHostname("lglw7152.lss.emc.com");
// System.out.println(d);
Assert.assertTrue(d.hasInet4() && d.hasInet6());
Assert.assertTrue(d.getInet4().equals("10.247.97.152"));
Assert.assertTrue(d.getInet6().equals("2620:0:170:2842::7152"));
} catch (UnknownHostException e) {
System.err.println(e);
log.error("Caught UnknownHostException: ", e);
Assert.assertTrue(false);
}
try {
DualInetAddress d = DualInetAddress.fromHostname("bourne-52.lss.emc.com");
Assert.assertTrue(d.hasInet4() && !d.hasInet6());
Assert.assertTrue(d.getInet4().equals("10.10.191.52"));
Assert.assertTrue(d.getInet6() == null);
} catch (UnknownHostException e) {
System.err.println(e);
log.error("Caught UnknownHostException: ", e);
Assert.assertTrue(false);
}
try {
DualInetAddress d = DualInetAddress.fromHostname("nonexistant.lss.emc.com");
System.out.println(d);
Assert.assertTrue(false);
;
} catch (UnknownHostException e) {
Assert.assertTrue(true);
}
// Test empty ip strings
try {
DualInetAddress invalid_address1 = DualInetAddress.fromAddresses("", normalizedInet6Addresses[0]);
Assert.assertTrue(invalid_address1.getInet4() == null);
DualInetAddress invalid_address2 = DualInetAddress.fromAddresses(normalizedInet4Addresses[0], "");
Assert.assertTrue(invalid_address2.getInet6() == null);
DualInetAddress invalid_address3 = DualInetAddress.fromAddresses("", "");
Assert.assertTrue(invalid_address3.getInet4() == null);
Assert.assertTrue(invalid_address3.getInet6() == null);
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
System.out.println("*** testFromHostname: End");
}
// This test requires internal accessible hosts and therefore is not viable for public/external builds of CoprHD, therefore disabling by default.
@Ignore
@Test
public void testConnectable() {
System.out.println("*** testConnectable: Start");
try {
DualInetAddress c4 = DualInetAddress.fromAddresses(c_ip4, null);
DualInetAddress c6 = DualInetAddress.fromAddresses(null, c_ip6);
DualInetAddress cm = DualInetAddress.fromAddresses(c_ip4, c_ip6);
DualInetAddress s4 = DualInetAddress.fromAddresses(s_ip4, null);
DualInetAddress s6 = DualInetAddress.fromAddresses(null, s_ip6);
DualInetAddress sm = DualInetAddress.fromAddresses(s_ip4, s_ip6);
try {
DualInetAddress.ConnectableInetAddresses q44 = DualInetAddress.getConnectableAddresses(c4, s4);
DualInetAddress.ConnectableInetAddresses q66 = DualInetAddress.getConnectableAddresses(c6, s6);
DualInetAddress.ConnectableInetAddresses q4m = DualInetAddress.getConnectableAddresses(c4, sm);
DualInetAddress.ConnectableInetAddresses qm4 = DualInetAddress.getConnectableAddresses(cm, s4);
DualInetAddress.ConnectableInetAddresses qmm = DualInetAddress.getConnectableAddresses(cm, sm);
DualInetAddress.ConnectableInetAddresses q6m = DualInetAddress.getConnectableAddresses(c6, sm);
DualInetAddress.ConnectableInetAddresses qm6 = DualInetAddress.getConnectableAddresses(cm, s6);
Assert.assertEquals(q44.getClient(), c_ip4);
Assert.assertEquals(q66.getClient(), c_ip6);
Assert.assertEquals(q4m.getClient(), c_ip4);
Assert.assertEquals(qm4.getClient(), c_ip4);
Assert.assertEquals(qmm.getClient(), c_ip4);
Assert.assertEquals(q6m.getClient(), c_ip6);
Assert.assertEquals(qm6.getClient(), c_ip6);
Assert.assertEquals(q44.getServer(), s_ip4);
Assert.assertEquals(q66.getServer(), s_ip6);
Assert.assertEquals(q4m.getServer(), s_ip4);
Assert.assertEquals(qm4.getServer(), s_ip4);
Assert.assertEquals(qmm.getServer(), s_ip4);
Assert.assertEquals(q6m.getServer(), s_ip6);
Assert.assertEquals(qm6.getServer(), s_ip6);
} catch (Exception e) {
Assert.assertTrue(false);
}
try {
DualInetAddress.ConnectableInetAddresses q46 = DualInetAddress.getConnectableAddresses(c4, s6);
Assert.assertTrue(false);
} catch (Exception e) {
Assert.assertTrue(true);
}
try {
DualInetAddress.ConnectableInetAddresses q46 = DualInetAddress.getConnectableAddresses(c6, s4);
Assert.assertTrue(false);
} catch (Exception e) {
Assert.assertTrue(true);
}
try {
String s4m = c4.getConnectableAddress(s_host);
String smm = cm.getConnectableAddress(s_host);
String s6m = c6.getConnectableAddress(s_host);
Assert.assertEquals(s4m, s_ip4);
Assert.assertEquals(smm, s_ip4);
Assert.assertEquals(s6m, s_ip6);
} catch (Exception e) {
Assert.assertTrue(false);
}
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
System.out.println("*** testConnectable: End");
}
@Test
public void testEquals() {
System.out.println("*** testEqual: Start");
try {
DualInetAddress cn = DualInetAddress.fromAddress(null);
DualInetAddress sn = DualInetAddress.fromAddress(null);
DualInetAddress c4 = DualInetAddress.fromAddresses(c_ip4, null);
DualInetAddress c6 = DualInetAddress.fromAddresses(null, c_ip6);
DualInetAddress cm = DualInetAddress.fromAddresses(c_ip4, c_ip6);
DualInetAddress s4 = DualInetAddress.fromAddresses(c_ip4, null);
DualInetAddress s6 = DualInetAddress.fromAddresses(null, c_ip6);
DualInetAddress sm = DualInetAddress.fromAddresses(c_ip4, c_ip6);
// Checks for empty ip strings
DualInetAddress blank_v4 = DualInetAddress.fromAddresses("", c_ip6);
DualInetAddress blank_v6 = DualInetAddress.fromAddresses(c_ip4, "");
DualInetAddress blank_all = DualInetAddress.fromAddresses("", "");
Assert.assertTrue(blank_v4.equals(s6));
Assert.assertTrue(blank_v6.equals(s4));
Assert.assertTrue(blank_all.equals(cn));
// Test strings, nulls for equals
Assert.assertFalse(cn == null);
Assert.assertTrue(cn.equals(cn));
Assert.assertTrue(sn.equals(sn));
Assert.assertTrue(sn.equals(cn));
Assert.assertTrue(cn.equals(sn));
Assert.assertTrue(c4.equals(c4));
Assert.assertTrue(s4.equals(s4));
Assert.assertTrue(s4.equals(c4));
Assert.assertTrue(c4.equals(s4));
Assert.assertTrue(c6.equals(c6));
Assert.assertTrue(s6.equals(s6));
Assert.assertTrue(s6.equals(c6));
Assert.assertTrue(c6.equals(s6));
Assert.assertTrue(cm.equals(cm));
Assert.assertTrue(sm.equals(sm));
Assert.assertTrue(sm.equals(cm));
Assert.assertTrue(cm.equals(sm));
Assert.assertFalse(cn.equals(c4));
Assert.assertFalse(cn.equals(cm));
Assert.assertFalse(cn.equals(c6));
Assert.assertFalse(c4.equals(cn));
Assert.assertFalse(c4.equals(cm));
Assert.assertFalse(c4.equals(c6));
Assert.assertFalse(c6.equals(cn));
Assert.assertFalse(c6.equals(cm));
Assert.assertFalse(c6.equals(c4));
Assert.assertFalse(cm.equals(cn));
Assert.assertFalse(cm.equals(c4));
Assert.assertFalse(cm.equals(c6));
Assert.assertTrue(sn.hashCode() == cn.hashCode());
Assert.assertTrue(cn.hashCode() == sn.hashCode());
Assert.assertTrue(s4.hashCode() == c4.hashCode());
Assert.assertTrue(c4.hashCode() == s4.hashCode());
Assert.assertTrue(s6.hashCode() == c6.hashCode());
Assert.assertTrue(c6.hashCode() == s6.hashCode());
Assert.assertTrue(sm.hashCode() == cm.hashCode());
Assert.assertTrue(cm.hashCode() == sm.hashCode());
Assert.assertFalse(cn.hashCode() == c4.hashCode());
Assert.assertFalse(cn.hashCode() == cm.hashCode());
Assert.assertFalse(cn.hashCode() == c6.hashCode());
Assert.assertFalse(c4.hashCode() == cn.hashCode());
Assert.assertFalse(c4.hashCode() == cm.hashCode());
Assert.assertFalse(c4.hashCode() == c6.hashCode());
Assert.assertFalse(c6.hashCode() == cn.hashCode());
Assert.assertFalse(c6.hashCode() == cm.hashCode());
Assert.assertFalse(c6.hashCode() == c4.hashCode());
Assert.assertFalse(cm.hashCode() == cn.hashCode());
Assert.assertFalse(cm.hashCode() == c4.hashCode());
Assert.assertFalse(cm.hashCode() == c6.hashCode());
} catch (UnknownHostException e) {
Assert.assertTrue(false);
}
System.out.println("*** testEqual: Start");
}
}