package net.onrc.onos.apps.sdnip;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class PrefixTest {

    private List<PrefixTestData> testPrefixes;

    private class PrefixTestData {
        public final String dotNotation;
        public final String binaryNotation;
        public final int prefixLength;

        public PrefixTestData(String dotNotation, int prefixLength,
                String binaryNotation) {
            this.dotNotation = dotNotation;
            this.prefixLength = prefixLength;
            this.binaryNotation = binaryNotation;
        }
    }

    @Before
    public void setUp() throws Exception {

        testPrefixes = new LinkedList<>();

        testPrefixes.add(new PrefixTestData("0.0.0.0", 0, ""));

        testPrefixes.add(new PrefixTestData("192.168.166.0", 22,
                "1100000010101000101001"));

        testPrefixes.add(new PrefixTestData("192.168.166.0", 23,
                "11000000101010001010011"));

        testPrefixes.add(new PrefixTestData("192.168.166.0", 24,
                "110000001010100010100110"));

        testPrefixes.add(new PrefixTestData("130.162.10.1", 25,
                "1000001010100010000010100"));

        testPrefixes.add(new PrefixTestData("255.255.255.255", 32,
                "11111111111111111111111111111111"));
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testNewPrefixFromByteArray() {
        byte[] b1 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
        byte[] b2 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0xff, (byte) 0xff};
        byte[] b3 = new byte[]{(byte) 0x8f, (byte) 0xac, (byte) 0x00, (byte) 0x00};
        byte[] b4 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};

        Prefix p1 = new Prefix(b1, 12);
        Prefix p2 = new Prefix(b2, 12);
        Prefix p3 = new Prefix(b3, 12);
        Prefix p4 = new Prefix(b4, 11);

        // Different input byte arrays, but Prefixes should be equal after
        // construction
        assertTrue(p1.equals(p2));
        assertTrue(p2.equals(p3));

        // Same input byte array, but should be false
        assertFalse(p1.equals(p4));

        assertTrue(Arrays.equals(p1.getAddress(), p3.getAddress()));
        assertTrue(p1.toString().equals(p2.toString()));
        assertTrue(Arrays.equals(p1.getAddress(), p4.getAddress()));
        assertFalse(p1.toString().equals(p4.toString()));
    }

    @Test
    public void testPrefixString() {
        Prefix p1 = new Prefix("192.168.166.0", 24);
        Prefix p2 = new Prefix("192.168.166.0", 23);
        Prefix p3 = new Prefix("192.168.166.128", 24);
        Prefix p4 = new Prefix("192.168.166.128", 25);

        assertFalse(p1.equals(p2));
        assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));

        assertTrue(p1.equals(p3));
        assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));

        assertFalse(p3.equals(p4));
        assertFalse(Arrays.equals(p3.getAddress(), p4.getAddress()));

        assertTrue(p1.toString().equals(p3.toString()));
        assertEquals(p1.hashCode(), p3.hashCode());
    }

    @Test
    public void testPrefixReturnsSame() {
        // Create a prefix of all ones for each prefix length.
        // Check that Prefix doesn't mangle it
        for (int prefixLength = 1; prefixLength <= Prefix.MAX_PREFIX_LENGTH; prefixLength++) {
            byte[] address = new byte[Prefix.ADDRESS_LENGTH_BYTES];

            int lastByte = (prefixLength - 1) / Byte.SIZE;
            int lastBit = (prefixLength - 1) % Byte.SIZE;

            for (int j = 0; j < address.length; j++) {
                if (j < lastByte) {
                    address[j] = (byte) 0xff;
                } else if (j == lastByte) {
                    byte b = 0;
                    byte msb = (byte) 0x80;
                    for (int k = 0; k < Byte.SIZE; k++) {
                        if (k <= lastBit) {
                            b |= (msb >> k);
                        }
                    }
                    address[j] = b;
                } else {
                    address[j] = 0;
                }
            }

            Prefix p = new Prefix(address, prefixLength);

            assertTrue(Arrays.equals(address, p.getAddress()));
        }
    }

    @Test
    public void testToBinaryString() {
        for (PrefixTestData testPrefix : testPrefixes) {
            Prefix p = new Prefix(testPrefix.dotNotation, testPrefix.prefixLength);
            assertEquals(testPrefix.binaryNotation, p.toBinaryString());
            assertEquals(p.getPrefixLength(), p.toBinaryString().length());
        }
    }

    @Test(expected = IllegalArgumentException.class)
    public void testStringConstructorPrefixLengthTooSmall() {
        String s = "255.255.255.255";

        // Check the first valid prefix length works
        Prefix p = new Prefix(s, Prefix.MIN_PREFIX_LENGTH);
        assertNotNull(p);

        // Should throw IllegalArgumentException
        new Prefix(s, Prefix.MIN_PREFIX_LENGTH - 1);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testStringConstructorPrefixLengthTooLarge() {
        String s = "255.255.255.255";

        // Check the last valid prefix length works
        Prefix p = new Prefix(s, Prefix.MAX_PREFIX_LENGTH);
        assertNotNull(p);

        // Should throw IllegalArgumentException
        new Prefix(s, Prefix.MAX_PREFIX_LENGTH + 1);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testByteConstructorPrefixLengthTooSmall() {
        byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};

        // Check the first valid prefix length works
        Prefix p = new Prefix(b, Prefix.MIN_PREFIX_LENGTH);
        assertNotNull(p);

        // Should throw IllegalArgumentException
        new Prefix(b, Prefix.MIN_PREFIX_LENGTH - 1);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testByteConstructorPrefixLengthTooLarge() {
        byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};

        // Check the last valid prefix length works
        Prefix p = new Prefix(b, Prefix.MAX_PREFIX_LENGTH);
        assertNotNull(p);

        // Should throw IllegalArgumentException
        new Prefix(b, Prefix.MAX_PREFIX_LENGTH + 1);
    }

    @Test
    public void testFromBinaryString() {
        Map<String, String> binaryToDecimalDot = new HashMap<>();

        binaryToDecimalDot.put("", "0.0.0.0/0");
        binaryToDecimalDot.put("1", "128.0.0.0/1");
        binaryToDecimalDot.put("10000001", "129.0.0.0/8");
        binaryToDecimalDot.put("1011011110", "183.128.0.0/10");
        binaryToDecimalDot.put("01001101000000001010010110110101", "77.0.165.181/32");

        for (Map.Entry<String, String> entry : binaryToDecimalDot.entrySet()) {
            Prefix p = Prefix.fromBinaryString(entry.getKey());
            assertEquals(entry.getValue(), p.toString());
        }
    }

    @Test
    public void testFromBinaryStringInvalidInput() {
        try {
            Prefix.fromBinaryString("34102");
            fail("Non-binary input should throw an exception");
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }

        try {
            Prefix.fromBinaryString("-0101");
            fail("Non-binary input should throw an exception");
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }

        try {
            Prefix.fromBinaryString("01010101010101010101010101010102");
            fail("Non-binary input should throw an exception");
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }

        try {
            Prefix.fromBinaryString("010101010101010101010101010101011");
            fail("Input too long should throw an exception");
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }
    }
}
