Merge "Fix SwitchIdleEvent echo request-reply xid"
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / PacketOutConvertorTest.java
1 /*\r
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
10 \r
11 import java.math.BigInteger;\r
12 import java.util.ArrayList;\r
13 import java.util.Collections;\r
14 import java.util.List;\r
15 import java.util.Optional;\r
16 import org.junit.Assert;\r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
20 import org.opendaylight.openflowplugin.api.OFConstants;\r
21 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
22 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;\r
23 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.PacketOutConvertorData;\r
24 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;\r
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;\r
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
47 \r
48 /**\r
49  * Created by Jakub Toth jatoth@cisco.com on 9/23/14.\r
50  */\r
51 \r
52 public class PacketOutConvertorTest {\r
53 \r
54     private ConvertorManager convertorManager;\r
55 \r
56     @Before\r
57     public void setUp() {\r
58         convertorManager = ConvertorManagerFactory.createDefaultManager();\r
59     }\r
60 \r
61     /**\r
62      * Test for {@link PacketOutConvertor} with null parameters\r
63      */\r
64     @Test\r
65     public void toPacketOutInputAllParmNullTest() {\r
66 \r
67         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
68 \r
69         Long bufferId = null;\r
70 \r
71         String NODE_ID = "0";\r
72         String port = "0";\r
73 \r
74         NodeRef ref = createNodeRef(NODE_ID);\r
75         NodeConnectorKey nodeConnKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, port);\r
76         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
77                 createNodeConnRef(NODE_ID, nodeConnKey));\r
78 \r
79         transmitPacketInputBuilder.setBufferId(bufferId);\r
80         transmitPacketInputBuilder.setConnectionCookie(null);\r
81         transmitPacketInputBuilder.setAction(null);\r
82         transmitPacketInputBuilder.setNode(ref);\r
83         transmitPacketInputBuilder.setPayload(null);\r
84         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
85         transmitPacketInputBuilder.setIngress(null);\r
86         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
87                 .build();\r
88 \r
89         Short version = (short) 0x04;\r
90         Long xid = null;\r
91         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
92         PacketOutInput message = convert(transmitPacketInput, data);\r
93 \r
94         //FIXME : this has to be fixed along with actions changed in openflowjava\r
95 \r
96         Assert.assertEquals(buildActionForNullTransmitPacketInputAction(nodeConnKey, version), message.getAction());\r
97 \r
98         Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());\r
99         Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());\r
100         Assert.assertEquals(version, message.getVersion());\r
101         Assert.assertEquals(xid, message.getXid());\r
102         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
103     }\r
104 \r
105     /**\r
106      * Test for PacketOutConvertor\r
107      */\r
108     @Test\r
109     public void toPacketOutInputAllParmTest() {\r
110         TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();\r
111 \r
112         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();\r
113         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder ab = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder();\r
114 \r
115         OutputActionBuilder output = new OutputActionBuilder();\r
116         output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);\r
117         Uri value = new Uri(OutputPortValues.CONTROLLER.toString());\r
118         output.setOutputNodeConnector(value);\r
119         ab.setAction(new OutputActionCaseBuilder().setOutputAction(\r
120                 output.build()).build());\r
121         ab.setOrder(0);\r
122         ab.setKey(new ActionKey(0));\r
123         actionList.add(ab.build());\r
124 \r
125         Long bufferId = 0xfL;\r
126 \r
127         Long valueForCookie = 0xeL;\r
128         ConnectionCookie connCook = new ConnectionCookie(valueForCookie);\r
129 \r
130         String NODE_ID = "node:1";\r
131 \r
132         NodeRef ref = createNodeRef(NODE_ID);\r
133 \r
134         String portO = "0xfffffffd";\r
135         NodeConnectorKey nEgrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, portO);\r
136         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(\r
137                 createNodeConnRef(NODE_ID, nEgrConKey));\r
138 \r
139         String inPort = "2";\r
140         NodeConnectorKey nIngrConKey = PacketOutConvertorTest.createNodeConnKey(NODE_ID, inPort);\r
141         NodeConnectorRef nIngressConRef = new NodeConnectorRef(\r
142                 createNodeConnRef(NODE_ID, nIngrConKey));\r
143 \r
144         String _string = new String("sendOutputMsg_TEST");\r
145         byte[] msg = _string.getBytes();\r
146 \r
147         byte[] payload = msg;\r
148 \r
149         transmitPacketInputBuilder.setAction(actionList);\r
150         transmitPacketInputBuilder.setBufferId(bufferId);\r
151         transmitPacketInputBuilder.setConnectionCookie(connCook);\r
152         transmitPacketInputBuilder.setEgress(nEgressConfRef);\r
153         transmitPacketInputBuilder.setIngress(nIngressConRef);\r
154         transmitPacketInputBuilder.setNode(ref);\r
155         transmitPacketInputBuilder.setPayload(payload);\r
156 \r
157         TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder\r
158                 .build();\r
159 \r
160         short version = (short) 0x04;\r
161         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
162         for (int i = 0; i < datapathIdByte.length; i++) {\r
163             datapathIdByte[i] = 1;\r
164         }\r
165         BigInteger datapathId = new BigInteger(1, datapathIdByte);\r
166         Long xid = 0xfffffL;\r
167 \r
168         PacketOutConvertorData data = new PacketOutConvertorData(version);\r
169         data.setXid(xid);\r
170         data.setDatapathId(datapathId);\r
171         PacketOutInput message = convert(transmitPacketInput, data);\r
172 \r
173         Assert.assertEquals(transmitPacketInput.getBufferId(),\r
174                 message.getBufferId());\r
175         Assert.assertEquals("PortNumber [_value=" + inPort + "]", message\r
176                 .getInPort().toString());\r
177         Assert.assertEquals((Object) version,\r
178                 Short.valueOf(message.getVersion()));\r
179         Assert.assertEquals(xid, message.getXid());\r
180 \r
181         ActionConvertorData actionConvertorData = new ActionConvertorData(version);\r
182         actionConvertorData.setDatapathId(datapathId);\r
183 \r
184         Optional<List<Action>> actionsOptional = convertorManager.convert(\r
185                 actionList, actionConvertorData);\r
186 \r
187         List<Action> actions = actionsOptional.orElse(Collections.emptyList());\r
188         Assert.assertEquals(actions, message.getAction());\r
189         Assert.assertArrayEquals(transmitPacketInput.getPayload(), message.getData());\r
190     }\r
191 \r
192     /**\r
193      * create action\r
194      *\r
195      * @param nConKey\r
196      * @param version\r
197      * @return\r
198      */\r
199     private static List<Action> buildActionForNullTransmitPacketInputAction(\r
200             final NodeConnectorKey nConKey, final short version) {\r
201 \r
202         PortNumber outPort = getPortNumber(nConKey, version);\r
203         List<Action> actions = new ArrayList<>();\r
204         ActionBuilder aBuild = new ActionBuilder();\r
205 \r
206         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder outputActionCaseBuilder =\r
207                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder();\r
208 \r
209         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder outputActionBuilder =\r
210                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder();\r
211 \r
212         outputActionBuilder.setPort(outPort);\r
213         outputActionBuilder.setMaxLength(0xffff);\r
214         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());\r
215         aBuild.setActionChoice(outputActionCaseBuilder.build());\r
216         actions.add(aBuild.build());\r
217         return actions;\r
218     }\r
219 \r
220     /**\r
221      * create PortNumber\r
222      *\r
223      * @param nConKey\r
224      * @param ofVersion\r
225      * @return\r
226      */\r
227     private static PortNumber getPortNumber(final NodeConnectorKey nConKey,\r
228                                             final Short ofVersion) {\r
229         Long port = InventoryDataServiceUtil.portNumberfromNodeConnectorId(\r
230                 OpenflowVersion.get(ofVersion), nConKey.getId());\r
231         return new PortNumber(port);\r
232     }\r
233 \r
234     /**\r
235      * create NodeConnectorRef\r
236      *\r
237      * @param nodeId\r
238      * @param nConKey\r
239      * @return\r
240      */\r
241     private static NodeConnectorRef createNodeConnRef(final String nodeId,\r
242                                                       final NodeConnectorKey nConKey) {\r
243 \r
244         InstanceIdentifier<NodeConnector> path = InstanceIdentifier\r
245                 .<Nodes>builder(Nodes.class)\r
246                 .<Node, NodeKey>child(Node.class,\r
247                         new NodeKey(new NodeId(nodeId)))\r
248                 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class,\r
249                         nConKey).build();\r
250 \r
251         return new NodeConnectorRef(path);\r
252     }\r
253 \r
254     /**\r
255      * create NodeConnectorKey\r
256      *\r
257      * @param nodeId\r
258      * @param port\r
259      * @return\r
260      */\r
261     private static NodeConnectorKey createNodeConnKey(final String nodeId,\r
262                                                       final String port) {\r
263         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(\r
264                 port);\r
265 \r
266         return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));\r
267     }\r
268 \r
269     /**\r
270      * create NodeRef\r
271      *\r
272      * @param nodeId\r
273      * @return\r
274      */\r
275     private static NodeRef createNodeRef(final String nodeId) {\r
276         NodeKey key = new NodeKey(new NodeId(nodeId));\r
277         InstanceIdentifier<Node> path = InstanceIdentifier\r
278                 .<Nodes>builder(Nodes.class)\r
279                 .<Node, NodeKey>child(Node.class, key).build();\r
280         return new NodeRef(path);\r
281     }\r
282 \r
283     private PacketOutInput convert(TransmitPacketInput transmitPacketInput, PacketOutConvertorData data) {\r
284         Optional<PacketOutInput> messageOptional = convertorManager.convert(transmitPacketInput, data);\r
285         return messageOptional.orElse(PacketOutConvertor.defaultResult(data.getVersion()));\r
286     }\r
287 }\r