From 4e61effd4ddd8e6869487914095f81a1566d0142 Mon Sep 17 00:00:00 2001 From: Remigiusz Janeczek Date: Wed, 5 Aug 2020 11:36:06 +0200 Subject: Add loading configuration from env to truststore merger Issue-ID: DCAEGEN2-2253 Signed-off-by: Remigiusz Janeczek Change-Id: I06b3e3fcebbca96a4b9cbb4c693ae16eb29366eb --- .../oom/truststoremerger/TrustStoreMerger.java | 24 +++++- .../onap/oom/truststoremerger/api/ExitStatus.java | 4 +- .../certification/file/EnvProvider.java | 29 +++++++ .../certification/file/PathValidator.java | 38 +++++++++ .../file/TruststoresPathsProvider.java | 69 +++++++++++++++ .../file/TruststoresPathsProviderException.java | 30 +++++++ .../configuration/MergerConfiguration.java | 44 ++++++++++ .../MergerConfigurationException.java | 30 +++++++ .../configuration/MergerConfigurationFactory.java | 45 ++++++++++ .../oom/truststoremerger/TrustStoreMergerTest.java | 4 +- .../certification/file/PathValidatorTest.java | 58 +++++++++++++ .../file/TruststoresPathsProviderTest.java | 88 +++++++++++++++++++ .../MergerConfigurationFactoryTest.java | 98 ++++++++++++++++++++++ 13 files changed, 557 insertions(+), 4 deletions(-) create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/EnvProvider.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PathValidator.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProvider.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderException.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfiguration.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java create mode 100644 trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java create mode 100644 trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/PathValidatorTest.java create mode 100644 trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderTest.java create mode 100644 trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java (limited to 'trustStoreMerger') diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java index f280800b..ee57b3aa 100644 --- a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/TrustStoreMerger.java @@ -20,6 +20,13 @@ package org.onap.oom.truststoremerger; import org.onap.oom.truststoremerger.api.ExitStatus; +import org.onap.oom.truststoremerger.api.ExitableException; +import org.onap.oom.truststoremerger.certification.file.EnvProvider; +import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider; +import org.onap.oom.truststoremerger.configuration.MergerConfiguration; +import org.onap.oom.truststoremerger.configuration.MergerConfigurationException; +import org.onap.oom.truststoremerger.configuration.MergerConfigurationFactory; +import org.onap.oom.truststoremerger.certification.file.PathValidator; class TrustStoreMerger { @@ -30,6 +37,21 @@ class TrustStoreMerger { } void run() { - appExitHandler.exit(ExitStatus.SUCCESS); + try { + mergeTruststores(); + appExitHandler.exit(ExitStatus.SUCCESS); + } catch (ExitableException e) { + appExitHandler.exit(e.applicationExitStatus()); + } + } + + private void mergeTruststores() throws ExitableException { + MergerConfiguration configuration = loadConfiguration(); + } + + private MergerConfiguration loadConfiguration() throws ExitableException { + TruststoresPathsProvider truststoresPathsProvider = new TruststoresPathsProvider(new EnvProvider(), new PathValidator()); + MergerConfigurationFactory factory = new MergerConfigurationFactory(truststoresPathsProvider); + return factory.createConfiguration(); } } diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java index 84184e89..ae145f7e 100644 --- a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/api/ExitStatus.java @@ -21,7 +21,9 @@ package org.onap.oom.truststoremerger.api; public enum ExitStatus { - SUCCESS(0, "Success"); + SUCCESS(0, "Success"), + TRUSTSTORES_PATHS_PROVIDER_EXCEPTION(1, "Invalid paths in environment variables"), + MERGER_CONFIGURATION_EXCEPTION(2, "Invalid merger configuration"); private final int value; private final String message; diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/EnvProvider.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/EnvProvider.java new file mode 100644 index 00000000..f64edc89 --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/EnvProvider.java @@ -0,0 +1,29 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.certification.file; + +import java.util.Optional; + +public class EnvProvider { + + Optional getEnv(String name) { + return Optional.ofNullable(System.getenv(name)); + } +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PathValidator.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PathValidator.java new file mode 100644 index 00000000..05b80f14 --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/PathValidator.java @@ -0,0 +1,38 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.certification.file; + +public class PathValidator { + + private static final String TRUSTSTORE_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.(pem|jks|p12)"; + private static final String TRUSTSTORE_PASSWORD_PATH_REGEX = "^(/[a-zA-Z0-9_-]+)+\\.pass"; + + public boolean isTruststorePathValid(String truststorePath) { + return isPathValid(truststorePath, TRUSTSTORE_PATH_REGEX); + } + + public boolean isTruststorePasswordPathValid(String truststorePasswordPath) { + return truststorePasswordPath.isEmpty() || isPathValid(truststorePasswordPath, TRUSTSTORE_PASSWORD_PATH_REGEX); + } + + private boolean isPathValid(String path, String regex) { + return path.matches(regex); + } +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProvider.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProvider.java new file mode 100644 index 00000000..b7b73e6b --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProvider.java @@ -0,0 +1,69 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.certification.file; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; + +public class TruststoresPathsProvider { + + static final String TRUSTSTORES_ENV = "TRUSTSTORES"; + static final String TRUSTSTORES_PASSWORDS_ENV = "TRUSTSTORES_PASSWORDS"; + private static final String DELIMITER = ":"; + private static final int NEGATIVE_SPLIT_LIMIT = -1; + + private EnvProvider envProvider; + private PathValidator pathValidator; + + public TruststoresPathsProvider(EnvProvider envProvider, PathValidator pathValidator) { + this.envProvider = envProvider; + this.pathValidator = pathValidator; + } + + public List getTruststores() throws TruststoresPathsProviderException { + return envProvider.getEnv(TRUSTSTORES_ENV) + .filter(Predicate.not(String::isEmpty)) + .map(this::splitToList) + .filter(this::validateTruststores) + .orElseThrow(() -> new TruststoresPathsProviderException("TRUSTSTORES environment variable does not contain valid truststores paths")); + } + + public List getTruststoresPasswords() throws TruststoresPathsProviderException { + return envProvider.getEnv(TRUSTSTORES_PASSWORDS_ENV) + .map(this::splitToList) + .filter(this::validateTruststoresPasswords) + .orElseThrow(() -> new TruststoresPathsProviderException("TRUSTSTORES_PASSWORDS environment variable does not contain valid passwords paths")); + } + + private boolean validateTruststores(List truststores) { + return truststores.stream() + .allMatch(pathValidator::isTruststorePathValid); + } + + private boolean validateTruststoresPasswords(List truststoresPasswords) { + return truststoresPasswords.stream() + .allMatch(pathValidator::isTruststorePasswordPathValid); + } + + private List splitToList(String stringToSplit) { + return Arrays.asList(stringToSplit.split(DELIMITER, NEGATIVE_SPLIT_LIMIT)); + } +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderException.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderException.java new file mode 100644 index 00000000..5f491c36 --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderException.java @@ -0,0 +1,30 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.certification.file; + +import org.onap.oom.truststoremerger.api.ExitStatus; +import org.onap.oom.truststoremerger.api.ExitableException; + +public class TruststoresPathsProviderException extends ExitableException { + + TruststoresPathsProviderException(String message) { + super(message, ExitStatus.TRUSTSTORES_PATHS_PROVIDER_EXCEPTION); + } +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfiguration.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfiguration.java new file mode 100644 index 00000000..f3b7d935 --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfiguration.java @@ -0,0 +1,44 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.configuration; + +import java.util.Collections; +import java.util.List; + +public class MergerConfiguration { + private final List truststoreFilePaths; + private final List truststoreFilePasswordPaths; + + public MergerConfiguration(List truststoreFilePaths, + List truststoreFilePasswordPaths) { + this.truststoreFilePaths = List.copyOf(truststoreFilePaths); + this.truststoreFilePasswordPaths = List.copyOf(truststoreFilePasswordPaths); + } + + public List getTruststoreFilePaths() { + return Collections.unmodifiableList(truststoreFilePaths); + } + + + public List getTruststoreFilePasswordPaths() { + return Collections.unmodifiableList(truststoreFilePasswordPaths); + } + +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java new file mode 100644 index 00000000..54982f5f --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationException.java @@ -0,0 +1,30 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.configuration; + +import org.onap.oom.truststoremerger.api.ExitStatus; +import org.onap.oom.truststoremerger.api.ExitableException; + +public class MergerConfigurationException extends ExitableException { + + MergerConfigurationException(String message) { + super(message, ExitStatus.MERGER_CONFIGURATION_EXCEPTION); + } +} diff --git a/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java new file mode 100644 index 00000000..eea0551d --- /dev/null +++ b/trustStoreMerger/src/main/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactory.java @@ -0,0 +1,45 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.configuration; + +import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider; +import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProviderException; + +import java.util.List; + +public class MergerConfigurationFactory { + + private final TruststoresPathsProvider pathsProvider; + + public MergerConfigurationFactory(TruststoresPathsProvider pathsProvider) { + this.pathsProvider = pathsProvider; + } + + public MergerConfiguration createConfiguration() throws MergerConfigurationException, TruststoresPathsProviderException { + List truststores = pathsProvider.getTruststores(); + List truststoresPasswords = pathsProvider.getTruststoresPasswords(); + + if (truststores.size() != truststoresPasswords.size()) { + throw new MergerConfigurationException("Size of TRUSTSTORES does not match size of TRUSTSTORES_PASSWORDS environment variables"); + } + + return new MergerConfiguration(truststores, truststoresPasswords); + } +} diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java index 11b18bf1..4787897a 100644 --- a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java +++ b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/TrustStoreMergerTest.java @@ -34,9 +34,9 @@ class TrustStoreMergerTest { AppExitHandler appExitHandler; @Test - void shouldExitWithSuccess() { + void shouldExitWithMergeConfigurationExceptionDueToMissingEnvs() { new TrustStoreMerger(appExitHandler).run(); - verify(appExitHandler).exit(ExitStatus.SUCCESS); + verify(appExitHandler).exit(ExitStatus.MERGER_CONFIGURATION_EXCEPTION); } } diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/PathValidatorTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/PathValidatorTest.java new file mode 100644 index 00000000..1c455764 --- /dev/null +++ b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/PathValidatorTest.java @@ -0,0 +1,58 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.certification.file; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class PathValidatorTest { + + private final PathValidator validator = new PathValidator(); + + @ParameterizedTest() + @ValueSource(strings = {"/opt/app/truststore.pem", "/opt/app/truststore.jks", + "/opt/app/truststore.p12", "/truststore.pem"}) + void shouldAcceptValidTruststorePaths(String path) { + assertThat(validator.isTruststorePathValid(path)).isTrue(); + } + + @ParameterizedTest() + @ValueSource(strings = {"/opt/app/truststore.pass", "/opt/app/truststore.invalid", "/", + "truststore", "opt/app/truststore.p12", "/?.pem", "/.pem"}) + void shouldRejectInValidTruststorePaths(String path) { + assertThat(validator.isTruststorePathValid(path)).isFalse(); + } + + @ParameterizedTest() + @ValueSource(strings = {"", "/opt/app/truststore.pass", "/truststore.pass"}) + void shouldAcceptValidTruststorePasswordPaths(String path) { + assertThat(validator.isTruststorePasswordPathValid(path)).isTrue(); + } + + @ParameterizedTest() + @ValueSource(strings = {"/opt/app/truststore.pem", "/opt/app/truststore.jks", + "/opt/app/truststore.p12", "/", "truststore", "opt/app/truststore.p12", "/?.pass", "/.pass"}) + void shouldRejectInValidTruststorePasswordPaths(String path) { + assertThat(validator.isTruststorePasswordPathValid(path)).isFalse(); + } + +} diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderTest.java new file mode 100644 index 00000000..d52d1899 --- /dev/null +++ b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/certification/file/TruststoresPathsProviderTest.java @@ -0,0 +1,88 @@ +package org.onap.oom.truststoremerger.certification.file; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.when; +import static org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider.TRUSTSTORES_ENV; +import static org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider.TRUSTSTORES_PASSWORDS_ENV; + +@ExtendWith(MockitoExtension.class) +class TruststoresPathsProviderTest { + + private static final String VALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.pem"; + private static final String VALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:"; + private static final String INVALID_TRUSTSTORES = "/opt/app/certificates/truststore.jks:/opt/app/certificates/truststore.invalid"; + private static final String INVALID_TRUSTSTORES_PASSWORDS = "/opt/app/certificates/truststore.pass:/.pass"; + + @Mock + private EnvProvider envProvider; + private TruststoresPathsProvider truststoresPathsProvider; + + @BeforeEach + void setUp() { + truststoresPathsProvider = new TruststoresPathsProvider(envProvider, new PathValidator()); + } + + @Test + void shouldReturnCorrectListWhenTruststoresValid() throws TruststoresPathsProviderException { + mockTruststoresEnv(VALID_TRUSTSTORES); + + assertThat(truststoresPathsProvider.getTruststores()) + .contains("/opt/app/certificates/truststore.jks", + "/opt/app/certificates/truststore.pem"); + } + + @Test + void shouldReturnCorrectListWhenTruststoresPasswordsValid() throws TruststoresPathsProviderException { + mockTruststoresPasswordsEnv(VALID_TRUSTSTORES_PASSWORDS); + + assertThat(truststoresPathsProvider.getTruststoresPasswords()) + .contains("/opt/app/certificates/truststore.pass", + ""); + } + + @Test + void shouldThrowExceptionWhenTruststoresEmpty() { + mockTruststoresEnv(""); + + assertThatExceptionOfType(TruststoresPathsProviderException.class) + .isThrownBy(truststoresPathsProvider::getTruststores); + } + + @Test + void shouldThrowExceptionWhenOneOfTruststoresPathsInvalid() { + mockTruststoresEnv(INVALID_TRUSTSTORES); + + assertThatExceptionOfType(TruststoresPathsProviderException.class) + .isThrownBy(truststoresPathsProvider::getTruststores); + } + + @Test + void shouldThrowExceptionWhenOneOfTruststorePasswordPathsInvalid() { + mockTruststoresPasswordsEnv(INVALID_TRUSTSTORES_PASSWORDS); + + assertThatExceptionOfType(TruststoresPathsProviderException.class) + .isThrownBy(truststoresPathsProvider::getTruststoresPasswords); + } + + private void mockTruststoresEnv(String truststores) { + mockEnv(truststores, TRUSTSTORES_ENV); + } + + private void mockTruststoresPasswordsEnv(String truststoresPasswords) { + mockEnv(truststoresPasswords, TRUSTSTORES_PASSWORDS_ENV); + } + + private void mockEnv(String envValue, String envName) { + when(envProvider.getEnv(envName)) + .thenReturn(Optional.of(envValue)); + } +} diff --git a/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java new file mode 100644 index 00000000..336ba5da --- /dev/null +++ b/trustStoreMerger/src/test/java/org/onap/oom/truststoremerger/configuration/MergerConfigurationFactoryTest.java @@ -0,0 +1,98 @@ +/*============LICENSE_START======================================================= + * oom-truststore-merger + * ================================================================================ + * Copyright (C) 2020 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.oom.truststoremerger.configuration; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProvider; +import org.onap.oom.truststoremerger.certification.file.TruststoresPathsProviderException; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class MergerConfigurationFactoryTest { + + private static final String BASE_TRUSTSTORE_PATH = "/opt/app/truststore_"; + private static final String TRUSTSTORE_EXTENSION = ".jks"; + private static final String PASSWORD_EXTENSION = ".pass"; + + @Mock + private TruststoresPathsProvider pathsProvider; + private MergerConfigurationFactory factory; + + @BeforeEach + void setUp() { + factory = new MergerConfigurationFactory(pathsProvider); + } + + @Test + void shouldReturnConfigurationWithCorrectPaths() throws TruststoresPathsProviderException, MergerConfigurationException { + int numberOfPaths = 5; + List truststoresPaths = createListOfPathsWithExtension(numberOfPaths, TRUSTSTORE_EXTENSION); + List truststorePasswordPaths = createListOfPathsWithExtension(numberOfPaths, PASSWORD_EXTENSION); + mockPaths(truststoresPaths, truststorePasswordPaths); + + MergerConfiguration configuration = factory.createConfiguration(); + + assertThat(configuration.getTruststoreFilePaths()).containsAll(truststoresPaths); + assertThat(configuration.getTruststoreFilePasswordPaths()).containsAll(truststorePasswordPaths); + } + + @Test + void shouldThrowExceptionWhenTruststoresLenghtDifferentThanTruststoresPasswordsLength() throws TruststoresPathsProviderException { + int numberOfTruststores = 5; + int numberOfTruststoresPasswords = 4; + List truststoresPaths = createListOfPathsWithExtension(numberOfTruststores, TRUSTSTORE_EXTENSION); + List truststorePasswordPaths = createListOfPathsWithExtension(numberOfTruststoresPasswords, PASSWORD_EXTENSION); + mockPaths(truststoresPaths, truststorePasswordPaths); + + assertThatExceptionOfType(MergerConfigurationException.class) + .isThrownBy(factory::createConfiguration); + } + + private void mockPaths(List truststores, List truststoresPasswords) throws TruststoresPathsProviderException { + mockTruststores(truststores); + mockTruststoresPasswords(truststoresPasswords); + } + + private void mockTruststores(List truststores) throws TruststoresPathsProviderException { + when(pathsProvider.getTruststores()).thenReturn(truststores); + } + + private void mockTruststoresPasswords(List truststoresPasswords) throws TruststoresPathsProviderException { + when(pathsProvider.getTruststoresPasswords()).thenReturn(truststoresPasswords); + } + + private List createListOfPathsWithExtension(int numberOfPaths, String password_extension) { + List paths = new ArrayList<>(); + while (numberOfPaths-- > 0) { + paths.add(BASE_TRUSTSTORE_PATH + numberOfPaths + password_extension); + } + return paths; + } +} -- cgit 1.2.3-korg