package edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip; import java.util.Arrays; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; /** * * @author michael */ public class IPv6AddressTest { public IPv6AddressTest() { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testValueOfNoExpansion() { int[] expected = new int[]{0x2001, 0xdb8, 0x85a3, 0x0, 0x0, 0x8a2e, 0x370, 0x7334}; IPv6Address adr = IPv6Address.valueOf("2001:db8:85a3:0:0:8a2e:370:7334"); for (int i = 0; i < 8; i++) { assertEquals(expected[i], adr.get(i)); } } @Test public void testValueOfWithExpansion() { int[] expected = new int[]{0x2001, 0xdb8, 0x85a3, 0x0, 0, 0x8a2e, 0x370, 0x7334}; IPv6Address adr = IPv6Address.valueOf("2001:db8:85a3::8a2e:370:7334"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } expected = new int[]{0x2001, 0xdb8, 0x0, 0x0, 0x0, 0x0, 0x370, 0x7334}; adr = IPv6Address.valueOf("2001:db8::370:7334"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } } @Test public void testValueOfWithExpansionZerosAtStart() { int[] expected = new int[]{0, 0, 0, 0, 0, 0x8a2e, 0x370, 0x7334}; IPv6Address adr = IPv6Address.valueOf("::8a2e:370:7334"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } expected = new int[]{0, 0, 0, 0, 0, 0, 0, 0x7334}; adr = IPv6Address.valueOf("::7334"); System.out.println("adr = " + adr); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } } @Test public void testValueOfWithExpansionZerosAtEnd() { int[] expected = new int[]{0x2001, 0x8a2e, 0, 0, 0, 0, 0, 0}; IPv6Address adr = IPv6Address.valueOf("2001:8a2e::"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } expected = new int[]{0x1337, 0, 0, 0, 0, 0, 0, 0}; adr = IPv6Address.valueOf("1337::"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } } @Test public void testValueOfWithExpansionSpecialCases() { int[] expected = new int[]{0, 0, 0, 0, 0, 0, 0, 0}; IPv6Address adr = IPv6Address.valueOf("::"); System.out.println("adr = " + adr); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } expected = new int[]{0, 0, 0, 0, 0, 0, 0, 1}; adr = IPv6Address.valueOf("::1"); for (int i = 0; i < 8; i++) { assertEquals("At index " + i + ": expecting " + expected[i] + ", got " + adr.get(i), expected[i], adr.get(i)); } } @Test public void testLocalhostness() { assertTrue(IPv6Address.valueOf("::1").isLocalhost()); assertFalse(IPv6Address.valueOf("fff::1").isLocalhost()); } @Test(expected = IllegalArgumentException.class) public void testIllegalLength() { IPv6Address.valueOf("0:1:2:3"); } @Test(expected = IllegalArgumentException.class) public void testIllegalLengthPrefix() { IPv6Address.valueOf(":1:2:3"); } @Test(expected = IllegalArgumentException.class) public void testIllegalLengthSuffix() { IPv6Address.valueOf("1:2:3:"); } @Test(expected = IllegalArgumentException.class) public void testIllegalNumber() { IPv6Address.valueOf("::xxx"); } @Test public void testCompareTo() { IPv6Address[] expected = new IPv6Address[]{ IPv6Address.valueOf("::"), IPv6Address.valueOf("::1"), IPv6Address.valueOf("::2"), IPv6Address.valueOf("::1:0"), IPv6Address.valueOf("::1:1"), IPv6Address.valueOf("1::") }; IPv6Address[] scrambled = new IPv6Address[]{expected[5], expected[4], expected[3], expected[2], expected[0], expected[1]}; Arrays.sort(scrambled); assertArrayEquals(expected, scrambled); } @Test public void testLongRoundTrips() { for (String s : Arrays.asList("a:b:c:d:e:f::1", "::", "::1", "ff:ff:ff:ff:ff:ff:ff:ff", "fe80::8358:c945:7094:2e6c", "fe80::60d0:6eff:fece:7713", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")) { IPv6Address addr = IPv6Address.valueOf(s); assertEquals("Bad roundtrip on address: " + s, addr, new IPv6Address(addr.toLongArray())); } } @Test public void testInclusionAbove() { IPv6Range r = new IPv6Range(IPv6Address.valueOf("dd:2:2:2:2:2:2:2"), IPv6Address.valueOf("dd:a:a:a:a:a:a:a")); for (String addr : Arrays.asList("df:a:a:a:a:a:a:a", "dd:b:a:a:a:a:a:a", "dd:a:b:a:a:a:a:a", "dd:a:a:b:a:a:a:a", "dd:a:a:a:b:a:a:a", "dd:a:a:a:a:b:a:a", "dd:a:a:a:a:a:b:a", "dd:a:a:a:a:a:a:b")) { IPv6Address ipv6 = IPv6Address.valueOf(addr); assertFalse(r.contains(ipv6)); assertTrue("for address " + ipv6, above(ipv6.toLongArray(), r.getTop().toLongArray())); assertFalse("for address " + ipv6, between(r.getBottom().toLongArray(), r.getTop().toLongArray(), ipv6.toLongArray())); } } @Test public void testInclusionBelow() { IPv6Range r = new IPv6Range(IPv6Address.valueOf("dd:2:2:2:2:2:2:2"), IPv6Address.valueOf("dd:a:a:a:a:a:a:a")); for (String addr : Arrays.asList("dc:2:2:2:2:2:2:2", "dd:1:2:2:2:2:2:2", "dd:2:1:2:2:2:2:2", "dd:2:2:1:2:2:2:2", "dd:2:2:2:1:2:2:2", "dd:2:2:2:2:1:2:2", "dd:2:2:2:2:2:1:2", "dd:2:2:2:2:2:2:1")) { IPv6Address ipv6 = IPv6Address.valueOf(addr); assertFalse(r.contains(ipv6)); long[] bottomArr = r.getBottom().toLongArray(); long[] addrArr = ipv6.toLongArray(); assertTrue("for address " + ipv6, above(bottomArr, addrArr)); assertFalse("for address " + ipv6, between(bottomArr, r.getTop().toLongArray(), addrArr)); } } @Test public void testNetworkInterfaceIgnore() { assertEquals(IPv6Address.valueOf("fe80:0:0:0:0:0:0:1%1]]"), IPv6Address.valueOf("fe80:0:0:0:0:0:0:1")); } @Test public void testEquals() { IPv6Address sut = IPv6Address.valueOf("ff:ff:12:23:34::0"); assertEquals( sut, sut ); assertFalse( sut.equals(null) ); assertFalse( sut.equals(IPv4Address.valueOf("12.23.34.54")) ); assertFalse( sut.equals(IPv6Address.valueOf("1:2:3:4::0"))); } public boolean above(long[] top, long[] addr) { return top[0] > addr[0] || (top[0] == addr[0] && top[1] > addr[1]) || (top[0] == addr[0] && top[1] == addr[1] && top[2] > addr[2]) || (top[0] == addr[0] && top[1] == addr[1] && top[2] == addr[2] && top[3] >= addr[3]); } public boolean between(long[] bottom, long[] top, long[] addr) { return above(top, addr) && above(addr, bottom); } }