package org.dcache.util; import org.junit.Test; import java.net.InetAddress; import java.net.UnknownHostException; import static com.google.common.net.InetAddresses.forString; import static org.junit.Assert.*; public class IPMatcherTest { @Test public void testIpBased() throws UnknownHostException { boolean match = IPMatcher.match(forString("131.169.214.0"), InetAddress.getByName("131.169.40.255"), 16); assertTrue("Failed to match host with netmask.", match); match = IPMatcher.match(forString("192.168.0.1"), forString("192.168.0.1"), 0); assertTrue("Failed to match host with 0-netmask.", match); } @Test public void testIpBasedNegative() throws UnknownHostException { boolean match = IPMatcher.match(forString("131.169.214.0"), forString("131.169.40.255"), 24); assertFalse("Match should have failed.", match); } @Test public void testIpV6SuccessfulIpNetMatching() throws UnknownHostException { boolean match = IPMatcher.match( forString("fe80::BAD:F00D:BAD:F00D") , forString("fe80::0:0:0:0"), 64); assertTrue("Failed to match host with netmask.", match); match = IPMatcher.match(forString("feed:bad:f00d:feed:bad:f00d:feed:f00d"), forString("feed:bad:f00d:feed:bad:f00d:feed:f00d"), 0); assertTrue("Failed to match host with 0-netmask.", match); } @Test public void testIpV6SuccessfulIpNetMatchingFractionedMask() throws UnknownHostException { boolean match = IPMatcher.match( forString("fe80::3FF:F00D:BAD:F00D"), forString("fe80::0:0:0:0"), 70); assertTrue("Failed to match host with netmask.", match); } @Test public void testIpV6FailedIpNetMatchingFractionedMask() throws UnknownHostException { boolean match = IPMatcher.match( forString("fe80::4FF:F00D:BAD:F00D"), forString("fe80::0:0:0:0"), 70); assertFalse("Match should have failed.", match); } @Test public void testIpV6FailedIpNetMatching() throws UnknownHostException { boolean match = IPMatcher.match( forString("fe80::BAD:F00D:BAD:F00D") , forString("fe80::0:0:0:0"), 96); assertFalse("Match should have failed.", match); } @Test public void testMatchCompatibleIPv6Address() throws UnknownHostException { boolean match = IPMatcher.match(forString("::ffff:192.168.0.3"), forString("192.168.0.0"), 24); assertTrue("Failed to match with compatible IPv6 address.", match); } @Test public void testMatchBothCompatibleIPv6Addresses() throws UnknownHostException { boolean match = IPMatcher.match(forString("::ffff:192.168.0.3"), forString("::ffff:192.168.0.0"), 24); assertTrue("Failed to match compatible IPv6 addresses.", match); } @Test public void testMatchWithCompatibleIPv6Subnet() throws UnknownHostException { boolean match = IPMatcher.match(forString("192.168.0.3"), forString("::ffff:192.168.0.0"), 24); assertTrue("Failed to match compatible IPv6 subnet.", match); } @Test public void testMatchWithCompatibleIPv6SubnetHexNotation() throws UnknownHostException { boolean match = IPMatcher.match(forString("192.168.0.3"), forString("::ffff:c0a8:0"), 24); assertTrue("Failed to match compatible IPv6 subnet.", match); } @Test public void testMatchAny() throws UnknownHostException { boolean match = IPMatcher.matchAny(new InetAddress[] { forString("131.169.213.1"), forString("131.169.215.1") }, forString("131.169.214.0"), 24); assertFalse(match); match = IPMatcher.matchAny(new InetAddress[] { forString("131.169.213.1"), forString("131.169.214.1"), forString("131.169.215.1") }, forString("131.169.214.0"), 24); assertTrue(match); } @Test public void testMaskZeroMatchesAll() throws UnknownHostException { boolean match = IPMatcher.match(forString("1.2.3.4"), forString("9.8.7.6"), 0); assertTrue(match); match = IPMatcher.match(forString("ffff::1234"), forString("9.8.7.6"), 0); assertTrue(match); match = IPMatcher.match(forString("9.8.7.6"), forString("ffff::1234"), 0); assertTrue(match); match = IPMatcher.match(forString("aaaa::4321"), forString("ffff::1234"), 0); assertTrue(match); } @Test public void testMatchCidrPattern() throws UnknownHostException { assertTrue(IPMatcher.matchCidrPattern(forString("192.168.0.25"), "192.168.0.0/24")); assertFalse(IPMatcher.matchCidrPattern(forString("192.168.1.25"), "192.168.0.0/24")); assertTrue(IPMatcher.matchCidrPattern(forString("192.168.0.25"), "192.168.0.0/255.255.255.0")); assertFalse(IPMatcher.matchCidrPattern(forString("192.168.1.25"), "192.168.0.0/255.255.255.0")); } @Test public void testMaskAddress() throws UnknownHostException { assertEquals("255.255.255.255", IPMatcher.maskInetAddress(forString("255.255.255.255"), 32).getHostAddress()); assertEquals("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", IPMatcher.maskInetAddress(forString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 128).getHostAddress()); assertEquals("0.0.0.0", IPMatcher.maskInetAddress(forString("255.255.255.255"), 0).getHostAddress()); assertEquals("0:0:0:0:0:0:0:0", IPMatcher.maskInetAddress(forString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 0).getHostAddress()); assertEquals("255.255.255.128", IPMatcher.maskInetAddress(forString("255.255.255.255"), 25).getHostAddress()); assertEquals("ffff:ffff:ffff:ffff:fff8:0:0:0", IPMatcher.maskInetAddress(forString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 77).getHostAddress()); } @Test public void testZeroMask() { assertTrue(IPMatcher.match(forString("123.123.123.123"), forString("0.0.0.0"), 0)); } @Test public void testConvertIPv4MaskStringToCidr() { assertEquals(0, IPMatcher.convertToCidrIfIsIPv4Mask("0.0.0.0")); assertEquals(1, IPMatcher.convertToCidrIfIsIPv4Mask("128.0.0.0")); assertEquals(2, IPMatcher.convertToCidrIfIsIPv4Mask("192.0.0.0")); assertEquals(3, IPMatcher.convertToCidrIfIsIPv4Mask("224.0.0.0")); assertEquals(4, IPMatcher.convertToCidrIfIsIPv4Mask("240.0.0.0")); assertEquals(5, IPMatcher.convertToCidrIfIsIPv4Mask("248.0.0.0")); assertEquals(6, IPMatcher.convertToCidrIfIsIPv4Mask("252.0.0.0")); assertEquals(7, IPMatcher.convertToCidrIfIsIPv4Mask("254.0.0.0")); assertEquals(8, IPMatcher.convertToCidrIfIsIPv4Mask("255.0.0.0")); assertEquals(9, IPMatcher.convertToCidrIfIsIPv4Mask("255.128.0.0")); assertEquals(10, IPMatcher.convertToCidrIfIsIPv4Mask("255.192.0.0")); assertEquals(11, IPMatcher.convertToCidrIfIsIPv4Mask("255.224.0.0")); assertEquals(12, IPMatcher.convertToCidrIfIsIPv4Mask("255.240.0.0")); assertEquals(13, IPMatcher.convertToCidrIfIsIPv4Mask("255.248.0.0")); assertEquals(14, IPMatcher.convertToCidrIfIsIPv4Mask("255.252.0.0")); assertEquals(15, IPMatcher.convertToCidrIfIsIPv4Mask("255.254.0.0")); assertEquals(16, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.0.0")); assertEquals(17, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.128.0")); assertEquals(18, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.192.0")); assertEquals(19, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.224.0")); assertEquals(20, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.240.0")); assertEquals(21, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.248.0")); assertEquals(22, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.252.0")); assertEquals(23, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.254.0")); assertEquals(24, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.0")); assertEquals(25, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.128")); assertEquals(26, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.192")); assertEquals(27, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.224")); assertEquals(28, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.240")); assertEquals(29, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.248")); assertEquals(30, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.252")); assertEquals(31, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.254")); assertEquals(32, IPMatcher.convertToCidrIfIsIPv4Mask("255.255.255.255")); assertEquals(0, IPMatcher.convertToCidrIfIsIPv4Mask("0")); assertEquals(2, IPMatcher.convertToCidrIfIsIPv4Mask("2")); assertEquals(32, IPMatcher.convertToCidrIfIsIPv4Mask("32")); } }