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