Merge "Migrate openflowplugin tests to use Uint types"
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / PacketOutConvertorTest.java
1 /*
2  * Copyright (c) 2014 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.openflowplugin.openflow.md.core.sal.convertor;
9
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Optional;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.openflowplugin.api.OFConstants;
19 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
21 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.XidConvertorData;
22 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.common.Uint16;
46 import org.opendaylight.yangtools.yang.common.Uint32;
47 import org.opendaylight.yangtools.yang.common.Uint64;
48 import org.opendaylight.yangtools.yang.common.Uint8;
49
50 /**
51  * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
52  */
53 public class PacketOutConvertorTest {
54
55     private ConvertorManager convertorManager;
56
57     @Before
58     public void setUp() {
59         convertorManager = ConvertorManagerFactory.createDefaultManager();
60     }
61
62     /**
63      * Test for {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PacketOutConvertor}
64      *  with null parameters.
65      */
66     @Test
67     public void toPacketOutInputAllParmNullTest() {
68
69         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
70
71         String nodeId = "0";
72         String port = "0";
73
74         NodeRef ref = createNodeRef(nodeId);
75         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(nodeId, port);
76         NodeConnectorRef egressConfRef = new NodeConnectorRef(
77                 createNodeConnRef(nodeId, nodeConnKey));
78
79         transmitPacketInputBuilder.setBufferId((Uint32) null);
80         transmitPacketInputBuilder.setConnectionCookie(null);
81         transmitPacketInputBuilder.setNode(ref);
82         transmitPacketInputBuilder.setPayload(null);
83         transmitPacketInputBuilder.setEgress(egressConfRef);
84         transmitPacketInputBuilder.setIngress(null);
85         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
86                 .build();
87
88         Short version = (short) 0x04;
89         Long xid = null;
90         XidConvertorData data = new XidConvertorData(version);
91         PacketOutInput message = convert(transmitPacketInput, data);
92
93         //FIXME : this has to be fixed along with actions changed in openflowjava
94
95         Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());
96
97         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());
98         Assert.assertEquals(new PortNumber(Uint32.valueOf(0xfffffffdL)), message.getInPort());
99         Assert.assertEquals(Uint8.valueOf(version), message.getVersion());
100         Assert.assertEquals(xid, message.getXid());
101         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
102     }
103
104     /**
105      * Test for XidConvertorData.
106      */
107     @Test
108     public void toPacketOutInputAllParmTest() {
109         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder ab =
110                 new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder();
111
112         OutputActionBuilder output = new OutputActionBuilder();
113         output.setMaxLength(Uint16.valueOf(OFConstants.OFPCML_NO_BUFFER));
114         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
115         output.setOutputNodeConnector(value);
116         ab.setAction(new OutputActionCaseBuilder().setOutputAction(
117                 output.build()).build());
118         ab.setOrder(0);
119         ab.withKey(new ActionKey(0));
120
121         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList =
122                 new ArrayList<>();
123         actionList.add(ab.build());
124
125         final Uint32 bufferId = Uint32.valueOf(0xf);
126
127         final Uint32 valueForCookie = Uint32.valueOf(0xe);
128         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
129
130         String nodeId = "node:1";
131
132         NodeRef ref = createNodeRef(nodeId);
133
134         String portO = "0xfffffffd";
135         NodeConnectorKey egrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, portO);
136         NodeConnectorRef egressConfRef = new NodeConnectorRef(
137                 createNodeConnRef(nodeId, egrConKey));
138
139         String inPort = "2";
140         NodeConnectorKey ingrConKey = PacketOutConvertorTest.createNodeConnKey(nodeId, inPort);
141         NodeConnectorRef ingressConRef = new NodeConnectorRef(
142                 createNodeConnRef(nodeId, ingrConKey));
143
144         String string = new String("sendOutputMsg_TEST");
145         byte[] msg = string.getBytes();
146
147         byte[] payload = msg;
148
149         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
150         transmitPacketInputBuilder.setAction(actionList);
151         transmitPacketInputBuilder.setBufferId(bufferId);
152         transmitPacketInputBuilder.setConnectionCookie(connCook);
153         transmitPacketInputBuilder.setEgress(egressConfRef);
154         transmitPacketInputBuilder.setIngress(ingressConRef);
155         transmitPacketInputBuilder.setNode(ref);
156         transmitPacketInputBuilder.setPayload(payload);
157
158         final TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder.build();
159
160         Short version = (short) 0x04;
161         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
162         for (int i = 0; i < datapathIdByte.length; i++) {
163             datapathIdByte[i] = 1;
164         }
165         Uint64 datapathId = Uint64.valueOf(new BigInteger(1, datapathIdByte));
166         Uint32 xid = Uint32.valueOf(0xfffffL);
167
168         XidConvertorData data = new XidConvertorData(version);
169         data.setXid(xid);
170         data.setDatapathId(datapathId);
171         PacketOutInput message = convert(transmitPacketInput, data);
172
173         Assert.assertEquals(transmitPacketInput.getBufferId(), message.getBufferId());
174         Assert.assertEquals(Uint32.valueOf(inPort), message.getInPort().getValue());
175         Assert.assertEquals(Uint8.valueOf(version), message.getVersion());
176         Assert.assertEquals(xid, message.getXid());
177
178         ActionConvertorData actionConvertorData = new ActionConvertorData(version);
179         actionConvertorData.setDatapathId(datapathId);
180
181         Optional<List<Action>> actionsOptional = convertorManager.convert(actionList, actionConvertorData);
182
183         List<Action> actions = actionsOptional.orElse(null);
184         Assert.assertEquals(actions, message.getAction());
185         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());
186     }
187
188     private static List<Action> buildActionForNullTransmitPacketInputAction(
189             final NodeConnectorKey nodeConKey, final short version) {
190
191         PortNumber outPort = getPortNumber(nodeConKey, version);
192
193         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
194             .OutputActionCaseBuilder outputActionCaseBuilder =
195                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
196                     .action.choice.OutputActionCaseBuilder();
197
198         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice
199             .output.action._case.OutputActionBuilder outputActionBuilder =
200                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping
201                     .action.choice.output.action._case.OutputActionBuilder();
202
203         outputActionBuilder.setPort(outPort);
204         outputActionBuilder.setMaxLength(Uint16.MAX_VALUE);
205         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());
206         ActionBuilder actionBuilder = new ActionBuilder();
207         actionBuilder.setActionChoice(outputActionCaseBuilder.build());
208
209         List<Action> actions = new ArrayList<>();
210         actions.add(actionBuilder.build());
211         return actions;
212     }
213
214     private static PortNumber getPortNumber(final NodeConnectorKey nodeConKey, final Short ofVersion) {
215         Uint32 port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.get(ofVersion),
216                 nodeConKey.getId());
217         return new PortNumber(port);
218     }
219
220     private static NodeConnectorRef createNodeConnRef(final String nodeId, final NodeConnectorKey nodeConKey) {
221         InstanceIdentifier<NodeConnector> path = InstanceIdentifier
222                 .builder(Nodes.class)
223                 .child(Node.class,
224                         new NodeKey(new NodeId(nodeId)))
225                 .child(NodeConnector.class,
226                         nodeConKey).build();
227
228         return new NodeConnectorRef(path);
229     }
230
231     private static NodeConnectorKey createNodeConnKey(final String nodeId, final String port) {
232         StringBuilder builder = new StringBuilder(nodeId).append(':').append(port);
233
234         return new NodeConnectorKey(new NodeConnectorId(builder.toString()));
235     }
236
237     private static NodeRef createNodeRef(final String nodeId) {
238         NodeKey key = new NodeKey(new NodeId(nodeId));
239         InstanceIdentifier<Node> path = InstanceIdentifier
240                 .builder(Nodes.class)
241                 .child(Node.class, key).build();
242         return new NodeRef(path);
243     }
244
245     private PacketOutInput convert(final TransmitPacketInput transmitPacketInput, final XidConvertorData data) {
246         Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);
247         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));
248     }
249 }