/**
* Copyright (c) 2016, 2017 Cisco Systems, Inc. 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.openflowjava.nx.codec.action;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.openflowjava.nx.api.NiciraConstants;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
public class ConntrackCodecTest {
private ConntrackCodec conntrackCodec;
private ByteBuf buffer;
private Action action;
private final int length = 24;
private final byte nxastConntrackSubtype = 35;
private final int nxNatLengthAction1 = 32;
private final int nxNatLengthAction2 = 24;
private final byte nxastNatSubtype = 36;
@Before
public void setUp() {
conntrackCodec = new ConntrackCodec();
buffer = ByteBufAllocator.DEFAULT.buffer();
}
@Test
public void serializeTest() {
action = createAction();
conntrackCodec.serialize(action, buffer);
Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readableBytes());
Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readUnsignedShort());
Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
Assert.assertEquals(1, buffer.readUnsignedShort());
Assert.assertEquals(2, buffer.readUnsignedInt());
Assert.assertEquals(3, buffer.readUnsignedShort());
Assert.assertEquals(4, buffer.readByte());
buffer.skipBytes(5);
Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
buffer.skipBytes(2);
Assert.assertEquals(5, buffer.readUnsignedShort());
Assert.assertEquals(0x3F, buffer.readUnsignedShort());
Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
Assert.assertEquals(3000, buffer.readUnsignedShort());
Assert.assertEquals(4000, buffer.readUnsignedShort());
buffer.skipBytes(4);
Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
buffer.skipBytes(2);
Assert.assertEquals(5, buffer.readUnsignedShort());
Assert.assertEquals(0x21, buffer.readUnsignedShort());
Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
Assert.assertEquals(4000, buffer.readUnsignedShort());
buffer.skipBytes(2);
}
@Test
public void serializeTestWithoutCtAction() {
action = createActionWithoutCtAction();
conntrackCodec.serialize(action, buffer);
Assert.assertEquals(24, buffer.readableBytes());
Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
Assert.assertEquals(length, buffer.readUnsignedShort());
Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
Assert.assertEquals(1, buffer.readUnsignedShort());
Assert.assertEquals(2, buffer.readUnsignedInt());
Assert.assertEquals(3, buffer.readUnsignedShort());
Assert.assertEquals(4, buffer.readByte());
buffer.skipBytes(5);
}
@Test
public void deserializeTest() {
createBufer(buffer);
action = conntrackCodec.deserialize(buffer);
ActionConntrack result = (ActionConntrack) action.getActionChoice();
Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
NxActionNat natAction = nxActionNatCase.getNxActionNat();
Assert.assertEquals(5, natAction.getFlags().shortValue());
Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
Assert.assertEquals(3000, natAction.getPortMin().shortValue());
Assert.assertEquals(4000, natAction.getPortMax().shortValue());
nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
natAction = nxActionNatCase.getNxActionNat();
Assert.assertEquals(5, natAction.getFlags().shortValue());
Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
Assert.assertEquals(4000, natAction.getPortMax().shortValue());
}
@Test
public void deserializeTestWithoutCtAction() {
createBuferWIthoutCtAction(buffer);
action = conntrackCodec.deserialize(buffer);
ActionConntrack result = (ActionConntrack) action.getActionChoice();
Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
}
private Action createAction() {
NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
nxActionConntrackBuilder.setFlags(1);
nxActionConntrackBuilder.setZoneSrc((long) 2);
nxActionConntrackBuilder.setConntrackZone(3);
nxActionConntrackBuilder.setRecircTable((short) 4);
NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
nxActionNatBuilder.setFlags(5);
nxActionNatBuilder.setRangePresent(0x3F);
nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
nxActionNatBuilder.setIpAddressMax(new IpAddress("192.168.10.0".toCharArray()));
nxActionNatBuilder.setPortMin(3000);
nxActionNatBuilder.setPortMax(4000);
NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
List<CtActions> ctActionsList = new ArrayList<>();
ctActionsList.add(ctActionsBuilder.build());
nxActionNatBuilder = new NxActionNatBuilder();
nxActionNatBuilder.setFlags(5);
nxActionNatBuilder.setRangePresent(0x21);
nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
nxActionNatBuilder.setPortMax(4000);
nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
ctActionsBuilder = new CtActionsBuilder();
ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
ctActionsList.add(ctActionsBuilder.build());
nxActionConntrackBuilder.setCtActions(ctActionsList);
ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
ActionBuilder actionBuilder = new ActionBuilder();
actionBuilder.setExperimenterId(experimenterId);
ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
actionBuilder.setActionChoice(actionConntrackBuilder.build());
return actionBuilder.build();
}
private Action createActionWithoutCtAction() {
NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
nxActionConntrackBuilder.setFlags(1);
nxActionConntrackBuilder.setZoneSrc((long) 2);
nxActionConntrackBuilder.setConntrackZone(3);
nxActionConntrackBuilder.setRecircTable((short) 4);
ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
ActionBuilder actionBuilder = new ActionBuilder();
actionBuilder.setExperimenterId(experimenterId);
ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
actionBuilder.setActionChoice(actionConntrackBuilder.build());
return actionBuilder.build();
}
private void createBufer(ByteBuf message) {
message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2);
message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
message.writeShort(nxastConntrackSubtype);
//FLAG = 1
message.writeShort(1);
//ZONE_SRC = 2
message.writeInt(2);
//CONNTRACK_ZONE = 3
message.writeShort(3);
//RECIRC_TABLE = 4
message.writeByte(4);
//ADDS 5 empty bytes
message.writeZero(5);
message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
message.writeShort(nxNatLengthAction1);
message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
message.writeShort(nxastNatSubtype);
message.writeZero(2);
//NAT FLAG
message.writeShort(5);
//RANGE PRESENT
message.writeShort(0x3F);
//IP ADDRESS MIN
message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
//IP ADDRESS MAX
message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
//PORT MIN
message.writeShort(3000);
//PORT MAX
message.writeShort(4000);
message.writeZero(4);
message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
message.writeShort(nxNatLengthAction2);
message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
message.writeShort(nxastNatSubtype);
message.writeZero(2);
//NAT FLAG
message.writeShort(5);
//RANGE PRESENT
message.writeShort(0x21);
//IP ADDRESS MIN
message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
//PORT MAX
message.writeShort(4000);
message.writeZero(2);
}
private void createBuferWIthoutCtAction(ByteBuf message) {
message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
message.writeShort(length);
message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
message.writeShort(nxastConntrackSubtype);
//FLAG = 1
message.writeShort(1);
//ZONE_SRC = 2
message.writeInt(2);
//CONNTRACK_ZONE = 3
message.writeShort(3);
//RECIRC_TABLE = 4
message.writeByte(4);
//ADDS 5 empty bytes
message.writeZero(5);
}
}