Skip to content

Commit 3ebc750

Browse files
committed
Add some unit tests
1 parent 6c7fffb commit 3ebc750

File tree

5 files changed

+171
-14
lines changed

5 files changed

+171
-14
lines changed

plugins/ca/root-ca/src/test/java/org/apache/cloudstack/ca/provider/RootCACustomTrustManagerTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
import java.security.KeyPair;
2424
import java.security.cert.CertificateException;
2525
import java.security.cert.X509Certificate;
26+
import java.util.Arrays;
2627
import java.util.Collections;
2728
import java.util.HashMap;
2829
import java.util.Map;
30+
import java.util.List;
2931

3032
import org.apache.cloudstack.utils.security.CertUtils;
3133
import org.junit.Assert;
@@ -128,6 +130,21 @@ public void testAuthStrictWithDenyExpiredCertAndOwnership() throws Exception {
128130
trustManager.checkClientTrusted(new X509Certificate[]{expiredClientCertificate}, "RSA");
129131
}
130132

133+
@Test
134+
public void testGetAcceptedIssuersWithChain() throws Exception {
135+
final KeyPair rootKeyPair = CertUtils.generateRandomKeyPair(1024);
136+
final X509Certificate rootCert = CertUtils.generateV3Certificate(null, rootKeyPair, rootKeyPair.getPublic(),
137+
"CN=root", "SHA256withRSA", 365, null, null);
138+
final List<X509Certificate> chain = Arrays.asList(caCertificate, rootCert);
139+
final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(
140+
clientIp, false, true, certMap, chain, crlDao);
141+
142+
final X509Certificate[] issuers = trustManager.getAcceptedIssuers();
143+
Assert.assertEquals(2, issuers.length);
144+
Assert.assertEquals(caCertificate, issuers[0]);
145+
Assert.assertEquals(rootCert, issuers[1]);
146+
}
147+
131148
@Test
132149
public void testAuthStrictWithAllowExpiredCertAndOwnership() throws Exception {
133150
Mockito.when(crlDao.findBySerial(Mockito.any(BigInteger.class))).thenReturn(null);

plugins/ca/root-ca/src/test/java/org/apache/cloudstack/ca/provider/RootCAProviderTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,46 @@ public void testIssueCertificateWithCsr() throws NoSuchProviderException, Certif
130130
certificate.getClientCertificate().verify(caCertificate.getPublicKey());
131131
}
132132

133+
@Test
134+
public void testGetCaCertificateWithChain() throws Exception {
135+
final KeyPair rootKeyPair = CertUtils.generateRandomKeyPair(1024);
136+
final X509Certificate rootCert = CertUtils.generateV3Certificate(null, rootKeyPair, rootKeyPair.getPublic(),
137+
"CN=root", "SHA256withRSA", 365, null, null);
138+
final KeyPair intermediateKeyPair = CertUtils.generateRandomKeyPair(1024);
139+
final X509Certificate intermediateCert = CertUtils.generateV3Certificate(rootCert, rootKeyPair,
140+
intermediateKeyPair.getPublic(), "CN=intermediate", "SHA256withRSA", 365, null, null);
141+
142+
final List<X509Certificate> chain = Arrays.asList(intermediateCert, rootCert);
143+
addField(provider, "caKeyPair", intermediateKeyPair);
144+
addField(provider, "caCertificate", intermediateCert);
145+
addField(provider, "caCertificates", chain);
146+
147+
Assert.assertEquals(2, provider.getCaCertificate().size());
148+
Assert.assertEquals(intermediateCert, provider.getCaCertificate().get(0));
149+
Assert.assertEquals(rootCert, provider.getCaCertificate().get(1));
150+
}
151+
152+
@Test
153+
public void testIssueCertificateWithoutCsrAndChain() throws Exception {
154+
final KeyPair rootKeyPair = CertUtils.generateRandomKeyPair(1024);
155+
final X509Certificate rootCert = CertUtils.generateV3Certificate(null, rootKeyPair, rootKeyPair.getPublic(),
156+
"CN=root", "SHA256withRSA", 365, null, null);
157+
final KeyPair intermediateKeyPair = CertUtils.generateRandomKeyPair(1024);
158+
final X509Certificate intermediateCert = CertUtils.generateV3Certificate(rootCert, rootKeyPair,
159+
intermediateKeyPair.getPublic(), "CN=intermediate", "SHA256withRSA", 365, null, null);
160+
161+
addField(provider, "caKeyPair", intermediateKeyPair);
162+
addField(provider, "caCertificate", intermediateCert);
163+
addField(provider, "caCertificates", Arrays.asList(intermediateCert, rootCert));
164+
165+
final Certificate certificate = provider.issueCertificate(Arrays.asList("domain1.com"), null, 1);
166+
Assert.assertNotNull(certificate);
167+
Assert.assertEquals(2, certificate.getCaCertificates().size());
168+
Assert.assertEquals(intermediateCert, certificate.getCaCertificates().get(0));
169+
Assert.assertEquals(rootCert, certificate.getCaCertificates().get(1));
170+
certificate.getClientCertificate().verify(intermediateKeyPair.getPublic());
171+
}
172+
133173
@Test
134174
public void testRevokeCertificate() throws Exception {
135175
Assert.assertTrue(provider.revokeCertificate(CertUtils.generateRandomBigInt(), "anyString"));

server/src/main/java/org/apache/cloudstack/ca/CAManagerImpl.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public boolean provisionCertificate(final Host host, final Boolean reconnect, fi
228228
}
229229
}
230230

231-
private boolean provisionCertificateForced(Host host, Boolean reconnect, String caProvider) {
231+
protected boolean provisionCertificateForced(Host host, Boolean reconnect, String caProvider) {
232232
if (host.getType() == Host.Type.Routing && host.getHypervisorType() == com.cloud.hypervisor.Hypervisor.HypervisorType.KVM) {
233233
return provisionKvmHostViaSsh(host, caProvider);
234234
} else if (host.getType() == Host.Type.ConsoleProxy || host.getType() == Host.Type.SecondaryStorageVM) {
@@ -371,11 +371,6 @@ public String generateKeyStoreAndCsr(final Host host, final Map<String, String>
371371
return answer.getCsr();
372372
}
373373

374-
private boolean isValidSystemVMType(Host.Type type) {
375-
return Host.Type.SecondaryStorageVM.equals(type) ||
376-
Host.Type.ConsoleProxy.equals(type);
377-
}
378-
379374
@Override
380375
public boolean deployCertificate(final Host host, final Certificate certificate, final Boolean reconnect, final Map<String, String> sshAccessDetails)
381376
throws AgentUnavailableException, OperationTimedoutException {

server/src/test/java/org/apache/cloudstack/ca/CAManagerImplTest.java

Lines changed: 98 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.cloud.certificate.dao.CrlDao;
2525
import com.cloud.host.Host;
2626
import com.cloud.host.dao.HostDao;
27+
import com.cloud.utils.exception.CloudRuntimeException;
2728
import org.apache.cloudstack.api.ServerApiException;
2829
import org.apache.cloudstack.framework.ca.CAProvider;
2930
import org.apache.cloudstack.framework.ca.Certificate;
@@ -33,8 +34,10 @@
3334
import org.junit.Before;
3435
import org.junit.Test;
3536
import org.junit.runner.RunWith;
37+
import org.mockito.InjectMocks;
3638
import org.mockito.Mock;
3739
import org.mockito.Mockito;
40+
import org.mockito.Spy;
3841
import org.mockito.junit.MockitoJUnitRunner;
3942

4043
import java.lang.reflect.Field;
@@ -63,7 +66,9 @@ public class CAManagerImplTest {
6366
@Mock
6467
private CAProvider caProvider;
6568

66-
private CAManagerImpl caManager;
69+
@InjectMocks
70+
@Spy
71+
private CAManagerImpl caManager = new CAManagerImpl();
6772

6873
private void addField(final CAManagerImpl provider, final String name, final Object o) throws IllegalAccessException, NoSuchFieldException {
6974
Field f = CAManagerImpl.class.getDeclaredField(name);
@@ -73,10 +78,6 @@ private void addField(final CAManagerImpl provider, final String name, final Obj
7378

7479
@Before
7580
public void setUp() throws Exception {
76-
caManager = new CAManagerImpl();
77-
addField(caManager, "crlDao", crlDao);
78-
addField(caManager, "hostDao", hostDao);
79-
addField(caManager, "agentManager", agentManager);
8081
addField(caManager, "configuredCaProvider", caProvider);
8182

8283
Mockito.when(caProvider.getProviderName()).thenReturn("root");
@@ -91,19 +92,19 @@ public void tearDown() throws Exception {
9192
}
9293

9394
@Test(expected = ServerApiException.class)
94-
public void testIssueCertificateThrowsException() throws Exception {
95+
public void testIssueCertificateThrowsException() {
9596
caManager.issueCertificate(null, null, null, 1, null);
9697
}
9798

9899
@Test
99-
public void testIssueCertificate() throws Exception {
100+
public void testIssueCertificate() {
100101
caManager.issueCertificate(null, Collections.singletonList("domain.example"), null, 1, null);
101102
Mockito.verify(caProvider, Mockito.times(1)).issueCertificate(anyList(), nullable(List.class), anyInt());
102103
Mockito.verify(caProvider, Mockito.times(0)).issueCertificate(anyString(), anyList(), anyList(), anyInt());
103104
}
104105

105106
@Test
106-
public void testRevokeCertificate() throws Exception {
107+
public void testRevokeCertificate() {
107108
final CrlVO crl = new CrlVO(CertUtils.generateRandomBigInt(), "some.domain", "some-uuid");
108109
Mockito.when(crlDao.revokeCertificate(Mockito.any(BigInteger.class), anyString())).thenReturn(crl);
109110
Mockito.when(caProvider.revokeCertificate(Mockito.any(BigInteger.class), anyString())).thenReturn(true);
@@ -126,4 +127,93 @@ public void testProvisionCertificate() throws Exception {
126127
Mockito.verify(agentManager, Mockito.times(1)).send(Mockito.anyLong(), any(SetupCertificateCommand.class));
127128
Mockito.verify(agentManager, Mockito.times(1)).reconnect(Mockito.anyLong());
128129
}
130+
131+
132+
@Test
133+
public void testProvisionCertificateForced() throws Exception {
134+
final Host host = Mockito.mock(Host.class);
135+
Mockito.doReturn(true).when(caManager).provisionCertificateForced(host, true, null);
136+
Assert.assertTrue(caManager.provisionCertificate(host, true, null, true));
137+
Mockito.verify(caManager, Mockito.times(1)).provisionCertificateForced(host, true, null);
138+
Mockito.verify(agentManager, Mockito.never()).send(Mockito.anyLong(), any(SetupKeyStoreCommand.class));
139+
Mockito.verify(agentManager, Mockito.never()).send(Mockito.anyLong(), any(SetupCertificateCommand.class));
140+
}
141+
142+
@Test
143+
public void testIssueCertificateWithCsr() throws Exception {
144+
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
145+
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null);
146+
Mockito.when(caProvider.issueCertificate(anyString(), anyList(), anyList(), anyInt()))
147+
.thenReturn(new Certificate(x509, null, Collections.singletonList(x509)));
148+
final Certificate result = caManager.issueCertificate("someCsr", Collections.singletonList("domain.example"), Collections.singletonList("1.2.3.4"), 365, null);
149+
Assert.assertNotNull(result);
150+
Mockito.verify(caProvider, Mockito.times(1)).issueCertificate(anyString(), anyList(), anyList(), anyInt());
151+
Mockito.verify(caProvider, Mockito.never()).issueCertificate(anyList(), nullable(List.class), anyInt());
152+
}
153+
154+
@Test(expected = CloudRuntimeException.class)
155+
public void testProvisionCertificateNullHost() {
156+
caManager.provisionCertificate(null, true, null, false);
157+
}
158+
159+
@Test
160+
public void testProvisionCertificateForSystemVm() throws Exception {
161+
final Host host = Mockito.mock(Host.class);
162+
Mockito.when(host.getType()).thenReturn(Host.Type.ConsoleProxy);
163+
Mockito.when(host.getPrivateIpAddress()).thenReturn("1.2.3.4");
164+
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
165+
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null);
166+
Mockito.when(caProvider.issueCertificate(anyList(), anyList(), anyInt()))
167+
.thenReturn(new Certificate(x509, null, Collections.singletonList(x509)));
168+
Mockito.when(agentManager.send(anyLong(), any(SetupCertificateCommand.class))).thenReturn(new SetupCertificateAnswer(true));
169+
Assert.assertTrue(caManager.provisionCertificate(host, false, null, false));
170+
Mockito.verify(agentManager, Mockito.never()).send(Mockito.anyLong(), any(SetupKeyStoreCommand.class));
171+
Mockito.verify(agentManager, Mockito.times(1)).send(Mockito.anyLong(), any(SetupCertificateCommand.class));
172+
Mockito.verify(agentManager, Mockito.never()).reconnect(Mockito.anyLong());
173+
}
174+
175+
@Test
176+
public void testProvisionCertificateWithoutReconnect() throws Exception {
177+
final Host host = Mockito.mock(Host.class);
178+
Mockito.when(host.getPrivateIpAddress()).thenReturn("1.2.3.4");
179+
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
180+
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair, keyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null);
181+
Mockito.when(caProvider.issueCertificate(anyString(), anyList(), anyList(), anyInt()))
182+
.thenReturn(new Certificate(x509, null, Collections.singletonList(x509)));
183+
Mockito.when(agentManager.send(anyLong(), any(SetupCertificateCommand.class))).thenReturn(new SetupCertificateAnswer(true));
184+
Mockito.when(agentManager.send(anyLong(), any(SetupKeyStoreCommand.class))).thenReturn(new SetupKeystoreAnswer("someCsr"));
185+
Assert.assertTrue(caManager.provisionCertificate(host, false, null, false));
186+
Mockito.verify(agentManager, Mockito.never()).reconnect(Mockito.anyLong());
187+
}
188+
189+
@Test
190+
public void testRevokeCertificateReturnsFalseWhenCrlIsNull() {
191+
Mockito.when(crlDao.revokeCertificate(Mockito.any(BigInteger.class), anyString())).thenReturn(null);
192+
Assert.assertFalse(caManager.revokeCertificate(BigInteger.ONE, "some.domain", null));
193+
Mockito.verify(caProvider, Mockito.never()).revokeCertificate(Mockito.any(BigInteger.class), anyString());
194+
}
195+
196+
@Test
197+
public void testRevokeCertificateReturnsFalseWhenSerialMismatch() {
198+
final CrlVO crl = new CrlVO(BigInteger.ONE, "some.domain", "some-uuid");
199+
Mockito.when(crlDao.revokeCertificate(Mockito.any(BigInteger.class), anyString())).thenReturn(crl);
200+
Assert.assertFalse(caManager.revokeCertificate(BigInteger.TWO, "some.domain", null));
201+
Mockito.verify(caProvider, Mockito.never()).revokeCertificate(Mockito.any(BigInteger.class), anyString());
202+
}
203+
204+
@Test
205+
public void testPurgeHostCertificate() throws Exception {
206+
final Host host = Mockito.mock(Host.class);
207+
Mockito.when(host.getPrivateIpAddress()).thenReturn("10.0.0.1");
208+
Mockito.when(host.getPublicIpAddress()).thenReturn("192.168.0.1");
209+
final KeyPair keyPair = CertUtils.generateRandomKeyPair(1024);
210+
final X509Certificate x509 = CertUtils.generateV3Certificate(null, keyPair,
211+
keyPair.getPublic(), "CN=ca", "SHA256withRSA",
212+
365, null, null);
213+
caManager.getActiveCertificatesMap().put("10.0.0.1", x509);
214+
caManager.getActiveCertificatesMap().put("192.168.0.1", x509);
215+
caManager.purgeHostCertificate(host);
216+
Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("10.0.0.1"));
217+
Assert.assertFalse(caManager.getActiveCertificatesMap().containsKey("192.168.0.1"));
218+
}
129219
}

utils/src/test/java/org/apache/cloudstack/utils/security/CertUtilsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,21 @@ public void testGenerateRandomBigInt() throws Exception {
8787
Assert.assertNotEquals(CertUtils.generateRandomBigInt(), CertUtils.generateRandomBigInt());
8888
}
8989

90+
@Test
91+
public void testPemToX509CertificatesWithChain() throws Exception {
92+
final KeyPair intermediateKeyPair = CertUtils.generateRandomKeyPair(1024);
93+
final X509Certificate intermediateCert = CertUtils.generateV3Certificate(caCertificate, caKeyPair,
94+
intermediateKeyPair.getPublic(), "CN=intermediate", "SHA256withRSA", 365, null, null);
95+
96+
final String chainPem = CertUtils.x509CertificateToPem(intermediateCert)
97+
+ CertUtils.x509CertificateToPem(caCertificate);
98+
final List<X509Certificate> parsed = CertUtils.pemToX509Certificates(chainPem);
99+
100+
Assert.assertEquals(2, parsed.size());
101+
Assert.assertEquals(intermediateCert.getSerialNumber(), parsed.get(0).getSerialNumber());
102+
Assert.assertEquals(caCertificate.getSerialNumber(), parsed.get(1).getSerialNumber());
103+
}
104+
90105
@Test
91106
public void testGenerateCertificate() throws Exception {
92107
final KeyPair clientKeyPair = CertUtils.generateRandomKeyPair(1024);

0 commit comments

Comments
 (0)