package org.dcache.util; import org.junit.Test; import org.springframework.util.SerializationUtils; import java.net.InetAddress; import java.net.UnknownHostException; import static com.google.common.net.InetAddresses.forString; import static org.junit.Assert.*; public class SubnetTest { @Test public void testCreateWithInetAddressAndMask() throws UnknownHostException { Subnet subnet = Subnet.create(forString("192.168.0.0"), 24); assertTrue(subnet.containsHost("192.168.0.1")); assertTrue(subnet.contains(forString("192.168.0.1"))); assertTrue(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("192.168.0.1"), forString("127.0.0.1")})); assertFalse(subnet.containsHost("192.168.1.1")); assertFalse(subnet.contains(forString("192.168.1.1"))); assertFalse(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("127.0.0.1")})); } @Test(expected=IllegalArgumentException.class) public void testCreateStringWithInvalidCidrPattern() { Subnet.create("something"); } @Test public void testCreateStringWithValidCidrPatternIPv4() throws UnknownHostException { Subnet subnet = Subnet.create("192.168.0.0/24"); assertTrue(subnet.containsHost("192.168.0.1")); assertTrue(subnet.contains(forString("192.168.0.1"))); assertTrue(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("192.168.0.1"), forString("127.0.0.1")})); assertFalse(subnet.containsHost("192.168.1.1")); assertFalse(subnet.contains(forString("192.168.1.1"))); assertFalse(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("127.0.0.1")})); } @Test public void testCreate() throws UnknownHostException { Subnet subnet = Subnet.create(); assertTrue(subnet.containsHost("192.168.0.1")); assertTrue(subnet.contains(forString("192.168.0.1"))); assertTrue(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("192.168.0.1"), forString("127.0.0.1")})); assertTrue(subnet.containsHost("192.168.1.1")); assertTrue(subnet.contains(forString("192.168.1.1"))); assertTrue(subnet.containsAny(new InetAddress[] {forString("134.102.101.100"), forString("127.0.0.1")})); } @Test(expected=NumberFormatException.class) public void testCidrWithInvalidMask() { Subnet.create("1.2.3.4/abc"); } @Test(expected=IllegalArgumentException.class) public void testCidrWithInvalidAddress() { Subnet.create("foobar/22"); } @Test public void testToString() { Subnet subnet = Subnet.create(); assertEquals("all", subnet.toString()); subnet = Subnet.create("::/0"); assertEquals("::/0", subnet.toString()); subnet = Subnet.create("0.0.0.0/0"); assertEquals("0.0.0.0/0", subnet.toString()); subnet = Subnet.create("0.0.0.0/0.0.0.0"); assertEquals("0.0.0.0/0", subnet.toString()); subnet = Subnet.create("192.168.0.0/24"); assertEquals("192.168.0.0/24", subnet.toString()); subnet = Subnet.create("192.168.0.0"); assertEquals("192.168.0.0/32", subnet.toString()); subnet = Subnet.create("192.168.0.0/32"); assertEquals("192.168.0.0/32", subnet.toString()); subnet = Subnet.create("192.168.0.0/255.255.255.255"); assertEquals("192.168.0.0/32", subnet.toString()); subnet = Subnet.create("::1"); assertEquals("::1/128", subnet.toString()); subnet = Subnet.create("2000::00ff:ff00"); assertEquals("2000::ff:ff00/128", subnet.toString()); subnet = Subnet.create("2001:0001::00ff:ff00"); assertEquals("2001:1::ff:ff00/128", subnet.toString()); // special addresses starting with 2002 are mapped to IPv4 // using bytes 2 to 5 (starting counting at 0): subnet = Subnet.create("2002:0102:0304::00ff:ff00"); assertEquals("1.2.3.4/32", subnet.toString()); subnet = Subnet.create("2002:0102:0304::00ff:ff00/112"); assertEquals("1.2.0.0/16", subnet.toString()); subnet = Subnet.create("2003::00ff:ff00"); assertEquals("2003::ff:ff00/128", subnet.toString()); // compatible ipv4 addresses: subnet = Subnet.create("::192.168.0.0/120"); assertEquals("192.168.0.0/24", subnet.toString()); subnet = Subnet.create("::c0a8:0/120"); assertEquals("192.168.0.0/24", subnet.toString()); subnet = Subnet.create("::c0a8:1"); assertEquals("192.168.0.1/32", subnet.toString()); // mapped ipv4 addresses: subnet = Subnet.create("::ffff:192.168.0.0/120"); assertEquals("192.168.0.0/24", subnet.toString()); subnet = Subnet.create("::ffff:192.168.0.0/128"); assertEquals("192.168.0.0/32", subnet.toString()); subnet = Subnet.create("::ffff:192.168.0.0/64"); assertEquals("192.168.0.0/0", subnet.toString()); subnet = Subnet.create("0:0:0::ffff:192.168.0.0/127"); assertEquals("192.168.0.0/31", subnet.toString()); subnet = Subnet.create("0:0:0::ffff:192.168.0.0/128"); assertEquals("192.168.0.0/32", subnet.toString()); subnet = Subnet.create("1234:1234:1234:1234:1234:1234:1234:1234/96"); assertEquals("1234:1234:1234:1234:1234:1234::/96", subnet.toString()); subnet = Subnet.create("1234:1234:1234::1234:1234:1234/96"); assertEquals("1234:1234:1234::1234:0:0/96", subnet.toString()); subnet = Subnet.create("0:11:0:11::1"); assertEquals("0:11:0:11::1/128", subnet.toString()); subnet = Subnet.create("00ff:ff:00ff:00ff:00ff::1"); assertEquals("ff:ff:ff:ff:ff::1/128", subnet.toString()); subnet = Subnet.create("192.168.0.0/255.255.255.0"); assertEquals("192.168.0.0/24", subnet.toString()); subnet = Subnet.create("::ffff:192.168.0.0/128"); assertEquals("192.168.0.0/32", subnet.toString()); } @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionWhenCreateIsCalledWithDocumentationAddress() { // special addresses for documentation starting with 2001:db8 // are mapped to IPv4 and inverted: Subnet.create("2001:db8::00ff:ff00"); } @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionWhenCreateIsCalledWithToredoAddress() { // special addresses for documentation starting with 2001:db8 // are mapped to IPv4 and inverted: Subnet.create("2001::00ff:ff00"); } @Test public void serializeSubnetTest() { Subnet original = Subnet.create(); Object copy = SerializationUtils.deserialize( SerializationUtils.serialize(original)); assertTrue(copy instanceof Subnet); assertEquals(original, copy); } @Test(expected=IllegalArgumentException.class) public void shouldThrowExceptionForTooBigMaskForIPv4Address() { Subnet.create("0.0.0.0/33"); } @Test(expected=IllegalArgumentException.class) public void shouldThrowExceptionForTooBigMaskForIPv6Address() { Subnet.create("::/129"); } @Test public void testMatch() throws UnknownHostException { assertTrue(matches("0.0.0.0/0", "131.169.252.76")); assertTrue(matches("0.0.0.0/0.0.0.0", "131.169.252.76")); assertTrue(matches("128.0.0.0/1", "131.169.252.76")); assertTrue(matches("130.0.0.0/7", "131.169.252.76")); assertTrue(matches("131.0.0.0/8", "131.169.252.76")); assertTrue(matches("131.128.0.0/9", "131.169.252.76")); assertTrue(matches("131.168.0.0/15", "131.169.252.76")); assertTrue(matches("131.169.0.0/16", "131.169.252.76")); assertTrue(matches("131.169.128.0/17", "131.169.252.76")); assertTrue(matches("131.169.252.0/23", "131.169.252.76")); assertTrue(matches("131.169.252.0/24", "131.169.252.76")); assertTrue(matches("131.169.252.0/25", "131.169.252.76")); assertTrue(matches("131.169.252.76/31", "131.169.252.76")); assertTrue(matches("131.169.252.76/32", "131.169.252.76")); assertFalse(matches("128.0.0.0/1", "127.169.252.76")); assertFalse(matches("130.0.0.0/7", "1.169.253.76")); assertFalse(matches("131.0.0.0/8", "132.169.252.76")); assertFalse(matches("131.128.0.0/9", "131.127.128.76")); assertFalse(matches("131.168.0.0/15", "131.167.252.76")); assertFalse(matches("131.169.0.0/16", "131.168.252.76")); assertFalse(matches("131.169.128.0/17", "131.169.127.128")); assertFalse(matches("131.169.252.0/23", "131.169.251.76")); assertFalse(matches("131.169.252.0/24", "131.169.253.76")); assertFalse(matches("131.169.252.0/25", "131.169.252.128")); assertFalse(matches("131.169.252.76/31", "131.169.251.77")); assertFalse(matches("131.169.252.76/32", "131.169.252.75")); } private boolean matches(String subnetLabel, String ip) { Subnet subnet = Subnet.create(subnetLabel); InetAddress address; try { address = forString(ip); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } return subnet.contains(address); } }