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.binding.Notification;
57 import org.opendaylight.yangtools.yang.common.RpcResult;
58 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
61 * Test for {@link OpendaylightGroupStatisticsServiceImpl}.
63 public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
65 private static final org.opendaylight.yang.gen.v1.urn
66 .opendaylight.openflow.common.types.rev130731.GroupId GROUP_ID =
67 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId(123L);
69 private ArgumentCaptor<MultipartRequestInput> requestInput;
71 private OpendaylightGroupStatisticsServiceImpl groupStatisticsService;
74 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
75 groupStatisticsService = new OpendaylightGroupStatisticsServiceImpl(rqContextStack, deviceContext,
76 new AtomicLong(), notificationPublishService, convertorManager);
78 Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
79 .commitEntry(eq(42L), requestInput.capture(), any(FutureCallback.class));
83 public void tearDown() throws Exception {
84 Mockito.verify(notificationPublishService).offerNotification(ArgumentMatchers.<Notification>any());
88 public void testGetAllGroupStatistics() throws Exception {
89 GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder()
90 .setNode(createNodeRef("unitProt:123"));
92 rpcResult = buildGroupStatsResponse();
94 final Future<RpcResult<GetAllGroupStatisticsOutput>> resultFuture
95 = groupStatisticsService.getAllGroupStatistics(input.build());
97 Assert.assertTrue(resultFuture.isDone());
98 final RpcResult<GetAllGroupStatisticsOutput> rpcResultCompatible = resultFuture.get();
99 Assert.assertTrue(rpcResultCompatible.isSuccessful());
100 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
104 public void testGetGroupDescription() throws Exception {
105 GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
106 .setNode(createNodeRef("unitProt:123"));
108 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
109 new MultipartReplyMessageBuilder()
110 .setVersion(OFConstants.OFP_VERSION_1_3)
111 .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
112 .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
113 .setGroupDesc(Collections.singletonList(new GroupDescBuilder()
114 .setGroupId(GROUP_ID)
115 .setBucketsList(Collections.singletonList(new BucketsListBuilder()
117 .setWatchPort(new PortNumber(52L))
120 .setType(GroupType.OFPGTALL)
127 final Future<RpcResult<GetGroupDescriptionOutput>> resultFuture
128 = groupStatisticsService.getGroupDescription(input.build());
130 Assert.assertTrue(resultFuture.isDone());
131 final RpcResult<GetGroupDescriptionOutput> rpcResult = resultFuture.get();
132 Assert.assertTrue(rpcResult.isSuccessful());
133 Assert.assertEquals(MultipartType.OFPMPGROUPDESC, requestInput.getValue().getType());
137 public void testGetGroupFeatures() throws Exception {
138 GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder()
139 .setNode(createNodeRef("unitProt:123"));
141 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
142 new MultipartReplyMessageBuilder()
143 .setVersion(OFConstants.OFP_VERSION_1_3)
144 .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
145 .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
146 .setActionsBitmap(Collections.singletonList(new ActionType(true,
147 false, false, false, false, false, false, false, false, false, false,
148 false, false, false, false, false, false)))
149 .setCapabilities(new GroupCapabilities(true, false, false, false))
150 .setTypes(new GroupTypes(true, false, false, false))
151 .setMaxGroups(Collections.singletonList(5L))
157 final Future<RpcResult<GetGroupFeaturesOutput>> resultFuture
158 = groupStatisticsService.getGroupFeatures(input.build());
160 Assert.assertTrue(resultFuture.isDone());
161 final RpcResult<GetGroupFeaturesOutput> rpcResult = resultFuture.get();
162 Assert.assertTrue(rpcResult.isSuccessful());
163 Assert.assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
167 public void testGetGroupStatistics() throws Exception {
168 GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder()
169 .setNode(createNodeRef("unitProt:123"))
170 .setGroupId(new GroupId(21L));
172 rpcResult = buildGroupStatsResponse();
174 final Future<RpcResult<GetGroupStatisticsOutput>> resultFuture
175 = groupStatisticsService.getGroupStatistics(input.build());
177 Assert.assertTrue(resultFuture.isDone());
178 final RpcResult<GetGroupStatisticsOutput> rpcResult = resultFuture.get();
179 Assert.assertTrue(rpcResult.isSuccessful());
180 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
183 private static RpcResult<Object> buildGroupStatsResponse() {
184 return RpcResultBuilder.<Object>success(Collections.singletonList(
185 new MultipartReplyMessageBuilder()
186 .setVersion(OFConstants.OFP_VERSION_1_3)
187 .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
188 .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
189 .setGroupStats(Collections.singletonList(new GroupStatsBuilder()
190 .setByteCount(BigInteger.valueOf(21L))
191 .setPacketCount(BigInteger.valueOf(22L))
194 .setDurationNsec(25L)
195 .setGroupId(GROUP_ID)
196 .setBucketStats(Collections.singletonList(new BucketStatsBuilder()
197 .setByteCount(BigInteger.valueOf(26L))
198 .setPacketCount(BigInteger.valueOf(27L))