Bug 5540 - FlowConvertor, FlowStatsResponseConvertor, FlowInstructionResponseConvertor
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / flow / FlowConvertorTest.java
@@ -6,24 +6,37 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
  */\r
 \r
-package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;\r
 \r
 import java.math.BigInteger;\r
 import java.util.ArrayList;\r
+import java.util.Collections;\r
 import java.util.List;\r
+import java.util.Optional;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowplugin.api.OFConstants;\r
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;\r
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlow;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCaseBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;\r
@@ -38,7 +51,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.ApplyActionsCase;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.GotoTableCase;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instruction.grouping.instruction.choice.MeterCase;\r
@@ -47,6 +66,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;\r
+import org.opendaylight.yangtools.yang.binding.Augmentation;\r
+import org.opendaylight.yangtools.yang.binding.DataContainer;\r
 \r
 /**\r
  * @author michal.polkorab\r
@@ -55,7 +76,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 public class FlowConvertorTest {\r
 \r
     /**\r
-     * Tests {@link FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\r
+     * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
      */\r
     @Test\r
     public void test() {\r
@@ -75,8 +96,10 @@ public class FlowConvertorTest {
         flowBuilder.setMatch(null);\r
         RemoveFlowInput flow = flowBuilder.build();\r
 \r
-        List<FlowModInputBuilder> flowMod = FlowConvertor\r
-                .toFlowModInputs(flow, EncodeConstants.OF13_VERSION_ID, new BigInteger("42"));\r
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);\r
+        data.setDatapathId(new BigInteger("42"));\r
+\r
+        List<FlowModInputBuilder> flowMod = convert(flow, data);\r
 \r
         Assert.assertEquals("Wrong version", 4, flowMod.get(0).getVersion().intValue());\r
         Assert.assertEquals("Wrong cookie", 4, flowMod.get(0).getCookie().intValue());\r
@@ -96,7 +119,7 @@ public class FlowConvertorTest {
     }\r
 \r
     /**\r
-     * Tests {@link FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\r
+     * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
      */\r
     @Test\r
     public void testOnlyModifyStrictCommand() {\r
@@ -104,15 +127,17 @@ public class FlowConvertorTest {
         flowBuilder.setStrict(true);\r
         UpdatedFlow flow = flowBuilder.build();\r
 \r
-        List<FlowModInputBuilder> flowMod = FlowConvertor\r
-                .toFlowModInputs(flow, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"));\r
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);\r
+        data.setDatapathId(new BigInteger("42"));\r
+\r
+        List<FlowModInputBuilder> flowMod = convert(flow, data);\r
 \r
         Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());\r
         Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());\r
     }\r
 \r
     /**\r
-     * Tests {@link FlowConvertor#toFlowModInputs(Flow, short, BigInteger)}\r
+     * Tests {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow.FlowConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }\r
      */\r
     @Test\r
     public void testInstructionsTranslation() {\r
@@ -175,8 +200,9 @@ public class FlowConvertorTest {
         flowBuilder.setInstructions(instructionsBuilder.build());\r
         AddFlowInput flow = flowBuilder.build();\r
 \r
-        List<FlowModInputBuilder> flowMod = FlowConvertor\r
-                .toFlowModInputs(flow, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"));\r
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_0);\r
+        data.setDatapathId(new BigInteger("42"));\r
+        List<FlowModInputBuilder> flowMod = convert(flow, data);\r
 \r
         Assert.assertEquals("Wrong version", 1, flowMod.get(0).getVersion().intValue());\r
         Assert.assertEquals("Wrong command", FlowModCommand.OFPFCADD, flowMod.get(0).getCommand());\r
@@ -215,4 +241,187 @@ public class FlowConvertorTest {
         MeterCase meterCase = (MeterCase) instruction.getInstructionChoice();\r
         Assert.assertEquals("Wrong meter id", 5, meterCase.getMeter().getMeterId().intValue());\r
     }\r
+\r
+    @Test\r
+    public void testCloneAndAugmentFlowWithSetVlanId() {\r
+        MockFlow mockFlow = new MockFlow();\r
+        Action action1 = createAction(\r
+                new SetVlanIdActionCaseBuilder().setSetVlanIdAction(\r
+                        new SetVlanIdActionBuilder().setVlanId(new VlanId(10)).build())\r
+                        .build(),\r
+                0);\r
+\r
+        mockFlow.setMatch(new MatchBuilder().setEthernetMatch(createEthernetMatch()).build());\r
+        mockFlow.setInstructions(toApplyInstruction(Collections.singletonList(action1)));\r
+\r
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);\r
+        data.setDatapathId(BigInteger.ONE);\r
+\r
+        List<FlowModInputBuilder> flowModInputBuilders = convert(mockFlow, data);\r
+\r
+        Assert.assertEquals(2, flowModInputBuilders.size());\r
+\r
+    }\r
+\r
+    private List<FlowModInputBuilder> convert(Flow flow, VersionDatapathIdConvertorData data) {\r
+        Optional<List<FlowModInputBuilder>> flowModOptional = ConvertorManager.getInstance().convert(flow, data);\r
+        Assert.assertTrue("Flow convertor not found", flowModOptional.isPresent());\r
+        return flowModOptional.get();\r
+    }\r
+\r
+    private static Action createAction(final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionCase,\r
+                                       final int order) {\r
+        Action action = new ActionBuilder().setOrder(order).setAction(actionCase).build();\r
+        return action;\r
+    }\r
+\r
+    private static EthernetMatch createEthernetMatch() {\r
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();\r
+        ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(33024L)).build());\r
+        return ethernetMatchBuilder.build();\r
+    }\r
+\r
+    private static Instructions toApplyInstruction(\r
+            final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions) {\r
+        return new InstructionsBuilder()\r
+                .setInstruction(\r
+                        Collections.singletonList(\r
+                                new InstructionBuilder()\r
+                                        .setOrder(0)\r
+                                        .setInstruction(\r
+                                                new ApplyActionsCaseBuilder()\r
+                                                        .setApplyActions((new ApplyActionsBuilder()).setAction(actions).build())\r
+                                                        .build()\r
+                                        ).build())\r
+                ).build();\r
+    }\r
+\r
+    private static class MockFlow implements AddFlowInput {\r
+        private Instructions instructions;\r
+        private Match match;\r
+\r
+        public void setInstructions(final Instructions instructions) {\r
+            this.instructions = instructions;\r
+        }\r
+\r
+        public void setMatch(final Match match) {\r
+            this.match = match;\r
+        }\r
+\r
+\r
+        @Override\r
+        public FlowRef getFlowRef() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public <E extends Augmentation<AddFlowInput>> E getAugmentation(final Class<E> augmentationType) {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public FlowTableRef getFlowTable() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Match getMatch() {\r
+            return match;\r
+        }\r
+\r
+        @Override\r
+        public Instructions getInstructions() {\r
+            return instructions;\r
+        }\r
+\r
+        @Override\r
+        public String getContainerName() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public FlowCookie getCookieMask() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Long getBufferId() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public BigInteger getOutPort() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Long getOutGroup() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags getFlags() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public String getFlowName() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Boolean isInstallHw() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Boolean isBarrier() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Boolean isStrict() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Integer getPriority() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Integer getIdleTimeout() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Integer getHardTimeout() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public FlowCookie getCookie() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Short getTableId() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public NodeRef getNode() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Uri getTransactionUri() {\r
+            return null;\r
+        }\r
+\r
+        @Override\r
+        public Class<? extends DataContainer> getImplementedInterface() {\r
+            return null;\r
+        }\r
+    }\r
 }
\ No newline at end of file