/**
* 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.MockUp;
import mockit.Mocked;
import org.junit.Before;
import org.junit.Test;
import org.seedstack.seed.core.internal.crypto.KeyPairConfig;
import org.seedstack.seed.core.internal.crypto.KeyPairConfigFactory;
import org.seedstack.seed.crypto.CryptoConfig;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyStore;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Vector;
import static org.assertj.core.api.Assertions.assertThat;
public class KeyPairConfigFactoryTest {
public static final String KEY_STORE_NAME = "keystoreName";
public static final String ALIAS_NAME_1 = "aliasName1";
public static final String ALIAS_NAME_2 = "aliasName2";
public static final String PASSWORD = "aliasPassword";
public static final String CERT_RESOURCE = "certResource";
public static final String PATH_TO_CERT = "path/to/cert";
public static final String ALIAS_QUALIFIER = "aliasQualifier";
@Mocked
private KeyStore keyStore;
@Mocked
private CryptoConfig configuration;
private KeyPairConfigFactory underTest;
@Before
public void before() {
underTest = new KeyPairConfigFactory(configuration);
}
@Test
public void test_key_pair_config_create_never_return_null() {
List<KeyPairConfig> keyPairConfigs = underTest.create(KEY_STORE_NAME, keyStore);
assertThat(keyPairConfigs).isNotNull();
assertThat(keyPairConfigs).hasSize(0);
}
@Test
public void test_key_pair_config_create_two_aliases_without_password() throws Exception {
prepareTwoAliases();
List<KeyPairConfig> keyPairConfigs = underTest.create(KEY_STORE_NAME, keyStore);
assertThat(keyPairConfigs).hasSize(2);
assertThat(keyPairConfigs.get(0).getKeyStoreName()).isEqualTo(KEY_STORE_NAME);
assertThat(keyPairConfigs.get(0).getAlias()).isEqualTo(ALIAS_NAME_1);
assertThat(keyPairConfigs.get(0).getPassword()).isNull();
assertThat(keyPairConfigs.get(0).getCertificateLocation()).isNull();
assertThat(keyPairConfigs.get(1).getKeyStoreName()).isEqualTo(KEY_STORE_NAME);
assertThat(keyPairConfigs.get(1).getAlias()).isEqualTo(ALIAS_NAME_2);
assertThat(keyPairConfigs.get(1).getCertificateLocation()).isNull();
}
@Test
public void test_key_pair_config_create_two_aliases_with_password_and_qualifier() throws Exception {
prepareTwoAliases();
new Expectations() {
{
configuration.keyStores();
result = new HashMap<String, CryptoConfig.KeyStoreConfig>() {{
put(KEY_STORE_NAME, new CryptoConfig.KeyStoreConfig()
.addAlias(ALIAS_NAME_1, new CryptoConfig.KeyStoreConfig.AliasConfig().setPassword(PASSWORD))
.addAlias(ALIAS_NAME_2, new CryptoConfig.KeyStoreConfig.AliasConfig().setPassword(PASSWORD).setQualifier(ALIAS_QUALIFIER)
));
}};
}
};
List<KeyPairConfig> keyPairConfigs = underTest.create(KEY_STORE_NAME, keyStore);
assertThat(keyPairConfigs.get(0).getPassword()).isEqualTo(PASSWORD);
assertThat(keyPairConfigs.get(1).getPassword()).isEqualTo(PASSWORD);
assertThat(keyPairConfigs.get(1).getQualifier()).isEqualTo(ALIAS_QUALIFIER);
}
@Test
public void test_key_pair_config_create_with_external_certificate(final @Mocked URL url) throws Exception {
new MockUp<ClassLoader>() {
@mockit.Mock
public URL getResource(String name) {
try {
return new URL(CERT_RESOURCE);
} catch (MalformedURLException e) {
throw new IllegalStateException(e);
}
}
};
prepareTwoAliases();
new Expectations() {
{
configuration.certificates();
result = new HashMap<String, CryptoConfig.CertificateConfig>() {{
put(ALIAS_NAME_1, new CryptoConfig.CertificateConfig().setFile(PATH_TO_CERT));
put(ALIAS_NAME_2, new CryptoConfig.CertificateConfig().setResource(CERT_RESOURCE));
}};
url.getFile();
result = CERT_RESOURCE;
}
};
List<KeyPairConfig> keyPairConfigs = underTest.create(KEY_STORE_NAME, keyStore);
assertThat(keyPairConfigs.get(0).getCertificateLocation()).isEqualTo(PATH_TO_CERT);
assertThat(keyPairConfigs.get(1).getCertificateLocation()).isEqualTo(CERT_RESOURCE);
}
private void prepareTwoAliases() throws Exception {
new Expectations() {
{
Enumeration<String> aliases = new Vector<String>() {{
add(ALIAS_NAME_1);
add(ALIAS_NAME_2);
}}.elements();
keyStore.aliases();
result = aliases;
}
};
}
}