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