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