View Javadoc
1   /*
2    * Copyright 2019-2021 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package nl.altindag.ssl.socket;
18  
19  import org.junit.jupiter.api.Test;
20  import org.junit.jupiter.api.extension.ExtendWith;
21  import org.mockito.junit.jupiter.MockitoExtension;
22  
23  import javax.net.ssl.SSLParameters;
24  import javax.net.ssl.SSLServerSocket;
25  import javax.net.ssl.SSLServerSocketFactory;
26  import java.io.IOException;
27  import java.net.InetAddress;
28  import java.net.ServerSocket;
29  
30  import static org.assertj.core.api.Assertions.assertThat;
31  import static org.mockito.ArgumentMatchers.*;
32  import static org.mockito.Mockito.*;
33  
34  /**
35   * @author Hakan Altindag
36   */
37  @ExtendWith(MockitoExtension.class)
38  class CompositeSSLServerSocketFactoryShould {
39  
40      private final SSLParameters sslParameters = spy(
41              new SSLParameters(
42                      new String[] {"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
43                      new String[] {"TLSv1.2"}
44              )
45      );
46  
47      private final SSLServerSocketFactory sslServerSocketFactory = mock(SSLServerSocketFactory.class);
48  
49      private final CompositeSSLServerSocketFactory victim = new CompositeSSLServerSocketFactory(sslServerSocketFactory, sslParameters);
50  
51      @Test
52      void returnDefaultCipherSuites() {
53          String[] defaultCipherSuites = victim.getDefaultCipherSuites();
54  
55          assertThat(defaultCipherSuites).containsExactly("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384");
56          verify(sslParameters, times(1)).getCipherSuites();
57      }
58  
59      @Test
60      void returnSupportedCipherSuites() {
61          String[] supportedCipherSuites = victim.getSupportedCipherSuites();
62  
63          assertThat(supportedCipherSuites).containsExactly("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384");
64          verify(sslParameters, times(1)).getCipherSuites();
65      }
66  
67      @Test
68      void createServerSocket() throws IOException {
69          SSLServerSocket mockedSslServerSocket = mock(SSLServerSocket.class);
70  
71          doReturn(mockedSslServerSocket).when(sslServerSocketFactory).createServerSocket();
72  
73          ServerSocket serverSocket = victim.createServerSocket();
74  
75          assertThat(serverSocket).isNotNull();
76          verify(sslServerSocketFactory, times(1)).createServerSocket();
77          verify(mockedSslServerSocket, times(1)).setSSLParameters(sslParameters);
78      }
79  
80      @Test
81      void createServerSocketDoesNotUseSslParametersWhenInnerSslServerSocketFactoryReturnsServerSocket() throws IOException {
82          ServerSocket mockedServerSocket = mock(ServerSocket.class);
83  
84          doReturn(mockedServerSocket).when(sslServerSocketFactory).createServerSocket();
85  
86          ServerSocket serverSocket = victim.createServerSocket();
87  
88          assertThat(serverSocket).isNotNull();
89          verify(sslServerSocketFactory, times(1)).createServerSocket();
90          verifyNoInteractions(mockedServerSocket);
91      }
92  
93      @Test
94      void createServerSocketWithPort() throws IOException {
95          SSLServerSocket mockedSslServerSocket = mock(SSLServerSocket.class);
96  
97          doReturn(mockedSslServerSocket)
98                  .when(sslServerSocketFactory).createServerSocket(anyInt());
99  
100         ServerSocket serverSocket = victim.createServerSocket(8443);
101 
102         assertThat(serverSocket).isNotNull();
103         verify(sslServerSocketFactory, times(1)).createServerSocket(8443);
104         verify(mockedSslServerSocket, times(1)).setSSLParameters(sslParameters);
105     }
106 
107     @Test
108     void createServerSocketWithPortBacklog() throws IOException {
109         SSLServerSocket mockedSslServerSocket = mock(SSLServerSocket.class);
110 
111         doReturn(mockedSslServerSocket)
112                 .when(sslServerSocketFactory).createServerSocket(anyInt(), anyInt());
113 
114         ServerSocket serverSocket = victim.createServerSocket(8443, 50);
115 
116         assertThat(serverSocket).isNotNull();
117         verify(sslServerSocketFactory, times(1)).createServerSocket(8443, 50);
118         verify(mockedSslServerSocket, times(1)).setSSLParameters(sslParameters);
119     }
120 
121     @Test
122     void createServerSocketWithPortBacklogIfAddress() throws IOException {
123         SSLServerSocket mockedSslServerSocket = mock(SSLServerSocket.class);
124 
125         doReturn(mockedSslServerSocket)
126                 .when(sslServerSocketFactory).createServerSocket(anyInt(), anyInt(), any(InetAddress.class));
127 
128         ServerSocket serverSocket = victim.createServerSocket(8443, 50, InetAddress.getLocalHost());
129 
130         assertThat(serverSocket).isNotNull();
131         verify(sslServerSocketFactory, times(1)).createServerSocket(8443, 50, InetAddress.getLocalHost());
132         verify(mockedSslServerSocket, times(1)).setSSLParameters(sslParameters);
133     }
134 
135 }