/**
* Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.junit.Assert;
import org.junit.Test;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.GroupCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopMplsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopVlanCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushMplsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushPbbCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PushVlanCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetMplsTtlCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTtlCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetQueueCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
/**
* test for {@link ActionConvertor}
*/
public class ActionConvertorTest {
List<Action> actions = new ArrayList<>();
static Integer actionItem = 0;
@Test
public void testActionConvertorwithallParameters() {
OutputActionData();
CopyTtlData();
MplsTtlActionData();
vlanActionData();
mplsActionData();
setQueueActionData();
setGroupAction();
NwTtlAction();
pbbActionData();
setFieldData();
setExperimenterData();
dropActionData();
ActionConvertorData data = new ActionConvertorData((short) 0X4);
data.setDatapathId(BigInteger.ONE);
final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action>> OFActionsList =
convertorManager.convert(actions, data);
outputActions(OFActionsList.orElse(Collections.emptyList()));
}
private void setExperimenterData() {
// TODO:SAL API Missing
}
private void dropActionData() {
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new DropActionCaseBuilder().build());
actions.add(actionItem++, AB.build());
}
private void setFieldData() {
SetFieldBuilder matchBuilder = new SetFieldBuilder();
matchBuilder.setInPort(new NodeConnectorId("openflow:1:2125"));
SetFieldBuilder setFB = new SetFieldBuilder();
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new SetFieldCaseBuilder().setSetField(setFB.build()).build());
actions.add(actionItem++, AB.build());
}
private void pbbActionData() {
PushPbbActionBuilder pushpbb = new PushPbbActionBuilder();
pushpbb.setEthernetType(10);
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new PushPbbActionCaseBuilder().setPushPbbAction(pushpbb.build()).build());
actions.add(actionItem++, AB.build());
PopPbbActionBuilder popPBB = new PopPbbActionBuilder();
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new PopPbbActionCaseBuilder().setPopPbbAction(popPBB.build()).build());
actions.add(actionItem++, AB1.build());
}
private void NwTtlAction() {
SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
setNwTtlActionBuilder.setNwTtl((short) 1);
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtlActionBuilder.build()).build());
actions.add(actionItem++, AB.build());
DecNwTtlBuilder necNwTtlBuilder = new DecNwTtlBuilder();
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new DecNwTtlCaseBuilder().setDecNwTtl(necNwTtlBuilder.build()).build());
actions.add(actionItem++, AB1.build());
}
private void setGroupAction() {
GroupActionBuilder grpIdAB = new GroupActionBuilder();
grpIdAB.setGroup("98");
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new GroupActionCaseBuilder().setGroupAction(grpIdAB.build()).build());
actions.add(actionItem++, AB.build());
}
// TODO - check if this method is needed (private and never used locally) - see line 94
private static void outputActions(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> oFActionsList) {
for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action action : oFActionsList) {
if (action.getActionChoice() instanceof OutputActionCase) {
OutputActionCase outputActionCase = (OutputActionCase) action.getActionChoice();
Assert.assertEquals((Integer) 10, (outputActionCase.getOutputAction().getMaxLength()));
long port = 4294967293L;
Assert.assertEquals(port, (long) (outputActionCase.getOutputAction().getPort().getValue()));
}
if (action.getActionChoice() instanceof CopyTtlInCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlInCase.class.getName());
}
if (action.getActionChoice() instanceof CopyTtlOutCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), CopyTtlOutCase.class.getName());
}
if (action.getActionChoice() instanceof
// TODO:getMplsTtl is missing.
SetMplsTtlCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetMplsTtlCase.class.getName());
}
if (action.getActionChoice() instanceof DecMplsTtlCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(),
DecMplsTtlCase.class.getName());
}
if (action.getActionChoice() instanceof PushMplsCase) {
PushMplsCase pushMplsCase = (PushMplsCase) action.getActionChoice();
EtherType etherType = pushMplsCase.getPushMplsAction().getEthertype();
if (etherType != null) {
Assert.assertEquals((Integer) 10, etherType.getValue());
}
}
if (action.getActionChoice() instanceof PopMplsCase) {
PopMplsCase popMplsCase = (PopMplsCase) action.getActionChoice();
Assert.assertEquals((Integer) 10, (popMplsCase.getPopMplsAction().getEthertype().getValue()));
}
if (action.getActionChoice() instanceof
// TODO:SetQueue,I dont have getQueueId
SetQueueCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetQueueCase.class.getName());
}
if (action.getActionChoice() instanceof GroupCase) {
GroupCase groupCase = (GroupCase) action.getActionChoice();
Assert.assertEquals(98, (long) (groupCase.getGroupAction().getGroupId()));
}
if (action.getActionChoice() instanceof PushVlanCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PushVlanCase.class.getName());
}
if (action.getActionChoice() instanceof PopVlanCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopVlanCase.class.getName());
}
if (action.getActionChoice() instanceof SetNwTtlCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), SetNwTtlCase.class.getName());
}
if (action.getActionChoice() instanceof DecNwTtlCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), DecNwTtlCase.class.getName());
}
if (action.getActionChoice() instanceof PushPbbCase) {
PushPbbCase pushPbbCase = (PushPbbCase) action.getActionChoice();
if (pushPbbCase.getPushPbbAction().getEthertype() != null) {
Assert.assertEquals((Integer) 10, pushPbbCase.getPushPbbAction().getEthertype().getValue());
}
}
if (action.getActionChoice() instanceof PopMplsCase) {
Assert.assertEquals(action.getActionChoice().getImplementedInterface().getName(), PopMplsCase.class.getName());
}
if (action.getActionChoice() instanceof SetFieldCase) {
SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice();
Assert.assertNotNull(setFieldCase.getSetFieldAction());
/*
Assert.assertEquals(OpenflowBasicClass.class, sf.getMatchEntry().get(0).getOxmClass());
if (sf.getMatchEntry().get(0).getOxmMatchField().equals(InPort.class)) {
InPortCase inPortCase = ((InPortCase) sf.getMatchEntry().get(0).getMatchEntryValue());
Assert.assertEquals(2125, inPortCase.getInPort().getPortNumber().getValue().intValue());
}
*/
}
}
}
private void OutputActionData() {
OutputActionBuilder outputB = new OutputActionBuilder();
outputB.setMaxLength(10);
Uri uri = new Uri(OutputPortValues.CONTROLLER.toString());
outputB.setOutputNodeConnector(uri);
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new OutputActionCaseBuilder().setOutputAction(outputB.build()).build());
actions.add(actionItem++, AB.build());
}
private void CopyTtlData() {
CopyTtlOutBuilder copyB = new CopyTtlOutBuilder();
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyB.build()).build());
actions.add(actionItem++, AB.build());
CopyTtlInBuilder copyTtlInBuilder = new CopyTtlInBuilder();
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInBuilder.build()).build());
actions.add(actionItem++, AB1.build());
}
private void MplsTtlActionData() {
SetMplsTtlActionBuilder setMplsTtlActionB = new SetMplsTtlActionBuilder();
setMplsTtlActionB.setMplsTtl((short) 10);
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(setMplsTtlActionB.build()).build());
actions.add(actionItem++, AB1.build());
DecMplsTtlBuilder decMplsTtlB = new DecMplsTtlBuilder();
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtlB.build()).build());
actions.add(actionItem++, AB.build());
}
private void vlanActionData() {
PushVlanActionBuilder pvB = new PushVlanActionBuilder();
pvB.setVlanId(new VlanId(10));
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new PushVlanActionCaseBuilder().setPushVlanAction(pvB.build()).build());
actions.add(actionItem++, AB1.build());
PopVlanActionBuilder popVAB = new PopVlanActionBuilder();
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new PopVlanActionCaseBuilder().setPopVlanAction(popVAB.build()).build());
actions.add(actionItem++, AB.build());
}
private void mplsActionData() {
PushMplsActionBuilder pushMB = new PushMplsActionBuilder();
pushMB.setEthernetType(10);
ActionBuilder AB = new ActionBuilder();
AB.setOrder(actionItem).setAction(new PushMplsActionCaseBuilder().setPushMplsAction(pushMB.build()).build());
actions.add(actionItem++, AB.build());
PopMplsActionBuilder popMB = new PopMplsActionBuilder();
popMB.setEthernetType(10);
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new PopMplsActionCaseBuilder().setPopMplsAction(popMB.build()).build());
actions.add(actionItem++, AB1.build());
}
private void setQueueActionData() {
SetQueueActionBuilder setQB = new SetQueueActionBuilder();
setQB.setQueue("99");
ActionBuilder AB1 = new ActionBuilder();
AB1.setOrder(actionItem).setAction(new SetQueueActionCaseBuilder().setSetQueueAction(setQB.build()).build());
actions.add(actionItem++, AB1.build());
}
}