2 * Copyright (c) 2015 Cisco Systems, Inc. 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
8 package org.opendaylight.openflowplugin.impl.statistics.services;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.ArgumentMatchers.any;
13 import static org.mockito.ArgumentMatchers.eq;
14 import static org.mockito.Mockito.doAnswer;
15 import static org.mockito.Mockito.verify;
17 import com.google.common.util.concurrent.FutureCallback;
18 import java.util.List;
19 import java.util.concurrent.atomic.AtomicLong;
20 import org.junit.After;
21 import org.junit.Test;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.ArgumentMatchers;
24 import org.mockito.Captor;
25 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
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.MultipartRequestInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeterBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStatsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.meter.stats.MeterBandStatsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.MeterConfigBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.meter.config.BandsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
50 import org.opendaylight.yangtools.yang.common.RpcResult;
51 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
52 import org.opendaylight.yangtools.yang.common.Uint32;
53 import org.opendaylight.yangtools.yang.common.Uint64;
54 import org.opendaylight.yangtools.yang.common.Uint8;
57 * Test for {@link OpendaylightMeterStatisticsServiceImpl}.
60 public class OpendaylightMeterStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
61 private static final org.opendaylight.yang.gen.v1.urn
62 .opendaylight.openflow.common.types.rev130731.MeterId METER_ID = new org.opendaylight.yang.gen.v1.urn
63 .opendaylight.openflow.common.types.rev130731.MeterId(Uint32.valueOf(123));
65 private ArgumentCaptor<MultipartRequestInput> requestInput;
67 private GetAllMeterStatisticsImpl getAllMeterStatistics;
68 private GetMeterStatisticsImpl getMeterStatistics;
69 private GetAllMeterConfigStatisticsImpl getAllMeterConfigStatistics;
70 private GetMeterFeaturesImpl getMeterFeatures;
74 final var xid = new AtomicLong();
75 final var convertorManager = ConvertorManagerFactory.createDefaultManager();
77 getAllMeterStatistics = new GetAllMeterStatisticsImpl(rqContextStack, deviceContext, xid,
78 notificationPublishService, convertorManager);
79 getMeterStatistics = new GetMeterStatisticsImpl(rqContextStack, deviceContext, xid,
80 notificationPublishService, convertorManager);
81 getAllMeterConfigStatistics = new GetAllMeterConfigStatisticsImpl(rqContextStack, deviceContext, xid,
82 notificationPublishService, convertorManager);
83 getMeterFeatures = new GetMeterFeaturesImpl(rqContextStack, deviceContext, xid,
84 notificationPublishService, convertorManager);
86 doAnswer(answerVoidToCallback).when(outboundQueueProvider)
87 .commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
91 public void tearDown() {
92 verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
96 public void testGetAllMeterConfigStatistics() throws Exception {
97 GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder()
98 .setNode(createNodeRef("unitProt:123"));
100 rpcResult = RpcResultBuilder.<Object>success(List.of(
101 new MultipartReplyMessageBuilder()
102 .setVersion(EncodeConstants.OF_VERSION_1_3)
103 .setMultipartReplyBody(new MultipartReplyMeterConfigCaseBuilder()
104 .setMultipartReplyMeterConfig(new MultipartReplyMeterConfigBuilder()
105 .setMeterConfig(List.of(new MeterConfigBuilder()
106 .setFlags(new MeterFlags(true, false, false, false))
107 .setMeterId(METER_ID)
108 .setBands(List.of(new BandsBuilder()
109 .setMeterBand(new MeterBandDropCaseBuilder()
110 .setMeterBandDrop(new MeterBandDropBuilder()
111 .setBurstSize(Uint32.valueOf(61))
112 .setRate(Uint32.valueOf(62))
113 .setType(MeterBandType.OFPMBTDROP)
123 final var resultFuture = getAllMeterConfigStatistics.invoke(input.build());
125 assertTrue(resultFuture.isDone());
126 final var rpcResult = resultFuture.get();
127 assertTrue(rpcResult.isSuccessful());
128 assertEquals(MultipartType.OFPMPMETERCONFIG, requestInput.getValue().getType());
132 public void testGetAllMeterStatistics() throws Exception {
133 GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder()
134 .setNode(createNodeRef("unitProt:123"));
136 rpcResult = buildMeterStatisticsReply();
138 final var resultFuture = getAllMeterStatistics.invoke(input.build());
140 assertTrue(resultFuture.isDone());
141 final var rpcResult = resultFuture.get();
142 assertTrue(rpcResult.isSuccessful());
143 assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
147 public void testGetMeterFeatures() throws Exception {
148 GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder()
149 .setNode(createNodeRef("unitProt:123"));
151 rpcResult = RpcResultBuilder.<Object>success(List.of(
152 new MultipartReplyMessageBuilder()
153 .setVersion(EncodeConstants.OF_VERSION_1_3)
154 .setMultipartReplyBody(new MultipartReplyMeterFeaturesCaseBuilder()
155 .setMultipartReplyMeterFeatures(new MultipartReplyMeterFeaturesBuilder()
156 .setBandTypes(new MeterBandTypeBitmap(true, false))
157 .setCapabilities(new MeterFlags(true, false, false, false))
158 .setMaxBands(Uint8.valueOf(71))
159 .setMaxColor(Uint8.valueOf(72))
160 .setMaxMeter(Uint32.valueOf(73))
166 final var resultFuture = getMeterFeatures.invoke(input.build());
168 assertTrue(resultFuture.isDone());
169 final var rpcResult = resultFuture.get();
170 assertTrue(rpcResult.isSuccessful());
171 assertEquals(MultipartType.OFPMPMETERFEATURES, requestInput.getValue().getType());
175 public void testGetMeterStatistics() throws Exception {
176 GetMeterStatisticsInputBuilder input = new GetMeterStatisticsInputBuilder()
177 .setNode(createNodeRef("unitProt:123"))
178 .setMeterId(new MeterId(Uint32.valueOf(21)));
180 rpcResult = buildMeterStatisticsReply();
182 final var resultFuture = getMeterStatistics.invoke(input.build());
184 assertTrue(resultFuture.isDone());
185 final var rpcResult = resultFuture.get();
186 assertTrue(rpcResult.isSuccessful());
187 assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
190 protected RpcResult<Object> buildMeterStatisticsReply() {
191 return RpcResultBuilder.<Object>success(List.of(
192 new MultipartReplyMessageBuilder()
193 .setVersion(EncodeConstants.OF_VERSION_1_3)
194 .setMultipartReplyBody(new MultipartReplyMeterCaseBuilder()
195 .setMultipartReplyMeter(new MultipartReplyMeterBuilder()
196 .setMeterStats(List.of(new MeterStatsBuilder()
197 .setMeterId(METER_ID)
198 .setByteInCount(Uint64.valueOf(81))
199 .setDurationSec(Uint32.valueOf(82))
200 .setDurationNsec(Uint32.valueOf(83))
201 .setFlowCount(Uint32.valueOf(84))
202 .setPacketInCount(Uint64.valueOf(85))
203 .setMeterBandStats(List.of(new MeterBandStatsBuilder()
204 .setByteBandCount(Uint64.valueOf(86))
205 .setPacketBandCount(Uint64.valueOf(87))