2 * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowjava.protocol.impl.core;
10 import static org.mockito.ArgumentMatchers.any;
11 import static org.mockito.ArgumentMatchers.anyShort;
12 import static org.mockito.Mockito.doThrow;
13 import static org.mockito.Mockito.when;
15 import io.netty.buffer.ByteBuf;
16 import io.netty.channel.ChannelHandlerContext;
17 import io.netty.util.concurrent.Future;
18 import io.netty.util.concurrent.GenericFutureListener;
19 import org.junit.After;
20 import org.junit.Assert;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
26 import org.opendaylight.openflowjava.protocol.impl.core.connection.MessageListenerWrapper;
27 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
28 import org.opendaylight.openflowjava.statistics.CounterEventTypes;
29 import org.opendaylight.openflowjava.statistics.StatisticsCounters;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
35 * Test counters for encoding (at least DS_ENCODE_SUCCESS, DS_ENCODE_FAIL and DS_FLOW_MODS_SENT counters have to
40 public class OFEncoderStatisticsTest {
42 @Mock ChannelHandlerContext mockChHndlrCtx ;
43 @Mock SerializationFactory mockSerializationFactory ;
44 @Mock MessageListenerWrapper wrapper;
45 @Mock OfHeader mockMsg ;
46 @Mock ByteBuf mockOut ;
47 @Mock Future<Void> future;
48 @Mock GenericFutureListener<Future<Void>> listener;
49 @Mock FlowModInput mockFlowModInput;
51 private StatisticsCounters statCounters;
52 private OFEncoder ofEncoder;
55 * Initialize tests, start and reset counters before each test.
58 public void initTlest() {
59 MockitoAnnotations.initMocks(this);
60 ofEncoder = new OFEncoder() ;
61 ofEncoder.setSerializationFactory(mockSerializationFactory) ;
62 statCounters = StatisticsCounters.getInstance();
63 statCounters.startCounting(false, 0);
67 * Stop counting after each test.
70 public void tierDown() {
71 statCounters.stopCounting();
75 * Test counting of success encode (counter DS_ENCODE_SUCCESS has to be enabled).
78 public void testEncodeSuccessCounter() throws Exception {
79 CounterEventTypes cet = CounterEventTypes.DS_ENCODE_SUCCESS;
80 if (!statCounters.isCounterEnabled(cet)) {
81 Assert.fail("Counter " + cet + " is not enabled.");
84 when(mockOut.readableBytes()).thenReturn(1);
85 when(wrapper.getMsg()).thenReturn(mockMsg);
86 when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
89 for (int i = 0; i < count; i++) {
90 ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
93 Assert.assertEquals("Wrong - bad counter value for OFEncoder encode succesfully ", count,
94 statCounters.getCounter(cet).getCounterValue());
98 * Test counting of flow-mod sent (counter DS_FLOW_MODS_SENT has to be enabled).
101 public void testFlowModSentCounter() throws Exception {
102 CounterEventTypes cet = CounterEventTypes.DS_FLOW_MODS_SENT;
103 if (!statCounters.isCounterEnabled(cet)) {
104 Assert.fail("Counter " + cet + " is not enabled.");
106 when(mockOut.readableBytes()).thenReturn(1);
107 when(wrapper.getMsg()).thenReturn(mockFlowModInput);
108 when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
111 for (int i = 0; i < count; i++) {
112 ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
115 Assert.assertEquals("Wrong - bad counter value for OFEncoder flow-mod sent", count,
116 statCounters.getCounter(cet).getCounterValue());
120 * Test counting of encode fail (counter DS_ENCODE_FAIL has to be enabled).
123 public void testEncodeEncodeFailCounter() throws Exception {
124 CounterEventTypes cet = CounterEventTypes.DS_ENCODE_FAIL;
125 if (!statCounters.isCounterEnabled(cet)) {
126 Assert.fail("Counter " + cet + " is not enabled.");
129 when(wrapper.getMsg()).thenReturn(mockMsg);
130 when(wrapper.getListener()).thenReturn(listener);
131 when(wrapper.getMsg().getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);
132 doThrow(new IllegalArgumentException()).when(mockSerializationFactory).messageToBuffer(anyShort(),
133 any(ByteBuf.class), any(DataObject.class));
136 for (int i = 0; i < count; i++) {
137 ofEncoder.encode(mockChHndlrCtx, wrapper, mockOut);
140 Assert.assertEquals("Wrong - bad counter value for OFEncoder fail encode", count,
141 statCounters.getCounter(cet).getCounterValue());