Make methods static
[openflowplugin.git] / extension / openflowjava-extension-nicira / src / test / java / org / opendaylight / openflowjava / nx / codec / action / ConntrackCodecTest.java
1 /*
2  * Copyright (c) 2016, 2017 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.openflowjava.nx.codec.action;
9
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.ByteBufAllocator;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMark;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
38
39 public class ConntrackCodecTest {
40
41     private ConntrackCodec conntrackCodec;
42
43     private ByteBuf buffer;
44     private Action action;
45
46     private final int length = 24;
47     private final byte nxastConntrackSubtype = 35;
48     private final int nxNatLengthAction1 = 32;
49     private final int nxNatLengthAction2 = 24;
50     private final byte nxastNatSubtype = 36;
51
52     private final byte nxmCtMarkFieldCode = 107;
53     private final byte setFieldCode = 25;
54     private final int setFieldLength = 16;
55
56     @Before
57     public void setUp() {
58         conntrackCodec = new ConntrackCodec();
59         buffer = ByteBufAllocator.DEFAULT.buffer();
60     }
61
62     @Test
63     public void serializeTest() {
64         action = createAction();
65         conntrackCodec.serialize(action, buffer);
66
67         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength, buffer.readableBytes());
68         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
69         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength,
70                 buffer.readUnsignedShort());
71         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
72         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
73         Assert.assertEquals(1, buffer.readUnsignedShort());
74         Assert.assertEquals(2, buffer.readUnsignedInt());
75         Assert.assertEquals(3, buffer.readUnsignedShort());
76         Assert.assertEquals(4, buffer.readByte());
77         buffer.skipBytes(5);
78         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
79         Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
80         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
81         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
82         buffer.skipBytes(2);
83         Assert.assertEquals(5, buffer.readUnsignedShort());
84         Assert.assertEquals(0x3F, buffer.readUnsignedShort());
85         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
86         Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
87         Assert.assertEquals(3000, buffer.readUnsignedShort());
88         Assert.assertEquals(4000, buffer.readUnsignedShort());
89         buffer.skipBytes(4);
90         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
91         Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
92         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
93         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
94         buffer.skipBytes(2);
95         Assert.assertEquals(5, buffer.readUnsignedShort());
96         Assert.assertEquals(0x21, buffer.readUnsignedShort());
97         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
98         Assert.assertEquals(4000, buffer.readUnsignedShort());
99         buffer.skipBytes(2);
100         Assert.assertEquals(setFieldCode, buffer.readUnsignedShort());
101         Assert.assertEquals(setFieldLength, buffer.readUnsignedShort());
102         buffer.skipBytes(2);
103         Assert.assertEquals(nxmCtMarkFieldCode << 1, buffer.readByte() & 0xFF);
104         buffer.skipBytes(1);
105         Assert.assertEquals(36, buffer.readUnsignedInt());
106         buffer.skipBytes(4);
107     }
108
109     @Test
110     public void serializeTestWithoutCtAction() {
111         action = createActionWithoutCtAction();
112         conntrackCodec.serialize(action, buffer);
113
114         Assert.assertEquals(24, buffer.readableBytes());
115         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
116         Assert.assertEquals(length, buffer.readUnsignedShort());
117         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
118         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
119         Assert.assertEquals(1, buffer.readUnsignedShort());
120         Assert.assertEquals(2, buffer.readUnsignedInt());
121         Assert.assertEquals(3, buffer.readUnsignedShort());
122         Assert.assertEquals(4, buffer.readByte());
123         buffer.skipBytes(5);
124     }
125
126     @Test
127     public void deserializeTest() {
128         createBuffer(buffer);
129         action = conntrackCodec.deserialize(buffer);
130         ActionConntrack result = (ActionConntrack) action.getActionChoice();
131
132         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
133         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
134         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
135         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
136         List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
137         NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
138         NxActionNat natAction = nxActionNatCase.getNxActionNat();
139         Assert.assertEquals(5, natAction.getFlags().shortValue());
140         Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
141         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
142         Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
143         Assert.assertEquals(3000, natAction.getPortMin().shortValue());
144         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
145         nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
146         natAction = nxActionNatCase.getNxActionNat();
147         Assert.assertEquals(5, natAction.getFlags().shortValue());
148         Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
149         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
150         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
151         NxActionCtMarkCase nxActionCtMarkCase = (NxActionCtMarkCase) ctActions.get(2).getOfpactActions();
152         NxActionCtMark ctMarkAction = nxActionCtMarkCase.getNxActionCtMark();
153         Assert.assertEquals(36, ctMarkAction.getCtMark().longValue());
154     }
155
156     @Test
157     public void deserializeTestWithoutCtAction() {
158         createBufferWIthoutCtAction(buffer);
159         action = conntrackCodec.deserialize(buffer);
160
161         ActionConntrack result = (ActionConntrack) action.getActionChoice();
162
163         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
164         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
165         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
166         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
167     }
168
169     private static Action createAction() {
170
171         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
172         nxActionConntrackBuilder.setFlags(1);
173         nxActionConntrackBuilder.setZoneSrc((long) 2);
174         nxActionConntrackBuilder.setConntrackZone(3);
175         nxActionConntrackBuilder.setRecircTable((short) 4);
176
177         NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
178         nxActionNatBuilder.setFlags(5);
179         nxActionNatBuilder.setRangePresent(0x3F);
180         nxActionNatBuilder.setIpAddressMin(IpAddressBuilder.getDefaultInstance("192.168.0.0"));
181         nxActionNatBuilder.setIpAddressMax(IpAddressBuilder.getDefaultInstance("192.168.10.0"));
182         nxActionNatBuilder.setPortMin(3000);
183         nxActionNatBuilder.setPortMax(4000);
184         NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
185         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
186         CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
187         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
188         List<CtActions> ctActionsList = new  ArrayList<>();
189         ctActionsList.add(ctActionsBuilder.build());
190         nxActionNatBuilder = new NxActionNatBuilder();
191         nxActionNatBuilder.setFlags(5);
192         nxActionNatBuilder.setRangePresent(0x21);
193         nxActionNatBuilder.setIpAddressMin(IpAddressBuilder.getDefaultInstance("192.168.0.0"));
194         nxActionNatBuilder.setPortMax(4000);
195         nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
196         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
197         ctActionsBuilder = new CtActionsBuilder();
198         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
199         ctActionsList.add(ctActionsBuilder.build());
200         nxActionConntrackBuilder.setCtActions(ctActionsList);
201
202         NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder();
203         nxActionCtMarkBuilder.setCtMark((long) 36);
204         NxActionCtMarkCaseBuilder nxActionCtMarkCaseBuilder = new NxActionCtMarkCaseBuilder();
205         nxActionCtMarkCaseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
206         ctActionsBuilder = new CtActionsBuilder();
207         ctActionsBuilder.setOfpactActions(nxActionCtMarkCaseBuilder.build());
208         ctActionsList.add(ctActionsBuilder.build());
209         nxActionConntrackBuilder.setCtActions(ctActionsList);
210
211         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
212         ActionBuilder actionBuilder = new ActionBuilder();
213         actionBuilder.setExperimenterId(experimenterId);
214         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
215         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
216         actionBuilder.setActionChoice(actionConntrackBuilder.build());
217
218         return actionBuilder.build();
219     }
220
221     private static Action createActionWithoutCtAction() {
222
223         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
224         nxActionConntrackBuilder.setFlags(1);
225         nxActionConntrackBuilder.setZoneSrc((long) 2);
226         nxActionConntrackBuilder.setConntrackZone(3);
227         nxActionConntrackBuilder.setRecircTable((short) 4);
228
229         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
230         ActionBuilder actionBuilder = new ActionBuilder();
231         actionBuilder.setExperimenterId(experimenterId);
232         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
233         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
234         actionBuilder.setActionChoice(actionConntrackBuilder.build());
235
236         return actionBuilder.build();
237     }
238
239     private void createBuffer(final ByteBuf message) {
240         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
241         message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2 + setFieldLength);
242         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
243         message.writeShort(nxastConntrackSubtype);
244         //FLAG = 1
245         message.writeShort(1);
246         //ZONE_SRC = 2
247         message.writeInt(2);
248         //CONNTRACK_ZONE = 3
249         message.writeShort(3);
250         //RECIRC_TABLE = 4
251         message.writeByte(4);
252         //ADDS 5 empty bytes
253         message.writeZero(5);
254         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
255         message.writeShort(nxNatLengthAction1);
256         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
257         message.writeShort(nxastNatSubtype);
258         message.writeZero(2);
259         //NAT FLAG
260         message.writeShort(5);
261         //RANGE PRESENT
262         message.writeShort(0x3F);
263         //IP ADDRESS MIN
264         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
265         //IP ADDRESS MAX
266         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
267         //PORT MIN
268         message.writeShort(3000);
269         //PORT MAX
270         message.writeShort(4000);
271         message.writeZero(4);
272
273         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
274         message.writeShort(nxNatLengthAction2);
275         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
276         message.writeShort(nxastNatSubtype);
277         message.writeZero(2);
278         //NAT FLAG
279         message.writeShort(5);
280         //RANGE PRESENT
281         message.writeShort(0x21);
282         //IP ADDRESS MIN
283         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
284         //PORT MAX
285         message.writeShort(4000);
286         message.writeZero(2);
287
288         message.writeShort(setFieldCode);
289         message.writeShort(setFieldLength);
290         message.writeZero(1);
291         message.writeByte(1);
292         message.writeByte(nxmCtMarkFieldCode << 1);
293         message.writeByte(4);
294         // value of ct_mark
295         message.writeInt(36);
296         message.writeZero(4);
297     }
298
299     private void createBufferWIthoutCtAction(final ByteBuf message) {
300         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
301         message.writeShort(length);
302         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
303         message.writeShort(nxastConntrackSubtype);
304         //FLAG = 1
305         message.writeShort(1);
306         //ZONE_SRC = 2
307         message.writeInt(2);
308         //CONNTRACK_ZONE = 3
309         message.writeShort(3);
310         //RECIRC_TABLE = 4
311         message.writeByte(4);
312         //ADDS 5 empty bytes
313         message.writeZero(5);
314     }
315 }