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.Captor;
24 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
25 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;
45 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;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
47 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;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
49 import org.opendaylight.yangtools.yang.common.RpcResult;
50 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
51 import org.opendaylight.yangtools.yang.common.Uint16;
52 import org.opendaylight.yangtools.yang.common.Uint32;
53 import org.opendaylight.yangtools.yang.common.Uint64;
56 public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
57 private static final org.opendaylight.yang.gen.v1.urn
58 .opendaylight.openflow.common.types.rev130731.GroupId GROUP_ID = new org.opendaylight.yang.gen.v1.urn
59 .opendaylight.openflow.common.types.rev130731.GroupId(Uint32.valueOf(123));
61 private ArgumentCaptor<MultipartRequestInput> requestInput;
63 private GetAllGroupStatisticsImpl getAllGroupStatistics;
64 private GetGroupStatisticsImpl getGroupStatistics;
65 private GetGroupDescriptionImpl getGroupDescription;
66 private GetGroupFeaturesImpl getGroupFeatures;
70 final var convertorManager = ConvertorManagerFactory.createDefaultManager();
71 final var xid = new AtomicLong();
72 getAllGroupStatistics = new GetAllGroupStatisticsImpl(rqContextStack, deviceContext, xid,
73 notificationPublishService, convertorManager);
74 getGroupStatistics = new GetGroupStatisticsImpl(rqContextStack, deviceContext, xid, notificationPublishService,
76 getGroupDescription = new GetGroupDescriptionImpl(rqContextStack, deviceContext, xid,
77 notificationPublishService, convertorManager);
78 getGroupFeatures = new GetGroupFeaturesImpl(rqContextStack, deviceContext, xid, notificationPublishService,
81 doAnswer(answerVoidToCallback).when(outboundQueueProvider)
82 .commitEntry(eq(Uint32.valueOf(42)), requestInput.capture(), any(FutureCallback.class));
86 public void tearDown() {
87 verify(notificationPublishService).offerNotification(any());
91 public void testGetAllGroupStatistics() throws Exception {
92 GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder()
93 .setNode(createNodeRef("unitProt:123"));
95 rpcResult = buildGroupStatsResponse();
97 final var resultFuture = getAllGroupStatistics.invoke(input.build());
99 assertTrue(resultFuture.isDone());
100 final var rpcResultCompatible = resultFuture.get();
101 assertTrue(rpcResultCompatible.isSuccessful());
102 assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
106 public void testGetGroupDescription() throws Exception {
107 GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
108 .setNode(createNodeRef("unitProt:123"));
110 rpcResult = RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
111 .setVersion(EncodeConstants.OF_VERSION_1_3)
112 .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
113 .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
114 .setGroupDesc(List.of(new GroupDescBuilder()
115 .setGroupId(GROUP_ID)
116 .setBucketsList(List.of(new BucketsListBuilder()
117 .setWatchGroup(Uint32.valueOf(51))
118 .setWatchPort(new PortNumber(Uint32.valueOf(52)))
119 .setWeight(Uint16.valueOf(53))
121 .setType(GroupType.OFPGTALL)
128 final var resultFuture = getGroupDescription.invoke(input.build());
130 assertTrue(resultFuture.isDone());
131 final var rpcResult = resultFuture.get();
132 assertTrue(rpcResult.isSuccessful());
133 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(List.of(new MultipartReplyMessageBuilder()
142 .setVersion(EncodeConstants.OF_VERSION_1_3)
143 .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
144 .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
145 .setActionsBitmap(List.of(new ActionType(true, false, false, false, false, false, false, false,
146 false, false, false, false, false, false, false, false, false)))
147 .setCapabilities(new GroupCapabilities(true, false, false, false))
148 .setTypes(new GroupTypes(true, false, false, false))
149 .setMaxGroups(List.of(Uint32.valueOf(5L)))
155 final var resultFuture = getGroupFeatures.invoke(input.build());
157 assertTrue(resultFuture.isDone());
158 final var rpcResult = resultFuture.get();
159 assertTrue(rpcResult.isSuccessful());
160 assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
164 public void testGetGroupStatistics() throws Exception {
165 GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder()
166 .setNode(createNodeRef("unitProt:123"))
167 .setGroupId(new GroupId(Uint32.valueOf(21)));
169 rpcResult = buildGroupStatsResponse();
171 final var resultFuture = getGroupStatistics.invoke(input.build());
173 assertTrue(resultFuture.isDone());
174 final var rpcResult = resultFuture.get();
175 assertTrue(rpcResult.isSuccessful());
176 assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
179 private static RpcResult<Object> buildGroupStatsResponse() {
180 return RpcResultBuilder.<Object>success(List.of(new MultipartReplyMessageBuilder()
181 .setVersion(EncodeConstants.OF_VERSION_1_3)
182 .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
183 .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
184 .setGroupStats(List.of(new GroupStatsBuilder()
185 .setByteCount(Uint64.valueOf(21))
186 .setPacketCount(Uint64.valueOf(22))
187 .setRefCount(Uint32.valueOf(23))
188 .setDurationSec(Uint32.valueOf(24))
189 .setDurationNsec(Uint32.valueOf(25))
190 .setGroupId(GROUP_ID)
191 .setBucketStats(List.of(new BucketStatsBuilder()
192 .setByteCount(Uint64.valueOf(26))
193 .setPacketCount(Uint64.valueOf(27))