package net.floodlightcontroller.util;

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

import org.junit.Test;

/**
 * @author Sho Shimizu (sho.shimizu@gmail.com)
 */
public class MACAddressTest {
    @Test
    public void testValueOf() {
        MACAddress address = MACAddress.valueOf("00:01:02:03:04:05");
        assertEquals(address,
                MACAddress.valueOf(new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05}));
        assertEquals("00:01:02:03:04:05", address.toString());

        address = MACAddress.valueOf("FF:FE:FD:10:20:30");
        assertEquals(address,
                MACAddress.valueOf(new byte[]{(byte) 0xFF, (byte) 0xFE, (byte) 0xFD, 0x10, 0x20, 0x30}));
        assertEquals("ff:fe:fd:10:20:30", address.toString());
        
        address = MACAddress.valueOf("00:11:22:aa:bb:cc");
        assertEquals(address,
                MACAddress.valueOf(new byte[]{0x00, 0x11, 0x22, (byte)0xaa, (byte)0xbb, (byte)0xcc}));
    }

    @Test(expected=NumberFormatException.class)
    public void testIllegalFormat() {
        MACAddress.valueOf("0T:00:01:02:03:04");
    }

    @Test(expected=IllegalArgumentException.class)
    public void testLongStringFields() {
        MACAddress.valueOf("00:01:02:03:04:05:06");
    }

    @Test(expected=IllegalArgumentException.class)
    public void testShortStringFields() {
        MACAddress.valueOf("00:01:02:03:04");
    }

    @Test(expected=IllegalArgumentException.class)
    public void testLongByteFields() {
        MACAddress.valueOf(new byte[]{0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
    }

    @Test(expected=IllegalArgumentException.class)
    public void testShortByteField() {
        MACAddress.valueOf(new byte[]{0x01, 0x01, 0x02, 0x03, 0x04});
    }

    //  Test data is imported from net.onrc.onos.core.packet.EthernetTest
    @Test
    public void testToLong() {
        assertEquals(
                281474976710655L,
                MACAddress.valueOf(new byte[]{(byte) 0xff, (byte) 0xff,
                        (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}).toLong());

        assertEquals(
                1103823438081L,
                MACAddress.valueOf(new byte[] { (byte) 0x01, (byte) 0x01,
                        (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01 }).toLong());

        assertEquals(
                141289400074368L,
                MACAddress.valueOf(new byte[] { (byte) 0x80, (byte) 0x80,
                        (byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80 }).toLong());

    }
    
    @Test
    public void testIsBroadcast() {
        assertTrue(MACAddress.valueOf("FF:FF:FF:FF:FF:FF").isBroadcast());
        assertFalse(MACAddress.valueOf("11:22:33:44:55:66").isBroadcast());
    }

    @Test
    public void testIsMulticast() {
        assertTrue(MACAddress.valueOf("01:80:C2:00:00:00").isMulticast());
        assertFalse(MACAddress.valueOf("FF:FF:FF:FF:FF:FF").isMulticast());
        assertFalse(MACAddress.valueOf("11:22:33:44:55:66").isBroadcast());
    }
}
