/*
 * Copyright 2014 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 com.google.common.testing.EqualsTester;
import org.junit.Ignore;
import org.junit.Test;

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.assertThatClassIsImmutable;

/**
 * Tests for class {@link IpPrefix}.
 */
public class IpPrefixTest {
    /**
     * Tests the immutability of {@link IpPrefix}.
     */
    @Ignore("The class is not pure immutable, because it is not 'final'")
    @Test
    public void testImmutable() {
        assertThatClassIsImmutable(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 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")));
    }

    /**
     * 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")));
    }

    /**
     * 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")));
    }

    /**
     * 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")));
    }

    /**
     * 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"));
    }
}
