diff options
5 files changed, 114 insertions, 14 deletions
diff --git a/security/crypt-password/pom.xml b/security/crypt-password/pom.xml index 7c6495ae..732df17d 100644 --- a/security/crypt-password/pom.xml +++ b/security/crypt-password/pom.xml @@ -27,14 +27,6 @@ <artifactId>spring-security-crypto</artifactId> </dependency> <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-api</artifactId> - </dependency> - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - </dependency> - <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <scope>runtime</scope> @@ -44,6 +36,21 @@ <artifactId>logback-classic</artifactId> <scope>runtime</scope> </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CharsFromStreamReader.java b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CharsFromStreamReader.java index 1ea18cc7..58be00cd 100644 --- a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CharsFromStreamReader.java +++ b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CharsFromStreamReader.java @@ -25,7 +25,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.nio.CharBuffer; -final class CharsFromStreamReader { +class CharsFromStreamReader { public static final int END_OF_STREAM = -1; private final int maxLength; diff --git a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CryptPassword.java b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CryptPassword.java index 4b16c9e2..c2c2528d 100644 --- a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CryptPassword.java +++ b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/CryptPassword.java @@ -24,7 +24,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * Class for encoding passwords using BCrypt algorithm. */ -public final class CryptPassword { +public class CryptPassword { private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); diff --git a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/EncodePassword.java b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/EncodePassword.java index 77843816..3fe6265c 100644 --- a/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/EncodePassword.java +++ b/security/crypt-password/src/main/java/org/onap/dcaegen2/services/sdk/security/EncodePassword.java @@ -25,11 +25,17 @@ class EncodePassword { private static final int MAX_PASSWORD_LENGTH = 64 * 1024; private static final int ARGS_LENGTH_PASSWORD_PROVIDED = 1; - private CryptPassword cryptPassword = new CryptPassword(); - private CharsFromStreamReader charsFromStreamReader = new CharsFromStreamReader(MAX_PASSWORD_LENGTH); + private final CryptPassword cryptPassword; + private final CharsFromStreamReader charsFromStreamReader; + + public EncodePassword(CryptPassword cryptPassword, CharsFromStreamReader charsFromStreamReader) { + this.cryptPassword = cryptPassword; + this.charsFromStreamReader = charsFromStreamReader; + } + public static void main(String[] args) { - new EncodePassword().run(args); + new EncodePassword(new CryptPassword(), new CharsFromStreamReader(MAX_PASSWORD_LENGTH)).run(args); } public void run(String[] args) { @@ -65,7 +71,7 @@ class EncodePassword { System.err.println(msg); } - private void printErrorAndExit(ExitCode exitCode, String msg) { + void printErrorAndExit(ExitCode exitCode, String msg) { System.err.println(msg); System.exit(exitCode.value); } diff --git a/security/crypt-password/src/test/java/org/onap/dcaegen2/services/sdk/security/EncodePasswordTest.java b/security/crypt-password/src/test/java/org/onap/dcaegen2/services/sdk/security/EncodePasswordTest.java new file mode 100644 index 00000000..a899bb98 --- /dev/null +++ b/security/crypt-password/src/test/java/org/onap/dcaegen2/services/sdk/security/EncodePasswordTest.java @@ -0,0 +1,87 @@ +/* + * ============LICENSE_START==================================== + * DCAEGEN2-SERVICES-SDK + * ========================================================= + * Copyright (C) 2021 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.dcaegen2.services.sdk.security; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +class EncodePasswordTest { + + public static final String PASSWORD_CANNOT_BE_EMPTY = "Password cannot be empty"; + public static final String PASSWORD_TO_ENCODE = "testPass"; + public static final String EMPTY_PASSWORD = ""; + private final CryptPassword cryptPassword = mock(CryptPassword.class); + private final CharsFromStreamReader charsFromStreamReader = mock(CharsFromStreamReader.class); + private final EncodePassword encodePassword = spy(new EncodePassword(cryptPassword, charsFromStreamReader)); + + @BeforeEach + void setUp() { + doNothing().when(encodePassword).printErrorAndExit(any(), any()); + } + + @Test + void shouldExitWithErrorCodeWhenPasswordIsNotAvailableInArgs() throws IOException { + // when + encodePassword.run(new String[]{}); + + // then + verify(charsFromStreamReader).readPasswordFromStdIn(); + verify(encodePassword).printErrorAndExit( + eq(ExitCode.INVALID_PASSWORD), + eq(PASSWORD_CANNOT_BE_EMPTY) + ); + } + + @Test + void shouldExitWithErrorCodeWhenPasswordIsEmpty() { + // when + encodePassword.run(new String[]{EMPTY_PASSWORD}); + + // then + verify(encodePassword).printErrorAndExit( + eq(ExitCode.INVALID_PASSWORD), + eq(PASSWORD_CANNOT_BE_EMPTY) + ); + } + + @Test + void shouldEncodePasswordWhenPasswordIsAvailableInArgs() throws IOException { + // when + encodePassword.run(new String[]{PASSWORD_TO_ENCODE}); + + // then + verify(charsFromStreamReader, never()).readPasswordFromStdIn(); + verify(cryptPassword).encode(eq(PASSWORD_TO_ENCODE)); + verify(encodePassword, never()).printErrorAndExit( + eq(ExitCode.INVALID_PASSWORD), + eq(PASSWORD_CANNOT_BE_EMPTY) + ); + } +} |