diff --git a/pom.xml b/pom.xml index 623afbd..3ba6725 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,12 @@ 3.8.0 test + + com.github.stefanbirkner + system-lambda + 1.2.0 + test + commons-io commons-io @@ -286,7 +292,7 @@ org.owasp dependency-check-maven - 6.0.5 + 6.1.3 diff --git a/src/test/java/de/stklcode/jvault/connector/builder/HTTPVaultConnectorBuilderTest.java b/src/test/java/de/stklcode/jvault/connector/builder/HTTPVaultConnectorBuilderTest.java index 733c332..9832496 100644 --- a/src/test/java/de/stklcode/jvault/connector/builder/HTTPVaultConnectorBuilderTest.java +++ b/src/test/java/de/stklcode/jvault/connector/builder/HTTPVaultConnectorBuilderTest.java @@ -16,17 +16,18 @@ package de.stklcode.jvault.connector.builder; +import com.github.stefanbirkner.systemlambda.SystemLambda; import de.stklcode.jvault.connector.HTTPVaultConnector; import de.stklcode.jvault.connector.exception.TlsException; -import de.stklcode.jvault.connector.test.EnvironmentMock; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import java.io.File; -import java.io.IOException; import java.lang.reflect.Field; import java.nio.file.NoSuchFileException; +import java.util.concurrent.Callable; +import static com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -50,59 +51,68 @@ class HTTPVaultConnectorBuilderTest { * Test building from environment variables */ @Test - void testFromEnv() throws NoSuchFieldException, IllegalAccessException, IOException { + void testFromEnv() throws Exception { /* Provide address only should be enough */ - setenv(VAULT_ADDR, null, null, null); - HTTPVaultConnectorBuilder factory = assertDoesNotThrow( - () -> VaultConnectorBuilder.http().fromEnv(), - "Factory creation from minimal environment failed" - ); - HTTPVaultConnector connector = factory.build(); + withVaultEnv(VAULT_ADDR, null, null, null).execute(() -> { + HTTPVaultConnectorBuilder builder = assertDoesNotThrow( + () -> VaultConnectorBuilder.http().fromEnv(), + "Factory creation from minimal environment failed" + ); + HTTPVaultConnector connector = builder.build(); - assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); - assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); - assertThat("Non-default number of retries, when none set", getRequestHelperPrivate(connector, "retries"), is(0)); + assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); + assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); + assertThat("Non-default number of retries, when none set", getRequestHelperPrivate(connector, "retries"), is(0)); + + return null; + }); /* Provide address and number of retries */ - setenv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), null); + withVaultEnv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), null).execute(() -> { + HTTPVaultConnectorBuilder builder = assertDoesNotThrow( + () -> VaultConnectorBuilder.http().fromEnv(), + "Factory creation from environment failed" + ); + HTTPVaultConnector connector = builder.build(); - factory = assertDoesNotThrow( - () -> VaultConnectorBuilder.http().fromEnv(), - "Factory creation from environment failed" - ); - connector = factory.build(); + assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); + assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); + assertThat("Number of retries not set correctly", getRequestHelperPrivate(connector, "retries"), is(VAULT_MAX_RETRIES)); - assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); - assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); - assertThat("Number of retries not set correctly", getRequestHelperPrivate(connector, "retries"), is(VAULT_MAX_RETRIES)); + return null; + }); /* Provide CA certificate */ String VAULT_CACERT = tempDir.toString() + "/doesnotexist"; - setenv(VAULT_ADDR, VAULT_CACERT, VAULT_MAX_RETRIES.toString(), null); + withVaultEnv(VAULT_ADDR, VAULT_CACERT, VAULT_MAX_RETRIES.toString(), null).execute(() -> { + TlsException e = assertThrows( + TlsException.class, + () -> VaultConnectorBuilder.http().fromEnv(), + "Creation with unknown cert path failed." + ); + assertThat(e.getCause(), is(instanceOf(NoSuchFileException.class))); + assertThat(((NoSuchFileException) e.getCause()).getFile(), is(VAULT_CACERT)); - TlsException e = assertThrows( - TlsException.class, - () -> VaultConnectorBuilder.http().fromEnv(), - "Creation with unknown cert path failed." - ); - assertThat(e.getCause(), is(instanceOf(NoSuchFileException.class))); - assertThat(((NoSuchFileException) e.getCause()).getFile(), is(VAULT_CACERT)); + return null; + }); /* Automatic authentication */ - setenv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), VAULT_TOKEN); + withVaultEnv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), VAULT_TOKEN).execute(() -> { + HTTPVaultConnectorBuilder builder = assertDoesNotThrow( + () -> VaultConnectorBuilder.http().fromEnv(), + "Factory creation from minimal environment failed" + ); + assertThat("Token nor set correctly", getPrivate(builder, "token"), is(equalTo(VAULT_TOKEN))); - factory = assertDoesNotThrow( - () -> VaultConnectorBuilder.http().fromEnv(), - "Factory creation from minimal environment failed" - ); - assertThat("Token nor set correctly", getPrivate(factory, "token"), is(equalTo(VAULT_TOKEN))); + return null; + }); } - private void setenv(String vault_addr, String vault_cacert, String vault_max_retries, String vault_token) { - EnvironmentMock.setenv("VAULT_ADDR", vault_addr); - EnvironmentMock.setenv("VAULT_CACERT", vault_cacert); - EnvironmentMock.setenv("VAULT_MAX_RETRIES", vault_max_retries); - EnvironmentMock.setenv("VAULT_TOKEN", vault_token); + private SystemLambda.WithEnvironmentVariables withVaultEnv(String vault_addr, String vault_cacert, String vault_max_retries, String vault_token) { + return withEnvironmentVariable("VAULT_ADDR", vault_addr) + .and("VAULT_CACERT", vault_cacert) + .and("VAULT_MAX_RETRIES", vault_max_retries) + .and("VAULT_TOKEN", vault_token); } private Object getRequestHelperPrivate(HTTPVaultConnector connector, String fieldName) throws NoSuchFieldException, IllegalAccessException { diff --git a/src/test/java/de/stklcode/jvault/connector/factory/HTTPVaultConnectorFactoryTest.java b/src/test/java/de/stklcode/jvault/connector/factory/HTTPVaultConnectorFactoryTest.java index a07e78a..dc3df2e 100644 --- a/src/test/java/de/stklcode/jvault/connector/factory/HTTPVaultConnectorFactoryTest.java +++ b/src/test/java/de/stklcode/jvault/connector/factory/HTTPVaultConnectorFactoryTest.java @@ -16,17 +16,17 @@ package de.stklcode.jvault.connector.factory; +import com.github.stefanbirkner.systemlambda.SystemLambda; import de.stklcode.jvault.connector.HTTPVaultConnector; import de.stklcode.jvault.connector.exception.TlsException; -import de.stklcode.jvault.connector.test.EnvironmentMock; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import java.io.File; -import java.io.IOException; import java.lang.reflect.Field; import java.nio.file.NoSuchFileException; +import static com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -50,60 +50,68 @@ class HTTPVaultConnectorFactoryTest { * Test building from environment variables */ @Test - void testFromEnv() throws NoSuchFieldException, IllegalAccessException, IOException { + void testFromEnv() throws Exception { /* Provide address only should be enough */ - setenv(VAULT_ADDR, null, null, null); + withVaultEnv(VAULT_ADDR, null, null, null).execute(() -> { + HTTPVaultConnectorFactory factory = assertDoesNotThrow( + () -> VaultConnectorFactory.httpFactory().fromEnv(), + "Factory creation from minimal environment failed" + ); + HTTPVaultConnector connector = factory.build(); - HTTPVaultConnectorFactory factory = assertDoesNotThrow( - () -> VaultConnectorFactory.httpFactory().fromEnv(), - "Factory creation from minimal environment failed" - ); - HTTPVaultConnector connector = factory.build(); + assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); + assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); + assertThat("Non-default number of retries, when none set", getRequestHelperPrivate(connector, "retries"), is(0)); - assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); - assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); - assertThat("Non-default number of retries, when none set", getRequestHelperPrivate(connector, "retries"), is(0)); + return null; + }); /* Provide address and number of retries */ - setenv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), null); + withVaultEnv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), null).execute(() -> { + HTTPVaultConnectorFactory factory = assertDoesNotThrow( + () -> VaultConnectorFactory.httpFactory().fromEnv(), + "Factory creation from environment failed" + ); + HTTPVaultConnector connector = factory.build(); - factory = assertDoesNotThrow( - () -> VaultConnectorFactory.httpFactory().fromEnv(), - "Factory creation from environment failed" - ); - connector = factory.build(); + assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); + assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); + assertThat("Number of retries not set correctly", getRequestHelperPrivate(connector, "retries"), is(VAULT_MAX_RETRIES)); - assertThat("URL nor set correctly", getRequestHelperPrivate(connector, "baseURL"), is(equalTo(VAULT_ADDR + "/v1/"))); - assertThat("Trusted CA cert set when no cert provided", getRequestHelperPrivate(connector, "trustedCaCert"), is(nullValue())); - assertThat("Number of retries not set correctly", getRequestHelperPrivate(connector, "retries"), is(VAULT_MAX_RETRIES)); + return null; + }); /* Provide CA certificate */ String VAULT_CACERT = tempDir.toString() + "/doesnotexist"; - setenv(VAULT_ADDR, VAULT_CACERT, VAULT_MAX_RETRIES.toString(), null); + withVaultEnv(VAULT_ADDR, VAULT_CACERT, VAULT_MAX_RETRIES.toString(), null).execute(() -> { + TlsException e = assertThrows( + TlsException.class, + () -> VaultConnectorFactory.httpFactory().fromEnv(), + "Creation with unknown cert path failed." + ); + assertThat(e.getCause(), is(instanceOf(NoSuchFileException.class))); + assertThat(((NoSuchFileException) e.getCause()).getFile(), is(VAULT_CACERT)); - TlsException e = assertThrows( - TlsException.class, - () -> VaultConnectorFactory.httpFactory().fromEnv(), - "Creation with unknown cert path failed." - ); - assertThat(e.getCause(), is(instanceOf(NoSuchFileException.class))); - assertThat(((NoSuchFileException) e.getCause()).getFile(), is(VAULT_CACERT)); + return null; + }); /* Automatic authentication */ - setenv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), VAULT_TOKEN); + withVaultEnv(VAULT_ADDR, null, VAULT_MAX_RETRIES.toString(), VAULT_TOKEN).execute(() -> { + HTTPVaultConnectorFactory factory = assertDoesNotThrow( + () -> VaultConnectorFactory.httpFactory().fromEnv(), + "Factory creation from minimal environment failed" + ); + assertThat("Token nor set correctly", getPrivate(getPrivate(factory, "delegate"), "token"), is(equalTo(VAULT_TOKEN))); - factory = assertDoesNotThrow( - () -> VaultConnectorFactory.httpFactory().fromEnv(), - "Factory creation from minimal environment failed" - ); - assertThat("Token nor set correctly", getPrivate(getPrivate(factory, "delegate"), "token"), is(equalTo(VAULT_TOKEN))); + return null; + }); } - private void setenv(String vault_addr, String vault_cacert, String vault_max_retries, String vault_token) { - EnvironmentMock.setenv("VAULT_ADDR", vault_addr); - EnvironmentMock.setenv("VAULT_CACERT", vault_cacert); - EnvironmentMock.setenv("VAULT_MAX_RETRIES", vault_max_retries); - EnvironmentMock.setenv("VAULT_TOKEN", vault_token); + private SystemLambda.WithEnvironmentVariables withVaultEnv(String vault_addr, String vault_cacert, String vault_max_retries, String vault_token) { + return withEnvironmentVariable("VAULT_ADDR", vault_addr) + .and("VAULT_CACERT", vault_cacert) + .and("VAULT_MAX_RETRIES", vault_max_retries) + .and("VAULT_TOKEN", vault_token); } private Object getRequestHelperPrivate(HTTPVaultConnector connector, String fieldName) throws NoSuchFieldException, IllegalAccessException { diff --git a/src/test/java/de/stklcode/jvault/connector/test/EnvironmentMock.java b/src/test/java/de/stklcode/jvault/connector/test/EnvironmentMock.java deleted file mode 100644 index 0fb6552..0000000 --- a/src/test/java/de/stklcode/jvault/connector/test/EnvironmentMock.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2016-2021 Stefan Kalscheuer - * - * 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. - */ - -package de.stklcode.jvault.connector.test; - -import java.lang.reflect.Field; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.fail; - -/** - * Test helper to modify system environment. - * - * @author Stefan Kalscheuer - */ -@SuppressWarnings("unchecked") -public class EnvironmentMock { - private static Map environment; - - static { - try { - Map originalEnv = System.getenv(); - Field mapField = originalEnv.getClass().getDeclaredField("m"); - mapField.setAccessible(true); - environment = (Map) mapField.get(originalEnv); - } catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) { - fail("Failed to intercept unmodifiable system environment"); - } - } - - public static void setenv(String key, String value) { - if (value != null) { - environment.put(key, value); - } else { - environment.remove(key); - } - } -}