2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
\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
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
\r
11 import java.math.BigInteger;
\r
12 import java.util.ArrayList;
\r
13 import java.util.List;
\r
15 import org.junit.Assert;
\r
16 import org.junit.Before;
\r
17 import org.junit.Test;
\r
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
\r
19 import org.opendaylight.openflowplugin.api.OFConstants;
\r
20 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
\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.augments.rev131002.MaxLengthAction;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
\r
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
\r
50 * Created by Jakub Toth jatoth@cisco.com on 9/23/14.
\r
53 public class PacketOutConvertorTest{
\r
57 OpenflowPortsUtil.init();
\r
61 * Test for {@link PacketOutConvertor} with null parameters
\r
64 public void toPacketOutInputAllParmNullTest(){
\r
66 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\r
68 Long bufferId = null;
\r
70 String NODE_ID = "0";
\r
73 NodeRef ref = createNodeRef(NODE_ID);
\r
74 NodeConnectorKey nodeConnKey = this.createNodeConnKey(NODE_ID, port);
\r
75 NodeConnectorRef nEgressConfRef = new NodeConnectorRef(
\r
76 createNodeConnRef(NODE_ID, nodeConnKey));
\r
78 transmitPacketInputBuilder.setBufferId(bufferId);
\r
79 transmitPacketInputBuilder.setConnectionCookie(null);
\r
80 transmitPacketInputBuilder.setAction(null);
\r
81 transmitPacketInputBuilder.setNode(ref);
\r
82 transmitPacketInputBuilder.setPayload(null);
\r
83 transmitPacketInputBuilder.setEgress(nEgressConfRef);
\r
84 transmitPacketInputBuilder.setIngress(null);
\r
85 TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
\r
88 Short version = (short) 0x04;
\r
90 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
91 transmitPacketInput, version, null, null);
\r
93 Assert.assertEquals(this.buildActionForNullTransmitPacketInputAction(nodeConnKey,
\r
94 version), message.getAction());
\r
95 Assert.assertEquals(OFConstants.OFP_NO_BUFFER, message.getBufferId());
\r
96 Assert.assertEquals(new PortNumber(0xfffffffdL), message.getInPort());
\r
97 Assert.assertEquals(version, message.getVersion());
\r
98 Assert.assertEquals(xid, message.getXid());
\r
99 Assert.assertEquals(transmitPacketInput.getPayload(), message.getData());
\r
103 * Test for PacketOutConvertor
\r
106 public void toPacketOutInputAllParmTest(){
\r
107 TransmitPacketInputBuilder transmitPacketInputBuilder = new TransmitPacketInputBuilder();
\r
109 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionList = new ArrayList<>();
\r
110 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
112 OutputActionBuilder output = new OutputActionBuilder();
\r
113 output.setMaxLength(OFConstants.OFPCML_NO_BUFFER);
\r
114 Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
\r
115 output.setOutputNodeConnector(value);
\r
116 ab.setAction(new OutputActionCaseBuilder().setOutputAction(
\r
117 output.build()).build());
\r
119 ab.setKey(new ActionKey(0));
\r
120 actionList.add(ab.build());
\r
122 Long bufferId = 0xfL;
\r
124 Long valueForCookie = 0xeL;
\r
125 ConnectionCookie connCook = new ConnectionCookie(valueForCookie);
\r
127 String NODE_ID = "node:1";
\r
129 NodeRef ref = createNodeRef(NODE_ID);
\r
131 String portO = "0xfffffffd";
\r
132 NodeConnectorKey nEgrConKey = this.createNodeConnKey(NODE_ID, portO);
\r
133 NodeConnectorRef nEgressConfRef = new NodeConnectorRef(
\r
134 createNodeConnRef(NODE_ID, nEgrConKey));
\r
136 String inPort = "2";
\r
137 NodeConnectorKey nIngrConKey = this.createNodeConnKey(NODE_ID, inPort);
\r
138 NodeConnectorRef nIngressConRef = new NodeConnectorRef(
\r
139 createNodeConnRef(NODE_ID, nIngrConKey));
\r
141 String _string = new String("sendOutputMsg_TEST");
\r
142 byte[] msg = _string.getBytes();
\r
144 byte[] payload = msg;
\r
146 transmitPacketInputBuilder.setAction(actionList);
\r
147 transmitPacketInputBuilder.setBufferId(bufferId);
\r
148 transmitPacketInputBuilder.setConnectionCookie(connCook);
\r
149 transmitPacketInputBuilder.setEgress(nEgressConfRef);
\r
150 transmitPacketInputBuilder.setIngress(nIngressConRef);
\r
151 transmitPacketInputBuilder.setNode(ref);
\r
152 transmitPacketInputBuilder.setPayload(payload);
\r
154 TransmitPacketInput transmitPacketInput = transmitPacketInputBuilder
\r
157 short version = (short) 0x04;
\r
158 byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
\r
159 for(int i = 0; i < datapathIdByte.length; i++){
\r
160 datapathIdByte[i] = 1;
\r
162 BigInteger datapathId = new BigInteger(1, datapathIdByte);
\r
163 Long xid = 0xfffffL;
\r
165 OpenflowPortsUtil.init();
\r
167 PacketOutInput message = PacketOutConvertor.toPacketOutInput(
\r
168 transmitPacketInput, version, xid, datapathId);
\r
170 Assert.assertEquals(transmitPacketInput.getBufferId(),
\r
171 message.getBufferId());
\r
172 Assert.assertEquals("PortNumber [_value=" + inPort + "]", message
\r
173 .getInPort().toString());
\r
174 Assert.assertEquals((Object) version,
\r
175 Short.valueOf(message.getVersion()));
\r
176 Assert.assertEquals(xid, message.getXid());
\r
177 Assert.assertEquals(
\r
178 ActionConvertor.getActions(actionList, version, datapathId),
\r
179 message.getAction());
\r
180 Assert.assertEquals(transmitPacketInput.getPayload(), message.getData());
\r
190 private List<Action> buildActionForNullTransmitPacketInputAction(
\r
191 final NodeConnectorKey nConKey, final short version){
\r
193 PortNumber outPort = getPortNumber(nConKey, version);
\r
194 List<Action> actions = new ArrayList<>();
\r
195 ActionBuilder aBuild = new ActionBuilder();
\r
196 aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
\r
197 PortActionBuilder paBuild = new PortActionBuilder();
\r
198 paBuild.setPort(outPort);
\r
199 aBuild.addAugmentation(PortAction.class, paBuild.build());
\r
200 MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder();
\r
201 mlBuild.setMaxLength(0xffff);
\r
202 aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build());
\r
203 actions.add(aBuild.build());
\r
208 * create PortNumber
\r
214 private static PortNumber getPortNumber(final NodeConnectorKey nConKey,
\r
215 final Short ofVersion){
\r
216 String[] split = nConKey.getId().getValue().split(":");
\r
217 Long port = OpenflowPortsUtil.getPortFromLogicalName(
\r
218 OpenflowVersion.get(ofVersion), split[split.length - 1]);
\r
219 return new PortNumber(port);
\r
223 * create NodeConnectorRef
\r
229 private static NodeConnectorRef createNodeConnRef(final String nodeId,
\r
230 final NodeConnectorKey nConKey){
\r
232 InstanceIdentifier<NodeConnector> path = InstanceIdentifier
\r
233 .<Nodes> builder(Nodes.class)
\r
234 .<Node, NodeKey> child(Node.class,
\r
235 new NodeKey(new NodeId(nodeId)))
\r
236 .<NodeConnector, NodeConnectorKey> child(NodeConnector.class,
\r
237 nConKey).toInstance();
\r
239 return new NodeConnectorRef(path);
\r
243 * create NodeConnectorKey
\r
249 private NodeConnectorKey createNodeConnKey(final String nodeId,
\r
250 final String port){
\r
251 StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(
\r
254 return new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
\r
263 private static NodeRef createNodeRef(final String nodeId){
\r
264 NodeKey key = new NodeKey(new NodeId(nodeId));
\r
265 InstanceIdentifier<Node> path = InstanceIdentifier
\r
266 .<Nodes> builder(Nodes.class)
\r
267 .<Node, NodeKey> child(Node.class, key).toInstance();
\r
268 return new NodeRef(path);
\r