diff options
Diffstat (limited to 'framework/src/onos/utils/misc/src/test/java/org/onlab/packet/IpPrefixTest.java')
-rw-r--r-- | framework/src/onos/utils/misc/src/test/java/org/onlab/packet/IpPrefixTest.java | 1080 |
1 files changed, 1080 insertions, 0 deletions
diff --git a/framework/src/onos/utils/misc/src/test/java/org/onlab/packet/IpPrefixTest.java b/framework/src/onos/utils/misc/src/test/java/org/onlab/packet/IpPrefixTest.java new file mode 100644 index 00000000..052a4cbb --- /dev/null +++ b/framework/src/onos/utils/misc/src/test/java/org/onlab/packet/IpPrefixTest.java @@ -0,0 +1,1080 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.packet; + +import org.junit.Test; + +import com.google.common.testing.EqualsTester; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass; + +/** + * Tests for class {@link IpPrefix}. + */ +public class IpPrefixTest { + /** + * Tests the immutability of {@link IpPrefix}. + */ + @Test + public void testImmutable() { + assertThatClassIsImmutableBaseClass(IpPrefix.class); + } + + /** + * Tests the maximum mask length. + */ + @Test + public void testMaxMaskLength() { + assertThat(IpPrefix.MAX_INET_MASK_LENGTH, is(32)); + assertThat(IpPrefix.MAX_INET6_MASK_LENGTH, is(128)); + } + + /** + * Tests returning the IP version of the prefix. + */ + @Test + public void testVersion() { + IpPrefix ipPrefix; + + // IPv4 + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertThat(ipPrefix.version(), is(IpAddress.Version.INET)); + + // IPv6 + ipPrefix = IpPrefix.valueOf("::/0"); + assertThat(ipPrefix.version(), is(IpAddress.Version.INET6)); + } + + /** + * Tests whether the IP version of a prefix is IPv4. + */ + @Test + public void testIsIp4() { + IpPrefix ipPrefix; + + // IPv4 + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertTrue(ipPrefix.isIp4()); + + // IPv6 + ipPrefix = IpPrefix.valueOf("::/0"); + assertFalse(ipPrefix.isIp4()); + } + + /** + * Tests whether the IP version of a prefix is IPv6. + */ + @Test + public void testIsIp6() { + IpPrefix ipPrefix; + + // IPv4 + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertFalse(ipPrefix.isIp6()); + + // IPv6 + ipPrefix = IpPrefix.valueOf("::/0"); + assertTrue(ipPrefix.isIp6()); + } + + /** + * Tests returning the IP address value and IP address prefix length of + * an IPv4 prefix. + */ + @Test + public void testAddressAndPrefixLengthIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.3.0/24"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.0"))); + assertThat(ipPrefix.prefixLength(), is(24)); + + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.0"))); + assertThat(ipPrefix.prefixLength(), is(24)); + + ipPrefix = IpPrefix.valueOf("1.2.3.4/32"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.4"))); + assertThat(ipPrefix.prefixLength(), is(32)); + + ipPrefix = IpPrefix.valueOf("1.2.3.5/32"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.5"))); + assertThat(ipPrefix.prefixLength(), is(32)); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("0.0.0.0"))); + assertThat(ipPrefix.prefixLength(), is(0)); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertThat(ipPrefix.address(), + equalTo(IpAddress.valueOf("255.255.255.255"))); + assertThat(ipPrefix.prefixLength(), is(32)); + } + + /** + * Tests returning the IP address value and IP address prefix length of + * an IPv6 prefix. + */ + @Test + public void testAddressAndPrefixLengthIPv6() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1100::/8"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1100::"))); + assertThat(ipPrefix.prefixLength(), is(8)); + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1100::"))); + assertThat(ipPrefix.prefixLength(), is(8)); + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8800/120"); + assertThat(ipPrefix.address(), + equalTo(IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8800"))); + assertThat(ipPrefix.prefixLength(), is(120)); + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/128"); + assertThat(ipPrefix.address(), + equalTo(IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8885"))); + assertThat(ipPrefix.prefixLength(), is(128)); + + ipPrefix = IpPrefix.valueOf("::/0"); + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("::"))); + assertThat(ipPrefix.prefixLength(), is(0)); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertThat(ipPrefix.address(), + equalTo(IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + assertThat(ipPrefix.prefixLength(), is(128)); + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/64"); + assertThat(ipPrefix.address(), + equalTo(IpAddress.valueOf("1111:2222:3333:4444::"))); + assertThat(ipPrefix.prefixLength(), is(64)); + } + + /** + * Tests getting the Ip4Prefix and Ip6Prefix view of the IP prefix. + */ + @Test + public void testGetIp4AndIp6PrefixView() { + IpPrefix ipPrefix; + Ip4Prefix ip4Prefix; + Ip6Prefix ip6Prefix; + + // Pure IPv4 IpPrefix + ipPrefix = IpPrefix.valueOf("1.2.3.0/24"); + ip4Prefix = ipPrefix.getIp4Prefix(); + ip6Prefix = ipPrefix.getIp6Prefix(); + assertThat(ip4Prefix.toString(), is("1.2.3.0/24")); + assertNull(ip6Prefix); + + // IPv4 IpPrefix that is Ip4Prefix + ipPrefix = Ip4Prefix.valueOf("1.2.3.0/24"); + ip4Prefix = ipPrefix.getIp4Prefix(); + ip6Prefix = ipPrefix.getIp6Prefix(); + assertThat(ip4Prefix.toString(), is("1.2.3.0/24")); + assertNull(ip6Prefix); + + // Pure IPv6 IpPrefix + ipPrefix = IpPrefix.valueOf("1111:2222::/64"); + ip4Prefix = ipPrefix.getIp4Prefix(); + ip6Prefix = ipPrefix.getIp6Prefix(); + assertNull(ip4Prefix); + assertThat(ip6Prefix.toString(), is("1111:2222::/64")); + + // IPv6 IpPrefix that is Ip6Prefix + ipPrefix = Ip6Prefix.valueOf("1111:2222::/64"); + ip4Prefix = ipPrefix.getIp4Prefix(); + ip6Prefix = ipPrefix.getIp6Prefix(); + assertNull(ip4Prefix); + assertThat(ip6Prefix.toString(), is("1111:2222::/64")); + } + + /** + * Tests valueOf() converter for IPv4 integer value. + */ + @Test + public void testValueOfForIntegerIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf(0x01020304, 24); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf(0x01020304, 32); + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); + + ipPrefix = IpPrefix.valueOf(0x01020305, 32); + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); + + ipPrefix = IpPrefix.valueOf(0, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(0, 32); + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); + + ipPrefix = IpPrefix.valueOf(0xffffffff, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(0xffffffff, 16); + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); + + ipPrefix = IpPrefix.valueOf(0xffffffff, 32); + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); + } + + /** + * Tests invalid valueOf() converter for IPv4 integer value and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfIntegerNegativePrefixLengthIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf(0x01020304, -1); + } + + /** + * Tests invalid valueOf() converter for IPv4 integer value and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfIntegerTooLongPrefixLengthIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf(0x01020304, 33); + } + + /** + * Tests valueOf() converter for IPv4 byte array. + */ + @Test + public void testValueOfByteArrayIPv4() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {1, 2, 3, 4}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); + + value = new byte[] {1, 2, 3, 5}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); + + value = new byte[] {0, 0, 0, 0}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); + + value = new byte[] {(byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 16); + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); + } + + /** + * Tests valueOf() converter for IPv6 byte array. + */ + @Test + public void testValueOfByteArrayIPv6() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {0x11, 0x11, 0x22, 0x22, + 0x33, 0x33, 0x44, 0x44, + 0x55, 0x55, 0x66, 0x66, + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); + + value = new byte[] {0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 0); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); + assertThat(ipPrefix.toString(), is("::/128")); + + value = new byte[] {(byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 0); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 64); + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); + + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); + assertThat(ipPrefix.toString(), + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); + } + + /** + * Tests invalid valueOf() converter for a null array for IPv4. + */ + @Test(expected = NullPointerException.class) + public void testInvalidValueOfNullArrayIPv4() { + IpPrefix ipPrefix; + byte[] value; + + value = null; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); + } + + /** + * Tests invalid valueOf() converter for a null array for IPv6. + */ + @Test(expected = NullPointerException.class) + public void testInvalidValueOfNullArrayIPv6() { + IpPrefix ipPrefix; + byte[] value; + + value = null; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); + } + + /** + * Tests invalid valueOf() converter for a short array for IPv4. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfShortArrayIPv4() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {1, 2, 3}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); + } + + /** + * Tests invalid valueOf() converter for a short array for IPv6. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfShortArrayIPv6() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); + } + + /** + * Tests invalid valueOf() converter for IPv4 byte array and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv4() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {1, 2, 3, 4}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, -1); + } + + /** + * Tests invalid valueOf() converter for IPv6 byte array and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv6() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {0x11, 0x11, 0x22, 0x22, + 0x33, 0x33, 0x44, 0x44, + 0x55, 0x55, 0x66, 0x66, + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, -1); + } + + /** + * Tests invalid valueOf() converter for IPv4 byte array and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv4() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {1, 2, 3, 4}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 33); + } + + /** + * Tests invalid valueOf() converter for IPv6 byte array and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv6() { + IpPrefix ipPrefix; + byte[] value; + + value = new byte[] {0x11, 0x11, 0x22, 0x22, + 0x33, 0x33, 0x44, 0x44, + 0x55, 0x55, 0x66, 0x66, + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 129); + } + + /** + * Tests valueOf() converter for IPv4 address. + */ + @Test + public void testValueOfAddressIPv4() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = IpAddress.valueOf("1.2.3.4"); + ipPrefix = IpPrefix.valueOf(ipAddress, 24); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 32); + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); + + ipAddress = IpAddress.valueOf("1.2.3.5"); + ipPrefix = IpPrefix.valueOf(ipAddress, 32); + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); + + ipAddress = IpAddress.valueOf("0.0.0.0"); + ipPrefix = IpPrefix.valueOf(ipAddress, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 32); + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); + + ipAddress = IpAddress.valueOf("255.255.255.255"); + ipPrefix = IpPrefix.valueOf(ipAddress, 0); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 16); + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 32); + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); + } + + /** + * Tests valueOf() converter for IPv6 address. + */ + @Test + public void testValueOfAddressIPv6() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); + ipPrefix = IpPrefix.valueOf(ipAddress, 120); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 128); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); + + ipAddress = IpAddress.valueOf("::"); + ipPrefix = IpPrefix.valueOf(ipAddress, 0); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 128); + assertThat(ipPrefix.toString(), is("::/128")); + + ipAddress = + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); + ipPrefix = IpPrefix.valueOf(ipAddress, 0); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 64); + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); + + ipPrefix = IpPrefix.valueOf(ipAddress, 128); + assertThat(ipPrefix.toString(), + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); + } + + /** + * Tests invalid valueOf() converter for a null IP address. + */ + @Test(expected = NullPointerException.class) + public void testInvalidValueOfNullAddress() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = null; + ipPrefix = IpPrefix.valueOf(ipAddress, 24); + } + + /** + * Tests invalid valueOf() converter for IPv4 address and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfAddressNegativePrefixLengthIPv4() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = IpAddress.valueOf("1.2.3.4"); + ipPrefix = IpPrefix.valueOf(ipAddress, -1); + } + + /** + * Tests invalid valueOf() converter for IPv6 address and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfAddressNegativePrefixLengthIPv6() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); + ipPrefix = IpPrefix.valueOf(ipAddress, -1); + } + + /** + * Tests invalid valueOf() converter for IPv4 address and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfAddressTooLongPrefixLengthIPv4() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = IpAddress.valueOf("1.2.3.4"); + ipPrefix = IpPrefix.valueOf(ipAddress, 33); + } + + /** + * Tests invalid valueOf() converter for IPv6 address and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfAddressTooLongPrefixLengthIPv6() { + IpAddress ipAddress; + IpPrefix ipPrefix; + + ipAddress = + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); + ipPrefix = IpPrefix.valueOf(ipAddress, 129); + } + + /** + * Tests valueOf() converter for IPv4 string. + */ + @Test + public void testValueOfStringIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf("1.2.3.4/32"); + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); + + ipPrefix = IpPrefix.valueOf("1.2.3.5/32"); + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/32"); + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/0"); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/16"); + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); + } + + /** + * Tests valueOf() converter for IPv6 string. + */ + @Test + public void testValueOfStringIPv6() { + IpPrefix ipPrefix; + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/120"); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/128"); + assertThat(ipPrefix.toString(), + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); + + ipPrefix = IpPrefix.valueOf("::/0"); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf("::/128"); + assertThat(ipPrefix.toString(), is("::/128")); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0"); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"); + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertThat(ipPrefix.toString(), + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); + } + + /** + * Tests invalid valueOf() converter for a null string. + */ + @Test(expected = NullPointerException.class) + public void testInvalidValueOfNullString() { + IpPrefix ipPrefix; + String fromString; + + fromString = null; + ipPrefix = IpPrefix.valueOf(fromString); + } + + /** + * Tests invalid valueOf() converter for an empty string. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfEmptyString() { + IpPrefix ipPrefix; + String fromString; + + fromString = ""; + ipPrefix = IpPrefix.valueOf(fromString); + } + + /** + * Tests invalid valueOf() converter for an incorrect string. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfIncorrectString() { + IpPrefix ipPrefix; + String fromString; + + fromString = "NoSuchIpPrefix"; + ipPrefix = IpPrefix.valueOf(fromString); + } + + /** + * Tests invalid valueOf() converter for IPv4 string and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfStringNegativePrefixLengthIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.3.4/-1"); + } + + /** + * Tests invalid valueOf() converter for IPv6 string and + * negative prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfStringNegativePrefixLengthIPv6() { + IpPrefix ipPrefix; + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/-1"); + } + + /** + * Tests invalid valueOf() converter for IPv4 string and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfStringTooLongPrefixLengthIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.3.4/33"); + } + + /** + * Tests invalid valueOf() converter for IPv6 string and + * too long prefix length. + */ + @Test(expected = IllegalArgumentException.class) + public void testInvalidValueOfStringTooLongPrefixLengthIPv6() { + IpPrefix ipPrefix; + + ipPrefix = + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/129"); + } + + /** + * Tests IP prefix contains another IP prefix for IPv4. + */ + @Test + public void testContainsIpPrefixIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.0.0/24"); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); + + ipPrefix = IpPrefix.valueOf("1.2.0.0/32"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); + + // Test when there is a mistmatch in the compared IP address families + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1111:2222:3333:4444::/120"))); + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); + } + + /** + * Tests IP prefix contains another IP prefix for IPv6. + */ + @Test + public void testContainsIpPrefixIPv6() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/120"); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); + + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/128"); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); + + ipPrefix = IpPrefix.valueOf("::/0"); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("::/64"))); + assertTrue(ipPrefix.contains(IpPrefix.valueOf("::/0"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); + assertFalse(ipPrefix.contains( + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); + assertTrue(ipPrefix.contains( + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); + + // Test when there is a mistmatch in the compared IP address families + ipPrefix = IpPrefix.valueOf("::/0"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); + } + + /** + * Tests IP prefix contains IP address for IPv4. + */ + @Test + public void testContainsIpAddressIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.0.0/24"); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); + + ipPrefix = IpPrefix.valueOf("1.2.0.0/32"); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); + + // Test when there is a mistmatch in the compared IP address families + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1111:2222:3333:4444::"))); + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertFalse(ipPrefix.contains(IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + } + + /** + * Tests IP prefix contains IP address for IPv6. + */ + @Test + public void testContainsIpAddressIPv6() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/120"); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::"))); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::1"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4445::"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/128"); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::1"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4445::"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + + ipPrefix = IpPrefix.valueOf("::/0"); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::"))); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::1"))); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4445::"))); + assertTrue(ipPrefix.contains(IpAddress.valueOf("::"))); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + + ipPrefix = + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4444::1"))); + assertFalse(ipPrefix.contains( + IpAddress.valueOf("1111:2222:3333:4445::"))); + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); + assertTrue(ipPrefix.contains( + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); + + // Test when there is a mistmatch in the compared IP address families + ipPrefix = IpPrefix.valueOf("::/0"); + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); + } + + /** + * Tests equality of {@link IpPrefix} for IPv4. + */ + @Test + public void testEqualityIPv4() { + new EqualsTester() + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/24"), + IpPrefix.valueOf("1.2.0.0/24"), + IpPrefix.valueOf("1.2.0.4/24")) + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/16"), + IpPrefix.valueOf("1.2.0.0/16")) + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/32"), + IpPrefix.valueOf("1.2.0.0/32")) + .addEqualityGroup(IpPrefix.valueOf("1.3.0.0/24"), + IpPrefix.valueOf("1.3.0.0/24")) + .addEqualityGroup(IpPrefix.valueOf("0.0.0.0/0"), + IpPrefix.valueOf("0.0.0.0/0")) + .addEqualityGroup(IpPrefix.valueOf("255.255.255.255/32"), + IpPrefix.valueOf("255.255.255.255/32")) + .testEquals(); + } + + /** + * Tests equality of {@link IpPrefix} for IPv6. + */ + @Test + public void testEqualityIPv6() { + new EqualsTester() + .addEqualityGroup( + IpPrefix.valueOf("1111:2222:3333:4444::/120"), + IpPrefix.valueOf("1111:2222:3333:4444::1/120"), + IpPrefix.valueOf("1111:2222:3333:4444::/120")) + .addEqualityGroup( + IpPrefix.valueOf("1111:2222:3333:4444::/64"), + IpPrefix.valueOf("1111:2222:3333:4444::/64")) + .addEqualityGroup( + IpPrefix.valueOf("1111:2222:3333:4444::/128"), + IpPrefix.valueOf("1111:2222:3333:4444::/128")) + .addEqualityGroup( + IpPrefix.valueOf("1111:2222:3333:4445::/64"), + IpPrefix.valueOf("1111:2222:3333:4445::/64")) + .addEqualityGroup( + IpPrefix.valueOf("::/0"), + IpPrefix.valueOf("::/0")) + .addEqualityGroup( + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"), + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")) + .testEquals(); + } + + /** + * Tests object string representation for IPv4. + */ + @Test + public void testToStringIPv4() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1.2.3.0/24"); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); + + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); + + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); + } + + /** + * Tests object string representation for IPv6. + */ + @Test + public void testToStringIPv6() { + IpPrefix ipPrefix; + + ipPrefix = IpPrefix.valueOf("1100::/8"); + assertThat(ipPrefix.toString(), is("1100::/8")); + + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8"); + assertThat(ipPrefix.toString(), is("1100::/8")); + + ipPrefix = IpPrefix.valueOf("::/0"); + assertThat(ipPrefix.toString(), is("::/0")); + + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); + assertThat(ipPrefix.toString(), + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); + } +} |