/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.crypto;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import mockit.Verifications;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.crypto.CryptoConfig;
import org.seedstack.seed.crypto.EncryptionService;
import java.net.URL;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.util.HashMap;
/**
* Unit test for {@link EncryptionServiceFactory}.
*/
public class EncryptionServiceFactoryTest {
private static final String ALIAS = "key1";
private static final char[] PASSWORD = "password".toCharArray();
@Mocked
private CryptoConfig configuration;
@Mocked
private KeyStore keyStore;
@Mocked
private Key key;
@Mocked
private Certificate certificate;
@Mocked
private PublicKey publicKey;
@Test
public void testCreateEncryptionService() throws Exception {
new Expectations() {
{
keyStore.getKey(ALIAS, PASSWORD);
result = key;
keyStore.getCertificate(ALIAS);
result = certificate;
certificate.getPublicKey();
result = publicKey;
}
};
KeyPairConfig keyPairConfig = new KeyPairConfig("keyStoreName", ALIAS, "password", null, null);
EncryptionServiceFactory factory = new EncryptionServiceFactory(configuration, keyStore);
EncryptionService encryptionService = factory.create(ALIAS, PASSWORD);
Assertions.assertThat(encryptionService).isNotNull();
new Verifications() {
{
new EncryptionServiceImpl(ALIAS, publicKey, key);
}
};
}
@Test
public void testCreateForAliasWithoutPrivateKey() throws KeyStoreException {
new Expectations() {
{
keyStore.getCertificate(ALIAS);
result = null;
}
};
EncryptionServiceFactory factory = new EncryptionServiceFactory(configuration, keyStore);
EncryptionService encryptionService = factory.create(ALIAS);
Assertions.assertThat(encryptionService).isNotNull();
new Verifications() {
{
new EncryptionServiceImpl(ALIAS, publicKey, null);
}
};
}
@Test(expected = SeedException.class)
public void testCreateWithMissingAliasPassword() throws Exception {
new Expectations() {
{
keyStore.getKey(ALIAS, null);
result = new UnrecoverableKeyException();
}
};
new EncryptionServiceFactory(configuration, keyStore).create(ALIAS, null);
}
@Test
public void testCreateForAliasWithoutCertificate() throws Exception {
new Expectations() {
{
keyStore.getKey(ALIAS, PASSWORD);
result = key;
keyStore.getCertificate(ALIAS);
result = null;
}
};
EncryptionServiceFactory factory = new EncryptionServiceFactory(configuration, keyStore);
EncryptionService encryptionService = factory.create(ALIAS, PASSWORD);
Assertions.assertThat(encryptionService).isNotNull();
new Verifications() {
{
new EncryptionServiceImpl(ALIAS, publicKey, key);
}
};
}
@Test
public void testCreateWithExternalCertificateFromResource(@Mocked final URL url, @Mocked CryptoConfig.CertificateConfig certificateConfig) throws Exception {
new MockUp<ClassLoader>() {
@Mock
public URL getResource(String name) {
return url;
}
};
new Expectations() {
{
keyStore.getKey(ALIAS, PASSWORD);
result = key;
certificate.getPublicKey();
result = publicKey;
configuration.certificates();
result = new HashMap<String, CryptoConfig.CertificateConfig>() {{ put(ALIAS, certificateConfig); }};
certificateConfig.getResource();
result = "path/to/cert";
}
};
EncryptionServiceFactory factory = new EncryptionServiceFactory(configuration, keyStore);
EncryptionService encryptionService = factory.create(ALIAS, PASSWORD);
Assertions.assertThat(encryptionService).isNotNull();
new Verifications() {
{
new EncryptionServiceImpl(ALIAS, publicKey, key);
}
};
}
@Test(expected = SeedException.class)
public void testMissingCertificateFromResource(@Mocked CryptoConfig.CertificateConfig certificateConfig) throws Exception {
new Expectations() {
{
configuration.certificates();
result = new HashMap<String, CryptoConfig.CertificateConfig>() {{ put(ALIAS, certificateConfig); }};
certificateConfig.getResource();
result = "path/to/cert";
}
};
new EncryptionServiceFactory(configuration, keyStore).create(ALIAS, PASSWORD);
}
}