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