package net.onrc.onos.ofcontroller.util;

import static org.junit.Assert.*;
import net.onrc.onos.ofcontroller.core.internal.TestableGraphDBOperation.TestFlowEntry;
import net.onrc.onos.ofcontroller.core.internal.TestableGraphDBOperation.TestFlowPath;

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

public class FlowPathTest {

	FlowPath flowPath;
	
	@Before
	public void setUp() throws Exception{
		TestFlowPath iFlowPath = new TestFlowPath();
		iFlowPath.setFlowIdForTest("0x1234");
		iFlowPath.setInstallerIdForTest("installerId");
		iFlowPath.setFlowPathTypeForTest("FP_TYPE_SHORTEST_PATH");
		iFlowPath.setFlowPathUserStateForTest("FP_USER_ADD");
		iFlowPath.setFlowPathFlagsForTest(0L);
		iFlowPath.setSrcSwForTest("CA:FE");
		iFlowPath.setSrcPortForTest((short)1);
		iFlowPath.setDstSwForTest("BA:BE");
		iFlowPath.setDstPortForTest((short)2);
		
		iFlowPath.setActionsForTest("[[type=ACTION_OUTPUT action=[port=10 maxLen=11]];[type=ACTION_OUTPUT action=[port=12 maxLen=13]];]");
		
		TestFlowEntry iFlowEntry = new TestFlowEntry();
		iFlowEntry.setEntryIdForTest("0x14");
		iFlowEntry.setDpidForTest("BE:EF");
		iFlowEntry.setActionsForTest("[[type=ACTION_OUTPUT action=[port=23 maxLen=24]];[type=ACTION_OUTPUT action=[port=25 maxLen=26]];]");
		iFlowEntry.setUserStateForTest("FE_USER_MODIFY");
		iFlowEntry.setSwitchStateForTest("FE_SWITCH_UPDATE_IN_PROGRESS");
		iFlowPath.addFlowEntryForTest(iFlowEntry);
		
		flowPath = new FlowPath(iFlowPath);
	}

	@Test
	public void testFlowPath(){
		FlowPath flowPath = new FlowPath();
		assertTrue ( flowPath.flowPathType() == FlowPathType.FP_TYPE_UNKNOWN);
		assertTrue ( flowPath.flowPathUserState() == FlowPathUserState.FP_USER_UNKNOWN);
		assertFalse( flowPath.flowPathFlags().isDiscardFirstHopEntry() );
		assertFalse( flowPath.flowPathFlags().isKeepOnlyFirstHopEntry() );
		assertTrue( flowPath.flowEntryActions().isEmpty() );
	}

	@Test
	public void testFlowPathIFlowPath(){
		TestFlowPath iFlowPath = new TestFlowPath();
		iFlowPath.setFlowIdForTest("0x1234");
		iFlowPath.setInstallerIdForTest("installerId");
		iFlowPath.setFlowPathTypeForTest("FP_TYPE_SHORTEST_PATH");
		iFlowPath.setFlowPathUserStateForTest("FP_USER_ADD");
		iFlowPath.setFlowPathFlagsForTest(0L);
		iFlowPath.setSrcSwForTest("CA:FE");
		iFlowPath.setSrcPortForTest((short)1);
		iFlowPath.setDstSwForTest("BA:BE");
		iFlowPath.setDstPortForTest((short)2);
		
		iFlowPath.setMatchSrcMacForTest("01:02:03:04:05:06");
		iFlowPath.setMatchDstMacForTest("06:05:04:03:02:01");
		iFlowPath.setMatchEthernetFrameTypeForTest((short)3);
		iFlowPath.setMatchVlanIdForTest((short)4);
		iFlowPath.setMatchVlanPriorityForTest((byte)5);
		iFlowPath.setMatchSrcIpaddrForTest("127.0.0.1/32");
		iFlowPath.setMatchDstIpaddrForTest("127.0.0.2/32");
		iFlowPath.setMatchIpProtoForTest((byte)6);
		iFlowPath.setMatchIpToSForTest((byte)7);
		iFlowPath.setMatchSrcTcpUdpPortForTest((short)8);
		iFlowPath.setMatchDstTcpUdpPortForTest((short)9);
		
		iFlowPath.setActionsForTest("[[type=ACTION_OUTPUT action=[port=10 maxLen=11]];[type=ACTION_OUTPUT action=[port=12 maxLen=13]];]");
		
		TestFlowEntry iFlowEntry = new TestFlowEntry();
		iFlowEntry.setEntryIdForTest("0x14");
		iFlowEntry.setDpidForTest("BE:EF");
		iFlowEntry.setMatchInPortForTest((short)15);
		iFlowEntry.setMatchSrcMacForTest("11:22:33:44:55:66");
		iFlowEntry.setMatchDstMacForTest("66:55:44:33:22:11");
		iFlowEntry.setMatchEtherFrameTypeForTest((short)16);
		iFlowEntry.setMatchVlanIdForTest((short)17);
		iFlowEntry.setMatchVlanPriorityForTest((byte)18);
		iFlowEntry.setMatchSrcIpaddrForTest("127.0.0.3/32");
		iFlowEntry.setMatchDstIpaddrForTest("127.0.0.4/32");
		iFlowEntry.setMatchIpProtoForTest((byte)19);
		iFlowEntry.setMatchIpToSForTest((byte)20);
		iFlowEntry.setMatchSrcTcpUdpPortForTest((short)21);
		iFlowEntry.setMatchDstTcpUdpPortForTest((short)22);
		iFlowEntry.setActionsForTest("[[type=ACTION_OUTPUT action=[port=23 maxLen=24]];[type=ACTION_OUTPUT action=[port=25 maxLen=26]];]");
		iFlowEntry.setUserStateForTest("FE_USER_MODIFY");
		iFlowEntry.setSwitchStateForTest("FE_SWITCH_UPDATE_IN_PROGRESS");
		iFlowPath.addFlowEntryForTest(iFlowEntry);
		
		FlowPath flowPath = new FlowPath(iFlowPath);
		assertEquals(flowPath.flowId().value(), 0x1234);
		assertEquals(flowPath.installerId().value(), "installerId");
		assertEquals(flowPath.flowPathType(), FlowPathType.FP_TYPE_SHORTEST_PATH);
		assertEquals(flowPath.flowPathUserState(), FlowPathUserState.FP_USER_ADD);
		assertEquals(flowPath.flowPathFlags().flags(), 0);
		assertEquals(flowPath.dataPath().srcPort().dpid().value(), 0xCAFE);
		assertEquals(flowPath.dataPath().srcPort().port().value(), 1);
		assertEquals(flowPath.dataPath().dstPort().dpid().value(), 0xBABE);
		assertEquals(flowPath.dataPath().dstPort().port().value(), 2);
		
		assertEquals(flowPath.flowEntryMatch().srcMac().toString(), "01:02:03:04:05:06");
		assertEquals(flowPath.flowEntryMatch().dstMac().toString(), "06:05:04:03:02:01");
		assertEquals(flowPath.flowEntryMatch().ethernetFrameType().shortValue(), 3);
		assertEquals(flowPath.flowEntryMatch().vlanId().shortValue(), 4);
		assertEquals(flowPath.flowEntryMatch().vlanPriority().shortValue(), 5);
		assertEquals(flowPath.flowEntryMatch().srcIPv4Net().address().toString(), "127.0.0.1");
		assertEquals(flowPath.flowEntryMatch().srcIPv4Net().prefixLen() , 32);
		assertEquals(flowPath.flowEntryMatch().dstIPv4Net().address().toString(), "127.0.0.2");
		assertEquals(flowPath.flowEntryMatch().dstIPv4Net().prefixLen() , 32);
		assertEquals(flowPath.flowEntryMatch().ipProto().byteValue(), 6);
		assertEquals(flowPath.flowEntryMatch().ipToS().byteValue(), 7);
		assertEquals(flowPath.flowEntryMatch().srcTcpUdpPort().shortValue(), 8);
		assertEquals(flowPath.flowEntryMatch().dstTcpUdpPort().shortValue(), 9);
		
		assertEquals(flowPath.flowEntryActions().toString(),"[[type=ACTION_OUTPUT action=[port=10 maxLen=11]];[type=ACTION_OUTPUT action=[port=12 maxLen=13]];]");
		
		assertEquals(0x14, flowPath.dataPath().flowEntries().get(0).flowEntryId().value() );
		assertEquals(0xBEEF, flowPath.dataPath().flowEntries().get(0).dpid().value() );
		assertEquals(15, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().inPort().value() );
		assertEquals("11:22:33:44:55:66", flowPath.dataPath().flowEntries().get(0).flowEntryMatch().srcMac().toString());
		assertEquals("66:55:44:33:22:11", flowPath.dataPath().flowEntries().get(0).flowEntryMatch().dstMac().toString());
		assertEquals(16, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().ethernetFrameType().shortValue());
		assertEquals(17, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().vlanId().shortValue());
		assertEquals(18, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().vlanPriority().byteValue());
		assertEquals("127.0.0.3", flowPath.dataPath().flowEntries().get(0).flowEntryMatch().srcIPv4Net().address().toString());
		assertEquals(32, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().srcIPv4Net().prefixLen());
		assertEquals("127.0.0.4", flowPath.dataPath().flowEntries().get(0).flowEntryMatch().dstIPv4Net().address().toString());
		assertEquals(32, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().dstIPv4Net().prefixLen());
		assertEquals(19, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().ipProto().byteValue());
		assertEquals(20, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().ipToS().byteValue());
		assertEquals(21, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().srcTcpUdpPort().shortValue());
		assertEquals(22, flowPath.dataPath().flowEntries().get(0).flowEntryMatch().dstTcpUdpPort().shortValue());
		assertEquals("[[type=ACTION_OUTPUT action=[port=23 maxLen=24]];[type=ACTION_OUTPUT action=[port=25 maxLen=26]];]", flowPath.dataPath().flowEntries().get(0).flowEntryActions().toString());
		assertEquals("FE_USER_MODIFY", flowPath.dataPath().flowEntries().get(0).flowEntryUserState().toString());
		assertEquals("FE_SWITCH_UPDATE_IN_PROGRESS", flowPath.dataPath().flowEntries().get(0).flowEntrySwitchState().toString());
	}

	@Test
	public void testSetFlowPathType(){
		FlowPath flowPath = new FlowPath();
		FlowPathType type = FlowPathType.FP_TYPE_SHORTEST_PATH;
		flowPath.setFlowPathType( type );
		assertTrue( flowPath.flowPathType() == FlowPathType.FP_TYPE_SHORTEST_PATH );
	}

	@Test
	public void testSetFlowPathUserState(){
		FlowPath flowPath = new FlowPath();
		FlowPathUserState state = FlowPathUserState.FP_USER_ADD;
		flowPath.setFlowPathUserState( state );
		assertTrue( flowPath.flowPathUserState() == FlowPathUserState.FP_USER_ADD );
	}

	@Test
	public void testFlowPathFlags(){
		FlowPath flowPath = new FlowPath();
		FlowPathFlags flags = new FlowPathFlags();
		flags.setFlags(0);
		flowPath.setFlowPathFlags( flags );
		assertFalse( flowPath.flowPathFlags().isDiscardFirstHopEntry() );
		assertFalse( flowPath.flowPathFlags().isKeepOnlyFirstHopEntry() );
	}

	@Test
	public void testSetFlowPathFlags(){
		FlowPath flowPath = new FlowPath();
		FlowPathFlags flags = new FlowPathFlags("DISCARD_FIRST_HOP_ENTRY");
		flags.setFlagsStr("KEEP_ONLY_FIRST_HOP_ENTRY");
		flowPath.setFlowPathFlags( flags );
		assertFalse( flowPath.flowPathFlags().isDiscardFirstHopEntry() );
		assertTrue( flowPath.flowPathFlags().isKeepOnlyFirstHopEntry() );
	}

	@Test
	public void testSetDataPath(){
		FlowPath flowPath = new FlowPath();
		DataPath dataPath = new DataPath();
		flowPath.setDataPath( dataPath );
		assertEquals(flowPath.dataPath(), dataPath );
	}

	@Test
	public void testToString(){

		assertEquals("[flowId=0x1234 installerId=installerId flowPathType=FP_TYPE_SHORTEST_PATH flowPathUserState=FP_USER_ADD flowPathFlags=[flags=] dataPath=[src=00:00:00:00:00:00:ca:fe/1 flowEntry=[flowEntryId=0x14 flowEntryMatch=[] flowEntryActions=[[type=ACTION_OUTPUT action=[port=23 maxLen=24]];[type=ACTION_OUTPUT action=[port=25 maxLen=26]];] dpid=00:00:00:00:00:00:be:ef flowEntryUserState=FE_USER_MODIFY flowEntrySwitchState=FE_SWITCH_UPDATE_IN_PROGRESS] dst=00:00:00:00:00:00:ba:be/2] flowEntryMatch=[] flowEntryActions=[[type=ACTION_OUTPUT action=[port=10 maxLen=11]];[type=ACTION_OUTPUT action=[port=12 maxLen=13]];]]", flowPath.toString());
	}

	@Test
	public void testCompareTo(){
		FlowPath flowPath1 = new FlowPath();
		flowPath1.setFlowId( new FlowId(1));
		FlowPath flowPath2 = new FlowPath();
		flowPath2.setFlowId( new FlowId(2));
		
		assertTrue( flowPath1.compareTo(flowPath2) < 0);
	}

}
