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