/** * 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 com.google.common.collect.Lists; import com.google.inject.Key; import com.google.inject.name.Names; import mockit.Expectations; import mockit.Mocked; 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 org.seedstack.seed.core.internal.crypto.fixtures.AliasQualifier; import java.security.KeyStore; import java.util.ArrayList; import java.util.List; import java.util.Map; public class EncryptionServiceBindingFactoryTest { public static final String KEY_STORE_NAME = "keyStoreName"; public static final String ALIAS_NAME = "aliasName"; public static final String PASSWORD = "password"; public static final String KEYSTORE_PATH = "path/to/keystore"; @Mocked private KeyStore keyStore; @Mocked private CryptoConfig configuration; @Mocked private EncryptionService encryptionService; @Mocked private EncryptionServiceFactory encryptionServiceFactory; @Mocked private Map<String, KeyStore> keyStores; @Test public void test_encryption_service_collect_never_return_null() { EncryptionServiceBindingFactory encryptionService = new EncryptionServiceBindingFactory(); Map<Key<EncryptionService>, EncryptionService> encryptionServiceMap = encryptionService.createBindings(null, null, null); Assertions.assertThat(encryptionServiceMap).isNotNull(); } @Test public void test_encryption_service_collect() { prepareMock(); EncryptionServiceBindingFactory collector = new EncryptionServiceBindingFactory(); Map<Key<EncryptionService>, EncryptionService> encryptionServiceMap = collector.createBindings(configuration, prepareKeyPairs(ALIAS_NAME, ALIAS_NAME + "2"), keyStores); Assertions.assertThat(encryptionServiceMap).hasSize(2); Assertions.assertThat(encryptionServiceMap).containsKey(Key.get(EncryptionService.class, Names.named(ALIAS_NAME))); Assertions.assertThat(encryptionServiceMap).containsKey(Key.get(EncryptionService.class, Names.named(ALIAS_NAME + "2"))); Assertions.assertThat(encryptionServiceMap).containsValue(encryptionService); } @Test public void test_encryption_service_collect_with_qualifier() { prepareMock(); EncryptionServiceBindingFactory collector = new EncryptionServiceBindingFactory(); Map<Key<EncryptionService>, EncryptionService> encryptionServiceMap = collector.createBindings(configuration, prepareKeyPairWithQualifier("foo"), keyStores); Assertions.assertThat(encryptionServiceMap).hasSize(1); Assertions.assertThat(encryptionServiceMap).containsKey(Key.get(EncryptionService.class, Names.named("foo"))); Assertions.assertThat(encryptionServiceMap).containsValue(encryptionService); } @Test public void test_encryption_service_collect_alias_without_private_key() { new Expectations() { { new EncryptionServiceFactory(configuration, keyStore); result = encryptionServiceFactory; encryptionServiceFactory.create(ALIAS_NAME); result = encryptionService; } }; EncryptionServiceBindingFactory collector = new EncryptionServiceBindingFactory(); List<KeyPairConfig> keyPairConfigurations = Lists.newArrayList(new KeyPairConfig(KEY_STORE_NAME, ALIAS_NAME, null, null, "foo")); Map<Key<EncryptionService>, EncryptionService> encryptionServiceMap = collector.createBindings(configuration, keyPairConfigurations, keyStores); Assertions.assertThat(encryptionServiceMap).hasSize(1); Assertions.assertThat(encryptionServiceMap).containsKey(Key.get(EncryptionService.class, Names.named("foo"))); Assertions.assertThat(encryptionServiceMap).containsValue(encryptionService); } @Test public void test_encryption_service_collect_with_qualifier_annotation() throws ClassNotFoundException { prepareMock(); List<KeyPairConfig> keyPairConfigurations = prepareKeyPairWithQualifier("org.seedstack.seed.core.internal.crypto.fixtures.AliasQualifier"); EncryptionServiceBindingFactory collector = new EncryptionServiceBindingFactory(); Map<Key<EncryptionService>, EncryptionService> encryptionServiceMap = collector.createBindings(configuration, keyPairConfigurations, keyStores); Assertions.assertThat(encryptionServiceMap).containsKey(Key.get(EncryptionService.class, AliasQualifier.class)); } @Test(expected = SeedException.class) public void test_encryption_service_collect_with_wrong_qualifier_class() throws ClassNotFoundException { prepareMock(); // interface instead of annotation List<KeyPairConfig> keyPairConfigurations = prepareKeyPairWithQualifier("org.seedstack.seed.core.internal.crypto.fixtures.BadAliasQualifier"); new EncryptionServiceBindingFactory().createBindings(configuration, keyPairConfigurations, keyStores); } @Test(expected = SeedException.class) public void test_encryption_service_collect_with_wrong_qualifier_annotation() throws ClassNotFoundException { prepareMock(); // missing @Qualifier List<KeyPairConfig> keyPairConfigurations = prepareKeyPairWithQualifier("org.seedstack.seed.core.internal.crypto.fixtures.BadAliasQualifier2"); new EncryptionServiceBindingFactory().createBindings(configuration, keyPairConfigurations, keyStores); } private void prepareMock() { new Expectations() { { new EncryptionServiceFactory(configuration, keyStore); result = encryptionServiceFactory; encryptionServiceFactory.create(ALIAS_NAME, PASSWORD.toCharArray()); result = encryptionService; } }; } private List<KeyPairConfig> prepareKeyPairs(String... aliasNames) { List<KeyPairConfig> keyPairConfigs = new ArrayList<>(); for (String aliasName : aliasNames) { keyPairConfigs.add(new KeyPairConfig(KEY_STORE_NAME, aliasName, PASSWORD, null, null)); } return keyPairConfigs; } private List<KeyPairConfig> prepareKeyPairWithQualifier(String qualifier) { return Lists.newArrayList(new KeyPairConfig(KEY_STORE_NAME, ALIAS_NAME, PASSWORD, null, qualifier)); } }