2 * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
\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
9 package org.opendaylight.openflowplugin.openflow.md.core.translator;
\r
11 import static org.mockito.Mockito.when;
\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.flow.statistics.rev130819.AggregateFlowStatisticsUpdate;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
\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.MultipartReplyMessage;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
\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.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
\r
48 import org.opendaylight.yangtools.yang.binding.DataObject;
\r
51 * @author michal.polkorab
\r
54 @RunWith(MockitoJUnitRunner.class)
\r
55 public class MultipartReplyTranslatorSecondTest {
\r
57 @Mock SwitchConnectionDistinguisher cookie;
\r
58 @Mock SessionContext sc;
\r
59 @Mock ConnectionConductor conductor;
\r
60 @Mock GetFeaturesOutput features;
\r
62 MultipartReplyTranslator translator;
\r
68 public void startUp() {
\r
69 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
\r
70 translator = new MultipartReplyTranslator(convertorManager);
\r
71 when(sc.getPrimaryConductor()).thenReturn(conductor);
\r
72 when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
\r
73 when(sc.getFeatures()).thenReturn(features);
\r
74 when(features.getDatapathId()).thenReturn(new BigInteger("42"));
\r
78 * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
\r
79 * with aggregate stat
\r
82 public void testAggregateCase() {
\r
83 MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
\r
84 mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
\r
85 mpBuilder.setXid(123L);
\r
86 mpBuilder.setFlags(new MultipartRequestFlags(false));
\r
87 mpBuilder.setType(MultipartType.OFPMPAGGREGATE);
\r
89 MultipartReplyAggregateCaseBuilder caseBuilder = new MultipartReplyAggregateCaseBuilder();
\r
90 MultipartReplyAggregateBuilder aggBuilder = new MultipartReplyAggregateBuilder();
\r
91 aggBuilder.setByteCount(new BigInteger("52"));
\r
92 aggBuilder.setFlowCount(6587L);
\r
93 aggBuilder.setPacketCount(new BigInteger("25"));
\r
94 caseBuilder.setMultipartReplyAggregate(aggBuilder.build());
\r
95 mpBuilder.setMultipartReplyBody(caseBuilder.build());
\r
96 MultipartReplyMessage message = mpBuilder.build();
\r
98 List<DataObject> list = translator.translate(cookie, sc, message);
\r
100 Assert.assertEquals("Wrong list size", 1, list.size());
\r
101 AggregateFlowStatisticsUpdate aggUpdate = (AggregateFlowStatisticsUpdate) list.get(0);
\r
102 Assert.assertEquals("Wrong node-id", "openflow:42", aggUpdate.getId().getValue());
\r
103 Assert.assertEquals("Wrong more-replies", false, aggUpdate.isMoreReplies());
\r
104 Assert.assertEquals("Wrong transaction-id", 123, aggUpdate.getTransactionId().getValue().intValue());
\r
105 Assert.assertEquals("Wrong byte count", 52, aggUpdate.getByteCount().getValue().intValue());
\r
106 Assert.assertEquals("Wrong packet count", 25, aggUpdate.getPacketCount().getValue().intValue());
\r
107 Assert.assertEquals("Wrong flow count", 6587, aggUpdate.getFlowCount().getValue().intValue());
\r
111 * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
\r
112 * with group features stat
\r
115 public void testGroupFeaturesCase() {
\r
116 MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
\r
117 mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
\r
118 mpBuilder.setXid(123L);
\r
119 mpBuilder.setFlags(new MultipartRequestFlags(false));
\r
120 mpBuilder.setType(MultipartType.OFPMPGROUPFEATURES);
\r
122 MultipartReplyGroupFeaturesCaseBuilder caseBuilder = new MultipartReplyGroupFeaturesCaseBuilder();
\r
123 MultipartReplyGroupFeaturesBuilder featBuilder = new MultipartReplyGroupFeaturesBuilder();
\r
124 featBuilder.setTypes(new GroupTypes(true, false, true, false));
\r
125 featBuilder.setCapabilities(new GroupCapabilities(false, true, false, true));
\r
126 List<Long> maxGroups = new ArrayList<>();
\r
131 featBuilder.setMaxGroups(maxGroups);
\r
132 List<ActionType> actionTypes = new ArrayList<>();
\r
133 ActionType actionType1 = new ActionType(true, false, true, false, false, false, true,
\r
134 false, true, false, true, false, true, false, true, false, true);
\r
135 actionTypes.add(actionType1);
\r
136 ActionType actionType2 = new ActionType(false, true, false, true, false, true, false,
\r
137 true, false, true, false, true, false, true, false, true, false);
\r
138 actionTypes.add(actionType2);
\r
139 ActionType actionType3 = new ActionType(false, false, false, false, false, false, false,
\r
140 true, true, true, true, true, true, true, true, true, true);
\r
141 actionTypes.add(actionType3);
\r
142 ActionType actionType4 = new ActionType(true, true, true, true, true, true, true,
\r
143 false, false, false, false, false, false, false, false, false, false);
\r
144 actionTypes.add(actionType4);
\r
145 featBuilder.setActionsBitmap(actionTypes);
\r
146 caseBuilder.setMultipartReplyGroupFeatures(featBuilder.build());
\r
147 mpBuilder.setMultipartReplyBody(caseBuilder.build());
\r
148 MultipartReplyMessage message = mpBuilder.build();
\r
150 List<DataObject> list = translator.translate(cookie, sc, message);
\r
152 Assert.assertEquals("Wrong list size", 1, list.size());
\r
153 GroupFeaturesUpdated groupUpdate = (GroupFeaturesUpdated) list.get(0);
\r
154 Assert.assertEquals("Wrong node-id", "openflow:42", groupUpdate.getId().getValue());
\r
155 Assert.assertEquals("Wrong more-replies", false, groupUpdate.isMoreReplies());
\r
156 Assert.assertEquals("Wrong transaction-id", 123, groupUpdate.getTransactionId().getValue().intValue());
\r
157 Assert.assertEquals("Wrong group types size", 2, groupUpdate.getGroupTypesSupported().size());
\r
158 Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll",
\r
159 groupUpdate.getGroupTypesSupported().get(0).getName());
\r
160 Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect",
\r
161 groupUpdate.getGroupTypesSupported().get(1).getName());
\r
162 Assert.assertEquals("Wrong group capabilities size", 2, groupUpdate.getGroupCapabilitiesSupported().size());
\r
163 Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks",
\r
164 groupUpdate.getGroupCapabilitiesSupported().get(0).getName());
\r
165 Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight",
\r
166 groupUpdate.getGroupCapabilitiesSupported().get(1).getName());
\r
167 Assert.assertEquals("Wrong max groups", maxGroups, groupUpdate.getMaxGroups());
\r
168 Assert.assertEquals("Wrong actions bitmap", 137072641, groupUpdate.getActions().get(0).longValue());
\r
169 Assert.assertEquals("Wrong actions bitmap", 131336192, groupUpdate.getActions().get(1).longValue());
\r
170 Assert.assertEquals("Wrong actions bitmap", 247365632, groupUpdate.getActions().get(2).longValue());
\r
171 Assert.assertEquals("Wrong actions bitmap", 21043201, groupUpdate.getActions().get(3).longValue());
\r
175 * Test {@link MultipartReplyTranslator#translate(SwitchConnectionDistinguisher, SessionContext, OfHeader)}
\r
176 * with meter features stat
\r
179 public void testMeterFeaturesCase() {
\r
180 MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();
\r
181 mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
\r
182 mpBuilder.setXid(123L);
\r
183 mpBuilder.setFlags(new MultipartRequestFlags(false));
\r
184 mpBuilder.setType(MultipartType.OFPMPMETERFEATURES);
\r
186 MultipartReplyMeterFeaturesCaseBuilder caseBuilder = new MultipartReplyMeterFeaturesCaseBuilder();
\r
187 MultipartReplyMeterFeaturesBuilder featBuilder = new MultipartReplyMeterFeaturesBuilder();
\r
188 featBuilder.setMaxMeter(1L);
\r
189 featBuilder.setBandTypes(new MeterBandTypeBitmap(true, true));
\r
190 featBuilder.setCapabilities(new MeterFlags(true, true, true, true));
\r
191 featBuilder.setMaxBands((short) 2);
\r
192 featBuilder.setMaxColor((short) 3);
\r
193 caseBuilder.setMultipartReplyMeterFeatures(featBuilder.build());
\r
194 mpBuilder.setMultipartReplyBody(caseBuilder.build());
\r
195 MultipartReplyMessage message = mpBuilder.build();
\r
197 List<DataObject> list = translator.translate(cookie, sc, message);
\r
199 Assert.assertEquals("Wrong list size", 1, list.size());
\r
200 MeterFeaturesUpdated megterUpdate = (MeterFeaturesUpdated) list.get(0);
\r
201 Assert.assertEquals("Wrong node-id", "openflow:42", megterUpdate.getId().getValue());
\r
202 Assert.assertEquals("Wrong more-replies", false, megterUpdate.isMoreReplies());
\r
203 Assert.assertEquals("Wrong transaction-id", 123, megterUpdate.getTransactionId().getValue().intValue());
\r
204 Assert.assertEquals("Wrong max meter", 1, megterUpdate.getMaxMeter().getValue().intValue());
\r
205 Assert.assertEquals("Wrong max bands", 2, megterUpdate.getMaxBands().intValue());
\r
206 Assert.assertEquals("Wrong max color", 3, megterUpdate.getMaxColor().intValue());
\r
207 Assert.assertEquals("Wrong capabilities size", 4, megterUpdate.getMeterCapabilitiesSupported().size());
\r
208 Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
\r
209 + ".MeterBurst", megterUpdate.getMeterCapabilitiesSupported().get(0).getName());
\r
210 Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
\r
211 + ".MeterKbps", megterUpdate.getMeterCapabilitiesSupported().get(1).getName());
\r
212 Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
\r
213 + ".MeterPktps", megterUpdate.getMeterCapabilitiesSupported().get(2).getName());
\r
214 Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"
\r
215 + ".MeterStats", megterUpdate.getMeterCapabilitiesSupported().get(3).getName());
\r
216 Assert.assertEquals("Wrong band types size", 2, megterUpdate.getMeterBandSupported().size());
\r
217 Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop",
\r
218 megterUpdate.getMeterBandSupported().get(0).getName());
\r
219 Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark",
\r
220 megterUpdate.getMeterBandSupported().get(1).getName());
\r