Improved unit test coverage (covered some untested branches)
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / connection / ConnectionAdapterImplTest.java
1 /*\r
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowjava.protocol.impl.connection;\r
10 \r
11 import static org.mockito.Matchers.any;\r
12 import static org.mockito.Mockito.times;\r
13 import static org.mockito.Mockito.verify;\r
14 import static org.mockito.Mockito.when;\r
15 import io.netty.channel.ChannelPipeline;\r
16 import io.netty.channel.socket.SocketChannel;\r
17 \r
18 import java.net.InetSocketAddress;\r
19 import java.util.concurrent.TimeUnit;\r
20 \r
21 import org.junit.Assert;\r
22 import org.junit.Before;\r
23 import org.junit.Test;\r
24 import org.mockito.Mock;\r
25 import org.mockito.MockitoAnnotations;\r
26 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;\r
27 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutputBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;\r
55 import org.opendaylight.yangtools.yang.binding.DataObject;\r
56 \r
57 import com.google.common.cache.Cache;\r
58 import com.google.common.cache.CacheBuilder;\r
59 import com.google.common.cache.RemovalListener;\r
60 import com.google.common.cache.RemovalNotification;\r
61 \r
62 /**\r
63  * @author michal.polkorab\r
64  *\r
65  */\r
66 public class ConnectionAdapterImplTest {\r
67 \r
68     private static final int RPC_RESPONSE_EXPIRATION = 1;\r
69     private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =\r
70             new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {\r
71         @Override\r
72         public void onRemoval(\r
73                 final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {\r
74             notification.getValue().discard();\r
75         }\r
76     };\r
77 \r
78     @Mock SocketChannel channel;\r
79     @Mock ChannelPipeline pipeline;\r
80     @Mock OpenflowProtocolListener messageListener;\r
81     @Mock SystemNotificationsListener systemListener;\r
82     @Mock ConnectionReadyListener readyListener;\r
83     @Mock Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;\r
84 \r
85     private ConnectionAdapterImpl adapter;\r
86     private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;\r
87 \r
88     /**\r
89      * Initializes ConnectionAdapter\r
90      */\r
91     @Before\r
92     public void setUp() {\r
93         MockitoAnnotations.initMocks(this);\r
94         when(channel.pipeline()).thenReturn(pipeline);\r
95         adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653));\r
96         adapter.setMessageListener(messageListener);\r
97         adapter.setSystemListener(systemListener);\r
98         adapter.setConnectionReadyListener(readyListener);\r
99         cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)\r
100                 .removalListener(REMOVAL_LISTENER).build();\r
101         adapter.setResponseCache(cache);\r
102     }\r
103 \r
104     /**\r
105      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with notifications\r
106      */\r
107     @Test\r
108     public void testConsume() {\r
109         DataObject message = new EchoRequestMessageBuilder().build();\r
110         adapter.consume(message);\r
111         verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
112         message = new ErrorMessageBuilder().build();\r
113         adapter.consume(message);\r
114         verify(messageListener, times(1)).onErrorMessage((ErrorMessage) message);\r
115         message = new ExperimenterMessageBuilder().build();\r
116         adapter.consume(message);\r
117         verify(messageListener, times(1)).onExperimenterMessage((ExperimenterMessage) message);\r
118         message = new FlowRemovedMessageBuilder().build();\r
119         adapter.consume(message);\r
120         verify(messageListener, times(1)).onFlowRemovedMessage((FlowRemovedMessage) message);\r
121         message = new HelloMessageBuilder().build();\r
122         adapter.consume(message);\r
123         verify(messageListener, times(1)).onHelloMessage((HelloMessage) message);\r
124         message = new MultipartReplyMessageBuilder().build();\r
125         adapter.consume(message);\r
126         verify(messageListener, times(1)).onMultipartReplyMessage((MultipartReplyMessage) message);\r
127         message = new PacketInMessageBuilder().build();\r
128         adapter.consume(message);\r
129         verify(messageListener, times(1)).onPacketInMessage((PacketInMessage) message);\r
130         message = new PortStatusMessageBuilder().build();\r
131         adapter.consume(message);\r
132         verify(messageListener, times(1)).onPortStatusMessage((PortStatusMessage) message);\r
133         message = new SwitchIdleEventBuilder().build();\r
134         adapter.consume(message);\r
135         verify(systemListener, times(1)).onSwitchIdleEvent((SwitchIdleEvent) message);\r
136         message = new DisconnectEventBuilder().build();\r
137         adapter.consume(message);\r
138         verify(systemListener, times(1)).onDisconnectEvent((DisconnectEvent) message);\r
139         message = new EchoRequestMessageBuilder().build();\r
140         adapter.consume(message);\r
141         verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
142     }\r
143 \r
144     /**\r
145      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with unexpected rpc\r
146      */\r
147     @Test\r
148     public void testConsume2() {\r
149         adapter.setResponseCache(mockCache);\r
150         BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
151         barrierBuilder.setXid(42L);\r
152         BarrierOutput barrier = barrierBuilder.build();\r
153         adapter.consume(barrier);\r
154         verify(mockCache, times(1)).getIfPresent(any(RpcResponseKey.class));\r
155     }\r
156 \r
157     /**\r
158      * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with expected rpc\r
159      */\r
160     @Test\r
161     public void testConsume3() {\r
162         BarrierInputBuilder inputBuilder = new BarrierInputBuilder();\r
163         inputBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
164         inputBuilder.setXid(42L);\r
165         BarrierInput barrierInput = inputBuilder.build();\r
166         RpcResponseKey key = new RpcResponseKey(42L, "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput");\r
167         ResponseExpectedRpcListener<OfHeader> listener = new ResponseExpectedRpcListener<>(barrierInput,\r
168                 "failure", mockCache, key);\r
169         cache.put(key, listener);\r
170         BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
171         barrierBuilder.setXid(42L);\r
172         BarrierOutput barrierOutput = barrierBuilder.build();\r
173         adapter.consume(barrierOutput);\r
174         ResponseExpectedRpcListener<?> ifPresent = cache.getIfPresent(key);\r
175         Assert.assertNull("Listener was not discarded", ifPresent);\r
176     }\r
177 }