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.connection;
10 import static org.mockito.Mockito.when;
12 import com.google.common.cache.Cache;
13 import com.google.common.cache.CacheBuilder;
14 import com.google.common.cache.RemovalListener;
15 import com.google.common.cache.RemovalNotification;
16 import io.netty.channel.ChannelFuture;
17 import io.netty.channel.ChannelOutboundHandlerAdapter;
18 import io.netty.channel.ChannelPipeline;
19 import io.netty.channel.embedded.EmbeddedChannel;
20 import io.netty.channel.socket.SocketChannel;
21 import java.net.InetSocketAddress;
22 import java.util.concurrent.TimeUnit;
23 import org.junit.After;
24 import org.junit.Assert;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.mockito.MockitoAnnotations;
29 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
30 import org.opendaylight.openflowjava.statistics.CounterEventTypes;
31 import org.opendaylight.openflowjava.statistics.StatisticsCounters;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
61 import org.opendaylight.yangtools.yang.binding.DataObject;
64 * Test counters in ConnectionAdapter (at least DS_ENTERED_OFJAVA, DS_FLOW_MODS_ENTERED and US_MESSAGE_PASS counters have to be enabled)
68 public class ConnectionAdapterImplStatisticsTest {
70 private static final int RPC_RESPONSE_EXPIRATION = 1;
71 private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =
72 new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {
74 public void onRemoval(
75 final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {
76 notification.getValue().discard();
80 @Mock SystemNotificationsListener systemListener;
81 @Mock ConnectionReadyListener readyListener;
82 @Mock ChannelFuture channelFuture;
83 @Mock OpenflowProtocolListener messageListener;
84 @Mock SocketChannel channel;
85 @Mock ChannelPipeline pipeline;
86 @Mock EchoInput echoInput;
87 @Mock BarrierInput barrierInput;
88 @Mock EchoReplyInput echoReplyInput;
89 @Mock ExperimenterInput experimenterInput;
90 @Mock FlowModInput flowModInput;
91 @Mock GetConfigInput getConfigInput;
92 @Mock GetFeaturesInput getFeaturesInput;
93 @Mock GetQueueConfigInput getQueueConfigInput;
94 @Mock GroupModInput groupModInput;
95 @Mock HelloInput helloInput;
96 @Mock MeterModInput meterModInput;
97 @Mock PacketOutInput packetOutInput;
98 @Mock MultipartRequestInput multipartRequestInput;
99 @Mock PortModInput portModInput;
100 @Mock RoleRequestInput roleRequestInput;
101 @Mock SetConfigInput setConfigInput;
102 @Mock TableModInput tableModInput;
103 @Mock GetAsyncInput getAsyncInput;
104 @Mock SetAsyncInput setAsyncInput;
106 private ConnectionAdapterImpl adapter;
107 private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;
108 private StatisticsCounters statCounters;
112 * Start counting and reset counters before each test
115 public void setUp() {
116 MockitoAnnotations.initMocks(this);
117 statCounters = StatisticsCounters.getInstance();
118 statCounters.startCounting(false, 0);
123 * Stop counting after each test
126 public void tierDown(){
127 if (adapter != null && adapter.isAlive()) {
128 adapter.disconnect();
130 statCounters.stopCounting();
134 * Test statistic counter for all rpc calls (counters DS_ENTERED_OFJAVA and DS_FLOW_MODS_ENTERED have to be enabled)
137 public void testEnterOFJavaCounter() {
138 if(!statCounters.isCounterEnabled(CounterEventTypes.DS_ENTERED_OFJAVA)){
139 Assert.fail("Counter " + CounterEventTypes.DS_ENTERED_OFJAVA + " is not enabled");
141 if(!statCounters.isCounterEnabled(CounterEventTypes.DS_FLOW_MODS_ENTERED)){
142 Assert.fail("Counter " + CounterEventTypes.DS_FLOW_MODS_ENTERED + " is not enabled");
144 final EmbeddedChannel embChannel = new EmbeddedChannel(new EmbededChannelHandler());
145 adapter = new ConnectionAdapterImpl(embChannel, InetSocketAddress.createUnresolved("localhost", 9876), true);
146 cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)
147 .removalListener(REMOVAL_LISTENER).build();
148 adapter.setResponseCache(cache);
149 adapter.barrier(barrierInput);
150 embChannel.runPendingTasks();
151 adapter.echo(echoInput);
152 embChannel.runPendingTasks();
153 adapter.echoReply(echoReplyInput);
154 embChannel.runPendingTasks();
155 adapter.experimenter(experimenterInput);
156 embChannel.runPendingTasks();
157 adapter.flowMod(flowModInput);
158 embChannel.runPendingTasks();
159 adapter.getConfig(getConfigInput);
160 embChannel.runPendingTasks();
161 adapter.getFeatures(getFeaturesInput);
162 embChannel.runPendingTasks();
163 adapter.getQueueConfig(getQueueConfigInput);
164 embChannel.runPendingTasks();
165 adapter.groupMod(groupModInput);
166 embChannel.runPendingTasks();
167 adapter.hello(helloInput);
168 embChannel.runPendingTasks();
169 adapter.meterMod(meterModInput);
170 embChannel.runPendingTasks();
171 adapter.packetOut(packetOutInput);
172 embChannel.runPendingTasks();
173 adapter.multipartRequest(multipartRequestInput);
174 embChannel.runPendingTasks();
175 adapter.portMod(portModInput);
176 embChannel.runPendingTasks();
177 adapter.roleRequest(roleRequestInput);
178 embChannel.runPendingTasks();
179 adapter.setConfig(setConfigInput);
180 embChannel.runPendingTasks();
181 adapter.tableMod(tableModInput);
182 embChannel.runPendingTasks();
183 adapter.getAsync(getAsyncInput);
184 embChannel.runPendingTasks();
185 adapter.setAsync(setAsyncInput);
186 embChannel.runPendingTasks();
187 Assert.assertEquals("Wrong - bad counter value for ConnectionAdapterImpl rpc methods", 19, statCounters.getCounter(CounterEventTypes.DS_ENTERED_OFJAVA).getCounterValue());
188 Assert.assertEquals("Wrong - bad counter value for ConnectionAdapterImpl flow-mod entered", 1, statCounters.getCounter(CounterEventTypes.DS_FLOW_MODS_ENTERED).getCounterValue());
189 adapter.disconnect();
193 * Test counter for pass messages to consumer (counter US_MESSAGE_PASS has to be enabled)
196 public void testMessagePassCounter() {
197 if(!statCounters.isCounterEnabled(CounterEventTypes.US_MESSAGE_PASS)){
198 Assert.fail("Counter " + CounterEventTypes.US_MESSAGE_PASS + " is not enabled");
200 when(channel.pipeline()).thenReturn(pipeline);
201 adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653), true);
202 adapter.setMessageListener(messageListener);
203 adapter.setSystemListener(systemListener);
204 adapter.setConnectionReadyListener(readyListener);
205 cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)
206 .removalListener(REMOVAL_LISTENER).build();
207 adapter.setResponseCache(cache);
208 when(channel.disconnect()).thenReturn(channelFuture);
209 DataObject message = new EchoRequestMessageBuilder().build();
210 adapter.consume(message);
211 message = new ErrorMessageBuilder().build();
212 adapter.consume(message);
213 message = new ExperimenterMessageBuilder().build();
214 adapter.consume(message);
215 message = new FlowRemovedMessageBuilder().build();
216 adapter.consume(message);
217 message = new HelloMessageBuilder().build();
218 adapter.consume(message);
219 message = new MultipartReplyMessageBuilder().build();
220 adapter.consume(message);
221 message = new PacketInMessageBuilder().build();
222 adapter.consume(message);
223 message = new PortStatusMessageBuilder().build();
224 adapter.consume(message);
225 message = new EchoRequestMessageBuilder().build();
226 adapter.consume(message);
227 Assert.assertEquals("Wrong - bad counter value for ConnectionAdapterImpl consume method", 9, statCounters.getCounter(CounterEventTypes.US_MESSAGE_PASS).getCounterValue());
228 adapter.disconnect();
232 * Empty channel Handler for testing
236 private class EmbededChannelHandler extends ChannelOutboundHandlerAdapter {
237 // no operation need to test