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;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertTrue;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.when;
15 import java.util.List;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.openflowplugin.api.OFConstants;
20 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
21 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
22 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
23 import org.opendaylight.openflowplugin.impl.common.MultipartReplyTranslatorUtil;
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.flow.statistics.rev130819.FlowAndStatisticsMapList;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupDescStatsReply;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupStatisticsReply;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.AggregateFlowStatistics;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.MultipartReplyBody;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
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.desc._case.MultipartReplyGroupDescBuilder;
50 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;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStatsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStatsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
54 import org.opendaylight.yangtools.yang.binding.DataContainer;
55 import org.opendaylight.yangtools.yang.common.Uint32;
56 import org.opendaylight.yangtools.yang.common.Uint64;
58 public class MultipartReplyTranslatorTest {
60 private static final Uint64 DUMMY_DATAPATH_ID = Uint64.valueOf(21);
61 private static final Uint32 DUMMY_XID = Uint32.ONE;
62 private static final Uint64 DUMMY_BYTE_COUNT = Uint64.valueOf(31);
63 private static final Uint64 DUMMY_PACKET_COUNT = Uint64.valueOf(41);
64 private static final Uint32 DUMMY_FLOW_COUNT = Uint32.valueOf(51);
65 private static final Uint32 DUMMY_PORT_NO = Uint32.valueOf(154);
66 private static final Uint64 DUMMY_RX_BYTES = Uint64.valueOf(155);
67 private static final Uint64 DUMMY_TX_BYTES = Uint64.valueOf(165);
68 private static final Uint64 DUMMY_RX_PACKETS = Uint64.valueOf(175);
69 private static final Uint64 DUMMY_TX_PACKETS = Uint64.valueOf(185);
70 private static final Uint64 DUMMY_COLLISIONS = Uint64.valueOf(195);
71 private static final Uint64 DUMMY_RX_CRC_ERR = Uint64.valueOf(205);
72 private static final Uint64 DUMMY_RX_DROPPED = Uint64.valueOf(215);
73 private static final Uint64 DUMMY_RX_ERRORS = Uint64.valueOf(225);
74 private static final Uint64 DUMMY_RX_FRAME_ERR = Uint64.valueOf(235);
75 private static final Uint64 DUMMY_OVER_ERR = Uint64.valueOf(245);
76 private static final Uint64 DUMMY_TX_DROPPED = Uint64.valueOf(255);
77 private static final Uint64 DUMMY_TX_ERRORS = Uint64.valueOf(265);
78 private static final Uint32 DUMMY_DURATION_SEC = Uint32.valueOf(3453);
79 private static final Uint32 DUMMY_DURATION_NSEC = Uint32.valueOf(3343);
80 private static final GroupId DUMMY_GROUP_ID = new GroupId(Uint32.valueOf(55));
81 private static final Uint32 DUMMY_REF_COUNT = Uint32.valueOf(1234);
82 private static final GroupTypes DUMMY_GROUPS_TYPE = GroupTypes.GroupAll;
83 private static final GroupType DUMMY_GROUP_TYPE = GroupType.OFPGTALL;
84 private static final ConvertorManager CONVERTOR_MANAGER = ConvertorManagerFactory.createDefaultManager();
91 public void testTranslateFlow() {
92 DeviceContext mockedDeviceContext = mock(DeviceContext.class);
94 MultipartReplyMessage multipartReplyMessage =
95 prepareMocks(mockedDeviceContext, prepareMultipartReplyFlow(), MultipartType.OFPMPFLOW);
97 DataContainer result = MultipartReplyTranslatorUtil.translate(
98 multipartReplyMessage,
99 mockedDeviceContext.getDeviceInfo(),
101 mockedDeviceContext.oook()).orElseThrow();
103 DataContainer dataObject = validateOutput(result);
104 assertTrue(dataObject instanceof FlowAndStatisticsMapList);
108 public void testTranslateAggregate() {
109 DeviceContext mockedDeviceContext = mock(DeviceContext.class);
111 MultipartReplyMessage multipartReplyMessage =
112 prepareMocks(mockedDeviceContext, prepareMultipartReplyAggregate(), MultipartType.OFPMPAGGREGATE);
114 DataContainer result = MultipartReplyTranslatorUtil.translate(
115 multipartReplyMessage,
116 mockedDeviceContext.getDeviceInfo(),
118 mockedDeviceContext.oook()).orElseThrow();
120 DataContainer dataObject = validateOutput(result);
121 assertTrue(dataObject instanceof AggregateFlowStatistics);
122 AggregateFlowStatistics message = (AggregateFlowStatistics)dataObject;
123 assertEquals(DUMMY_BYTE_COUNT, message.getByteCount().getValue());
124 assertEquals(DUMMY_PACKET_COUNT, message.getPacketCount().getValue());
125 assertEquals(DUMMY_FLOW_COUNT, message.getFlowCount().getValue());
129 public void testTranslatePortStats() {
130 DeviceContext mockedDeviceContext = mock(DeviceContext.class);
132 MultipartReplyMessage multipartReplyMessage =
133 prepareMocks(mockedDeviceContext, prepareMultipartReplyPortStats(), MultipartType.OFPMPPORTSTATS);
135 DataContainer result = MultipartReplyTranslatorUtil.translate(
136 multipartReplyMessage,
137 mockedDeviceContext.getDeviceInfo(),
139 mockedDeviceContext.oook()).orElseThrow();
141 DataContainer dataObject = validateOutput(result);
142 assertTrue(dataObject instanceof org.opendaylight.yang.gen.v1.urn
143 .opendaylight.port.statistics.rev131214.NodeConnectorStatisticsAndPortNumberMap);
144 org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsAndPortNumberMap
145 nodeConnectorStatisticsUpdate = (org.opendaylight.yang.gen.v1.urn
146 .opendaylight.port.statistics.rev131214.NodeConnectorStatisticsAndPortNumberMap) dataObject;
147 var nodeConnectorStatisticsAndPortNumberMaps =
148 nodeConnectorStatisticsUpdate.nonnullNodeConnectorStatisticsAndPortNumberMap();
149 assertEquals(1, nodeConnectorStatisticsAndPortNumberMaps.size());
150 NodeConnectorStatisticsAndPortNumberMap nodeConnectorStatisticsAndPortNumberMap =
151 nodeConnectorStatisticsAndPortNumberMaps.values().iterator().next();
152 assertEquals("openflow:" + DUMMY_DATAPATH_ID + ":" + DUMMY_PORT_NO,
153 nodeConnectorStatisticsAndPortNumberMap.getNodeConnectorId().getValue());
154 assertEquals(DUMMY_RX_BYTES, nodeConnectorStatisticsAndPortNumberMap.getBytes().getReceived());
155 assertEquals(DUMMY_TX_BYTES, nodeConnectorStatisticsAndPortNumberMap.getBytes().getTransmitted());
156 assertEquals(DUMMY_RX_PACKETS, nodeConnectorStatisticsAndPortNumberMap.getPackets().getReceived());
157 assertEquals(DUMMY_TX_PACKETS, nodeConnectorStatisticsAndPortNumberMap.getPackets().getTransmitted());
158 assertEquals(DUMMY_COLLISIONS, nodeConnectorStatisticsAndPortNumberMap.getCollisionCount());
159 assertEquals(DUMMY_RX_CRC_ERR, nodeConnectorStatisticsAndPortNumberMap.getReceiveCrcError());
160 assertEquals(DUMMY_RX_DROPPED, nodeConnectorStatisticsAndPortNumberMap.getReceiveDrops());
161 assertEquals(DUMMY_RX_ERRORS, nodeConnectorStatisticsAndPortNumberMap.getReceiveErrors());
162 assertEquals(DUMMY_RX_FRAME_ERR, nodeConnectorStatisticsAndPortNumberMap.getReceiveFrameError());
163 assertEquals(DUMMY_OVER_ERR, nodeConnectorStatisticsAndPortNumberMap.getReceiveOverRunError());
164 assertEquals(DUMMY_TX_DROPPED, nodeConnectorStatisticsAndPortNumberMap.getTransmitDrops());
165 assertEquals(DUMMY_TX_ERRORS, nodeConnectorStatisticsAndPortNumberMap.getTransmitErrors());
169 public void testTranslateGroup() {
170 DeviceContext mockedDeviceContext = mock(DeviceContext.class);
172 MultipartReplyMessage multipartReplyMessage =
173 prepareMocks(mockedDeviceContext, prepareMultipartReplyGroup(), MultipartType.OFPMPGROUP);
175 DataContainer result = MultipartReplyTranslatorUtil.translate(
176 multipartReplyMessage,
177 mockedDeviceContext.getDeviceInfo(),
179 mockedDeviceContext.oook()).orElseThrow();
181 DataContainer dataObject = validateOutput(result);
182 assertTrue(dataObject instanceof GroupStatisticsReply);
183 GroupStatisticsReply groupStatisticsUpdate = (GroupStatisticsReply)dataObject;
184 var groupStats = groupStatisticsUpdate.nonnullGroupStats();
185 assertEquals(1, groupStats.size());
186 var groupStat = groupStats.values().iterator().next();
188 assertEquals(DUMMY_BYTE_COUNT, groupStat.getByteCount().getValue());
189 assertEquals(DUMMY_DURATION_SEC, groupStat.getDuration().getSecond().getValue());
190 assertEquals(DUMMY_DURATION_NSEC, groupStat.getDuration().getNanosecond().getValue());
191 assertEquals(DUMMY_GROUP_ID.getValue(), groupStat.getGroupId().getValue());
192 assertEquals(DUMMY_PACKET_COUNT, groupStat.getPacketCount().getValue());
193 assertEquals(DUMMY_REF_COUNT, groupStat.getRefCount().getValue());
197 public void testTranslateGroupDesc() {
198 DeviceContext mockedDeviceContext = mock(DeviceContext.class);
200 MultipartReplyMessage multipartReplyMessage =
201 prepareMocks(mockedDeviceContext, prepareMultipartReplyGroupDesc(), MultipartType.OFPMPGROUPDESC);
203 DataContainer result = MultipartReplyTranslatorUtil.translate(
204 multipartReplyMessage,
205 mockedDeviceContext.getDeviceInfo(),
207 mockedDeviceContext.oook()).orElseThrow();
209 DataContainer dataObject = validateOutput(result);
210 assertTrue(dataObject instanceof GroupDescStatsReply);
211 GroupDescStatsReply groupStatistics = (GroupDescStatsReply) dataObject;
212 Map<GroupDescStatsKey, GroupDescStats> groupDescStats = groupStatistics.nonnullGroupDescStats();
213 assertEquals(1, groupDescStats.size());
214 GroupDescStats groupDescStat = groupDescStats.values().iterator().next();
215 assertEquals(DUMMY_GROUP_ID.getValue(),groupDescStat.getGroupId().getValue());
216 assertEquals(DUMMY_GROUPS_TYPE,groupDescStat.getGroupType());
219 private static MultipartReplyBody prepareMultipartReplyGroupDesc() {
220 GroupDescBuilder groupDescBuilder = new GroupDescBuilder()
221 .setGroupId(DUMMY_GROUP_ID)
222 .setBucketsList(List.of())
223 .setType(DUMMY_GROUP_TYPE);
224 MultipartReplyGroupDescBuilder multipartReplyGroupDescBuilder = new MultipartReplyGroupDescBuilder()
225 .setGroupDesc(List.of(groupDescBuilder.build()));
226 MultipartReplyGroupDescCaseBuilder multipartReplyGroupDescCaseBuilder =
227 new MultipartReplyGroupDescCaseBuilder();
228 multipartReplyGroupDescCaseBuilder.setMultipartReplyGroupDesc(multipartReplyGroupDescBuilder.build());
229 return multipartReplyGroupDescCaseBuilder.build();
232 private static MultipartReplyBody prepareMultipartReplyGroup() {
233 GroupStatsBuilder groupStatsBuilder = new GroupStatsBuilder();
234 groupStatsBuilder.setByteCount(DUMMY_BYTE_COUNT);
235 groupStatsBuilder.setBucketStats(List.of());
236 groupStatsBuilder.setDurationSec(DUMMY_DURATION_SEC);
237 groupStatsBuilder.setDurationNsec(DUMMY_DURATION_NSEC);
238 groupStatsBuilder.setGroupId(DUMMY_GROUP_ID);
239 groupStatsBuilder.setPacketCount(DUMMY_PACKET_COUNT);
240 groupStatsBuilder.setRefCount(DUMMY_REF_COUNT);
241 MultipartReplyGroupBuilder multipartReplyGroupBuilder = new MultipartReplyGroupBuilder()
242 .setGroupStats(List.of(groupStatsBuilder.build()));
243 MultipartReplyGroupCaseBuilder multipartReplyGroupCaseBuilder = new MultipartReplyGroupCaseBuilder();
244 multipartReplyGroupCaseBuilder.setMultipartReplyGroup(multipartReplyGroupBuilder.build());
245 return multipartReplyGroupCaseBuilder.build();
248 private static MultipartReplyBody prepareMultipartReplyPortStats() {
249 PortStatsBuilder dummyPortStatBuilder = new PortStatsBuilder();
250 dummyPortStatBuilder.setPortNo(DUMMY_PORT_NO);
251 dummyPortStatBuilder.setRxBytes(DUMMY_RX_BYTES);
252 dummyPortStatBuilder.setTxBytes(DUMMY_TX_BYTES);
253 dummyPortStatBuilder.setRxPackets(DUMMY_RX_PACKETS);
254 dummyPortStatBuilder.setTxPackets(DUMMY_TX_PACKETS);
255 dummyPortStatBuilder.setCollisions(DUMMY_COLLISIONS);
256 dummyPortStatBuilder.setRxCrcErr(DUMMY_RX_CRC_ERR);
257 dummyPortStatBuilder.setRxDropped(DUMMY_RX_DROPPED);
258 dummyPortStatBuilder.setRxErrors(DUMMY_RX_ERRORS);
259 dummyPortStatBuilder.setRxFrameErr(DUMMY_RX_FRAME_ERR);
260 dummyPortStatBuilder.setRxOverErr(DUMMY_OVER_ERR);
261 dummyPortStatBuilder.setTxDropped(DUMMY_TX_DROPPED);
262 dummyPortStatBuilder.setTxErrors(DUMMY_TX_ERRORS);
263 MultipartReplyPortStatsBuilder multipartReplyPortStatsBuilder = new MultipartReplyPortStatsBuilder()
264 .setPortStats(List.of(dummyPortStatBuilder.build()));
265 MultipartReplyPortStatsCaseBuilder multipartReplyPortStatsCaseBuilder =
266 new MultipartReplyPortStatsCaseBuilder();
267 multipartReplyPortStatsCaseBuilder.setMultipartReplyPortStats(multipartReplyPortStatsBuilder.build());
268 return multipartReplyPortStatsCaseBuilder.build();
272 private static MultipartReplyBody prepareMultipartReplyAggregate() {
273 MultipartReplyAggregateBuilder multipartReplyAggregateBuilder = new MultipartReplyAggregateBuilder();
274 multipartReplyAggregateBuilder.setByteCount(DUMMY_BYTE_COUNT);
275 multipartReplyAggregateBuilder.setPacketCount(DUMMY_PACKET_COUNT);
276 multipartReplyAggregateBuilder.setFlowCount(DUMMY_FLOW_COUNT);
277 MultipartReplyAggregateCaseBuilder multipartReplyAggregateCaseBuilder =
278 new MultipartReplyAggregateCaseBuilder();
279 multipartReplyAggregateCaseBuilder.setMultipartReplyAggregate(multipartReplyAggregateBuilder.build());
280 return multipartReplyAggregateCaseBuilder.build();
283 private static MultipartReplyBody prepareMultipartReplyFlow() {
284 MultipartReplyFlowCaseBuilder multipartReplyFlowCaseBuilder = new MultipartReplyFlowCaseBuilder();
285 MultipartReplyFlowBuilder multipartReplyFlowBuilder = new MultipartReplyFlowBuilder();
286 multipartReplyFlowBuilder.setFlowStats(List.of());
287 multipartReplyFlowCaseBuilder.setMultipartReplyFlow(multipartReplyFlowBuilder.build());
288 return multipartReplyFlowCaseBuilder.build();
291 private static MultipartReplyMessage prepareMocks(final DeviceContext mockedDeviceContext,
292 final MultipartReplyBody multipartReplyBody,
293 final MultipartType multipartType) {
294 ConnectionContext mockedConnectionContext = mock(ConnectionContext.class);
295 FeaturesReply mockedFeaturesReply = mock(FeaturesReply.class);
296 when(mockedFeaturesReply.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
297 when(mockedFeaturesReply.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
299 DeviceInfo deviceInfo = mock(DeviceInfo.class);
300 when(deviceInfo.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_3);
301 when(deviceInfo.getDatapathId()).thenReturn(DUMMY_DATAPATH_ID);
302 when(mockedDeviceContext.getDeviceInfo()).thenReturn(deviceInfo);
304 when(mockedConnectionContext.getFeatures()).thenReturn(mockedFeaturesReply);
305 when(mockedDeviceContext.getPrimaryConnectionContext()).thenReturn(mockedConnectionContext);
307 MultipartReplyMessage multipartReplyMessage = mock(MultipartReplyMessage.class);
308 when(multipartReplyMessage.getType()).thenReturn(multipartType);
309 when(multipartReplyMessage.getFlags()).thenReturn(new MultipartRequestFlags(true));
310 when(multipartReplyMessage.getXid()).thenReturn(DUMMY_XID);
311 when(multipartReplyMessage.getMultipartReplyBody()).thenReturn(multipartReplyBody);
312 return multipartReplyMessage;
315 private static DataContainer validateOutput(final DataContainer dataObject) {