diff options
author | Håkon Hallingstad <hakon@yahooinc.com> | 2023-06-12 15:20:41 +0200 |
---|---|---|
committer | Håkon Hallingstad <hakon@yahooinc.com> | 2023-06-12 15:20:41 +0200 |
commit | 85a2298347ea60e6d4f904438995ab8ac8e68dea (patch) | |
tree | da6e6271245113f68fe603e5ac6cfa2177958ffd /vespajlib/src/test | |
parent | 5d42ad8a6ea453c129452cdc23311b6b191ad10a (diff) |
Move CidrBlock to vespa
Diffstat (limited to 'vespajlib/src/test')
-rw-r--r-- | vespajlib/src/test/java/ai/vespa/net/CidrBlockTest.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/vespajlib/src/test/java/ai/vespa/net/CidrBlockTest.java b/vespajlib/src/test/java/ai/vespa/net/CidrBlockTest.java new file mode 100644 index 00000000000..2194ca2de71 --- /dev/null +++ b/vespajlib/src/test/java/ai/vespa/net/CidrBlockTest.java @@ -0,0 +1,150 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package ai.vespa.net; + +import com.google.common.net.InetAddresses; +import ai.vespa.net.CidrBlock; +import org.junit.Test; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + + +/** + * @author valerijf + */ +public class CidrBlockTest { + + @Test(expected = IllegalArgumentException.class) + public void negative_prefix_size_fails() { + new CidrBlock(InetAddresses.forString("10.0.0.1"), -1); + } + + @Test(expected = IllegalArgumentException.class) + public void too_large_ipv4_prefix_size_fails() { + new CidrBlock(InetAddresses.forString("10.0.0.1"), 35); + } + + @Test(expected = IllegalArgumentException.class) + public void too_large_ipv6_prefix_size_fails() { + new CidrBlock(InetAddresses.forString("::1"), 130); + } + + @Test + public void bits_after_prefix_are_ignored() { + withHostIdentifierCleared("10.3.0.0/16", "10.3.12.180/16", "10.3.128.3/16"); + withHostIdentifierCleared("1234:5600::/25", "1234:5678::123/25", "1234:5600::725/25"); + } + + private void withHostIdentifierCleared(String canonical, String... aliases) { + CidrBlock canonicalBlock = CidrBlock.fromString(canonical); + assertEquals(canonical, canonicalBlock.toString()); + for (String alias : aliases) { + CidrBlock aliasBlock = CidrBlock.fromString(alias).clearHostIdentifier(); + assertEquals(canonicalBlock, aliasBlock); + assertEquals(canonical, aliasBlock.toString()); + } + } + + @Test + public void parse_from_string_test() { + assertEquals(new CidrBlock(InetAddresses.forString("10.0.0.1"), 12), CidrBlock.fromString("10.0.0.1/12")); + assertEquals(new CidrBlock(InetAddresses.forString("1234:5678::1"), 64), CidrBlock.fromString("1234:5678:0000::1/64")); + } + + @Test + public void ipv4_overlap_test() { + CidrBlock base = CidrBlock.fromString("10.3.0.0/16"); + + assertTrue(base.overlapsWith(CidrBlock.fromString("10.3.0.0/16"))); + assertTrue(base.overlapsWith(CidrBlock.fromString("10.0.0.0/8"))); + assertTrue(base.overlapsWith(CidrBlock.fromString("10.3.128.0/17"))); + assertFalse(base.overlapsWith(CidrBlock.fromString("10.4.0.0/16"))); + assertFalse(base.overlapsWith(CidrBlock.fromString("11.0.0.0/8"))); + } + + @Test + public void ipv6_overlap_test() { + CidrBlock base = CidrBlock.fromString("1234:5678:abcd::/48"); + + assertTrue(base.overlapsWith(CidrBlock.fromString("1234:5678:abcd::/48"))); + assertTrue(base.overlapsWith(CidrBlock.fromString("1234:5678::/32"))); + assertTrue(base.overlapsWith(CidrBlock.fromString("1234:5678:abcd:8000::/49"))); + assertFalse(base.overlapsWith(CidrBlock.fromString("1234:5678:abce::/48"))); + assertFalse(base.overlapsWith(CidrBlock.fromString("1234:5679::/32"))); + } + + @Test + public void domain_name_test() { + assertEquals("3.10.in-addr.arpa.", CidrBlock.fromString("10.3.0.0/16").getDomainName()); + assertEquals("128.192.in-addr.arpa.", CidrBlock.fromString("192.128.0.0/9").getDomainName()); + + assertEquals("d.c.b.a.8.7.6.5.4.3.2.1.ip6.arpa.", CidrBlock.fromString("1234:5678:abcd::/48").getDomainName()); + assertEquals("8.c.b.a.8.7.6.5.4.3.2.1.ip6.arpa.", CidrBlock.fromString("1234:5678:abc8::/45").getDomainName()); + } + + @Test + public void iterableCidrs() { + CidrBlock superBlock = CidrBlock.fromString("10.12.14.0/24"); + assertEquals(List.of("10.12.14.200/29", "10.12.14.208/29", "10.12.14.216/29", "10.12.14.224/29", "10.12.14.232/29", "10.12.14.240/29", "10.12.14.248/29"), + StreamSupport.stream(CidrBlock.fromString("10.12.14.200/29").iterableCidrs().spliterator(), false) + .takeWhile(superBlock::overlapsWith) + .map(CidrBlock::asString) + .collect(Collectors.toList())); + + assertEquals(StreamSupport.stream(superBlock.iterableIps().spliterator(), false) + .skip(24) + .map(ip -> InetAddresses.toAddrString(ip) + "/32") + .collect(Collectors.toList()), + StreamSupport.stream(CidrBlock.fromString("10.12.14.24/32").iterableCidrs().spliterator(), false) + .takeWhile(superBlock::overlapsWith) + .map(CidrBlock::asString) + .collect(Collectors.toList())); + } + + @Test + public void iterableIps() { + assertEquals(List.of("10.12.14.24", "10.12.14.25", "10.12.14.26", "10.12.14.27", "10.12.14.28", "10.12.14.29", "10.12.14.30", "10.12.14.31"), + StreamSupport.stream(CidrBlock.fromString("10.12.14.24/29").iterableIps().spliterator(), false) + .map(InetAddresses::toAddrString) + .collect(Collectors.toList())); + + assertEquals(List.of("10.12.14.24"), + StreamSupport.stream(CidrBlock.fromString("10.12.14.24/32").iterableIps().spliterator(), false) + .map(InetAddresses::toAddrString) + .collect(Collectors.toList())); + } + + @Test + public void testByteAccessors() { + CidrBlock ipv4Block = CidrBlock.fromString("11.22.33.44/24"); + assertEquals(11, ipv4Block.getByte(0)); + assertEquals(22, ipv4Block.getByte(1)); + assertEquals(33, ipv4Block.getByte(2)); + assertEquals(44, ipv4Block.getByte(3)); + assertEquals(24, ipv4Block.prefixLength()); + + assertEquals("12.22.33.44/24", ipv4Block.addByte(0, 1).asString()); + assertEquals("11.22.33.45/24", ipv4Block.addByte(3, 1).asString()); + assertEquals("55.22.33.44/24", ipv4Block.setByte(0, 55).asString()); + assertEquals("11.22.33.55/24", ipv4Block.setByte(3, 55).asString()); + + CidrBlock ipv6Block = CidrBlock.fromString("de63:aca:dcdc:e2a8:1fb4:542:b80d:f7c3/24"); + assertEquals(0xde, ipv6Block.getByte(0)); + assertEquals(0x63, ipv6Block.getByte(1)); + assertEquals(0x0a, ipv6Block.getByte(2)); + assertEquals(0xc3, ipv6Block.getByte(15)); + assertEquals(24, ipv6Block.prefixLength()); + + assertEquals("df63:aca:dcdc:e2a8:1fb4:542:b80d:f7c3/24", ipv6Block.addByte(0, 1).asString()); + assertEquals("ab63:aca:dcdc:e2a8:1fb4:542:b80d:f7c3/24", ipv6Block.setByte(0, 0xab).asString()); + assertEquals("de63:aca:dcdc:e2a8:1fb4:542:b80d:f7c4/24", ipv6Block.addByte(15, 1).asString()); + assertEquals("de63:aca:dcdc:e2a8:1fb4:542:b80d:f7fe/24", ipv6Block.setByte(15, 0xfe).asString()); + } +}
\ No newline at end of file |