BUG-4283: experimenter msg support - serialization part
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / core / connection / ConnectionAdapterImplStatisticsTest.java
1 /*
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. 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 package org.opendaylight.openflowjava.protocol.impl.core.connection;
9
10 import static org.mockito.Mockito.when;
11
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;
62
63 /**
64  * Test counters in ConnectionAdapter (at least DS_ENTERED_OFJAVA, DS_FLOW_MODS_ENTERED and US_MESSAGE_PASS counters have to be enabled)
65  * @author madamjak
66  *
67  */
68 public class ConnectionAdapterImplStatisticsTest {
69
70     private static final int RPC_RESPONSE_EXPIRATION = 1;
71     private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =
72             new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {
73         @Override
74         public void onRemoval(
75                 final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {
76             notification.getValue().discard();
77         }
78     };
79
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;
105
106     private ConnectionAdapterImpl adapter;
107     private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;
108     private StatisticsCounters statCounters;
109
110     /**
111      * Initialize mocks
112      * Start counting and reset counters before each test
113      */
114     @Before
115     public void setUp() {
116         MockitoAnnotations.initMocks(this);
117         statCounters = StatisticsCounters.getInstance();
118         statCounters.startCounting(false, 0);
119     }
120
121     /**
122      * Disconnect adapter
123      * Stop counting after each test
124      */
125     @After
126     public void tierDown(){
127         if (adapter != null && adapter.isAlive()) {
128             adapter.disconnect();
129         }
130         statCounters.stopCounting();
131     }
132
133     /**
134      * Test statistic counter for all rpc calls (counters DS_ENTERED_OFJAVA and DS_FLOW_MODS_ENTERED have to be enabled)
135      */
136     @Test
137     public void testEnterOFJavaCounter() {
138         if(!statCounters.isCounterEnabled(CounterEventTypes.DS_ENTERED_OFJAVA)){
139             Assert.fail("Counter " + CounterEventTypes.DS_ENTERED_OFJAVA + " is not enabled");
140         }
141         if(!statCounters.isCounterEnabled(CounterEventTypes.DS_FLOW_MODS_ENTERED)){
142             Assert.fail("Counter " + CounterEventTypes.DS_FLOW_MODS_ENTERED + " is not enabled");
143         }
144         EmbeddedChannel embChannel = new EmbeddedChannel(new EmbededChannelHandler());
145         adapter = new ConnectionAdapterImpl(embChannel,InetSocketAddress.createUnresolved("localhost", 9876));
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();
190     }
191
192     /**
193      * Test counter for pass messages to consumer (counter US_MESSAGE_PASS has to be enabled)
194      */
195     @Test
196     public void testMessagePassCounter() {
197         if(!statCounters.isCounterEnabled(CounterEventTypes.US_MESSAGE_PASS)){
198             Assert.fail("Counter " + CounterEventTypes.US_MESSAGE_PASS + " is not enabled");
199         }
200         when(channel.pipeline()).thenReturn(pipeline);
201         adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653));
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();
229     }
230
231     /**
232      * Empty channel Handler for testing
233      * @author madamjak
234      *
235      */
236     private class EmbededChannelHandler extends ChannelOutboundHandlerAdapter {
237         // no operation need to test
238     }
239 }