Mass replace CRLF->LF
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / core / connection / ConnectionAdapterImplTest.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
9 package org.opendaylight.openflowjava.protocol.impl.core.connection;
10
11 import static org.mockito.Matchers.any;
12 import static org.mockito.Mockito.times;
13 import static org.mockito.Mockito.verify;
14 import static org.mockito.Mockito.when;
15 import io.netty.channel.ChannelFuture;
16 import io.netty.channel.ChannelPipeline;
17 import io.netty.channel.socket.SocketChannel;
18
19 import java.net.InetSocketAddress;
20 import java.util.concurrent.TimeUnit;
21
22 import org.junit.Assert;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.mockito.Mock;
26 import org.mockito.MockitoAnnotations;
27 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
28 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
29 import org.opendaylight.openflowjava.protocol.impl.core.connection.ConnectionAdapterImpl;
30 import org.opendaylight.openflowjava.protocol.impl.core.connection.ResponseExpectedRpcListener;
31 import org.opendaylight.openflowjava.protocol.impl.core.connection.RpcResponseKey;
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.BarrierInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
59 import org.opendaylight.yangtools.yang.binding.DataObject;
60
61 import com.google.common.cache.Cache;
62 import com.google.common.cache.CacheBuilder;
63 import com.google.common.cache.RemovalListener;
64 import com.google.common.cache.RemovalNotification;
65
66 /**
67  * @author michal.polkorab
68  * @author madamjak
69  *
70  */
71 public class ConnectionAdapterImplTest {
72
73     private static final int RPC_RESPONSE_EXPIRATION = 1;
74     private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =
75             new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {
76         @Override
77         public void onRemoval(
78                 final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {
79             notification.getValue().discard();
80         }
81     };
82
83     @Mock SocketChannel channel;
84     @Mock ChannelPipeline pipeline;
85     @Mock OpenflowProtocolListener messageListener;
86     @Mock SystemNotificationsListener systemListener;
87     @Mock ConnectionReadyListener readyListener;
88     @Mock Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;
89     @Mock ChannelFuture channelFuture;
90
91     private ConnectionAdapterImpl adapter;
92     private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;
93
94     /**
95      * Initializes ConnectionAdapter
96      */
97     @Before
98     public void setUp() {
99         MockitoAnnotations.initMocks(this);
100         when(channel.pipeline()).thenReturn(pipeline);
101         adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653));
102         adapter.setMessageListener(messageListener);
103         adapter.setSystemListener(systemListener);
104         adapter.setConnectionReadyListener(readyListener);
105         cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)
106                 .removalListener(REMOVAL_LISTENER).build();
107         adapter.setResponseCache(cache);
108         when(channel.disconnect()).thenReturn(channelFuture);
109     }
110
111     /**
112      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with notifications
113      */
114     @Test
115     public void testConsume() {
116         DataObject message = new EchoRequestMessageBuilder().build();
117         adapter.consume(message);
118         verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);
119         message = new ErrorMessageBuilder().build();
120         adapter.consume(message);
121         verify(messageListener, times(1)).onErrorMessage((ErrorMessage) message);
122         message = new ExperimenterMessageBuilder().build();
123         adapter.consume(message);
124         verify(messageListener, times(1)).onExperimenterMessage((ExperimenterMessage) message);
125         message = new FlowRemovedMessageBuilder().build();
126         adapter.consume(message);
127         verify(messageListener, times(1)).onFlowRemovedMessage((FlowRemovedMessage) message);
128         message = new HelloMessageBuilder().build();
129         adapter.consume(message);
130         verify(messageListener, times(1)).onHelloMessage((HelloMessage) message);
131         message = new MultipartReplyMessageBuilder().build();
132         adapter.consume(message);
133         verify(messageListener, times(1)).onMultipartReplyMessage((MultipartReplyMessage) message);
134         message = new PacketInMessageBuilder().build();
135         adapter.consume(message);
136         verify(messageListener, times(1)).onPacketInMessage((PacketInMessage) message);
137         message = new PortStatusMessageBuilder().build();
138         adapter.consume(message);
139         verify(messageListener, times(1)).onPortStatusMessage((PortStatusMessage) message);
140         message = new SwitchIdleEventBuilder().build();
141         adapter.consume(message);
142         verify(systemListener, times(1)).onSwitchIdleEvent((SwitchIdleEvent) message);
143         message = new DisconnectEventBuilder().build();
144         adapter.consume(message);
145         verify(systemListener, times(1)).onDisconnectEvent((DisconnectEvent) message);
146         message = new EchoRequestMessageBuilder().build();
147         adapter.consume(message);
148         verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);
149     }
150
151     /**
152      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with unexpected rpc
153      */
154     @Test
155     public void testConsume2() {
156         adapter.setResponseCache(mockCache);
157         BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();
158         barrierBuilder.setXid(42L);
159         BarrierOutput barrier = barrierBuilder.build();
160         adapter.consume(barrier);
161         verify(mockCache, times(1)).getIfPresent(any(RpcResponseKey.class));
162     }
163
164     /**
165      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with expected rpc
166      */
167     @Test
168     public void testConsume3() {
169         BarrierInputBuilder inputBuilder = new BarrierInputBuilder();
170         inputBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
171         inputBuilder.setXid(42L);
172         BarrierInput barrierInput = inputBuilder.build();
173         RpcResponseKey key = new RpcResponseKey(42L, "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput");
174         ResponseExpectedRpcListener<OfHeader> listener = new ResponseExpectedRpcListener<>(barrierInput,
175                 "failure", mockCache, key);
176         cache.put(key, listener);
177         BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();
178         barrierBuilder.setXid(42L);
179         BarrierOutput barrierOutput = barrierBuilder.build();
180         adapter.consume(barrierOutput);
181         ResponseExpectedRpcListener<?> ifPresent = cache.getIfPresent(key);
182         Assert.assertNull("Listener was not discarded", ifPresent);
183     }
184     /**
185      * Test IsAlive method
186      */
187     @Test
188     public void testIsAlive(){
189         int port = 9876;
190         String host ="localhost";
191         InetSocketAddress inetSockAddr = InetSocketAddress.createUnresolved(host, port);
192         ConnectionAdapterImpl connAddapter = new ConnectionAdapterImpl(channel,inetSockAddr);
193         Assert.assertEquals("Wrong - diffrence between channel.isOpen() and ConnectionAdapterImpl.isAlive()", channel.isOpen(), connAddapter.isAlive());
194
195         connAddapter.disconnect();
196         Assert.assertFalse("Wrong - ConnectionAdapterImpl can not be alive after disconnet.", connAddapter.isAlive());
197     }
198
199     /**
200      * Test throw exception if no listeners are present
201      */
202     @Test(expected = java.lang.IllegalStateException.class)
203     public void testMissingListeners(){
204         int port = 9876;
205         String host ="localhost";
206         InetSocketAddress inetSockAddr = InetSocketAddress.createUnresolved(host, port);
207         ConnectionAdapterImpl connAddapter = new ConnectionAdapterImpl(channel,inetSockAddr);
208         connAddapter.setSystemListener(null);
209         connAddapter.setMessageListener(null);
210         connAddapter.setConnectionReadyListener(null);
211         connAddapter.checkListeners();
212     }
213 }