6666da3de000c1cc6bd759cd8eae4fd34032cfa0
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / core / PublishingChannelInitializerTest.java
1 /*
2  * Copyright (c) 2014 Brocade Communications Systems, Inc. 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;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.eq;
14 import static org.mockito.Mockito.doThrow;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17 import static org.mockito.Mockito.when;
18 import io.netty.channel.ChannelHandler;
19 import io.netty.channel.ChannelPipeline;
20 import io.netty.channel.group.DefaultChannelGroup;
21 import io.netty.channel.socket.SocketChannel;
22 import io.netty.handler.ssl.SslHandler;
23
24 import java.net.InetAddress;
25 import java.net.InetSocketAddress;
26 import java.net.UnknownHostException;
27
28 import javax.net.ssl.SSLEngine;
29
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.mockito.Mock;
33 import org.mockito.MockitoAnnotations;
34 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
35 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfiguration;
36 import org.opendaylight.openflowjava.protocol.api.connection.TlsConfigurationImpl;
37 import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionAdapterFactory;
38 import org.opendaylight.openflowjava.protocol.impl.connection.ConnectionFacade;
39 import org.opendaylight.openflowjava.protocol.impl.core.PublishingChannelInitializer.COMPONENT_NAMES;
40 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
41 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.KeystoreType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.PathType;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow._switch.connection.provider.impl.rev140328.Tls;
45
46 /**
47  *
48  * @author james.hall
49  */
50 public class PublishingChannelInitializerTest {
51
52     @Mock SocketChannel mockSocketCh ;
53     @Mock ChannelPipeline mockChPipeline ;
54     @Mock SwitchConnectionHandler mockSwConnHandler ;
55     @Mock ConnectionAdapterFactory mockConnAdaptorFactory;
56     @Mock DefaultChannelGroup mockChGrp ;
57     @Mock ConnectionFacade mockConnFacade ;
58     @Mock Tls mockTls ;
59     SSLEngine sslEngine ;
60
61     @Mock SerializationFactory mockSerializationFactory ;
62     @Mock DeserializationFactory mockDeserializationFactory ;
63
64     TlsConfiguration tlsConfiguration ;
65     InetSocketAddress inetSockAddr;
66     PublishingChannelInitializer pubChInitializer  ;
67
68     /**
69      * Sets up test environment
70      * @throws Exception 
71      */
72     @Before
73     public void setUp() throws Exception {
74         MockitoAnnotations.initMocks(this);
75         pubChInitializer= new PublishingChannelInitializer(mockChGrp, mockConnAdaptorFactory) ;
76         pubChInitializer.setSerializationFactory(mockSerializationFactory);
77         pubChInitializer.setDeserializationFactory(mockDeserializationFactory);
78         pubChInitializer.setSwitchIdleTimeout(1) ;
79         pubChInitializer.getConnectionIterator() ;
80
81         when( mockChGrp.size()).thenReturn(1) ;
82         pubChInitializer.setSwitchConnectionHandler( mockSwConnHandler ) ;
83
84         inetSockAddr = new InetSocketAddress(InetAddress.getLocalHost(), 8675 ) ;
85
86         when(mockConnAdaptorFactory.createConnectionFacade(mockSocketCh))
87         .thenReturn(mockConnFacade);
88         when(mockSocketCh.remoteAddress()).thenReturn(inetSockAddr) ;
89         when(mockSocketCh.localAddress()).thenReturn(inetSockAddr) ;
90         when(mockSocketCh.remoteAddress()).thenReturn(inetSockAddr) ;
91         when(mockSwConnHandler.accept(eq(InetAddress.getLocalHost()))).thenReturn(true) ;
92         when(mockSocketCh.pipeline()).thenReturn(mockChPipeline) ;
93         
94         tlsConfiguration = new TlsConfigurationImpl(KeystoreType.JKS, "/selfSignedSwitch", PathType.CLASSPATH,
95                 KeystoreType.JKS, "/selfSignedController", PathType.CLASSPATH);
96     }
97
98
99     /**
100      * Test channel initialization with encryption config set
101      */
102     @Test
103     public void testinitChannelEncryptionSet()  {
104         pubChInitializer.setTlsConfiguration(tlsConfiguration);
105         pubChInitializer.initChannel(mockSocketCh) ;
106
107         verifyCommonHandlers();
108         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.SSL_HANDLER.name()),any(SslHandler.class)) ;
109     }
110
111     /**
112      * Test channel initialization with null encryption config
113      */
114     @Test
115     public void testinitChannelEncryptionSetNullTls()  {
116         pubChInitializer.setTlsConfiguration(null);
117         pubChInitializer.initChannel(mockSocketCh) ;
118
119         verifyCommonHandlers();
120         verify(mockChPipeline, times(0)).addLast(eq(COMPONENT_NAMES.SSL_HANDLER.name()),any(SslHandler.class)) ;
121     }
122
123     /**
124      * Test channel initialization without setting the encryption
125      */
126     @Test
127     public void testinitChannelEncryptionNotSet()  {
128         // Without encryption, only the common
129         pubChInitializer.initChannel(mockSocketCh) ;
130
131         verifyCommonHandlers();
132     }
133
134     /**
135      * Test disconnect on new connection rejected
136      * @throws UnknownHostException
137      */
138     @Test
139     public void testinitChannelNoEncryptionAcceptFails() throws UnknownHostException  {
140         when(mockSwConnHandler.accept(eq(InetAddress.getLocalHost()))).thenReturn(false) ;
141         pubChInitializer.initChannel(mockSocketCh) ;
142
143         verify(mockSocketCh, times(1)).disconnect();
144         verify(mockChPipeline, times(0))
145         .addLast( any(String.class), any(ChannelHandler.class) ) ;
146     }
147
148     /**
149      * Test channel close on exception during initialization
150      */
151     @Test
152     public void testExceptionThrown() {
153         doThrow(new IllegalArgumentException()).when(mockSocketCh).pipeline() ;
154         pubChInitializer.initChannel(mockSocketCh);
155
156         verify( mockSocketCh, times(1)).close() ;
157     }
158
159     /**
160      * All paths should install these six handlers:
161      */
162     private void verifyCommonHandlers() {
163         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.IDLE_HANDLER.name()),any(IdleHandler.class)) ;
164         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.OF_DECODER.name()),any(OFDecoder.class)) ;
165         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.OF_ENCODER.name()),any(OFEncoder.class)) ;
166         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.OF_FRAME_DECODER.name()),any(OFFrameDecoder.class)) ;
167         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.OF_VERSION_DETECTOR.name()),any(OFVersionDetector.class)) ;
168         verify(mockChPipeline, times(1)).addLast(eq(COMPONENT_NAMES.DELEGATING_INBOUND_HANDLER.name()),any(DelegatingInboundHandler.class));
169         assertEquals(1, pubChInitializer.size()) ;
170     }
171 }