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