OPNFLWPLUG-1032: Neon-MRI: Bump odlparent, yangtools, mdsal
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / statistics / services / OpendaylightMeterStatisticsServiceImplTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.impl.statistics.services;
10
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.ArgumentMatchers.eq;
13
14 import com.google.common.util.concurrent.FutureCallback;
15 import java.math.BigInteger;
16 import java.util.Collections;
17 import java.util.concurrent.Future;
18 import java.util.concurrent.atomic.AtomicLong;
19 import org.junit.After;
20 import org.junit.Assert;
21 import org.junit.Test;
22 import org.mockito.ArgumentCaptor;
23 import org.mockito.ArgumentMatchers;
24 import org.mockito.Captor;
25 import org.mockito.Mockito;
26 import org.opendaylight.openflowplugin.api.OFConstants;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
28 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeterBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStatsBuilder;
51 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;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
53 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;
54 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;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
56 import org.opendaylight.yangtools.yang.binding.Notification;
57 import org.opendaylight.yangtools.yang.common.RpcResult;
58 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
59
60 /**
61  * Test for {@link OpendaylightMeterStatisticsServiceImpl}.
62  */
63 public class OpendaylightMeterStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
64
65     private static final org.opendaylight.yang.gen.v1.urn
66                 .opendaylight.openflow.common.types.rev130731.MeterId METER_ID =
67             new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId(123L);
68     @Captor
69     private ArgumentCaptor<MultipartRequestInput> requestInput;
70
71     private OpendaylightMeterStatisticsServiceImpl meterStatisticsService;
72
73     public void setUp() {
74         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
75         meterStatisticsService = new OpendaylightMeterStatisticsServiceImpl(rqContextStack, deviceContext,
76                 new AtomicLong(), notificationPublishService, convertorManager);
77
78         Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
79                 .commitEntry(eq(42L), requestInput.capture(), any(FutureCallback.class));
80     }
81
82     @After
83     public void tearDown() throws Exception {
84         Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.<Notification>any());
85     }
86
87     @Test
88     public void testGetAllMeterConfigStatistics() throws Exception {
89         GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder()
90                 .setNode(createNodeRef("unitProt:123"));
91
92         rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
93                 new MultipartReplyMessageBuilder()
94                         .setVersion(OFConstants.OFP_VERSION_1_3)
95                         .setMultipartReplyBody(new MultipartReplyMeterConfigCaseBuilder()
96                                 .setMultipartReplyMeterConfig(new MultipartReplyMeterConfigBuilder()
97                                         .setMeterConfig(Collections.singletonList(new MeterConfigBuilder()
98                                                 .setFlags(new MeterFlags(true, false, false, false))
99                                                 .setMeterId(METER_ID)
100                                                 .setBands(Collections.singletonList(new BandsBuilder()
101                                                         .setMeterBand(new MeterBandDropCaseBuilder()
102                                                                 .setMeterBandDrop(new MeterBandDropBuilder()
103                                                                         .setBurstSize(61L)
104                                                                         .setRate(62L)
105                                                                         .setType(MeterBandType.OFPMBTDROP)
106                                                                         .build())
107                                                                 .build())
108                                                         .build()))
109                                                 .build()))
110                                         .build())
111                                 .build())
112                         .build()
113         )).build();
114
115         final Future<RpcResult<GetAllMeterConfigStatisticsOutput>> resultFuture
116                 = meterStatisticsService.getAllMeterConfigStatistics(input.build());
117
118         Assert.assertTrue(resultFuture.isDone());
119         final RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = resultFuture.get();
120         Assert.assertTrue(rpcResult.isSuccessful());
121         Assert.assertEquals(MultipartType.OFPMPMETERCONFIG, requestInput.getValue().getType());
122     }
123
124     @Test
125     public void testGetAllMeterStatistics() throws Exception {
126         GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder()
127                 .setNode(createNodeRef("unitProt:123"));
128
129         rpcResult = buildMeterStatisticsReply();
130
131         final Future<RpcResult<GetAllMeterStatisticsOutput>> resultFuture
132                 = meterStatisticsService.getAllMeterStatistics(input.build());
133
134         Assert.assertTrue(resultFuture.isDone());
135         final RpcResult<GetAllMeterStatisticsOutput> rpcResult = resultFuture.get();
136         Assert.assertTrue(rpcResult.isSuccessful());
137         Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
138     }
139
140     @Test
141     public void testGetMeterFeatures() throws Exception {
142         GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder()
143                 .setNode(createNodeRef("unitProt:123"));
144
145         rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
146                 new MultipartReplyMessageBuilder()
147                         .setVersion(OFConstants.OFP_VERSION_1_3)
148                         .setMultipartReplyBody(new MultipartReplyMeterFeaturesCaseBuilder()
149                                 .setMultipartReplyMeterFeatures(new MultipartReplyMeterFeaturesBuilder()
150                                         .setBandTypes(new MeterBandTypeBitmap(true, false))
151                                         .setCapabilities(new MeterFlags(true, false, false, false))
152                                         .setMaxBands((short) 71)
153                                         .setMaxColor((short) 72)
154                                         .setMaxMeter(73L)
155                                         .build())
156                                 .build())
157                         .build()
158         )).build();
159
160         final Future<RpcResult<GetMeterFeaturesOutput>> resultFuture
161                 = meterStatisticsService.getMeterFeatures(input.build());
162
163         Assert.assertTrue(resultFuture.isDone());
164         final RpcResult<GetMeterFeaturesOutput> rpcResult = resultFuture.get();
165         Assert.assertTrue(rpcResult.isSuccessful());
166         Assert.assertEquals(MultipartType.OFPMPMETERFEATURES, requestInput.getValue().getType());
167     }
168
169     @Test
170     public void testGetMeterStatistics() throws Exception {
171         GetMeterStatisticsInputBuilder input = new GetMeterStatisticsInputBuilder()
172                 .setNode(createNodeRef("unitProt:123"))
173                 .setMeterId(new MeterId(21L));
174
175         rpcResult = buildMeterStatisticsReply();
176
177         final Future<RpcResult<GetMeterStatisticsOutput>> resultFuture
178                 = meterStatisticsService.getMeterStatistics(input.build());
179
180         Assert.assertTrue(resultFuture.isDone());
181         final RpcResult<GetMeterStatisticsOutput> rpcResult = resultFuture.get();
182         Assert.assertTrue(rpcResult.isSuccessful());
183         Assert.assertEquals(MultipartType.OFPMPMETER, requestInput.getValue().getType());
184     }
185
186     protected RpcResult<Object> buildMeterStatisticsReply() {
187         return RpcResultBuilder.<Object>success(Collections.singletonList(
188                 new MultipartReplyMessageBuilder()
189                         .setVersion(OFConstants.OFP_VERSION_1_3)
190                         .setMultipartReplyBody(new MultipartReplyMeterCaseBuilder()
191                                 .setMultipartReplyMeter(new MultipartReplyMeterBuilder()
192                                         .setMeterStats(Collections.singletonList(new MeterStatsBuilder()
193                                                 .setMeterId(METER_ID)
194                                                 .setByteInCount(BigInteger.valueOf(81L))
195                                                 .setDurationSec(82L)
196                                                 .setDurationNsec(83L)
197                                                 .setFlowCount(84L)
198                                                 .setPacketInCount(BigInteger.valueOf(85L))
199                                                 .setMeterBandStats(Collections.singletonList(new MeterBandStatsBuilder()
200                                                         .setByteBandCount(BigInteger.valueOf(86L))
201                                                         .setPacketBandCount(BigInteger.valueOf(87L))
202                                                         .build()))
203                                                 .build()))
204                                         .build())
205                                 .build())
206                         .build()
207         )).build();
208     }
209 }