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.setIdleTimeoutForTest(5);
		iFlowPath.setHardTimeoutForTest(10);
		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.idleTimeout() == 0);
		assertTrue (flowPath.hardTimeout() == 0);
		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.setIdleTimeoutForTest(5);
		iFlowPath.setHardTimeoutForTest(10);
		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.idleTimeout(), 5);
		assertEquals(flowPath.hardTimeout(), 10);
		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(0, flowPath.dataPath().flowEntries().get(0).idleTimeout() );
		assertEquals(0, flowPath.dataPath().flowEntries().get(0).hardTimeout() );
		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 testSetIdleTimeout(){
		FlowPath flowPath = new FlowPath();
		int idleTimeout = 15;
		flowPath.setIdleTimeout( idleTimeout );
		assertTrue( flowPath.idleTimeout() == 15 );
	}

	@Test
	public void testSetHardTimeout(){
		FlowPath flowPath = new FlowPath();
		int hardTimeout = 20;
		flowPath.setHardTimeout( hardTimeout );
		assertTrue( flowPath.hardTimeout() == 20 );
	}

	@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=] idleTimeout=5 hardTimeout=10 dataPath=[src=00:00:00:00:00:00:ca:fe/1 flowEntry=[flowEntryId=0x14 idleTimeout=0 hardTimeout=0 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);
	}

}
