diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml new file mode 100644 index 0000000..eb58352 --- /dev/null +++ b/.github/workflows/updater.yml @@ -0,0 +1,50 @@ +name: updater +on: + workflow_dispatch: + schedule: + - cron: '0 12 * * 5' # every Friday at 07:00 Colombia Time +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Generate a token + id: generate_token + uses: tibdex/github-app-token@v2 + with: + app_id: ${{ secrets.APP_ID_ADMIN_GITHUB }} + private_key: ${{ secrets.APP_PRIVATE_KEY_ADMIN_GITHUB }} + - uses: actions/checkout@v4 + with: + ref: master + token: ${{ steps.generate_token.outputs.token }} + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 17 + - name: Check for updates + run: ./gradlew internalTask --action UPDATE_DEPENDENCIES + - name: Check for changes + id: git_changes + run: | + git diff --name-only + if [[ $(git diff --name-only) ]]; then + echo "Changes detected!" + echo "HAS_CHANGES=true" >> $GITHUB_ENV + else + echo "No changes detected!" + echo "HAS_CHANGES=false" >> $GITHUB_ENV + fi + - name: Create Pull Request + if: env.HAS_CHANGES == 'true' + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ steps.generate_token.outputs.token }} + committer: Dependencies Bot + commit-message: 'fix(deps): update dependencies' + title: 'fix(deps): update dependencies' + body: 'This PR updates dependencies to latest versions' + branch: 'feature/autoupdate-deps' + base: 'master' + labels: 'dependencies' + reviewers: 'juancgalvis' \ No newline at end of file diff --git a/api/secrets-manager-api/secrets-manager-api.gradle b/api/secrets-manager-api/secrets-manager-api.gradle index fa81e63..0629d0c 100644 --- a/api/secrets-manager-api/secrets-manager-api.gradle +++ b/api/secrets-manager-api/secrets-manager-api.gradle @@ -1,9 +1,9 @@ dependencies { - implementation "io.projectreactor:reactor-core:${reactorCoreVersion}" - implementation "com.google.code.gson:gson:${gsonVersion}" + implementation 'io.projectreactor:reactor-core:3.6.6' + implementation 'com.google.code.gson:gson:2.11.0' } ext { artifactId = 'secrets-manager-api' artifactDescription = 'Secrets Manager API' -} +} \ No newline at end of file diff --git a/api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/exceptionsTest.java b/api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/ExceptionsTest.java similarity index 62% rename from api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/exceptionsTest.java rename to api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/ExceptionsTest.java index 7ad8943..019d40c 100644 --- a/api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/exceptionsTest.java +++ b/api/secrets-manager-api/src/test/java/co/com/bancolombia/secretsmanager/api/ExceptionsTest.java @@ -1,13 +1,14 @@ package co.com.bancolombia.secretsmanager.api; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; -import org.junit.Test; -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Test; -public class exceptionsTest { +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ExceptionsTest { @Test - public void generateExpetion() { + void generateException() { SecretException ex = new SecretException("My error"); assertEquals("My error", ex.getMessage()); } diff --git a/async/aws-parameter-store-manager-async/aws-parameter-store-manager-async.gradle b/async/aws-parameter-store-manager-async/aws-parameter-store-manager-async.gradle index d064795..e2f2d3e 100644 --- a/async/aws-parameter-store-manager-async/aws-parameter-store-manager-async.gradle +++ b/async/aws-parameter-store-manager-async/aws-parameter-store-manager-async.gradle @@ -2,18 +2,18 @@ dependencies { api project(":secrets-manager-api") implementation 'software.amazon.awssdk:ssm' implementation 'software.amazon.awssdk:sts' - implementation "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}" - implementation "io.projectreactor:reactor-core:${reactorCoreVersion}" - testImplementation "io.projectreactor:reactor-test:${reactorCoreVersion}" + implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + implementation 'io.projectreactor:reactor-core:3.6.6' + testImplementation 'io.projectreactor:reactor-test:3.6.6' } dependencyManagement { imports { - mavenBom "software.amazon.awssdk:bom:${awsBomVersion}" + mavenBom 'software.amazon.awssdk:bom:2.25.55' } } ext { artifactId = 'aws-parameter-store-manager-async' artifactDescription = 'Secrets Manager' -} +} \ No newline at end of file diff --git a/async/aws-parameter-store-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsync.java b/async/aws-parameter-store-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsync.java index be94104..2108ec7 100644 --- a/async/aws-parameter-store-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsync.java +++ b/async/aws-parameter-store-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsync.java @@ -6,13 +6,7 @@ import com.github.benmanes.caffeine.cache.AsyncCache; import com.github.benmanes.caffeine.cache.Caffeine; import reactor.core.publisher.Mono; -import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; -import software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider; -import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider; -import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider; +import software.amazon.awssdk.auth.credentials.*; import software.amazon.awssdk.services.ssm.SsmAsyncClient; import software.amazon.awssdk.services.ssm.SsmAsyncClientBuilder; import software.amazon.awssdk.services.ssm.model.GetParameterRequest; @@ -63,9 +57,7 @@ private Mono getSecretValue(String secretName) { } return Mono.error(new SecretException("Secret value is not a String")); }) - .doOnError((err) -> { - logger.warning("Error retrieving the secret: " + err.getMessage()); - }); + .doOnError(err -> logger.warning("Error retrieving the secret: " + err.getMessage())); } private SsmAsyncClient buildClient(SsmAsyncClientBuilder builder) { diff --git a/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSParameterStoreConfigTest.java b/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSParameterStoreConfigTest.java index a53114b..b4ee73c 100644 --- a/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSParameterStoreConfigTest.java +++ b/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSParameterStoreConfigTest.java @@ -1,22 +1,22 @@ package co.com.bancolombia.secretsmanager.config; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import software.amazon.awssdk.regions.Region; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class AWSParameterStoreConfigTest { +class AWSParameterStoreConfigTest { private static AWSParameterStoreConfig awsParameterStoreConfig; - @BeforeClass + @BeforeAll public static void setUp() { awsParameterStoreConfig = AWSParameterStoreConfig.builder().build(); } @Test - public void validateAWSParameterStoreConfig() { + void validateAWSParameterStoreConfig() { assertEquals(Region.US_EAST_1, awsParameterStoreConfig.getRegion()); assertEquals("", awsParameterStoreConfig.getEndpoint()); assertEquals(0, awsParameterStoreConfig.getCacheSeconds()); diff --git a/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsyncTest.java b/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsyncTest.java index f28c38a..ad462ab 100644 --- a/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsyncTest.java +++ b/async/aws-parameter-store-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorAsyncTest.java @@ -2,11 +2,11 @@ import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.config.AWSParameterStoreConfig; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +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.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.test.StepVerifier; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ssm.SsmAsyncClient; @@ -20,8 +20,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class AWSParameterStoreConnectorAsyncTest { +@ExtendWith(MockitoExtension.class) +class AWSParameterStoreConnectorAsyncTest { @Mock private SsmAsyncClient client; @Mock @@ -29,8 +29,8 @@ public class AWSParameterStoreConnectorAsyncTest { private AWSParameterStoreConnectorAsync connector; private AWSParameterStoreConfig config; - @Before - public void buildClient() { + @BeforeEach + void buildClient() { config = AWSParameterStoreConfig.builder() .cacheSeconds(1) .cacheSize(10) @@ -40,14 +40,14 @@ public void buildClient() { } @Test - public void shouldGetStringSecret() throws SecretException { + void shouldGetStringSecret() { prepareClient("secretValue", true); StepVerifier.create(connector.getSecret("secretName")) .expectNext("secretValue").expectComplete().verify(); } @Test - public void shouldThrowExceptionWhenSecretValueNull() { + void shouldThrowExceptionWhenSecretValueNull() { prepareClient("secretValue", false); StepVerifier.create(connector.getSecret("secretName")) .expectSubscription() @@ -55,7 +55,7 @@ public void shouldThrowExceptionWhenSecretValueNull() { } @Test - public void shouldThrowExceptionWhenSecretIsNotAString() { + void shouldThrowExceptionWhenSecretIsNotAString() { prepareClient(null, true); StepVerifier.create(connector.getSecret("secretName")) .expectSubscription() @@ -63,14 +63,17 @@ public void shouldThrowExceptionWhenSecretIsNotAString() { } @Test - public void shouldThrowExceptionWhenNoApplySerialization() { - prepareClient("secretValue", true); + void shouldThrowExceptionWhenNoApplySerialization() { + prepareClient("secretValue", true, false); StepVerifier.create(connector.getSecret("secretName", Class.class)) .expectSubscription() .verifyError(UnsupportedOperationException.class); } private void prepareClient(String data, boolean secretValue) { + prepareClient(data, secretValue, true); + } + private void prepareClient(String data, boolean secretValue, boolean willCallGetParameter) { GetParameterResponse responseMock = secretValue ? GetParameterResponse.builder() .parameter(Parameter.builder().value(data).build()) .build() : null; @@ -81,7 +84,9 @@ private void prepareClient(String data, boolean secretValue) { when(builder.region(any())).thenReturn(builder); when(builder.build()).thenReturn(client); - when(client.getParameter(any(GetParameterRequest.class))).thenReturn(completableFuture); + if (willCallGetParameter) { + when(client.getParameter(any(GetParameterRequest.class))).thenReturn(completableFuture); + } connector = new AWSParameterStoreConnectorAsync(config, builder); } diff --git a/async/aws-secrets-manager-async/aws-secrets-manager-async.gradle b/async/aws-secrets-manager-async/aws-secrets-manager-async.gradle index 3d4672f..7f1d941 100644 --- a/async/aws-secrets-manager-async/aws-secrets-manager-async.gradle +++ b/async/aws-secrets-manager-async/aws-secrets-manager-async.gradle @@ -2,19 +2,19 @@ dependencies { api project(":secrets-manager-api") implementation 'software.amazon.awssdk:secretsmanager' implementation 'software.amazon.awssdk:sts' - implementation "io.projectreactor.addons:reactor-extra:${reactorExtraVersion}" - implementation "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}" - implementation "io.projectreactor:reactor-core:${reactorCoreVersion}" - testImplementation "io.projectreactor:reactor-test:${reactorCoreVersion}" + implementation 'io.projectreactor.addons:reactor-extra:3.5.1' + implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + implementation 'io.projectreactor:reactor-core:3.6.6' + testImplementation 'io.projectreactor:reactor-test:3.6.6' } dependencyManagement { imports { - mavenBom "software.amazon.awssdk:bom:${awsBomVersion}" + mavenBom 'software.amazon.awssdk:bom:2.25.55' } } ext { artifactId = 'aws-secrets-manager-async' artifactDescription = 'Secrets Manager' -} +} \ No newline at end of file diff --git a/async/aws-secrets-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsync.java b/async/aws-secrets-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsync.java index 35c3435..5d5ba35 100644 --- a/async/aws-secrets-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsync.java +++ b/async/aws-secrets-manager-async/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsync.java @@ -7,13 +7,7 @@ import com.github.benmanes.caffeine.cache.AsyncCache; import com.github.benmanes.caffeine.cache.Caffeine; import reactor.core.publisher.Mono; -import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; -import software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider; -import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider; -import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider; +import software.amazon.awssdk.auth.credentials.*; import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient; import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClientBuilder; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; @@ -56,7 +50,7 @@ public Mono getSecret(String secretName) { public Mono getSecret(String secretName, Class cls) { return this.getSecret(secretName) .flatMap((data -> Mono.just(GsonUtils.getInstance().stringToModel(data, cls)))) - .onErrorMap((e) -> new SecretException(e.getMessage())); + .onErrorMap(e -> new SecretException(e.getMessage())); } @@ -73,9 +67,7 @@ private Mono getSecretValue(String secretName) { } return Mono.error(new SecretException("Secret value is not a String")); }) - .doOnError((err) -> { - logger.warning("Error retrieving the secret: " + err.getMessage()); - }); + .doOnError(err -> logger.warning("Error retrieving the secret: " + err.getMessage())); } /** diff --git a/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSSecretsManagerConfigTest.java b/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSSecretsManagerConfigTest.java index 1c7b7e3..b03e66f 100644 --- a/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSSecretsManagerConfigTest.java +++ b/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/config/AWSSecretsManagerConfigTest.java @@ -1,22 +1,22 @@ package co.com.bancolombia.secretsmanager.config; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import software.amazon.awssdk.regions.Region; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class AWSSecretsManagerConfigTest { +class AWSSecretsManagerConfigTest { private static AWSSecretsManagerConfig awsSecretsManagerConfig; - @BeforeClass + @BeforeAll public static void setUp() { awsSecretsManagerConfig = AWSSecretsManagerConfig.builder().build(); } @Test - public void validateAWSSecretsManagerConfig() { + void validateAWSSecretsManagerConfig() { assertEquals(Region.US_EAST_1, awsSecretsManagerConfig.getRegion()); assertEquals("", awsSecretsManagerConfig.getEndpoint()); assertEquals(0, awsSecretsManagerConfig.getCacheSeconds()); diff --git a/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsyncTest.java b/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsyncTest.java index 49a78aa..04ec90a 100644 --- a/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsyncTest.java +++ b/async/aws-secrets-manager-async/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorAsyncTest.java @@ -3,11 +3,11 @@ import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.config.AWSSecretsManagerConfig; import lombok.Data; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +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.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.test.StepVerifier; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient; @@ -22,16 +22,16 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class AWSSecretManagerConnectorAsyncTest { +@ExtendWith(MockitoExtension.class) +class AWSSecretManagerConnectorAsyncTest { @Mock private SecretsManagerAsyncClient client; @Mock private SecretsManagerAsyncClientBuilder clientBuilder; private AWSSecretManagerConnectorAsync connector; - @Before - public void setUp() { + @BeforeEach + void setUp() { AWSSecretsManagerConfig config = AWSSecretsManagerConfig.builder() .cacheSeconds(5) .cacheSize(10) @@ -44,7 +44,7 @@ public void setUp() { } @Test - public void shouldReturnSecretModel() { + void shouldReturnSecretModel() { when(client.getSecretValue(getSecretValueRequest("secretModelName"))) .thenReturn(getResponse("{\"username\":\"root\",\"password\":\"123456789\"}", true)); @@ -56,7 +56,7 @@ public void shouldReturnSecretModel() { } @Test - public void shouldReturnStringSecretValue() { + void shouldReturnStringSecretValue() { when(client.getSecretValue(getSecretValueRequest("stringSecretName"))) .thenReturn(getResponse("secretValue", true)); @@ -67,7 +67,7 @@ public void shouldReturnStringSecretValue() { } @Test - public void shouldThrowExceptionWhenSecretIsNotAString() { + void shouldThrowExceptionWhenSecretIsNotAString() { when(client.getSecretValue(getSecretValueRequest("secretName"))) .thenReturn(getResponse(null, true)); @@ -77,7 +77,7 @@ public void shouldThrowExceptionWhenSecretIsNotAString() { } @Test - public void shouldThrowExceptionWhenSecretIsNull() { + void shouldThrowExceptionWhenSecretIsNull() { when(client.getSecretValue(getSecretValueRequest("secretName"))) .thenReturn(getResponse(null, false)); @@ -87,7 +87,7 @@ public void shouldThrowExceptionWhenSecretIsNull() { } @Test - public void shouldThrowExceptionWhenSecretIsNonExistent() { + void shouldThrowExceptionWhenSecretIsNonExistent() { when(client.getSecretValue(getSecretValueRequest("secretName"))) .thenReturn(CompletableFuture.failedFuture(ResourceNotFoundException.builder() .message("Secrets Manager can't find the specified secret not found.") @@ -101,7 +101,7 @@ public void shouldThrowExceptionWhenSecretIsNonExistent() { } @Test - public void shouldThrowExceptionWhenRequestIsInvalid() { + void shouldThrowExceptionWhenRequestIsInvalid() { when(client.getSecretValue(getSecretValueRequest("secretNameF$1l"))) .thenReturn(CompletableFuture.failedFuture(InvalidParameterException.builder() .message("The parameter name or value is invalid.") diff --git a/async/vault-async/src/main/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsync.java b/async/vault-async/src/main/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsync.java index fc7f04b..260368e 100644 --- a/async/vault-async/src/main/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsync.java +++ b/async/vault-async/src/main/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsync.java @@ -3,9 +3,9 @@ import co.com.bancolombia.secretsmanager.api.GenericManagerAsync; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.commons.utils.GsonUtils; +import co.com.bancolombia.secretsmanager.vault.auth.AuthResponse; import co.com.bancolombia.secretsmanager.vault.config.VaultSecretsManagerProperties; import co.com.bancolombia.secretsmanager.vault.secret.SecretResponse; -import co.com.bancolombia.secretsmanager.vault.auth.AuthResponse; import com.github.benmanes.caffeine.cache.AsyncCache; import com.github.benmanes.caffeine.cache.Caffeine; import reactor.core.publisher.Mono; diff --git a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaulAuthenticatorTest.java b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaulAuthenticatorTest.java index e5c066a..5904e09 100644 --- a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaulAuthenticatorTest.java +++ b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaulAuthenticatorTest.java @@ -5,22 +5,22 @@ import lombok.SneakyThrows; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.test.StepVerifier; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class VaulAuthenticatorTest { +@ExtendWith(MockitoExtension.class) +class VaulAuthenticatorTest { @SneakyThrows @Test - public void testAuthenticateWithRoleIdAndSecretId() { + void testAuthenticateWithRoleIdAndSecretId() { MockWebServer server = new MockWebServer(); MockResponse response = new MockResponse() @@ -57,7 +57,7 @@ public void testAuthenticateWithRoleIdAndSecretId() { @SneakyThrows @Test - public void testAuthenticateWithK8s() { + void testAuthenticateWithK8s() { MockWebServer server = new MockWebServer(); @@ -99,7 +99,7 @@ public void testAuthenticateWithK8s() { @SneakyThrows @Test - public void testHandleNoCredentials() { + void testHandleNoCredentials() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(2020) @@ -127,7 +127,7 @@ public void testHandleNoCredentials() { @SneakyThrows @Test - public void testHandleFailedAuth() { + void testHandleFailedAuth() { MockWebServer server = new MockWebServer(); MockResponse response = new MockResponse() @@ -159,7 +159,7 @@ public void testHandleFailedAuth() { StepVerifier.create(vaultAuthenticator.login()) .expectSubscription() .expectErrorMatches(throwable -> { - Assert.assertTrue(throwable.getMessage().contains("invalid role or secret ID")); + assertTrue(throwable.getMessage().contains("invalid role or secret ID")); return true; }) .verify(); diff --git a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretManagerConfiguratorTest.java b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretManagerConfiguratorTest.java index 2a8e086..c6a1e97 100644 --- a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretManagerConfiguratorTest.java +++ b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretManagerConfiguratorTest.java @@ -5,18 +5,20 @@ import co.com.bancolombia.secretsmanager.vault.config.VaultSecretsManagerProperties; import co.com.bancolombia.secretsmanager.vault.config.VaultTrustStoreProperties; import lombok.SneakyThrows; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.File; import java.net.URI; import java.net.http.HttpClient; -public class VaultSecretManagerConfiguratorTest { +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class VaultSecretManagerConfiguratorTest { @SneakyThrows @Test - public void testHttpClientGeneration() { + void testHttpClientGeneration() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -29,12 +31,12 @@ public void testHttpClientGeneration() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testVaultClientGeneration() { + void testVaultClientGeneration() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -47,12 +49,12 @@ public void testVaultClientGeneration() { .build() .getVaultClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithKeyStore() { + void testClientGenerationWithKeyStore() { URI keyStoreUri = getClass().getClassLoader().getResource("keystore.jks").toURI(); File keyStoreFile = new File(keyStoreUri); @@ -73,12 +75,12 @@ public void testClientGenerationWithKeyStore() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithKeyStoreNoValues() { + void testClientGenerationWithKeyStoreNoValues() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -89,7 +91,7 @@ public void testClientGenerationWithKeyStoreNoValues() { ) .build(); - Assert.assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() + assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() .withProperties(properties) .build() .getHttpClient()); @@ -98,7 +100,7 @@ public void testClientGenerationWithKeyStoreNoValues() { @SneakyThrows @Test - public void testClientGenerationWithTrustStore() { + void testClientGenerationWithTrustStore() { URI storeUri = getClass().getClassLoader().getResource("truststore.jks").toURI(); File storeFile = new File(storeUri); @@ -118,12 +120,12 @@ public void testClientGenerationWithTrustStore() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithTrustPem() { + void testClientGenerationWithTrustPem() { URI pemUri = getClass().getClassLoader().getResource("certificate.arm").toURI(); File pemFile = new File(pemUri); @@ -143,15 +145,12 @@ public void testClientGenerationWithTrustPem() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithTrustNoValues() { - URI pemUri = getClass().getClassLoader().getResource("certificate.arm").toURI(); - File pemFile = new File(pemUri); - + void testClientGenerationWithTrustNoValues() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -162,7 +161,7 @@ public void testClientGenerationWithTrustNoValues() { ) .build(); - Assert.assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() + assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() .withProperties(properties) .build() .getHttpClient()); diff --git a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsyncTest.java b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsyncTest.java index 04a39ec..db1b6d1 100644 --- a/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsyncTest.java +++ b/async/vault-async/src/test/java/co/com/bancolombia/secretsmanager/connector/VaultSecretsManagerConnectorAsyncTest.java @@ -8,27 +8,27 @@ import lombok.SneakyThrows; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import java.net.http.HttpClient; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class VaultSecretsManagerConnectorAsyncTest { +@ExtendWith(MockitoExtension.class) +class VaultSecretsManagerConnectorAsyncTest { @Mock VaultAuthenticator authenticator; @SneakyThrows @Test - public void testGetSecretContent() { + void testGetSecretContent() { MockWebServer server = new MockWebServer(); @@ -77,7 +77,7 @@ public void testGetSecretContent() { @SneakyThrows @Test - public void testGetSecretContentNoAuthUseTokenProvided() { + void testGetSecretContentNoAuthUseTokenProvided() { MockWebServer server = new MockWebServer(); @@ -119,7 +119,7 @@ public void testGetSecretContentNoAuthUseTokenProvided() { @SneakyThrows @Test - public void testGetSecretPojo() { + void testGetSecretPojo() { MockWebServer server = new MockWebServer(); diff --git a/async/vault-async/vault-async.gradle b/async/vault-async/vault-async.gradle index 3a0b198..aa77a0c 100644 --- a/async/vault-async/vault-async.gradle +++ b/async/vault-async/vault-async.gradle @@ -1,15 +1,15 @@ dependencies { api project(":secrets-manager-api") api project(":vault-commons") - implementation "io.projectreactor.addons:reactor-extra:${reactorExtraVersion}" - implementation "io.projectreactor:reactor-core:${reactorCoreVersion}" - implementation "com.google.code.gson:gson:${gsonVersion}" - implementation "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}" - testImplementation "io.projectreactor:reactor-test:${reactorCoreVersion}" - testImplementation("com.squareup.okhttp3:mockwebserver:${okHttpVersion}") + implementation 'io.projectreactor.addons:reactor-extra:3.5.1' + implementation 'io.projectreactor:reactor-core:3.6.6' + implementation 'com.google.code.gson:gson:2.11.0' + implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + testImplementation 'io.projectreactor:reactor-test:3.6.6' + testImplementation('com.squareup.okhttp3:mockwebserver:4.12.0') } ext { artifactId = 'vault-async' artifactDescription = 'Secrets Manager async connector for Vault' -} +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index b5e7da3..c323660 100644 --- a/build.gradle +++ b/build.gradle @@ -4,17 +4,15 @@ buildscript { maven { url "https://repo.spring.io/milestone" } maven { url "https://repo.spring.io/snapshot" } } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - classpath("com.github.ben-manes:gradle-versions-plugin:$gradleVersionsVersion") - } } plugins { - id "org.sonarqube" version "4.4.1.3373" - id "io.github.gradle-nexus.publish-plugin" version "1.1.0" -// id "org.owasp.dependencycheck" version "9.0.9" + id 'org.sonarqube' version '5.0.0.4638' + id 'com.github.ben-manes.versions' version '0.51.0' + id 'io.github.gradle-nexus.publish-plugin' version '2.0.0' + id 'org.springframework.boot' version '3.2.5' apply false + id 'org.owasp.dependencycheck' version '9.2.0' apply false + id 'co.com.bancolombia.cleanArchitecture' version '3.17.3' } -apply from: './main.gradle' -apply plugin: 'com.github.ben-manes.versions' +apply from: './main.gradle' \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e21310f..324ee2c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,2 @@ version=4.4.2 -springBootVersion=3.2.4 -reactorCoreVersion=3.6.4 -reactorExtraVersion=3.5.1 -gradleVersionsVersion=0.47.0 -awsBomVersion=2.25.31 -caffeineVersion=3.1.8 -okHttpVersion=4.12.0 -gsonVersion=2.10.1 -lombokVersion=1.18.32 \ No newline at end of file +onlyUpdater=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a7..d64cd49 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3499ded..1af9e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cb..1aa94a4 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/main.gradle b/main.gradle index f504288..9c9b1c7 100644 --- a/main.gradle +++ b/main.gradle @@ -2,6 +2,10 @@ allprojects { apply plugin: 'java' apply plugin: 'jacoco' apply plugin: 'org.sonarqube' + apply plugin: 'org.owasp.dependencycheck' + + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() @@ -9,18 +13,7 @@ allprojects { group 'com.github.bancolombia' - dependencies { - compileOnly "org.projectlombok:lombok:${lombokVersion}" - annotationProcessor "org.projectlombok:lombok:${lombokVersion}" - - testCompileOnly "org.projectlombok:lombok:${lombokVersion}" - testAnnotationProcessor "org.projectlombok:lombok:${lombokVersion}" - testImplementation 'org.mockito:mockito-core:3.12.4' - testImplementation 'org.mockito:mockito-inline:3.12.4' - testImplementation 'junit:junit:4.13.2' - } - - sonarqube { + sonar { properties { property "sonar.sourceEncoding", "UTF-8" property "sonar.projectKey", "bancolombia_secrets-manager" @@ -44,11 +37,10 @@ nexusPublishing { } subprojects { - apply plugin: 'io.spring.dependency-management' apply plugin: 'java-library' + apply plugin: 'io.spring.dependency-management' apply plugin: 'maven-publish' apply plugin: 'signing' -// apply plugin: 'org.owasp.dependencycheck' ext { pomConfig = { @@ -84,10 +76,42 @@ subprojects { groupId = 'com.github.bancolombia' } - group groupId + dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' + + testCompileOnly 'org.projectlombok:lombok:1.18.32' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.32' + testImplementation platform('org.junit:junit-bom:5.11.0-M1') + testImplementation 'org.junit.jupiter:junit-jupiter-engine' + testImplementation 'org.mockito:mockito-junit-jupiter:5.11.0' + } - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_17 + test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed" + } + } + + test.finalizedBy(project.tasks.jacocoTestReport) + + jacocoTestReport { + dependsOn test + reports { + xml.setRequired true + xml.setOutputLocation layout.buildDirectory.file("reports/jacoco.xml") + csv.setRequired false + html.setOutputLocation layout.buildDirectory.dir("reports/jacocoHtml") + } + } + + // check.dependsOn dependencyCheckAggregate + + dependencyCheck { + format = 'JSON' + formats = ['JSON'] + } java { withJavadocJar() @@ -101,19 +125,10 @@ subprojects { } javadoc.failOnError = false - repositories { - mavenCentral() + tasks.withType(GenerateModuleMetadata).configureEach { + enabled = false } -// dependencyCheck { -// format = 'JSON' -// formats = ['JSON'] -// junitFailOnCVSS = 7 -// failBuildOnCVSS = 7 -// } - -// check.dependsOn dependencyCheckAggregate - publishing { publications { mavenJava(MavenPublication) { @@ -134,10 +149,6 @@ subprojects { } } - tasks.withType(GenerateModuleMetadata).configureEach { - enabled = false - } - if (project.hasProperty('signing.keyId')) { signing { sign publishing.publications.mavenJava @@ -149,6 +160,7 @@ tasks.register('generateMergedReport', JacocoReport) { dependsOn test dependsOn subprojects.test dependsOn subprojects.javadoc + dependsOn subprojects.jacocoTestReport additionalSourceDirs.setFrom files(subprojects.sourceSets.main.allSource.srcDirs) sourceDirectories.setFrom files(subprojects.sourceSets.main.allSource.srcDirs) classDirectories.setFrom files(subprojects.sourceSets.main.output) @@ -162,4 +174,4 @@ tasks.register('generateMergedReport', JacocoReport) { tasks.named('wrapper') { gradleVersion = '8.5' -} +} \ No newline at end of file diff --git a/sync/aws-parameter-store-manager-sync/aws-parameter-store-manager-sync.gradle b/sync/aws-parameter-store-manager-sync/aws-parameter-store-manager-sync.gradle index d7efdaa..31fb8ae 100644 --- a/sync/aws-parameter-store-manager-sync/aws-parameter-store-manager-sync.gradle +++ b/sync/aws-parameter-store-manager-sync/aws-parameter-store-manager-sync.gradle @@ -6,11 +6,11 @@ dependencies { dependencyManagement { imports { - mavenBom "software.amazon.awssdk:bom:${awsBomVersion}" + mavenBom 'software.amazon.awssdk:bom:2.25.55' } } ext { artifactId = 'aws-parameter-store-manager-sync' artifactDescription = 'Secrets Manager' -} +} \ No newline at end of file diff --git a/sync/aws-parameter-store-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnector.java b/sync/aws-parameter-store-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnector.java index 6469d4d..2fddc98 100644 --- a/sync/aws-parameter-store-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnector.java +++ b/sync/aws-parameter-store-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnector.java @@ -2,13 +2,7 @@ import co.com.bancolombia.secretsmanager.api.GenericManager; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; -import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; -import software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider; -import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider; -import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider; +import software.amazon.awssdk.auth.credentials.*; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ssm.SsmClient; import software.amazon.awssdk.services.ssm.SsmClientBuilder; diff --git a/sync/aws-parameter-store-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorTest.java b/sync/aws-parameter-store-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorTest.java index 2d92270..8fc4ee9 100644 --- a/sync/aws-parameter-store-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorTest.java +++ b/sync/aws-parameter-store-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSParameterStoreConnectorTest.java @@ -1,10 +1,10 @@ package co.com.bancolombia.secretsmanager.connector; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.awssdk.services.ssm.SsmClient; import software.amazon.awssdk.services.ssm.SsmClientBuilder; import software.amazon.awssdk.services.ssm.model.GetParameterRequest; @@ -12,12 +12,13 @@ import software.amazon.awssdk.services.ssm.model.Parameter; import software.amazon.awssdk.services.ssm.model.ParameterNotFoundException; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class AWSParameterStoreConnectorTest { +@ExtendWith(MockitoExtension.class) +class AWSParameterStoreConnectorTest { @Mock private SsmClient client; @Mock @@ -26,7 +27,7 @@ public class AWSParameterStoreConnectorTest { private AWSParameterStoreConnector connector; @Test - public void shouldGetStringSecretWithEndpoint() throws SecretException { + void shouldGetStringSecret() throws SecretException { prepareClient("secretValue", true); connector = new AWSParameterStoreConnector("us-east-1", builder); String secretValue = connector.getSecret("secretName"); @@ -34,45 +35,42 @@ public void shouldGetStringSecretWithEndpoint() throws SecretException { } @Test - public void shouldGetStringSecret() throws SecretException { - prepareClient("secretValue", true); - connector = new AWSParameterStoreConnector("us-east-1", builder); - String secretValue = connector.getSecret("secretName"); - assertEquals(secretValue, "secretValue"); - } - - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretValueNull() throws SecretException { + void shouldThrowExceptionWhenSecretValueNull() { prepareClient("secretValue", false); connector = new AWSParameterStoreConnector("us-east-1", builder); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> { + connector.getSecret("secretName"); + }); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretIsNotAString() throws SecretException { + @Test + void shouldThrowExceptionWhenSecretIsNotAString() { prepareClient(null, true); connector = new AWSParameterStoreConnector("us-east-1", builder); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } - @Test(expected = UnsupportedOperationException.class) - public void shouldThrowExceptionWhenNoApplySerialization() throws UnsupportedOperationException { - prepareClient("secretValue", true); + @Test + void shouldThrowExceptionWhenNoApplySerialization() throws UnsupportedOperationException { connector = new AWSParameterStoreConnector("us-east-1", builder); - connector.getSecret("secretName", Class.class); + assertThrows(UnsupportedOperationException.class, () -> connector.getSecret("secretName", Class.class)); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenParameterNotFound() throws SecretException { - prepareClient(null, false); + @Test + void shouldThrowExceptionWhenParameterNotFound() { + prepareClient(null, false, false); connector = new AWSParameterStoreConnector("us-east-1", builder); when(client.getParameter(any(GetParameterRequest.class))).thenThrow(ParameterNotFoundException.class); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } private void prepareClient(String data, boolean secretValue) { + prepareClient(data, secretValue, true); + } + + private void prepareClient(String data, boolean secretValue, boolean willCallGetParameter) { GetParameterResponse responseMock = secretValue ? GetParameterResponse.builder() .parameter(Parameter.builder().value(data).build()) .build() : null; @@ -80,8 +78,9 @@ private void prepareClient(String data, boolean secretValue) { when(builder.credentialsProvider(any())).thenReturn(builder); when(builder.region(any())).thenReturn(builder); when(builder.build()).thenReturn(client); - - when(client.getParameter(any(GetParameterRequest.class))).thenReturn(responseMock); + if (willCallGetParameter) { + when(client.getParameter(any(GetParameterRequest.class))).thenReturn(responseMock); + } } } diff --git a/sync/aws-secrets-manager-sync/aws-secrets-manager-sync.gradle b/sync/aws-secrets-manager-sync/aws-secrets-manager-sync.gradle index d07d847..818621e 100644 --- a/sync/aws-secrets-manager-sync/aws-secrets-manager-sync.gradle +++ b/sync/aws-secrets-manager-sync/aws-secrets-manager-sync.gradle @@ -2,16 +2,16 @@ dependencies { api project(":secrets-manager-api") implementation 'software.amazon.awssdk:secretsmanager' implementation 'software.amazon.awssdk:sts' - implementation "com.google.code.gson:gson:${gsonVersion}" + implementation 'com.google.code.gson:gson:2.11.0' } dependencyManagement { imports { - mavenBom "software.amazon.awssdk:bom:${awsBomVersion}" + mavenBom 'software.amazon.awssdk:bom:2.25.55' } } ext { artifactId = 'aws-secrets-manager-sync' artifactDescription = 'Secrets Manager' -} +} \ No newline at end of file diff --git a/sync/aws-secrets-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnector.java b/sync/aws-secrets-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnector.java index 4d0ecee..41c05f6 100644 --- a/sync/aws-secrets-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnector.java +++ b/sync/aws-secrets-manager-sync/src/main/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnector.java @@ -3,13 +3,7 @@ import co.com.bancolombia.secretsmanager.api.GenericManager; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.commons.utils.GsonUtils; -import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; -import software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider; -import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; -import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; -import software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider; -import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider; +import software.amazon.awssdk.auth.credentials.*; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; diff --git a/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorTest.java b/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorTest.java index b40558b..5a5a9e7 100644 --- a/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorTest.java +++ b/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/AWSSecretManagerConnectorTest.java @@ -2,10 +2,10 @@ import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.model.AWSSecretDBModel; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; @@ -13,7 +13,8 @@ import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; import software.amazon.awssdk.services.secretsmanager.model.ResourceNotFoundException; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -22,8 +23,8 @@ * * @author Andrés Mauricio Gómez P. */ -@RunWith(MockitoJUnitRunner.class) -public class AWSSecretManagerConnectorTest { +@ExtendWith(MockitoExtension.class) +class AWSSecretManagerConnectorTest { @Mock private SecretsManagerClientBuilder builder; @Mock @@ -31,7 +32,7 @@ public class AWSSecretManagerConnectorTest { private AWSSecretManagerConnector connector; @Test - public void shouldConversionOk() throws SecretException { + void shouldConversionOk() throws SecretException { prepareClient("{\"username\":\"root\",\"password\":\"123456789\"," + "\"engine\":\"oracle\",\"" @@ -51,15 +52,15 @@ public void shouldConversionOk() throws SecretException { assertEquals("ROOT", model.getDbname()); } - @Test(expected = SecretException.class) - public void shouldConversionFail() throws Exception { + @Test + void shouldConversionFail() { prepareClient("test", true); connector = new AWSSecretManagerConnector("us-east-1", builder); - connector.getSecret("SecretDBFailMock", AWSSecretDBModel.class); + assertThrows(SecretException.class, () -> connector.getSecret("SecretDBFailMock", AWSSecretDBModel.class)); } @Test - public void shouldGetStringSecret() throws SecretException { + void shouldGetStringSecret() throws SecretException { prepareClient("SecretValue", true); connector = new AWSSecretManagerConnector("us-east-1", builder); @@ -67,48 +68,53 @@ public void shouldGetStringSecret() throws SecretException { assertEquals("SecretValue", secretValue); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretIsNotAString() throws SecretException { + @Test + void shouldThrowExceptionWhenSecretIsNotAString() { prepareClient(null, true); connector = new AWSSecretManagerConnector("us-east-1", builder); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretResultIsNull() throws SecretException { + @Test + void shouldThrowExceptionWhenSecretResultIsNull() { prepareClient(null, false); connector = new AWSSecretManagerConnector("us-east-1", builder); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretIsNonExistent() throws SecretException { - prepareClient(null, false); + @Test + void shouldThrowExceptionWhenSecretIsNonExistent() { + prepareClient(null, false, false); connector = new AWSSecretManagerConnector("us-east-1", builder); when(client.getSecretValue(any(GetSecretValueRequest.class))).thenThrow(ResourceNotFoundException.class); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } - @Test(expected = SecretException.class) - public void shouldThrowExceptionWhenSecretManagerFailsWithEndpoint() throws SecretException { - prepareClient(null, false); + @Test + void shouldThrowExceptionWhenSecretManagerFailsWithEndpoint() { + prepareClient(null, false, false); connector = new AWSSecretManagerConnector("us-east-1", builder); when(client.getSecretValue(any(GetSecretValueRequest.class))).thenThrow(SdkClientException.class); - connector.getSecret("secretName"); + assertThrows(SecretException.class, () -> connector.getSecret("secretName")); } private void prepareClient(String data, boolean secretValue) { + prepareClient(data, secretValue, true); + } + + private void prepareClient(String data, boolean secretValue, boolean mockGetSecretValue) { GetSecretValueResponse responseMock = secretValue ? GetSecretValueResponse.builder() .secretString(data) .build() : null; when(builder.build()).thenReturn(client); - - when(client.getSecretValue(any(GetSecretValueRequest.class))).thenReturn(responseMock); + if (mockGetSecretValue) { + when(client.getSecretValue(any(GetSecretValueRequest.class))).thenReturn(responseMock); + } } } diff --git a/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/models/AWSSecretDBModelTest.java b/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/models/AWSSecretDBModelTest.java index e0b3f83..6f6f6d3 100644 --- a/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/models/AWSSecretDBModelTest.java +++ b/sync/aws-secrets-manager-sync/src/test/java/co/com/bancolombia/secretsmanager/connector/models/AWSSecretDBModelTest.java @@ -1,9 +1,9 @@ package co.com.bancolombia.secretsmanager.connector.models; import co.com.bancolombia.secretsmanager.model.AWSSecretDBModel; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; /** * Represents an AWS Secret DB Model. It lets you to test a AWS Secret DB Model. @@ -11,10 +11,10 @@ * @author Andrés Mauricio Gómez * P. */ -public final class AWSSecretDBModelTest { +class AWSSecretDBModelTest { @Test - public void conversionOk() { + void conversionOk() { AWSSecretDBModel model = AWSSecretDBModel .getModel("{\"username\":\"root\"," + "\"password\":\"123456789\",\"engine\":\"oracle\"," + "\"host\":\"jdbc:oracle:thin:@oauth-oracle.cufapur4ayuj" @@ -28,9 +28,9 @@ public void conversionOk() { assertEquals("ROOT", model.getDbname()); } - @Test(expected = Exception.class) - public void conversionFail() { - AWSSecretDBModel.getModel("{\"username\"\"root\",\"passwords\":\"123456789\",\"engine\":\"oracle\"}"); + @Test + void conversionFail() { + assertThrows(Exception.class, () -> AWSSecretDBModel.getModel("{\"username\"\"root\",\"passwords\":\"123456789\",\"engine\":\"oracle\"}")); } } diff --git a/sync/env-secrets-manager/env-secrets-manager.gradle b/sync/env-secrets-manager/env-secrets-manager.gradle index 2f1ba83..963ab82 100644 --- a/sync/env-secrets-manager/env-secrets-manager.gradle +++ b/sync/env-secrets-manager/env-secrets-manager.gradle @@ -16,5 +16,3 @@ tasks.register('sourcesJar2', Jar) { sourcesJar.doLast { sourcesJar2 } - - diff --git a/sync/env-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/EnvConnectorTest.java b/sync/env-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/EnvConnectorTest.java index 55a7dc4..149d4c9 100644 --- a/sync/env-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/EnvConnectorTest.java +++ b/sync/env-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/EnvConnectorTest.java @@ -1,37 +1,40 @@ package co.com.bancolombia.secretsmanager.connector; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Represents an Environment Connector Test. It lets you to test Environment Connector Object. * * @author Andrés Mauricio Gómez P. */ -public class EnvConnectorTest { +class EnvConnectorTest { private EnvConnector connector; - @Before - public void setUp() { + @BeforeEach + void setUp() { connector = new EnvConnector(); } - @Test(expected = Exception.class) - public void variableDoesntExist() throws Exception { - connector.getSecret("SecretDoesntExist"); + @Test + void variableDoesNotExist() { + assertThrows(Exception.class, () -> { + connector.getSecret("SecretDoesNotExist"); + }); } @Test - public void variableExists() throws Exception { + void variableExists() throws Exception { String secret = connector.getSecret("PATH"); assertNotNull(secret); } - @Test(expected = UnsupportedOperationException.class) - public void getSecretModel() { - connector.getSecret("mySecret", Class.class); + @Test + void getSecretModel() { + assertThrows(UnsupportedOperationException.class, () -> connector.getSecret("mySecret", Class.class)); } } \ No newline at end of file diff --git a/sync/file-secrets-manager/file-secrets-manager.gradle b/sync/file-secrets-manager/file-secrets-manager.gradle index d6addbc..a779bb4 100644 --- a/sync/file-secrets-manager/file-secrets-manager.gradle +++ b/sync/file-secrets-manager/file-secrets-manager.gradle @@ -5,4 +5,4 @@ dependencies { ext { artifactId = 'file-secrets-manager' artifactDescription = 'Secrets Manager' -} +} \ No newline at end of file diff --git a/sync/file-secrets-manager/src/main/java/co/com/bancolombia/secretsmanager/connector/FileConnector.java b/sync/file-secrets-manager/src/main/java/co/com/bancolombia/secretsmanager/connector/FileConnector.java index 1eadbc2..4c396ad 100644 --- a/sync/file-secrets-manager/src/main/java/co/com/bancolombia/secretsmanager/connector/FileConnector.java +++ b/sync/file-secrets-manager/src/main/java/co/com/bancolombia/secretsmanager/connector/FileConnector.java @@ -2,6 +2,7 @@ import co.com.bancolombia.secretsmanager.api.GenericManager; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; +import lombok.Getter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -12,10 +13,11 @@ * * @author Andrés Mauricio Gómez P. */ +@Getter public class FileConnector implements GenericManager { - public static final String PATH_DOCKER_LINUX = "/run/secrets/"; - public static final String PATH_DOCKER_WINDOWS = "C:\\ProgramData\\Docker\\secrets"; + public static final String PATH_DOCKER_LINUX = "/run/secrets/"; // NOSONAR + public static final String PATH_DOCKER_WINDOWS = "C:\\ProgramData\\Docker\\secrets"; // NOSONAR private String path; @@ -23,10 +25,6 @@ public FileConnector(String path) { setPath(path); } - public String getPath() { - return path; - } - /** * It sets path of secrets directory. * diff --git a/sync/file-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/FileConnectorTest.java b/sync/file-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/FileConnectorTest.java index 3de6ada..72ae7e0 100644 --- a/sync/file-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/FileConnectorTest.java +++ b/sync/file-secrets-manager/src/test/java/co/com/bancolombia/secretsmanager/connector/FileConnectorTest.java @@ -1,35 +1,36 @@ package co.com.bancolombia.secretsmanager.connector; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Represents an File Connector Test. It lets you to test File Connector Object. * * @author Andrés Mauricio Gómez P. */ -public class FileConnectorTest { +class FileConnectorTest { private FileConnector connector; - @Test(expected = SecretException.class) - public void pathDoesntExist() throws Exception { - connector = new FileConnector("/path/doesnt/exits"); - connector.getSecret("SecretDoesntExist"); + @Test + void pathDoesNotExist() { + connector = new FileConnector("/path/doesNot/exits"); + assertThrows(SecretException.class, () -> connector.getSecret("Secret.txt")); } @Test - public void pathExists() throws SecretException { + void pathExists() throws SecretException { connector = new FileConnector("src/test/resources/"); - String secreto = connector.getSecret("Secret.txt"); - assertEquals("secret", secreto); + String secret = connector.getSecret("Secret.txt"); + assertEquals("secret", secret); } - @Test(expected = UnsupportedOperationException.class) - public void getSecretModel() { + @Test + void getSecretModel() { connector = new FileConnector("src/test/resources/"); - connector.getSecret("Secret.txt", Class.class); + assertThrows(UnsupportedOperationException.class, () -> connector.getSecret("Secret.txt", Class.class)); } } \ No newline at end of file diff --git a/sync/vault-commons/src/main/java/co/com/bancolombia/secretsmanager/vault/config/VaultSecretsManagerProperties.java b/sync/vault-commons/src/main/java/co/com/bancolombia/secretsmanager/vault/config/VaultSecretsManagerProperties.java index bdab1eb..c265883 100644 --- a/sync/vault-commons/src/main/java/co/com/bancolombia/secretsmanager/vault/config/VaultSecretsManagerProperties.java +++ b/sync/vault-commons/src/main/java/co/com/bancolombia/secretsmanager/vault/config/VaultSecretsManagerProperties.java @@ -52,10 +52,10 @@ public class VaultSecretsManagerProperties { private CacheProperties secretsCacheProperties= CacheProperties.builder().expireAfter(600).maxSize(100).build(); @Builder.Default - private String appRoleAuthPath = "/auth/approle/login"; + private String appRoleAuthPath = "/auth/approle/login"; // NOSONAR @Builder.Default - private String k8sAuthPath = "/auth/kubernetes/login"; + private String k8sAuthPath = "/auth/kubernetes/login"; // NOSONAR public String buildUrl() { return String.format("%s://%s:%d%s", ssl ? "https" : "http", host, port, baseApi); diff --git a/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/K8sTokenReaderTest.java b/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/K8sTokenReaderTest.java index c7ccc07..b94d2e5 100644 --- a/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/K8sTokenReaderTest.java +++ b/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/K8sTokenReaderTest.java @@ -3,15 +3,15 @@ import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; import co.com.bancolombia.secretsmanager.vault.K8sTokenReader; import lombok.SneakyThrows; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertThrows; -public class K8sTokenReaderTest { +class K8sTokenReaderTest { @SneakyThrows @Test - public void testReadToken() { + void testReadToken() { assertThrows(SecretException.class, () -> { new K8sTokenReader().getKubernetesServiceAccountToken(); }); @@ -19,7 +19,7 @@ public void testReadToken() { @SneakyThrows @Test - public void testReadTokenWithPath() { + void testReadTokenWithPath() { assertThrows(SecretException.class, () -> { new K8sTokenReader("/tmp/file").getKubernetesServiceAccountToken(); }); diff --git a/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/SslConfigTest.java b/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/SslConfigTest.java index 1f3e64d..c4db292 100644 --- a/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/SslConfigTest.java +++ b/sync/vault-commons/src/test/java/co/com/bancolombia/secretsmanager/vault/ssl/SslConfigTest.java @@ -1,10 +1,8 @@ package co.com.bancolombia.secretsmanager.vault.ssl; import co.com.bancolombia.secretsmanager.api.exceptions.SecretException; -import co.com.bancolombia.secretsmanager.vault.ssl.SslConfig; import lombok.SneakyThrows; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.DataOutputStream; import java.io.File; @@ -15,13 +13,14 @@ import java.security.PrivateKey; import java.util.Base64; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; -public class SslConfigTest { +class SslConfigTest { @SneakyThrows @Test - public void testLoadTrustStore() { + void testLoadTrustStore() { URI trustStoreUri = getClass().getClassLoader().getResource("truststore.jks").toURI(); File f = new File(trustStoreUri); SslConfig config = new SslConfig().trustStoreFile(f).build(); @@ -30,14 +29,14 @@ public void testLoadTrustStore() { } @Test - public void testHandleFailureToLoadTrustStore() { + void testHandleFailureToLoadTrustStore() { File f = new File("nofile.jks"); - Assert.assertThrows(SecretException.class, () -> new SslConfig().trustStoreFile(f)); + assertThrows(SecretException.class, () -> new SslConfig().trustStoreFile(f)); } @SneakyThrows @Test - public void testLoadPemCertificate() { + void testLoadPemCertificate() { URI certUri = getClass().getClassLoader().getResource("certificate.arm").toURI(); File f = new File(certUri); SslConfig config = new SslConfig().pemFile(f).build(); @@ -46,14 +45,14 @@ public void testLoadPemCertificate() { } @Test - public void testHandleFailureToLoadPemCertificate() { + void testHandleFailureToLoadPemCertificate() { File f = new File("nofile.pem"); - Assert.assertThrows(SecretException.class, () -> new SslConfig().pemFile(f)); + assertThrows(SecretException.class, () -> new SslConfig().pemFile(f)); } @SneakyThrows @Test - public void testLoadKeyStore() { + void testLoadKeyStore() { URI keyStoreUri = getClass().getClassLoader().getResource("keystore.jks").toURI(); File f = new File(keyStoreUri); SslConfig config = new SslConfig().keyStoreFile(f, "changeit").build(); @@ -62,14 +61,14 @@ public void testLoadKeyStore() { } @Test - public void testHandleFailureToLoadKeyStore() { + void testHandleFailureToLoadKeyStore() { File f = new File("nofile.jks"); - Assert.assertThrows(SecretException.class, () -> new SslConfig().keyStoreFile(f, "changeit")); + assertThrows(SecretException.class, () -> new SslConfig().keyStoreFile(f, "changeit")); } @SneakyThrows @Test - public void testLoadKeyPem() { + void testLoadKeyPem() { URI certUri = getClass().getClassLoader().getResource("client_cert.pem").toURI(); File certFile = new File(certUri); @@ -82,9 +81,9 @@ public void testLoadKeyPem() { } @Test - public void testHandleFailureToLoadKeyPem() { + void testHandleFailureToLoadKeyPem() { File f = new File("nofile.pem"); - Assert.assertThrows(SecretException.class, () -> new SslConfig().clientKeyPemFile(f)); + assertThrows(SecretException.class, () -> new SslConfig().clientKeyPemFile(f)); } @SneakyThrows @@ -101,7 +100,7 @@ private File generateTestKey(String dir) { //Getting the private key from the key pair PrivateKey privKey = pair.getPrivate(); - String keypem = "-----BEGIN PRIVATE KEY-----\n" + + String keypem = "-----BEGIN PRIVATE KEY-----\n" + Base64.getEncoder().encodeToString(privKey.getEncoded()) + "\n-----END PRIVATE KEY-----\n"; diff --git a/sync/vault-commons/vault-commons.gradle b/sync/vault-commons/vault-commons.gradle index 22f0027..cd5b6d9 100644 --- a/sync/vault-commons/vault-commons.gradle +++ b/sync/vault-commons/vault-commons.gradle @@ -1,9 +1,9 @@ dependencies { api project(":secrets-manager-api") - implementation "com.google.code.gson:gson:${gsonVersion}" + implementation 'com.google.code.gson:gson:2.11.0' } ext { artifactId = 'vault-commons' artifactDescription = 'Vault Secrets Manager base abstractions' -} +} \ No newline at end of file diff --git a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaulAuthenticatorTest.java b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultAuthenticatorTest.java similarity index 90% rename from sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaulAuthenticatorTest.java rename to sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultAuthenticatorTest.java index f2cfccd..f8aef28 100644 --- a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaulAuthenticatorTest.java +++ b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultAuthenticatorTest.java @@ -7,22 +7,22 @@ import lombok.SneakyThrows; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class VaulAuthenticatorTest { +@ExtendWith(MockitoExtension.class) +class VaultAuthenticatorTest { @SneakyThrows @Test - public void testAuthenticateWithRoleIdAndSecretId() { + void testAuthenticateWithRoleIdAndSecretId() { MockWebServer server = new MockWebServer(); MockResponse response = new MockResponse() @@ -55,7 +55,7 @@ public void testAuthenticateWithRoleIdAndSecretId() { @SneakyThrows @Test - public void testAuthenticateWithK8s() { + void testAuthenticateWithK8s() { MockWebServer server = new MockWebServer(); @@ -93,7 +93,7 @@ public void testAuthenticateWithK8s() { @SneakyThrows @Test - public void testHandleNoCredentials() { + void testHandleNoCredentials() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(2020) @@ -109,7 +109,7 @@ public void testHandleNoCredentials() { VaultAuthenticator vaultAuthenticator = configurator.getVaultAuthenticator(); - Assert.assertThrows("Could not perform login with vault. Please check your configuration", + assertThrows("Could not perform login with vault. Please check your configuration", SecretException.class, vaultAuthenticator::login); @@ -117,7 +117,7 @@ public void testHandleNoCredentials() { @SneakyThrows @Test - public void testHandleFailedAuth() { + void testHandleFailedAuth() { MockWebServer server = new MockWebServer(); MockResponse response = new MockResponse() @@ -146,7 +146,7 @@ public void testHandleFailedAuth() { VaultAuthenticator vaultAuthenticator = configurator.getVaultAuthenticator(); - Assert.assertThrows("invalid role or secret ID", + assertThrows("invalid role or secret ID", SecretException.class, vaultAuthenticator::login); diff --git a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretManagerConfiguratorTest.java b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretManagerConfiguratorTest.java index f74a273..5955ed0 100644 --- a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretManagerConfiguratorTest.java +++ b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretManagerConfiguratorTest.java @@ -5,18 +5,20 @@ import co.com.bancolombia.secretsmanager.vault.config.VaultSecretsManagerProperties; import co.com.bancolombia.secretsmanager.vault.config.VaultTrustStoreProperties; import lombok.SneakyThrows; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.File; import java.net.URI; import java.net.http.HttpClient; -public class VaultSecretManagerConfiguratorTest { +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class VaultSecretManagerConfiguratorTest { @SneakyThrows @Test - public void testHttpClientGeneration() { + void testHttpClientGeneration() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -29,12 +31,12 @@ public void testHttpClientGeneration() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testVaultClientGeneration() { + void testVaultClientGeneration() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -47,12 +49,12 @@ public void testVaultClientGeneration() { .build() .getVaultClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithKeyStore() { + void testClientGenerationWithKeyStore() { URI keyStoreUri = getClass().getClassLoader().getResource("keystore.jks").toURI(); File keyStoreFile = new File(keyStoreUri); @@ -73,12 +75,12 @@ public void testClientGenerationWithKeyStore() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithKeyStoreNoValues() { + void testClientGenerationWithKeyStoreNoValues() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -89,7 +91,7 @@ public void testClientGenerationWithKeyStoreNoValues() { ) .build(); - Assert.assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() + assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() .withProperties(properties) .build() .getHttpClient()); @@ -98,7 +100,7 @@ public void testClientGenerationWithKeyStoreNoValues() { @SneakyThrows @Test - public void testClientGenerationWithTrustStore() { + void testClientGenerationWithTrustStore() { URI storeUri = getClass().getClassLoader().getResource("truststore.jks").toURI(); File storeFile = new File(storeUri); @@ -118,12 +120,12 @@ public void testClientGenerationWithTrustStore() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithTrustPem() { + void testClientGenerationWithTrustPem() { URI pemUri = getClass().getClassLoader().getResource("certificate.arm").toURI(); File pemFile = new File(pemUri); @@ -143,15 +145,12 @@ public void testClientGenerationWithTrustPem() { .build() .getHttpClient(); - Assert.assertNotNull(client); + assertNotNull(client); } @SneakyThrows @Test - public void testClientGenerationWithTrustNoValues() { - URI pemUri = getClass().getClassLoader().getResource("certificate.arm").toURI(); - File pemFile = new File(pemUri); - + void testClientGenerationWithTrustNoValues() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") .port(8200) @@ -162,10 +161,11 @@ public void testClientGenerationWithTrustNoValues() { ) .build(); - Assert.assertThrows(SecretException.class, () -> VaultSecretManagerConfigurator.builder() - .withProperties(properties) - .build() - .getHttpClient()); + assertThrows(SecretException.class, + () -> VaultSecretManagerConfigurator.builder() + .withProperties(properties) + .build() + .getHttpClient()); } } diff --git a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretsManagerConnectorSyncTest.java b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretsManagerConnectorSyncTest.java index 9adcc17..c78bd6f 100644 --- a/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretsManagerConnectorSyncTest.java +++ b/sync/vault-sync/src/test/java/co/com/bancolombia/secretsmanager/vaultsync/connector/VaultSecretsManagerConnectorSyncTest.java @@ -9,28 +9,27 @@ import lombok.SneakyThrows; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import java.io.IOException; import java.net.http.HttpClient; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class VaultSecretsManagerConnectorSyncTest { +@ExtendWith(MockitoExtension.class) +class VaultSecretsManagerConnectorSyncTest { @Mock VaultAuthenticator authenticator; @SneakyThrows @Test - public void testGetSecretContent() { + void testGetSecretContent() { MockWebServer server = new MockWebServer(); @@ -78,7 +77,7 @@ public void testGetSecretContent() { @SneakyThrows @Test - public void testUnsuccessfulGetSecretContent() { + void testUnsuccessfulGetSecretContent() { MockWebServer server = new MockWebServer(); @@ -108,7 +107,7 @@ public void testUnsuccessfulGetSecretContent() { VaultSecretsManagerConnectorSync vaultSecretsManagerConnectorSync = new VaultSecretsManagerConnectorSync(httpClient, authenticator, properties); - Assert.assertThrows(SecretException.class, + assertThrows(SecretException.class, () -> vaultSecretsManagerConnectorSync.getSecret("/path1/foo/bar")); assertEquals("/v1/kv/data//path1/foo/bar", server.takeRequest().getPath()); @@ -118,7 +117,7 @@ public void testUnsuccessfulGetSecretContent() { @SneakyThrows @Test - public void testHandleIOException() { + void testHandleIOException() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") @@ -128,10 +127,6 @@ public void testHandleIOException() { .secretId("0cce6d0b-e756-c12e-9729-xxxxxxxxx") .build(); - VaultSecretManagerConfigurator configurator = VaultSecretManagerConfigurator.builder() - .withProperties(properties) - .build(); - HttpClient httpClient = Mockito.mock(HttpClient.class); when(httpClient.send(Mockito.any(), Mockito.any())).thenThrow(new IOException("Dummy IO Exception")); when(authenticator.login()).thenReturn(AuthResponse.builder().clientToken("hvs.dummy").build()); @@ -139,14 +134,14 @@ public void testHandleIOException() { VaultSecretsManagerConnectorSync vaultSecretsManagerConnectorSync = new VaultSecretsManagerConnectorSync(httpClient, authenticator, properties); - Assert.assertThrows(SecretException.class, + assertThrows(SecretException.class, () -> vaultSecretsManagerConnectorSync.getSecret("/path1/foo/bar")); } @SneakyThrows @Test - public void testHandleInterruptedException() { + void testHandleInterruptedException() { VaultSecretsManagerProperties properties = VaultSecretsManagerProperties.builder() .host("localhost") @@ -156,10 +151,6 @@ public void testHandleInterruptedException() { .secretId("0cce6d0b-e756-c12e-9729-xxxxxxxxx") .build(); - VaultSecretManagerConfigurator configurator = VaultSecretManagerConfigurator.builder() - .withProperties(properties) - .build(); - HttpClient httpClient = Mockito.mock(HttpClient.class); when(httpClient.send(Mockito.any(), Mockito.any())).thenThrow(new InterruptedException("Dummy Interrupted Exception")); when(authenticator.login()).thenReturn(AuthResponse.builder().clientToken("hvs.dummy").build()); @@ -167,14 +158,14 @@ public void testHandleInterruptedException() { VaultSecretsManagerConnectorSync vaultSecretsManagerConnectorSync = new VaultSecretsManagerConnectorSync(httpClient, authenticator, properties); - Assert.assertThrows(SecretException.class, + assertThrows(SecretException.class, () -> vaultSecretsManagerConnectorSync.getSecret("/path1/foo/bar")); } @SneakyThrows @Test - public void testGetSecretContentNoAuthUseTokenProvided() { + void testGetSecretContentNoAuthUseTokenProvided() { MockWebServer server = new MockWebServer(); @@ -215,7 +206,7 @@ public void testGetSecretContentNoAuthUseTokenProvided() { @SneakyThrows @Test - public void testGetSecretPojo() { + void testGetSecretPojo() { MockWebServer server = new MockWebServer(); diff --git a/sync/vault-sync/vault-sync.gradle b/sync/vault-sync/vault-sync.gradle index 89513ad..a11833f 100644 --- a/sync/vault-sync/vault-sync.gradle +++ b/sync/vault-sync/vault-sync.gradle @@ -1,13 +1,13 @@ dependencies { api project(":secrets-manager-api") api project(":vault-commons") - implementation "com.google.code.gson:gson:${gsonVersion}" - implementation "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}" - testImplementation("com.squareup.okhttp3:mockwebserver:${okHttpVersion}") + implementation 'com.google.code.gson:gson:2.11.0' + implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' + testImplementation('com.squareup.okhttp3:mockwebserver:4.12.0') } ext { artifactId = 'vault-sync' artifactDescription = 'Secrets Manager connector for Vault' -} +} \ No newline at end of file