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
9 package org.opendaylight.openflowplugin.impl.statistics.services;
11 import static org.mockito.ArgumentMatchers.any;
12 import static org.mockito.ArgumentMatchers.eq;
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.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStatsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDescBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
56 import org.opendaylight.yangtools.yang.common.RpcResult;
57 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
60 * Test for {@link OpendaylightGroupStatisticsServiceImpl}.
62 public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
64 private static final org.opendaylight.yang.gen.v1.urn
65 .opendaylight.openflow.common.types.rev130731.GroupId GROUP_ID =
66 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId(123L);
68 private ArgumentCaptor<MultipartRequestInput> requestInput;
70 private OpendaylightGroupStatisticsServiceImpl groupStatisticsService;
73 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
74 groupStatisticsService = new OpendaylightGroupStatisticsServiceImpl(rqContextStack, deviceContext,
75 new AtomicLong(), notificationPublishService, convertorManager);
77 Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
78 .commitEntry(eq(42L), requestInput.capture(), any(FutureCallback.class));
82 public void tearDown() throws Exception {
83 Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.any());
87 public void testGetAllGroupStatistics() throws Exception {
88 GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder()
89 .setNode(createNodeRef("unitProt:123"));
91 rpcResult = buildGroupStatsResponse();
93 final Future<RpcResult<GetAllGroupStatisticsOutput>> resultFuture
94 = groupStatisticsService.getAllGroupStatistics(input.build());
96 Assert.assertTrue(resultFuture.isDone());
97 final RpcResult<GetAllGroupStatisticsOutput> rpcResultCompatible = resultFuture.get();
98 Assert.assertTrue(rpcResultCompatible.isSuccessful());
99 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
103 public void testGetGroupDescription() throws Exception {
104 GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
105 .setNode(createNodeRef("unitProt:123"));
107 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
108 new MultipartReplyMessageBuilder()
109 .setVersion(OFConstants.OFP_VERSION_1_3)
110 .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
111 .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
112 .setGroupDesc(Collections.singletonList(new GroupDescBuilder()
113 .setGroupId(GROUP_ID)
114 .setBucketsList(Collections.singletonList(new BucketsListBuilder()
116 .setWatchPort(new PortNumber(52L))
119 .setType(GroupType.OFPGTALL)
126 final Future<RpcResult<GetGroupDescriptionOutput>> resultFuture
127 = groupStatisticsService.getGroupDescription(input.build());
129 Assert.assertTrue(resultFuture.isDone());
130 final RpcResult<GetGroupDescriptionOutput> rpcResult = resultFuture.get();
131 Assert.assertTrue(rpcResult.isSuccessful());
132 Assert.assertEquals(MultipartType.OFPMPGROUPDESC, requestInput.getValue().getType());
136 public void testGetGroupFeatures() throws Exception {
137 GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder()
138 .setNode(createNodeRef("unitProt:123"));
140 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
141 new MultipartReplyMessageBuilder()
142 .setVersion(OFConstants.OFP_VERSION_1_3)
143 .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
144 .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
145 .setActionsBitmap(Collections.singletonList(new ActionType(true,
146 false, false, false, false, false, false, false, false, false, false,
147 false, false, false, false, false, false)))
148 .setCapabilities(new GroupCapabilities(true, false, false, false))
149 .setTypes(new GroupTypes(true, false, false, false))
150 .setMaxGroups(Collections.singletonList(5L))
156 final Future<RpcResult<GetGroupFeaturesOutput>> resultFuture
157 = groupStatisticsService.getGroupFeatures(input.build());
159 Assert.assertTrue(resultFuture.isDone());
160 final RpcResult<GetGroupFeaturesOutput> rpcResult = resultFuture.get();
161 Assert.assertTrue(rpcResult.isSuccessful());
162 Assert.assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
166 public void testGetGroupStatistics() throws Exception {
167 GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder()
168 .setNode(createNodeRef("unitProt:123"))
169 .setGroupId(new GroupId(21L));
171 rpcResult = buildGroupStatsResponse();
173 final Future<RpcResult<GetGroupStatisticsOutput>> resultFuture
174 = groupStatisticsService.getGroupStatistics(input.build());
176 Assert.assertTrue(resultFuture.isDone());
177 final RpcResult<GetGroupStatisticsOutput> rpcResult = resultFuture.get();
178 Assert.assertTrue(rpcResult.isSuccessful());
179 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
182 private static RpcResult<Object> buildGroupStatsResponse() {
183 return RpcResultBuilder.<Object>success(Collections.singletonList(
184 new MultipartReplyMessageBuilder()
185 .setVersion(OFConstants.OFP_VERSION_1_3)
186 .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
187 .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
188 .setGroupStats(Collections.singletonList(new GroupStatsBuilder()
189 .setByteCount(BigInteger.valueOf(21L))
190 .setPacketCount(BigInteger.valueOf(22L))
193 .setDurationNsec(25L)
194 .setGroupId(GROUP_ID)
195 .setBucketStats(Collections.singletonList(new BucketStatsBuilder()
196 .setByteCount(BigInteger.valueOf(26L))
197 .setPacketCount(BigInteger.valueOf(27L))