/*
 * 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.Test;

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertFalse;
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}.
     */
    @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 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"));
    }
}
