Merge "Bug 8873 - Bundle based reconciliation to enable bundling of messages"
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / translator / MultipartReplyTranslatorFourthTest.java
1 /*\r
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.math.BigInteger;\r
14 import java.util.ArrayList;\r
15 import java.util.List;\r
16 import org.junit.Assert;\r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.junit.runner.RunWith;\r
20 import org.mockito.Mock;\r
21 import org.mockito.runners.MockitoJUnitRunner;\r
22 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
23 import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;\r
24 import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;\r
25 import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;\r
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;\r
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdated;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecMplsTtlCaseBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStatsBuilder;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDescBuilder;\r
58 import org.opendaylight.yangtools.yang.binding.DataObject;\r
59 \r
60 /**\r
61  * @author michal.polkorab\r
62  *\r
63  */\r
64 @RunWith(MockitoJUnitRunner.class)\r
65 public class MultipartReplyTranslatorFourthTest {\r
66 \r
67     @Mock SwitchConnectionDistinguisher cookie;\r
68     @Mock SessionContext sc;\r
69     @Mock ConnectionConductor conductor;\r
70     @Mock GetFeaturesOutput features;\r
71 \r
72     MultipartReplyTranslator translator;\r
73 \r
74     /**\r
75      * Initializes mocks\r
76      */\r
77     @Before\r
78     public void startUp() {\r
79         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();\r
80         translator = new MultipartReplyTranslator(convertorManager);\r
81         when(sc.getPrimaryConductor()).thenReturn(conductor);\r
82         when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);\r
83         when(sc.getFeatures()).thenReturn(features);\r
84         when(features.getDatapathId()).thenReturn(new BigInteger("42"));\r
85     }\r
86 \r
87     /**\r
88      * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
89      * with empty group stats\r
90      */\r
91     @Test\r
92     public void testEmptyGroupStats() {\r
93         MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
94         mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
95         mpBuilder.setXid(123L);\r
96         mpBuilder.setFlags(new MultipartRequestFlags(false));\r
97         mpBuilder.setType(MultipartType.OFPMPGROUP);\r
98 \r
99         MultipartReplyGroupCaseBuilder caseBuilder = new MultipartReplyGroupCaseBuilder();\r
100         MultipartReplyGroupBuilder groupBuilder = new MultipartReplyGroupBuilder();\r
101         List<GroupStats> groupStats = new ArrayList<>();\r
102         groupBuilder.setGroupStats(groupStats);\r
103         caseBuilder.setMultipartReplyGroup(groupBuilder.build());\r
104         mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
105         MultipartReplyMessage message = mpBuilder.build();\r
106 \r
107         List<DataObject> list = translator.translate(cookie, sc, message);\r
108 \r
109         Assert.assertEquals("Wrong list size", 1, list.size());\r
110         GroupStatisticsUpdated statUpdate = (GroupStatisticsUpdated) list.get(0);\r
111         Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
112         Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
113         Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
114         Assert.assertEquals("Wrong group stats size", 0, statUpdate.getGroupStats().size());\r
115     }\r
116 \r
117     /**\r
118      * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
119      * with group stats\r
120      */\r
121     @Test\r
122     public void testGroupStats() {\r
123         MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
124         mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
125         mpBuilder.setXid(123L);\r
126         mpBuilder.setFlags(new MultipartRequestFlags(false));\r
127         mpBuilder.setType(MultipartType.OFPMPGROUP);\r
128 \r
129         MultipartReplyGroupCaseBuilder caseBuilder = new MultipartReplyGroupCaseBuilder();\r
130         MultipartReplyGroupBuilder groupBuilder = new MultipartReplyGroupBuilder();\r
131         List<GroupStats> groupStats = new ArrayList<>();\r
132         GroupStatsBuilder builder = new GroupStatsBuilder();\r
133         builder.setGroupId(new GroupId(55L));\r
134         builder.setRefCount(56L);\r
135         builder.setPacketCount(new BigInteger("57"));\r
136         builder.setByteCount(new BigInteger("58"));\r
137         builder.setDurationSec(59L);\r
138         builder.setDurationNsec(60L);\r
139         List<BucketStats> bucketStats = new ArrayList<>();\r
140         BucketStatsBuilder bucketBuilder = new BucketStatsBuilder();\r
141         bucketBuilder.setByteCount(new BigInteger("61"));\r
142         bucketBuilder.setPacketCount(new BigInteger("62"));\r
143         bucketStats.add(bucketBuilder.build());\r
144         bucketBuilder = new BucketStatsBuilder();\r
145         bucketBuilder.setByteCount(new BigInteger("63"));\r
146         bucketBuilder.setPacketCount(new BigInteger("64"));\r
147         bucketStats.add(bucketBuilder.build());\r
148         builder.setBucketStats(bucketStats);\r
149         groupStats.add(builder.build());\r
150         builder = new GroupStatsBuilder();\r
151         builder.setGroupId(new GroupId(550L));\r
152         builder.setRefCount(560L);\r
153         builder.setPacketCount(new BigInteger("570"));\r
154         builder.setByteCount(new BigInteger("580"));\r
155         builder.setDurationSec(590L);\r
156         builder.setDurationNsec(600L);\r
157         bucketStats = new ArrayList<>();\r
158         builder.setBucketStats(bucketStats);\r
159         groupStats.add(builder.build());\r
160         groupBuilder.setGroupStats(groupStats);\r
161         caseBuilder.setMultipartReplyGroup(groupBuilder.build());\r
162         mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
163         MultipartReplyMessage message = mpBuilder.build();\r
164 \r
165         List<DataObject> list = translator.translate(cookie, sc, message);\r
166 \r
167         Assert.assertEquals("Wrong list size", 1, list.size());\r
168         GroupStatisticsUpdated statUpdate = (GroupStatisticsUpdated) list.get(0);\r
169         Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
170         Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
171         Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
172         Assert.assertEquals("Wrong group stats size", 2, statUpdate.getGroupStats().size());\r
173         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
174         .GroupStats stat = statUpdate.getGroupStats().get(0);\r
175         Assert.assertEquals("Wrong group-id", 55, stat.getGroupId().getValue().intValue());\r
176         Assert.assertEquals("Wrong ref count", 56, stat.getRefCount().getValue().intValue());\r
177         Assert.assertEquals("Wrong packet count", 57, stat.getPacketCount().getValue().intValue());\r
178         Assert.assertEquals("Wrong byte count", 58, stat.getByteCount().getValue().intValue());\r
179         Assert.assertEquals("Wrong duration sec", 59, stat.getDuration().getSecond().getValue().intValue());\r
180         Assert.assertEquals("Wrong duration n sec", 60, stat.getDuration().getNanosecond().getValue().intValue());\r
181         Assert.assertEquals("Wrong bucket stats size", 2, stat.getBuckets().getBucketCounter().size());\r
182         Assert.assertEquals("Wrong bucket-id", 0, stat.getBuckets().getBucketCounter().get(0).getBucketId().getValue().intValue());\r
183         Assert.assertEquals("Wrong byte count", 61, stat.getBuckets().getBucketCounter().get(0).getByteCount().getValue().intValue());\r
184         Assert.assertEquals("Wrong packet count", 62, stat.getBuckets().getBucketCounter().get(0).getPacketCount().getValue().intValue());\r
185         Assert.assertEquals("Wrong bucket-id", 1, stat.getBuckets().getBucketCounter().get(1).getBucketId().getValue().intValue());\r
186         Assert.assertEquals("Wrong byte count", 63, stat.getBuckets().getBucketCounter().get(1).getByteCount().getValue().intValue());\r
187         Assert.assertEquals("Wrong packet count", 64, stat.getBuckets().getBucketCounter().get(1).getPacketCount().getValue().intValue());\r
188         stat = statUpdate.getGroupStats().get(1);\r
189         Assert.assertEquals("Wrong group-id", 550, stat.getGroupId().getValue().intValue());\r
190         Assert.assertEquals("Wrong ref count", 560, stat.getRefCount().getValue().intValue());\r
191         Assert.assertEquals("Wrong packet count", 570, stat.getPacketCount().getValue().intValue());\r
192         Assert.assertEquals("Wrong byte count", 580, stat.getByteCount().getValue().intValue());\r
193         Assert.assertEquals("Wrong duration sec", 590, stat.getDuration().getSecond().getValue().intValue());\r
194         Assert.assertEquals("Wrong duration n sec", 600, stat.getDuration().getNanosecond().getValue().intValue());\r
195         Assert.assertEquals("Wrong bucket stats size", 0, stat.getBuckets().getBucketCounter().size());\r
196     }\r
197 \r
198     /**\r
199      * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
200      * with empty group desc stats\r
201      */\r
202     @Test\r
203     public void testEmptyGroupDescStats() {\r
204         MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
205         mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
206         mpBuilder.setXid(123L);\r
207         mpBuilder.setFlags(new MultipartRequestFlags(false));\r
208         mpBuilder.setType(MultipartType.OFPMPGROUPDESC);\r
209 \r
210         MultipartReplyGroupDescCaseBuilder caseBuilder = new MultipartReplyGroupDescCaseBuilder();\r
211         MultipartReplyGroupDescBuilder groupBuilder = new MultipartReplyGroupDescBuilder();\r
212         List<GroupDesc> groupStats = new ArrayList<>();\r
213         groupBuilder.setGroupDesc(groupStats);\r
214         caseBuilder.setMultipartReplyGroupDesc(groupBuilder.build());\r
215         mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
216         MultipartReplyMessage message = mpBuilder.build();\r
217 \r
218         List<DataObject> list = translator.translate(cookie, sc, message);\r
219 \r
220         Assert.assertEquals("Wrong list size", 1, list.size());\r
221         GroupDescStatsUpdated statUpdate = (GroupDescStatsUpdated) list.get(0);\r
222         Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
223         Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
224         Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
225         Assert.assertEquals("Wrong group stats size", 0, statUpdate.getGroupDescStats().size());\r
226     }\r
227 \r
228     /**\r
229      * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}\r
230      * with group desc stats\r
231      */\r
232     @Test\r
233     public void testGroupDescStats() {\r
234         MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
235         mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
236         mpBuilder.setXid(123L);\r
237         mpBuilder.setFlags(new MultipartRequestFlags(false));\r
238         mpBuilder.setType(MultipartType.OFPMPGROUPDESC);\r
239 \r
240         MultipartReplyGroupDescCaseBuilder caseBuilder = new MultipartReplyGroupDescCaseBuilder();\r
241         MultipartReplyGroupDescBuilder groupBuilder = new MultipartReplyGroupDescBuilder();\r
242         List<GroupDesc> groupStats = new ArrayList<>();\r
243 \r
244         GroupDescBuilder builder = new GroupDescBuilder();\r
245         builder.setType(GroupType.OFPGTALL);\r
246         builder.setGroupId(new GroupId(1L));\r
247         List<BucketsList> buckets = new ArrayList<>();\r
248         BucketsListBuilder bucketBuilder = new BucketsListBuilder();\r
249         bucketBuilder.setWeight(28);\r
250         bucketBuilder.setWatchPort(new PortNumber(56L));\r
251         bucketBuilder.setWatchGroup(112L);\r
252 \r
253         List<Action> actions = new ArrayList<>();\r
254         ActionBuilder actionBuilder = new ActionBuilder();\r
255         DecMplsTtlCaseBuilder decMplsTtlCaseBuilder = new DecMplsTtlCaseBuilder();\r
256         actionBuilder.setActionChoice(decMplsTtlCaseBuilder.build());\r
257         actions.add(actionBuilder.build());\r
258 \r
259         actionBuilder = new ActionBuilder();\r
260         PopPbbCaseBuilder popPbbCaseBuilder = new PopPbbCaseBuilder();\r
261         actionBuilder.setActionChoice(popPbbCaseBuilder.build());\r
262         actions.add(actionBuilder.build());\r
263 \r
264         bucketBuilder.setAction(actions);\r
265         buckets.add(bucketBuilder.build());\r
266         bucketBuilder = new BucketsListBuilder();\r
267         bucketBuilder.setWeight(280);\r
268         bucketBuilder.setWatchPort(new PortNumber(560L));\r
269         bucketBuilder.setWatchGroup(1120L);\r
270         actions = new ArrayList<>();\r
271         bucketBuilder.setAction(actions);\r
272         buckets.add(bucketBuilder.build());\r
273         builder.setBucketsList(buckets);\r
274         groupStats.add(builder.build());\r
275         groupBuilder.setGroupDesc(groupStats);\r
276         caseBuilder.setMultipartReplyGroupDesc(groupBuilder.build());\r
277         mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
278         MultipartReplyMessage message = mpBuilder.build();\r
279 \r
280         List<DataObject> list = translator.translate(cookie, sc, message);\r
281 \r
282         Assert.assertEquals("Wrong list size", 1, list.size());\r
283         GroupDescStatsUpdated statUpdate = (GroupDescStatsUpdated) list.get(0);\r
284         Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
285         Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
286         Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
287         Assert.assertEquals("Wrong group stats size", 1, statUpdate.getGroupDescStats().size());\r
288         GroupDescStats stat = statUpdate.getGroupDescStats().get(0);\r
289         Assert.assertEquals("Wrong group-id", 1, stat.getGroupId().getValue().intValue());\r
290         Assert.assertEquals("Wrong group type", GroupTypes.GroupAll, stat.getGroupType());\r
291         Assert.assertEquals("Wrong buckets size", 2, stat.getBuckets().getBucket().size());\r
292         Bucket bucket = stat.getBuckets().getBucket().get(0);\r
293         Assert.assertEquals("Wrong weight size", 28, bucket.getWeight().intValue());\r
294         Assert.assertEquals("Wrong watch port size", 56, bucket.getWatchPort().intValue());\r
295         Assert.assertEquals("Wrong watch group size", 112, bucket.getWatchGroup().intValue());\r
296         Assert.assertEquals("Wrong actions size", 2, bucket.getAction().size());\r
297         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
298                 + ".action.action.DecMplsTtlCase", bucket.getAction().get(0).getAction().getImplementedInterface().getName());\r
299         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
300                 + ".action.action.PopPbbActionCase", bucket.getAction().get(1).getAction().getImplementedInterface().getName());\r
301         bucket = stat.getBuckets().getBucket().get(1);\r
302         Assert.assertEquals("Wrong weight size", 280, bucket.getWeight().intValue());\r
303         Assert.assertEquals("Wrong watch port size", 560, bucket.getWatchPort().intValue());\r
304         Assert.assertEquals("Wrong watch group size", 1120, bucket.getWatchGroup().intValue());\r
305         Assert.assertEquals("Wrong actions size", 0, bucket.getAction().size());\r
306     }\r
307 }