package net.onrc.onos.core.util;

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

import net.floodlightcontroller.util.MACAddress;

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

public class FlowEntryMatchTest {

    FlowEntryMatch match;

    Port inport = new Port((short) 1);
    byte[] byte1 = {1, 2, 3, 4, 5, 6};
    byte[] byte2 = {6, 5, 4, 3, 2, 1};
    MACAddress mac1 = new MACAddress(byte1);
    MACAddress mac2 = new MACAddress(byte2);
    Short ether = Short.valueOf((short) 2);
    Short vlanid = Short.valueOf((short) 3);
    Byte vlanprio = Byte.valueOf((byte) 4);
    IPv4Net ip1 = new IPv4Net("127.0.0.1/32");
    IPv4Net ip2 = new IPv4Net("127.0.0.2/32");
    Byte ipproto = Byte.valueOf((byte) 5);
    Byte ipToS = Byte.valueOf((byte) 6);
    Short tport1 = Short.valueOf((short) 7);
    Short tport2 = Short.valueOf((short) 8);

    @Before
    public void setUp() throws Exception {
        match = new FlowEntryMatch();
        match.enableInPort(inport);
        match.enableSrcMac(mac1);
        match.enableDstMac(mac2);
        match.enableEthernetFrameType(ether);
        match.enableVlanId(vlanid);
        match.enableVlanPriority(vlanprio);
        match.enableSrcIPv4Net(ip1);
        match.enableDstIPv4Net(ip2);
        match.enableIpProto(ipproto);
        match.enableIpToS(ipToS);
        match.enableSrcTcpUdpPort(tport1);
        match.enableDstTcpUdpPort(tport2);
    }

    @Test
    public void testFlowEntryMatch() {
        FlowEntryMatch def = new FlowEntryMatch();

        assertEquals("default null", null, def.inPort());
        assertEquals("default null", null, def.srcMac());
        assertEquals("default null", null, def.dstMac());
        assertEquals("default null", null, def.ethernetFrameType());
        assertEquals("default null", null, def.vlanId());
        assertEquals("default null", null, def.vlanPriority());
        assertEquals("default null", null, def.srcIPv4Net());
        assertEquals("default null", null, def.dstIPv4Net());
        assertEquals("default null", null, def.ipProto());
        assertEquals("default null", null, def.ipToS());
        assertEquals("default null", null, def.srcTcpUdpPort());
        assertEquals("default null", null, def.dstTcpUdpPort());
    }

    @Test
    public void testFlowEntryMatchFlowEntryMatch() {
        FlowEntryMatch def_base = new FlowEntryMatch();
        FlowEntryMatch def = new FlowEntryMatch(def_base);

        assertEquals("default null", null, def.inPort());
        assertEquals("default null", null, def.srcMac());
        assertEquals("default null", null, def.dstMac());
        assertEquals("default null", null, def.ethernetFrameType());
        assertEquals("default null", null, def.vlanId());
        assertEquals("default null", null, def.vlanPriority());
        assertEquals("default null", null, def.srcIPv4Net());
        assertEquals("default null", null, def.dstIPv4Net());
        assertEquals("default null", null, def.ipProto());
        assertEquals("default null", null, def.ipToS());
        assertEquals("default null", null, def.srcTcpUdpPort());
        assertEquals("default null", null, def.dstTcpUdpPort());

        FlowEntryMatch copy = new FlowEntryMatch(match);

        assertEquals("inport", inport, copy.inPort());
        assertEquals("mac1", mac1, copy.srcMac());
        assertEquals("mac2", mac2, copy.dstMac());
        assertEquals("ether", ether, copy.ethernetFrameType());
        assertEquals("vlan id", vlanid, copy.vlanId());
        assertEquals("vlan prio", vlanprio, copy.vlanPriority());
        assertEquals("ip1", ip1, copy.srcIPv4Net());
        assertEquals("ip2", ip2, copy.dstIPv4Net());
        assertEquals("ip proto", ipproto, copy.ipProto());
        assertEquals("tos", ipToS, copy.ipToS());
        assertEquals("src port", tport1, copy.srcTcpUdpPort());
        assertEquals("dst port", tport2, copy.dstTcpUdpPort());

    }

    @Test
    public void testInPort() {
        assertEquals("inport", inport, match.inPort());
    }

    @Test
    public void testDisableInPort() {
        match.disableInPort();
        assertEquals("inport", null, match.inPort());
        assertFalse(match.matchInPort());
    }

    @Test
    public void testMatchInPort() {
        assertTrue(match.matchInPort());
    }

    @Test
    public void testSrcMac() {
        assertEquals("mac1", mac1, match.srcMac());
    }

    @Test
    public void testDisableSrcMac() {
        match.disableSrcMac();
        assertEquals("srcMac", null, match.srcMac());
        assertFalse(match.matchSrcMac());
    }

    @Test
    public void testMatchSrcMac() {
        assertTrue(match.matchSrcMac());
    }

    @Test
    public void testDstMac() {
        assertEquals("mac2", mac2, match.dstMac());
    }

    @Test
    public void testDisableDstMac() {
        match.disableDstMac();
        assertEquals("dstMac", null, match.dstMac());
        assertFalse(match.matchDstMac());
    }

    @Test
    public void testMatchDstMac() {
        assertTrue(match.matchDstMac());
    }

    @Test
    public void testEthernetFrameType() {
        assertEquals("ether", ether, match.ethernetFrameType());
    }

    @Test
    public void testDisableEthernetFrameType() {
        match.disableEthernetFrameType();
        assertEquals("ethernetFrameType", null, match.ethernetFrameType());
        assertFalse(match.matchEthernetFrameType());
    }

    @Test
    public void testMatchEthernetFrameType() {
        assertTrue(match.matchEthernetFrameType());
    }

    @Test
    public void testVlanId() {
        assertEquals("vlan id", vlanid, match.vlanId());
    }

    @Test
    public void testDisableVlanId() {
        match.disableVlanId();
        assertEquals("vlanId", null, match.vlanId());
        assertFalse(match.matchVlanId());
    }

    @Test
    public void testMatchVlanId() {
        assertTrue(match.matchVlanId());
    }

    @Test
    public void testVlanPriority() {
        assertEquals("vlan prio", vlanprio, match.vlanPriority());
    }

    @Test
    public void testDisableVlanPriority() {
        match.disableVlanPriority();
        assertEquals("vlanPriority", null, match.vlanPriority());
        assertFalse(match.matchVlanPriority());
    }

    @Test
    public void testMatchVlanPriority() {
        assertTrue(match.matchVlanPriority());
    }

    @Test
    public void testSrcIPv4Net() {
        assertEquals("ip1", ip1, match.srcIPv4Net());
    }

    @Test
    public void testDisableSrcIPv4Net() {
        match.disableSrcIPv4Net();
        assertEquals("srcIPv4Net", null, match.srcIPv4Net());
        assertFalse(match.matchSrcIPv4Net());
    }

    @Test
    public void testMatchSrcIPv4Net() {
        assertTrue(match.matchSrcIPv4Net());
    }

    @Test
    public void testDstIPv4Net() {
        assertEquals("ip2", ip2, match.dstIPv4Net());
    }

    @Test
    public void testDisableDstIPv4Net() {
        match.disableDstIPv4Net();
        assertEquals("dstIPv4Net", null, match.dstIPv4Net());
        assertFalse(match.matchDstIPv4Net());
    }

    @Test
    public void testMatchDstIPv4Net() {
        assertTrue(match.matchDstIPv4Net());
    }

    @Test
    public void testIpProto() {
        assertEquals("ip proto", ipproto, match.ipProto());
    }

    @Test
    public void testDisableIpProto() {
        match.disableIpProto();
        assertEquals("ipProto", null, match.ipProto());
        assertFalse(match.matchIpProto());
    }

    @Test
    public void testMatchIpProto() {
        assertTrue(match.matchIpProto());
    }

    @Test
    public void testIpToS() {
        assertEquals("tos", ipToS, match.ipToS());
    }

    @Test
    public void testDisableIpToS() {
        match.disableIpToS();
        assertEquals("ipToS", null, match.ipToS());
        assertFalse(match.matchIpToS());
    }

    @Test
    public void testMatchIpToS() {
        assertTrue(match.matchIpToS());
    }

    @Test
    public void testSrcTcpUdpPort() {
        assertEquals("src port", tport1, match.srcTcpUdpPort());
    }

    @Test
    public void testDisableSrcTcpUdpPort() {
        match.disableSrcTcpUdpPort();
        assertEquals("srcTcpUdpPort", null, match.srcTcpUdpPort());
        assertFalse(match.matchSrcTcpUdpPort());
    }

    @Test
    public void testMatchSrcTcpUdpPort() {
        assertTrue(match.matchSrcTcpUdpPort());
    }

    @Test
    public void testDstTcpUdpPort() {
        assertEquals("dst port", tport2, match.dstTcpUdpPort());
    }

    @Test
    public void testDisableDstTcpUdpPort() {
        match.disableDstTcpUdpPort();
        assertEquals("dstTcpUdpPort", null, match.dstTcpUdpPort());
        assertFalse(match.matchDstTcpUdpPort());
    }

    @Test
    public void testMatchDstTcpUdpPort() {
        assertTrue(match.matchDstTcpUdpPort());
    }

    @Test
    public void testToString() {
        FlowEntryMatch def = new FlowEntryMatch();
        assertEquals("match default", def.toString(), "[]");

        assertEquals("match set", match.toString(), "[inPort=1 srcMac=01:02:03:04:05:06 dstMac=06:05:04:03:02:01 ethernetFrameType=2 vlanId=3 vlanPriority=4 srcIPv4Net=127.0.0.1/32 dstIPv4Net=127.0.0.2/32 ipProto=5 ipToS=6 srcTcpUdpPort=7 dstTcpUdpPort=8]");
    }

}
