Merge "Bug 8408 - Deserialization exception in logs when NAT flows are added."
[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
9 package org.opendaylight.openflowjava.nx.codec.action;
10
11 import io.netty.buffer.ByteBuf;
12 import io.netty.buffer.ByteBufAllocator;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.openflowjava.nx.api.NiciraConstants;
21 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
37
38 public class ConntrackCodecTest {
39
40     private ConntrackCodec conntrackCodec;
41
42     private ByteBuf buffer;
43     private Action action;
44
45     private final int length = 24;
46     private final byte nxastConntrackSubtype = 35;
47     private final int nxNatLengthAction1 = 32;
48     private final int nxNatLengthAction2 = 24;
49     private final byte nxastNatSubtype = 36;
50
51     @Before
52     public void setUp() {
53         conntrackCodec = new ConntrackCodec();
54         buffer = ByteBufAllocator.DEFAULT.buffer();
55     }
56
57     @Test
58     public void serializeTest() {
59         action = createAction();
60         conntrackCodec.serialize(action, buffer);
61
62         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readableBytes());
63         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
64         Assert.assertEquals(length + nxNatLengthAction1 + nxNatLengthAction2, buffer.readUnsignedShort());
65         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
66         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
67         Assert.assertEquals(1, buffer.readUnsignedShort());
68         Assert.assertEquals(2, buffer.readUnsignedInt());
69         Assert.assertEquals(3, buffer.readUnsignedShort());
70         Assert.assertEquals(4, buffer.readByte());
71         buffer.skipBytes(5);
72         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
73         Assert.assertEquals(nxNatLengthAction1, buffer.readUnsignedShort());
74         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
75         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
76         buffer.skipBytes(2);
77         Assert.assertEquals(5, buffer.readUnsignedShort());
78         Assert.assertEquals(0x3F, buffer.readUnsignedShort());
79         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
80         Assert.assertEquals(3232238080L, buffer.readUnsignedInt());
81         Assert.assertEquals(3000, buffer.readUnsignedShort());
82         Assert.assertEquals(4000, buffer.readUnsignedShort());
83         buffer.skipBytes(4);
84         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
85         Assert.assertEquals(nxNatLengthAction2, buffer.readUnsignedShort());
86         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
87         Assert.assertEquals(nxastNatSubtype, buffer.readUnsignedShort());
88         buffer.skipBytes(2);
89         Assert.assertEquals(5, buffer.readUnsignedShort());
90         Assert.assertEquals(0x21, buffer.readUnsignedShort());
91         Assert.assertEquals(3232235520L, buffer.readUnsignedInt());
92         Assert.assertEquals(4000, buffer.readUnsignedShort());
93         buffer.skipBytes(2);
94     }
95
96     @Test
97     public void serializeTestWithoutCtAction() {
98         action = createActionWithoutCtAction();
99         conntrackCodec.serialize(action, buffer);
100
101         Assert.assertEquals(24, buffer.readableBytes());
102         Assert.assertEquals(EncodeConstants.EXPERIMENTER_VALUE, buffer.readUnsignedShort());
103         Assert.assertEquals(length, buffer.readUnsignedShort());
104         Assert.assertEquals(NiciraConstants.NX_VENDOR_ID.intValue(), buffer.readUnsignedInt());
105         Assert.assertEquals(nxastConntrackSubtype, buffer.readUnsignedShort());
106         Assert.assertEquals(1, buffer.readUnsignedShort());
107         Assert.assertEquals(2, buffer.readUnsignedInt());
108         Assert.assertEquals(3, buffer.readUnsignedShort());
109         Assert.assertEquals(4, buffer.readByte());
110         buffer.skipBytes(5);
111     }
112
113     @Test
114     public void deserializeTest() {
115         createBufer(buffer);
116         action = conntrackCodec.deserialize(buffer);
117
118         ActionConntrack result = (ActionConntrack) action.getActionChoice();
119
120         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
121         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
122         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
123         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
124         List<CtActions> ctActions = result.getNxActionConntrack().getCtActions();
125         NxActionNatCase nxActionNatCase = (NxActionNatCase) ctActions.get(0).getOfpactActions();
126         NxActionNat natAction = nxActionNatCase.getNxActionNat();
127         Assert.assertEquals(5, natAction.getFlags().shortValue());
128         Assert.assertEquals(0x3F, natAction.getRangePresent().intValue());
129         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
130         Assert.assertEquals("192.168.10.0", natAction.getIpAddressMax().getIpv4Address().getValue());
131         Assert.assertEquals(3000, natAction.getPortMin().shortValue());
132         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
133         nxActionNatCase = (NxActionNatCase) ctActions.get(1).getOfpactActions();
134         natAction = nxActionNatCase.getNxActionNat();
135         Assert.assertEquals(5, natAction.getFlags().shortValue());
136         Assert.assertEquals(0x21, natAction.getRangePresent().intValue());
137         Assert.assertEquals("192.168.0.0", natAction.getIpAddressMin().getIpv4Address().getValue());
138         Assert.assertEquals(4000, natAction.getPortMax().shortValue());
139     }
140
141     @Test
142     public void deserializeTestWithoutCtAction() {
143         createBuferWIthoutCtAction(buffer);
144         action = conntrackCodec.deserialize(buffer);
145
146         ActionConntrack result = (ActionConntrack) action.getActionChoice();
147
148         Assert.assertEquals(1, result.getNxActionConntrack().getFlags().shortValue());
149         Assert.assertEquals(2, result.getNxActionConntrack().getZoneSrc().intValue());
150         Assert.assertEquals(3, result.getNxActionConntrack().getConntrackZone().shortValue());
151         Assert.assertEquals(4, result.getNxActionConntrack().getRecircTable().byteValue());
152     }
153
154     private Action createAction() {
155
156         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
157         nxActionConntrackBuilder.setFlags(1);
158         nxActionConntrackBuilder.setZoneSrc((long) 2);
159         nxActionConntrackBuilder.setConntrackZone(3);
160         nxActionConntrackBuilder.setRecircTable((short) 4);
161
162         NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
163         nxActionNatBuilder.setFlags(5);
164         nxActionNatBuilder.setRangePresent(0x3F);
165         nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
166         nxActionNatBuilder.setIpAddressMax(new IpAddress("192.168.10.0".toCharArray()));
167         nxActionNatBuilder.setPortMin(3000);
168         nxActionNatBuilder.setPortMax(4000);
169         NxActionNatCaseBuilder nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
170         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
171         CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
172         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
173         List<CtActions> ctActionsList = new  ArrayList<>();
174         ctActionsList.add(ctActionsBuilder.build());
175         nxActionNatBuilder = new NxActionNatBuilder();
176         nxActionNatBuilder.setFlags(5);
177         nxActionNatBuilder.setRangePresent(0x21);
178         nxActionNatBuilder.setIpAddressMin(new IpAddress("192.168.0.0".toCharArray()));
179         nxActionNatBuilder.setPortMax(4000);
180         nxActionNatCaseBuilder = new NxActionNatCaseBuilder();
181         nxActionNatCaseBuilder.setNxActionNat(nxActionNatBuilder.build());
182         ctActionsBuilder = new CtActionsBuilder();
183         ctActionsBuilder.setOfpactActions(nxActionNatCaseBuilder.build());
184         ctActionsList.add(ctActionsBuilder.build());
185         nxActionConntrackBuilder.setCtActions(ctActionsList);
186
187         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
188         ActionBuilder actionBuilder = new ActionBuilder();
189         actionBuilder.setExperimenterId(experimenterId);
190         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
191         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
192         actionBuilder.setActionChoice(actionConntrackBuilder.build());
193
194         return actionBuilder.build();
195     }
196
197     private Action createActionWithoutCtAction() {
198
199         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
200         nxActionConntrackBuilder.setFlags(1);
201         nxActionConntrackBuilder.setZoneSrc((long) 2);
202         nxActionConntrackBuilder.setConntrackZone(3);
203         nxActionConntrackBuilder.setRecircTable((short) 4);
204
205         ExperimenterId experimenterId = new ExperimenterId(NiciraConstants.NX_VENDOR_ID);
206         ActionBuilder actionBuilder = new ActionBuilder();
207         actionBuilder.setExperimenterId(experimenterId);
208         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
209         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
210         actionBuilder.setActionChoice(actionConntrackBuilder.build());
211
212         return actionBuilder.build();
213     }
214
215     private void createBufer(ByteBuf message) {
216         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
217         message.writeShort(length + nxNatLengthAction1 + nxNatLengthAction2);
218         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
219         message.writeShort(nxastConntrackSubtype);
220         //FLAG = 1
221         message.writeShort(1);
222         //ZONE_SRC = 2
223         message.writeInt(2);
224         //CONNTRACK_ZONE = 3
225         message.writeShort(3);
226         //RECIRC_TABLE = 4
227         message.writeByte(4);
228         //ADDS 5 empty bytes
229         message.writeZero(5);
230         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
231         message.writeShort(nxNatLengthAction1);
232         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
233         message.writeShort(nxastNatSubtype);
234         message.writeZero(2);
235         //NAT FLAG
236         message.writeShort(5);
237         //RANGE PRESENT
238         message.writeShort(0x3F);
239         //IP ADDRESS MIN
240         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
241         //IP ADDRESS MAX
242         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.10.0")));
243         //PORT MIN
244         message.writeShort(3000);
245         //PORT MAX
246         message.writeShort(4000);
247         message.writeZero(4);
248
249         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
250         message.writeShort(nxNatLengthAction2);
251         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
252         message.writeShort(nxastNatSubtype);
253         message.writeZero(2);
254         //NAT FLAG
255         message.writeShort(5);
256         //RANGE PRESENT
257         message.writeShort(0x21);
258         //IP ADDRESS MIN
259         message.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(new Ipv4Address("192.168.0.0")));
260         //PORT MAX
261         message.writeShort(4000);
262         message.writeZero(2);
263     }
264
265     private void createBuferWIthoutCtAction(ByteBuf message) {
266         message.writeShort(EncodeConstants.EXPERIMENTER_VALUE);
267         message.writeShort(length);
268         message.writeInt(NiciraConstants.NX_VENDOR_ID.intValue());
269         message.writeShort(nxastConntrackSubtype);
270         //FLAG = 1
271         message.writeShort(1);
272         //ZONE_SRC = 2
273         message.writeInt(2);
274         //CONNTRACK_ZONE = 3
275         message.writeShort(3);
276         //RECIRC_TABLE = 4
277         message.writeByte(4);
278         //ADDS 5 empty bytes
279         message.writeZero(5);
280     }
281 }