2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.impl.common;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Mockito.when;
14 import java.math.BigInteger;
15 import java.util.Collections;
16 import java.util.Optional;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.junit.runner.RunWith;
20 import org.mockito.Mock;
21 import org.mockito.runners.MockitoJUnitRunner;
22 import org.opendaylight.openflowplugin.api.OFConstants;
23 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
24 import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary;
25 import org.opendaylight.openflowplugin.api.openflow.translator.TranslatorLibrarian;
26 import org.opendaylight.openflowplugin.impl.util.TranslatorLibraryUtil;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.MultipartReplyBody;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeterBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.MultipartReplyPortDescBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStatsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStatsBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueueBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStatsBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTableBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStatsBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeaturesBuilder;
71 @RunWith(MockitoJUnitRunner.class)
72 public class MultipartReplyTranslatorUtilTest {
74 private DeviceInfo deviceInfo;
75 private ConvertorExecutor convertorExecutor = ConvertorManagerFactory.createDefaultManager();
76 private TranslatorLibrarian translatorLibrarian;
79 public void setUp() throws Exception {
80 when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
82 translatorLibrarian = new TranslatorLibrarian() {
83 private TranslatorLibrary translatorLibrary;
86 public TranslatorLibrary oook() {
87 return translatorLibrary;
91 public void setTranslatorLibrary(final TranslatorLibrary translatorLibrary) {
92 this.translatorLibrary = translatorLibrary;
96 TranslatorLibraryUtil.injectBasicTranslatorLibrary(translatorLibrarian, convertorExecutor);
99 private static MultipartReply buildReply(final MultipartType multipartType,
100 final MultipartReplyBody multipartReplyBody) {
101 return new MultipartReplyMessageBuilder()
102 .setType(multipartType)
103 .setMultipartReplyBody(multipartReplyBody)
107 private void dummyAssertReply(final MultipartReply multipartReply) {
108 final Optional<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart
109 .reply.MultipartReplyBody> translatedReply = MultipartReplyTranslatorUtil
110 .translate(multipartReply, deviceInfo, convertorExecutor, translatorLibrarian.oook());
112 assertTrue(translatedReply.isPresent());
116 public void translatePortDesc() {
117 final MultipartReply multipartReply = buildReply(
118 MultipartType.OFPMPPORTDESC,
119 new MultipartReplyPortDescCaseBuilder()
120 .setMultipartReplyPortDesc(new MultipartReplyPortDescBuilder()
121 .setPorts(Collections.singletonList(new PortsBuilder()
126 dummyAssertReply(multipartReply);
130 public void translateTableFeatures() {
131 final MultipartReply multipartReply = buildReply(
132 MultipartType.OFPMPTABLEFEATURES,
133 new MultipartReplyTableFeaturesCaseBuilder()
134 .setMultipartReplyTableFeatures(new MultipartReplyTableFeaturesBuilder()
138 dummyAssertReply(multipartReply);
142 public void translateDesc() {
143 final MultipartReply multipartReply = buildReply(
144 MultipartType.OFPMPDESC,
145 new MultipartReplyDescCaseBuilder()
146 .setMultipartReplyDesc(new MultipartReplyDescBuilder()
150 dummyAssertReply(multipartReply);
154 public void translateFlow() {
155 final MultipartReply multipartReply = buildReply(
156 MultipartType.OFPMPFLOW,
157 new MultipartReplyFlowCaseBuilder()
158 .setMultipartReplyFlow(new MultipartReplyFlowBuilder()
162 dummyAssertReply(multipartReply);
166 public void translateAggregate() {
167 final MultipartReply multipartReply = buildReply(
168 MultipartType.OFPMPAGGREGATE,
169 new MultipartReplyAggregateCaseBuilder()
170 .setMultipartReplyAggregate(new MultipartReplyAggregateBuilder()
171 .setByteCount(BigInteger.ONE)
173 .setPacketCount(BigInteger.ONE)
177 dummyAssertReply(multipartReply);
181 public void translatePortStats() {
182 final MultipartReply multipartReply = buildReply(
183 MultipartType.OFPMPPORTSTATS,
184 new MultipartReplyPortStatsCaseBuilder()
185 .setMultipartReplyPortStats(new MultipartReplyPortStatsBuilder()
186 .setPortStats(Collections.singletonList(new PortStatsBuilder()
191 dummyAssertReply(multipartReply);
195 public void translateGroup() {
196 final MultipartReply multipartReply = buildReply(
197 MultipartType.OFPMPGROUP,
198 new MultipartReplyGroupCaseBuilder()
199 .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
203 dummyAssertReply(multipartReply);
207 public void translateGroupDesc() {
208 final MultipartReply multipartReply = buildReply(
209 MultipartType.OFPMPGROUPDESC,
210 new MultipartReplyGroupDescCaseBuilder()
211 .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
215 dummyAssertReply(multipartReply);
219 public void translateGroupFeatures() {
220 final MultipartReply multipartReply = buildReply(
221 MultipartType.OFPMPGROUPFEATURES,
222 new MultipartReplyGroupFeaturesCaseBuilder()
223 .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
224 .setTypes(new GroupTypes(true, false, false, false))
225 .setCapabilities(new GroupCapabilities(false, true, true, false))
226 .setActionsBitmap(Collections.singletonList(new ActionType(
248 dummyAssertReply(multipartReply);
252 public void translateMeter() {
253 final MultipartReply multipartReply = buildReply(
254 MultipartType.OFPMPMETER,
255 new MultipartReplyMeterCaseBuilder()
256 .setMultipartReplyMeter(new MultipartReplyMeterBuilder()
260 dummyAssertReply(multipartReply);
264 public void translateMeterConfig() {
265 final MultipartReply multipartReply = buildReply(
266 MultipartType.OFPMPMETERCONFIG,
267 new MultipartReplyMeterConfigCaseBuilder()
268 .setMultipartReplyMeterConfig(new MultipartReplyMeterConfigBuilder()
272 dummyAssertReply(multipartReply);
276 public void translateMeterFeatures() {
277 final MultipartReply multipartReply = buildReply(
278 MultipartType.OFPMPMETERFEATURES,
279 new MultipartReplyMeterFeaturesCaseBuilder()
280 .setMultipartReplyMeterFeatures(new MultipartReplyMeterFeaturesBuilder()
282 .setCapabilities(new MeterFlags(true, false, false, false))
283 .setBandTypes(new MeterBandTypeBitmap(true, false))
287 dummyAssertReply(multipartReply);
291 public void translateTable() {
292 final MultipartReply multipartReply = buildReply(
293 MultipartType.OFPMPTABLE,
294 new MultipartReplyTableCaseBuilder()
295 .setMultipartReplyTable(new MultipartReplyTableBuilder()
296 .setTableStats(Collections.singletonList(new TableStatsBuilder()
298 .setLookupCount(BigInteger.ONE)
299 .setMatchedCount(BigInteger.ONE)
300 .setTableId((short) 10)
305 dummyAssertReply(multipartReply);
309 public void translateQueue() {
310 final MultipartReply multipartReply = buildReply(
311 MultipartType.OFPMPQUEUE,
312 new MultipartReplyQueueCaseBuilder()
313 .setMultipartReplyQueue(new MultipartReplyQueueBuilder()
314 .setQueueStats(Collections.singletonList(new QueueStatsBuilder()
315 .setTxErrors(BigInteger.ONE)
316 .setTxBytes(BigInteger.ONE)
317 .setTxPackets(BigInteger.ONE)
318 .setDurationNsec(10L)
325 dummyAssertReply(multipartReply);