Merge "Mask Support for TCP and UDP ports in nicira extension "
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / statistics / services / OpendaylightGroupStatisticsServiceImplTest.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 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;
56
57 /**
58  * Test for {@link OpendaylightGroupStatisticsServiceImpl}
59  */
60 public class OpendaylightGroupStatisticsServiceImplTest extends AbstractSingleStatsServiceTest {
61
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);
64     @Captor
65     private ArgumentCaptor<MultipartRequestInput> requestInput;
66
67     private OpendaylightGroupStatisticsServiceImpl groupStatisticsService;
68
69     public void setUp() {
70         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
71         groupStatisticsService = new OpendaylightGroupStatisticsServiceImpl(rqContextStack, deviceContext,
72                 new AtomicLong(), notificationPublishService, convertorManager);
73
74         Mockito.doAnswer(answerVoidToCallback).when(outboundQueueProvider)
75                 .commitEntry(Matchers.eq(42L), requestInput.capture(), Matchers.any(FutureCallback.class));
76     }
77
78     @After
79     public void tearDown() throws Exception {
80         Mockito.verify(notificationPublishService).offerNotification(Matchers.<Notification>any());
81     }
82
83     @Test
84     public void testGetAllGroupStatistics() throws Exception {
85         GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder()
86                 .setNode(createNodeRef("unitProt:123"));
87
88         rpcResult = buildGroupStatsResponse();
89
90         final Future<RpcResult<GetAllGroupStatisticsOutput>> resultFuture
91                 = groupStatisticsService.getAllGroupStatistics(input.build());
92
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());
97     }
98
99     @Test
100     public void testGetGroupDescription() throws Exception {
101         GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder()
102                 .setNode(createNodeRef("unitProt:123"));
103
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()
112                                                         .setWatchGroup(51L)
113                                                         .setWatchPort(new PortNumber(52L))
114                                                         .setWeight(53)
115                                                         .build()))
116                                                 .setType(GroupType.OFPGTALL)
117                                                 .build()))
118                                         .build())
119                                 .build())
120                         .build()
121         )).build();
122
123         final Future<RpcResult<GetGroupDescriptionOutput>> resultFuture
124                 = groupStatisticsService.getGroupDescription(input.build());
125
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());
130     }
131
132     @Test
133     public void testGetGroupFeatures() throws Exception {
134         GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder()
135                 .setNode(createNodeRef("unitProt:123"));
136
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))
148                                         .build())
149                                 .build())
150                         .build()
151         )).build();
152
153         final Future<RpcResult<GetGroupFeaturesOutput>> resultFuture
154                 = groupStatisticsService.getGroupFeatures(input.build());
155
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());
160     }
161
162     @Test
163     public void testGetGroupStatistics() throws Exception {
164         GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder()
165                 .setNode(createNodeRef("unitProt:123"))
166                 .setGroupId(new GroupId(21L));
167
168         rpcResult = buildGroupStatsResponse();
169
170         final Future<RpcResult<GetGroupStatisticsOutput>> resultFuture
171                 = groupStatisticsService.getGroupStatistics(input.build());
172
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());
177     }
178
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))
188                                                 .setRefCount(23L)
189                                                 .setDurationSec(24L)
190                                                 .setDurationNsec(25L)
191                                                 .setGroupId(GROUP_ID)
192                                                 .setBucketStats(Collections.singletonList(new BucketStatsBuilder()
193                                                         .setByteCount(BigInteger.valueOf(26L))
194                                                         .setPacketCount(BigInteger.valueOf(27L))
195                                                         .build()))
196                                                 .build()))
197                                         .build())
198                                 .build())
199                         .build()
200         )).build();
201     }
202 }