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 com.google.common.util.concurrent.FutureCallback;
12 import java.math.BigInteger;
13 import java.util.Collections;
14 import java.util.concurrent.Future;
15 import java.util.concurrent.atomic.AtomicLong;
16 import org.junit.After;
17 import org.junit.Assert;
18 import org.junit.Test;
19 import org.mockito.ArgumentCaptor;
20 import org.mockito.Captor;
21 import org.mockito.Matchers;
22 import org.mockito.Mockito;
23 import org.opendaylight.openflowplugin.api.OFConstants;
24 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
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.GetAllGroupStatisticsOutput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;
49 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;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
51 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;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
53 import org.opendaylight.yangtools.yang.binding.Notification;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
55 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
58 * Test for {@link OpendaylightGroupStatisticsServiceImpl}
60 public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
62 private static final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId GROUP_ID =
63 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId(123L);
65 private ArgumentCaptor<MultipartRequestInput> requestInput;
67 private OpendaylightGroupStatisticsServiceImpl groupStatisticsService;
70 final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
71 groupStatisticsService = new OpendaylightGroupStatisticsServiceImpl(rqContextStack, deviceContext,
72 new AtomicLong(), notificationPublishService, convertorManager);
74 Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
75 .commitEntry(Matchers.eq(42L), requestInput.capture(), Matchers.any(FutureCallback.class));
79 public void tearDown() throws Exception {
80 Mockito.verify(notificationPublishService).offerNotification(Matchers.<Notification>any());
84 public void testGetAllGroupStatistics() throws Exception {
85 GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder()
86 .setNode(createNodeRef("unitProt:123"));
88 rpcResult = buildGroupStatsResponse();
90 final Future<RpcResult<GetAllGroupStatisticsOutput>> resultFuture
91 = groupStatisticsService.getAllGroupStatistics(input.build());
93 Assert.assertTrue(resultFuture.isDone());
94 final RpcResult<GetAllGroupStatisticsOutput> rpcResultCompatible = resultFuture.get();
95 Assert.assertTrue(rpcResultCompatible.isSuccessful());
96 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
100 public void testGetGroupDescription() throws Exception {
101 GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
102 .setNode(createNodeRef("unitProt:123"));
104 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
105 new MultipartReplyMessageBuilder()
106 .setVersion(OFConstants.OFP_VERSION_1_3)
107 .setMultipartReplyBody(new MultipartReplyGroupDescCaseBuilder()
108 .setMultipartReplyGroupDesc(new MultipartReplyGroupDescBuilder()
109 .setGroupDesc(Collections.singletonList(new GroupDescBuilder()
110 .setGroupId(GROUP_ID)
111 .setBucketsList(Collections.singletonList(new BucketsListBuilder()
113 .setWatchPort(new PortNumber(52L))
116 .setType(GroupType.OFPGTALL)
123 final Future<RpcResult<GetGroupDescriptionOutput>> resultFuture
124 = groupStatisticsService.getGroupDescription(input.build());
126 Assert.assertTrue(resultFuture.isDone());
127 final RpcResult<GetGroupDescriptionOutput> rpcResult = resultFuture.get();
128 Assert.assertTrue(rpcResult.isSuccessful());
129 Assert.assertEquals(MultipartType.OFPMPGROUPDESC, requestInput.getValue().getType());
133 public void testGetGroupFeatures() throws Exception {
134 GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder()
135 .setNode(createNodeRef("unitProt:123"));
137 rpcResult = RpcResultBuilder.<Object>success(Collections.singletonList(
138 new MultipartReplyMessageBuilder()
139 .setVersion(OFConstants.OFP_VERSION_1_3)
140 .setMultipartReplyBody(new MultipartReplyGroupFeaturesCaseBuilder()
141 .setMultipartReplyGroupFeatures(new MultipartReplyGroupFeaturesBuilder()
142 .setActionsBitmap(Collections.singletonList(new ActionType(true,
143 false, false, false, false, false, false, false, false, false, false,
144 false, false, false, false, false, false)))
145 .setCapabilities(new GroupCapabilities(true, false, false, false))
146 .setTypes(new GroupTypes(true, false, false, false))
147 .setMaxGroups(Collections.singletonList(5L))
153 final Future<RpcResult<GetGroupFeaturesOutput>> resultFuture
154 = groupStatisticsService.getGroupFeatures(input.build());
156 Assert.assertTrue(resultFuture.isDone());
157 final RpcResult<GetGroupFeaturesOutput> rpcResult = resultFuture.get();
158 Assert.assertTrue(rpcResult.isSuccessful());
159 Assert.assertEquals(MultipartType.OFPMPGROUPFEATURES, requestInput.getValue().getType());
163 public void testGetGroupStatistics() throws Exception {
164 GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder()
165 .setNode(createNodeRef("unitProt:123"))
166 .setGroupId(new GroupId(21L));
168 rpcResult = buildGroupStatsResponse();
170 final Future<RpcResult<GetGroupStatisticsOutput>> resultFuture
171 = groupStatisticsService.getGroupStatistics(input.build());
173 Assert.assertTrue(resultFuture.isDone());
174 final RpcResult<GetGroupStatisticsOutput> rpcResult = resultFuture.get();
175 Assert.assertTrue(rpcResult.isSuccessful());
176 Assert.assertEquals(MultipartType.OFPMPGROUP, requestInput.getValue().getType());
179 private static RpcResult<Object> buildGroupStatsResponse() {
180 return RpcResultBuilder.<Object>success(Collections.singletonList(
181 new MultipartReplyMessageBuilder()
182 .setVersion(OFConstants.OFP_VERSION_1_3)
183 .setMultipartReplyBody(new MultipartReplyGroupCaseBuilder()
184 .setMultipartReplyGroup(new MultipartReplyGroupBuilder()
185 .setGroupStats(Collections.singletonList(new GroupStatsBuilder()
186 .setByteCount(BigInteger.valueOf(21L))
187 .setPacketCount(BigInteger.valueOf(22L))
190 .setDurationNsec(25L)
191 .setGroupId(GROUP_ID)
192 .setBucketStats(Collections.singletonList(new BucketStatsBuilder()
193 .setByteCount(BigInteger.valueOf(26L))
194 .setPacketCount(BigInteger.valueOf(27L))