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.mockito.ArgumentMatchers.any;
11 import static org.mockito.ArgumentMatchers.eq;
13 import com.google.common.util.concurrent.FutureCallback;
14 import java.util.Collections;
15 import java.util.concurrent.Future;
16 import java.util.concurrent.atomic.AtomicLong;
17 import org.junit.After;
18 import org.junit.Assert;
19 import org.junit.Test;
20 import org.mockito.ArgumentCaptor;
21 import org.mockito.ArgumentMatchers;
22 import org.mockito.Captor;
23 import org.mockito.Mockito;
24 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
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.GetAllMeterConfigStatisticsOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
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.multipart.reply.meter._case.MultipartReplyMeterBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStatsBuilder;
49 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;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
51 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;
52 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;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
55 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
56 import org.opendaylight.yangtools.yang.common.Uint32;
57 import org.opendaylight.yangtools.yang.common.Uint64;
58 import org.opendaylight.yangtools.yang.common.Uint8;
61 * Test for {@link OpendaylightMeterStatisticsServiceImpl}.
63 public class OpendaylightMeterStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
65 private static final org.opendaylight.yang.gen.v1.urn
66 .opendaylight.openflow.common.types.rev130731.MeterId METER_ID = new org.opendaylight.yang.gen.v1.urn
67 .opendaylight.openflow.common.types.rev130731.MeterId(Uint32.valueOf(123));
69 private ArgumentCaptor<MultipartRequestInput> requestInput;
71 private OpendaylightMeterStatisticsServiceImpl meterStatisticsService;
75 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
76 meterStatisticsService = new OpendaylightMeterStatisticsServiceImpl(rqContextStack, deviceContext,
77 new AtomicLong(), notificationPublishService, convertorManager);
79 Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
80 .commitEntry(eq(42L), requestInput.capture(), any(FutureCallback.class));
84 public void tearDown() {
85 Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
89 public void testGetAllMeterConfigStatistics() throws Exception {
90 GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder()
91 .setNode(createNodeRef("unitProt:123"));
93 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
94 new MultipartReplyMessageBuilder()
95 .setVersion(EncodeConstants.OF_VERSION_1_3)
96 .setMultipartReplyBody(new MultipartReplyMeterConfigCaseBuilder()
97 .setMultipartReplyMeterConfig(new MultipartReplyMeterConfigBuilder()
98 .setMeterConfig(Collections.singletonList(new MeterConfigBuilder()
99 .setFlags(new MeterFlags(true, false, false, false))
100 .setMeterId(METER_ID)
101 .setBands(Collections.singletonList(new BandsBuilder()
102 .setMeterBand(new MeterBandDropCaseBuilder()
103 .setMeterBandDrop(new MeterBandDropBuilder()
104 .setBurstSize(Uint32.valueOf(61))
105 .setRate(Uint32.valueOf(62))
106 .setType(MeterBandType.OFPMBTDROP)
116 final Future<RpcResult<GetAllMeterConfigStatisticsOutput>> resultFuture
117 = meterStatisticsService.getAllMeterConfigStatistics(input.build());
119 Assert.assertTrue(resultFuture.isDone());
120 final RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = resultFuture.get();
121 Assert.assertTrue(rpcResult.isSuccessful());
122 Assert.assertEquals(MultipartType.OFPMPMETERCONFIG, requestInput.getValue().getType());
126 public void testGetAllMeterStatistics() throws Exception {
127 GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder()
128 .setNode(createNodeRef("unitProt:123"));
130 rpcResult = buildMeterStatisticsReply();
132 final Future<RpcResult<GetAllMeterStatisticsOutput>> resultFuture
133 = meterStatisticsService.getAllMeterStatistics(input.build());
135 Assert.assertTrue(resultFuture.isDone());
136 final RpcResult<GetAllMeterStatisticsOutput> rpcResult = resultFuture.get();
137 Assert.assertTrue(rpcResult.isSuccessful());
138 Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
142 public void testGetMeterFeatures() throws Exception {
143 GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder()
144 .setNode(createNodeRef("unitProt:123"));
146 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
147 new MultipartReplyMessageBuilder()
148 .setVersion(EncodeConstants.OF_VERSION_1_3)
149 .setMultipartReplyBody(new MultipartReplyMeterFeaturesCaseBuilder()
150 .setMultipartReplyMeterFeatures(new MultipartReplyMeterFeaturesBuilder()
151 .setBandTypes(new MeterBandTypeBitmap(true, false))
152 .setCapabilities(new MeterFlags(true, false, false, false))
153 .setMaxBands(Uint8.valueOf(71))
154 .setMaxColor(Uint8.valueOf(72))
155 .setMaxMeter(Uint32.valueOf(73))
161 final Future<RpcResult<GetMeterFeaturesOutput>> resultFuture
162 = meterStatisticsService.getMeterFeatures(input.build());
164 Assert.assertTrue(resultFuture.isDone());
165 final RpcResult<GetMeterFeaturesOutput> rpcResult = resultFuture.get();
166 Assert.assertTrue(rpcResult.isSuccessful());
167 Assert.assertEquals(MultipartType.OFPMPMETERFEATURES, requestInput.getValue().getType());
171 public void testGetMeterStatistics() throws Exception {
172 GetMeterStatisticsInputBuilder input = new GetMeterStatisticsInputBuilder()
173 .setNode(createNodeRef("unitProt:123"))
174 .setMeterId(new MeterId(Uint32.valueOf(21)));
176 rpcResult = buildMeterStatisticsReply();
178 final Future<RpcResult<GetMeterStatisticsOutput>> resultFuture
179 = meterStatisticsService.getMeterStatistics(input.build());
181 Assert.assertTrue(resultFuture.isDone());
182 final RpcResult<GetMeterStatisticsOutput> rpcResult = resultFuture.get();
183 Assert.assertTrue(rpcResult.isSuccessful());
184 Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
187 protected RpcResult<Object> buildMeterStatisticsReply() {
188 return RpcResultBuilder.<Object>success(Collections.singletonList(
189 new MultipartReplyMessageBuilder()
190 .setVersion(EncodeConstants.OF_VERSION_1_3)
191 .setMultipartReplyBody(new MultipartReplyMeterCaseBuilder()
192 .setMultipartReplyMeter(new MultipartReplyMeterBuilder()
193 .setMeterStats(Collections.singletonList(new MeterStatsBuilder()
194 .setMeterId(METER_ID)
195 .setByteInCount(Uint64.valueOf(81))
196 .setDurationSec(Uint32.valueOf(82))
197 .setDurationNsec(Uint32.valueOf(83))
198 .setFlowCount(Uint32.valueOf(84))
199 .setPacketInCount(Uint64.valueOf(85))
200 .setMeterBandStats(Collections.singletonList(new MeterBandStatsBuilder()
201 .setByteBandCount(Uint64.valueOf(86))
202 .setPacketBandCount(Uint64.valueOf(87))