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.keymanager;
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.X509ExtendedKeyManager;
24  import java.security.PrivateKey;
25  import java.security.cert.X509Certificate;
26  
27  import static org.assertj.core.api.Assertions.assertThat;
28  import static org.assertj.core.api.Assertions.assertThatThrownBy;
29  import static org.mockito.ArgumentMatchers.any;
30  import static org.mockito.ArgumentMatchers.anyString;
31  import static org.mockito.Mockito.mock;
32  import static org.mockito.Mockito.times;
33  import static org.mockito.Mockito.verify;
34  import static org.mockito.Mockito.when;
35  
36  /**
37   * @author Hakan Altindag
38   */
39  @ExtendWith(MockitoExtension.class)
40  class HotSwappableX509ExtendedKeyManagerShould {
41  
42      @Test
43      void chooseClientAlias() {
44          X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
45          when(keyManager.chooseClientAlias(any(), any(), any())).thenReturn("alias");
46  
47          X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
48          String clientAlias = victim.chooseClientAlias(null, null, null);
49  
50          assertThat(clientAlias).isEqualTo("alias");
51          verify(keyManager, times(1)).chooseClientAlias(null, null, null);
52      }
53  
54      @Test
55      void chooseEngineClientAlias() {
56          X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
57          when(keyManager.chooseEngineClientAlias(any(), any(), any())).thenReturn("alias");
58  
59          X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
60          String clientAlias = victim.chooseEngineClientAlias(null, null, null);
61  
62          assertThat(clientAlias).isEqualTo("alias");
63          verify(keyManager, times(1)).chooseEngineClientAlias(null, null, null);
64      }
65  
66      @Test
67      void chooseServerAlias() {
68          X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
69          when(keyManager.chooseServerAlias(any(), any(), any())).thenReturn("alias");
70  
71          X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
72          String clientAlias = victim.chooseServerAlias(null, null, null);
73  
74          assertThat(clientAlias).isEqualTo("alias");
75          verify(keyManager, times(1)).chooseServerAlias(null, null, null);
76      }
77  
78      @Test
79      void chooseEngineServerAlias() {
80          X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
81          when(keyManager.chooseEngineServerAlias(any(), any(), any())).thenReturn("alias");
82  
83          X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
84          String clientAlias = victim.chooseEngineServerAlias(null, null, null);
85  
86          assertThat(clientAlias).isEqualTo("alias");
87          verify(keyManager, times(1)).chooseEngineServerAlias(null, null, null);
88      }
89  
90      @Test
91      void getPrivateKey() {
92          X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
93          when(keyManager.getPrivateKey(anyString())).thenReturn(mock(PrivateKey.class));
94  
95          X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
96          PrivateKey privateKey = victim.getPrivateKey("alias");
97  
98          assertThat(privateKey).isNotNull();
99          verify(keyManager, times(1)).getPrivateKey("alias");
100     }
101 
102     @Test
103     void getCertificateChain() {
104         X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
105         when(keyManager.getCertificateChain(anyString())).thenReturn(new X509Certificate[] { mock(X509Certificate.class) } );
106 
107         X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
108         X509Certificate[] certificateChain = victim.getCertificateChain("alias");
109 
110         assertThat(certificateChain).hasSize(1);
111         verify(keyManager, times(1)).getCertificateChain("alias");
112     }
113 
114     @Test
115     void getClientAliases() {
116         X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
117         when(keyManager.getClientAliases(any(), any())).thenReturn(new String[]{"alias-1", "alias-2"});
118 
119         X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
120         String[] clientAliases = victim.getClientAliases(null, null);
121 
122         assertThat(clientAliases).containsExactlyInAnyOrder("alias-1", "alias-2");
123         verify(keyManager, times(1)).getClientAliases(null, null);
124     }
125 
126     @Test
127     void getServerAliases() {
128         X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
129         when(keyManager.getServerAliases(any(), any())).thenReturn(new String[]{"alias-1", "alias-2"});
130 
131         X509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
132         String[] clientAliases = victim.getServerAliases(null, null);
133 
134         assertThat(clientAliases).containsExactlyInAnyOrder("alias-1", "alias-2");
135         verify(keyManager, times(1)).getServerAliases(null, null);
136     }
137 
138     @Test
139     void setKeyManager() {
140         X509ExtendedKeyManager keyManager = mock(X509ExtendedKeyManager.class);
141         when(keyManager.chooseClientAlias(any(), any(), any())).thenReturn("alias");
142 
143         HotSwappableX509ExtendedKeyManager victim = new HotSwappableX509ExtendedKeyManager(keyManager);
144         victim.chooseClientAlias(null, null, null);
145 
146         victim.setKeyManager(mock(X509ExtendedKeyManager.class));
147         victim.chooseClientAlias(null, null, null);
148 
149         verify(keyManager, times(1)).chooseClientAlias(null, null, null);
150     }
151 
152     @Test
153     void throwNullPointerExceptionWhenKeyManagerIsNotPresent() {
154         assertThatThrownBy(() -> new HotSwappableX509ExtendedKeyManager(null))
155                 .isInstanceOf(NullPointerException.class);
156     }
157 
158 }