BUG-2315: Remove dependency to OFJava-impl
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / translator / PacketInV10TranslatorTest.java
1 /**\r
2  * Copyright (c) 2013 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.translator;\r
10 \r
11 import static org.mockito.Mockito.when;\r
12 \r
13 import java.io.IOException;\r
14 import java.math.BigInteger;\r
15 import java.util.ArrayList;\r
16 import java.util.Collection;\r
17 import java.util.HashMap;\r
18 import java.util.List;\r
19 import java.util.Map;\r
20 \r
21 import org.junit.Assert;\r
22 import org.junit.Before;\r
23 import org.junit.Test;\r
24 import org.junit.runner.RunWith;\r
25 import org.mockito.Mock;\r
26 import org.mockito.runners.MockitoJUnitRunner;\r
27 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
28 import org.opendaylight.openflowplugin.api.openflow.md.core.IMDMessageTranslator;\r
29 import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;\r
30 import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;\r
31 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;\r
32 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductorImpl;\r
33 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContextOFImpl;\r
34 import org.opendaylight.openflowplugin.openflow.md.core.session.SwitchConnectionCookieOFImpl;\r
35 import org.opendaylight.openflowplugin.openflow.md.queue.QueueProcessorLightImpl;\r
36 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
43 import org.opendaylight.yangtools.yang.binding.DataObject;\r
44 import org.slf4j.Logger;\r
45 import org.slf4j.LoggerFactory;\r
46 \r
47 /**\r
48  * Created by Jakub Toth jatoth@cisco.com on 3/10/14.\r
49  */\r
50 @RunWith(MockitoJUnitRunner.class)\r
51 public class PacketInV10TranslatorTest{\r
52     private static final Logger LOG = LoggerFactory\r
53             .getLogger(PacketInV10TranslatorTest.class);\r
54     \r
55     @Mock\r
56     private SessionContext sc;\r
57     @Mock\r
58     private ConnectionConductorImpl conductor;\r
59     @Mock\r
60     private GetFeaturesOutput features;\r
61 \r
62     private SwitchConnectionDistinguisher cookie;\r
63     private byte[] data;\r
64     \r
65     /**\r
66      * Initializes mocks\r
67      */\r
68     @Before\r
69     public void startUp() {\r
70         when(sc.getPrimaryConductor()).thenReturn(conductor);\r
71         when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF10_VERSION_ID);\r
72         when(sc.getFeatures()).thenReturn(features);\r
73         when(features.getDatapathId()).thenReturn(new BigInteger("42"));\r
74         OpenflowPortsUtil.init();\r
75         \r
76         cookie = settingCookie();\r
77         data = messageData();\r
78     }\r
79     \r
80     /**\r
81      * test\r
82      * {@link PacketInV10Translator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
83      * - all parameteres are null - translates packetIn from OF-API model to\r
84      * MD-SAL model, supports OF-1.0\r
85      */\r
86     @Test\r
87     public void testTranslateWithAllNullParam(){\r
88         SwitchConnectionDistinguisher cookieNull = null;\r
89         SessionContext sessionContext = null;\r
90         OfHeader msg = null;\r
91 \r
92         PacketInV10Translator packetInV10Translator = new PacketInV10Translator();\r
93 \r
94         List<DataObject> salPacketIn = packetInV10Translator.translate(cookieNull,\r
95                 sessionContext, msg);\r
96 \r
97         Assert.assertEquals(true, salPacketIn.isEmpty());\r
98 \r
99         LOG.info("Test with all null parameters done.");\r
100     }\r
101 \r
102     /**\r
103      * test\r
104      * {@link PacketInV10Translator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
105      * - DPID is null- translates packetIn from OF-API model to MD-SAL model,\r
106      * supports OF-1.0\r
107      */\r
108     @Test\r
109     public void testTranslateDPIDNull(){\r
110         SessionContextOFImpl sessionContextOFImpl = new SessionContextOFImpl();\r
111 \r
112         PacketInMessage message = createPacketInMessage(data, null);\r
113 \r
114         PacketInV10Translator packetInV10Translator = new PacketInV10Translator();\r
115 \r
116         List<DataObject> salPacketIn = packetInV10Translator.translate(cookie,\r
117                 sessionContextOFImpl, message);\r
118 \r
119         Assert.assertEquals(true, salPacketIn.isEmpty());\r
120         LOG.info("Test with null DPID parameter done.");\r
121     }\r
122 \r
123     /**\r
124      * test\r
125      * {@link PacketInV10Translator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
126      * - inPort is null- translates packetIn from OF-API model to MD-SAL model,\r
127      * supports OF-1.0\r
128      */\r
129     @Test\r
130     public void testTranslateInPortNull(){\r
131         BigInteger datapathId = dataPathId();\r
132 \r
133         GetFeaturesOutputBuilder featuresBuilder = new GetFeaturesOutputBuilder();\r
134         featuresBuilder.setDatapathId(datapathId);\r
135 \r
136         SessionContextOFImpl sessionContextOFImpl = new SessionContextOFImpl();\r
137         sessionContextOFImpl.setFeatures(featuresBuilder.build());\r
138 \r
139         PacketInMessage message = createPacketInMessage(data, null);\r
140 \r
141         PacketInV10Translator packetInV10Translator = new PacketInV10Translator();\r
142 \r
143         List<DataObject> salPacketIn = packetInV10Translator.translate(cookie,\r
144                 sessionContextOFImpl, message);\r
145 \r
146         Assert.assertEquals(true, salPacketIn.isEmpty());\r
147 \r
148         LOG.info("Test with null inPort parameter done.");\r
149     }\r
150 \r
151     /**\r
152      * test\r
153      * {@link PacketInV10Translator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
154      * - translates packetIn from OF-API model to MD-SAL model, supports OF-1.0\r
155      * \r
156      * @throws IOException\r
157      */\r
158     @Test\r
159     public void testTranslate(){\r
160         BigInteger datapathId = dataPathId();\r
161 \r
162         PacketInMessage message = createPacketInMessage(data, 5);\r
163 \r
164         GetFeaturesOutput featuresOutput = createGetFeatureOutput(datapathId);\r
165         initConnectionConductor(conductor, featuresOutput);\r
166         SessionContextOFImpl sessionContextOFImpl = new SessionContextOFImpl();\r
167         sessionContextOFImpl.setFeatures(featuresOutput);\r
168         sessionContextOFImpl.setPrimaryConductor(conductor);\r
169         PacketInV10Translator packetInV10Translator = new PacketInV10Translator();\r
170         OpenflowPortsUtil.init();\r
171         List<DataObject> salPacketIn = packetInV10Translator.translate(cookie,\r
172                 sessionContextOFImpl, message);\r
173         \r
174         //TODO: rewrite to object and involve object comparison in Assert\r
175         String expectedString = "[PacketReceived [_ingress=NodeConnectorRef [_value=KeyedInstanceIdentifier"\r
176                 + "{targetType=interface org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector,"\r
177                 + " path=[org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes,"\r
178                 + " org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node["\r
179                 + "key=NodeKey [_id=Uri [_value=openflow:"\r
180                 + datapathId.toString()\r
181                 + "]]],"\r
182                 + " org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector["\r
183                 + "key=NodeConnectorKey [_id=Uri [_value=openflow:"\r
184                 + datapathId.toString()\r
185                 + ":"\r
186                 + message.getInPort().toString()\r
187                 + "]]]]}], _packetInReason=class org.opendaylight.yang.gen.v1.urn.opendaylight."\r
188                 + "packet.service.rev130709.SendToController, _payload=[115, 101, 110, 100, 79, 117,"\r
189                 + " 116, 112, 117, 116, 77, 115, 103, 95, 84, 69, 83, 84], augmentation=[]]]";\r
190         Assert.assertEquals(expectedString, salPacketIn.toString());\r
191         LOG.debug("Test translate done.");\r
192     }\r
193 \r
194     /**\r
195      * create datapathID\r
196      * \r
197      * @return BigInteger\r
198      */\r
199     private static BigInteger dataPathId(){\r
200         byte[] datapathIdByte = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
201         for(int i = 0; i < datapathIdByte.length; i++){\r
202             datapathIdByte[i] = 1;\r
203         }\r
204         return new BigInteger(1, datapathIdByte);\r
205     }\r
206 \r
207     /**\r
208      * generate message from string to byte[]\r
209      * \r
210      * @return byte[]\r
211      */\r
212     private static byte[] messageData(){\r
213         String string = new String("sendOutputMsg_TEST");\r
214         return string.getBytes();\r
215     }\r
216 \r
217     /**\r
218      * create PacketInMessage with setting Version, InPort, Data, Reason\r
219      * \r
220      * @param data\r
221      * @param port\r
222      * @return PacketInMessage\r
223      */\r
224     private static PacketInMessage createPacketInMessage(final byte[] data,\r
225             final java.lang.Integer port){\r
226         PacketInReason reason = PacketInReason.OFPRACTION;\r
227         return new PacketInMessageBuilder()\r
228                 .setVersion((short) EncodeConstants.OF10_VERSION_ID)\r
229                 .setInPort(port).setData(data).setReason(reason).build();\r
230 \r
231     }\r
232 \r
233     /**\r
234      * create cookie\r
235      * \r
236      * @return SwitchConnectionDistinguisher\r
237      */\r
238     private static SwitchConnectionDistinguisher settingCookie(){\r
239         SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();\r
240         key.setAuxiliaryId((short) 1);\r
241         key.init(42);\r
242         return key;\r
243     }\r
244 \r
245     /**\r
246      * create GetFeatureOutput\r
247      * \r
248      * @param datapathId\r
249      * @return GetFeaturesOutput\r
250      */\r
251     private static GetFeaturesOutput createGetFeatureOutput(final BigInteger datapathId){\r
252         return new GetFeaturesOutputBuilder().setDatapathId(datapathId)\r
253                 .setVersion((short) 0x01).build();\r
254     }\r
255 \r
256     /**\r
257      * init connectionConductor\r
258      * \r
259      * @param connectionConductor\r
260      * @param featuresOutput\r
261      */\r
262     private static void initConnectionConductor(\r
263             final ConnectionConductorImpl connectionConductor,\r
264             final GetFeaturesOutput featuresOutput){\r
265         TranslatorKey paramK = new TranslatorKey(1, PacketInMessage.class.getSimpleName());\r
266         Collection<IMDMessageTranslator<OfHeader, List<DataObject>>> coll = new ArrayList<>();\r
267         coll.add(new PacketInV10Translator());\r
268         Map<TranslatorKey, Collection<IMDMessageTranslator<OfHeader, List<DataObject>>>> translatorMapping = new HashMap<>();\r
269         translatorMapping.put(paramK, coll);\r
270 \r
271         QueueProcessorLightImpl queueProcessor = new QueueProcessorLightImpl();\r
272         queueProcessor.setTranslatorMapping(translatorMapping);\r
273         queueProcessor.init();\r
274         connectionConductor.setQueueProcessor(queueProcessor);\r
275         connectionConductor.init();\r
276         connectionConductor\r
277                 .onHandshakeSuccessfull(featuresOutput, (short) 0x01);\r
278     }\r
279 }\r