diff --git a/core-java-modules/core-java-lang-6/Dockerfile b/core-java-modules/core-java-lang-6/Dockerfile new file mode 100644 index 0000000000..60c052f79f --- /dev/null +++ b/core-java-modules/core-java-lang-6/Dockerfile @@ -0,0 +1,7 @@ +FROM maven:3.9-amazoncorretto-17 +WORKDIR /app +COPY /src/test/java/com/baeldung/setenvironment/SettingDockerEnvironmentVariableUnitTest.java \ + ./src/test/java/com/baeldung/setenvironment/ +COPY /docker-pom.xml ./ +ENV CUSTOM_DOCKER_ENV_VARIABLE=TRUE +ENTRYPOINT mvn -f docker-pom.xml test \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/docker-pom.xml b/core-java-modules/core-java-lang-6/docker-pom.xml new file mode 100644 index 0000000000..5977480664 --- /dev/null +++ b/core-java-modules/core-java-lang-6/docker-pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.baeldung.core-java-modules + core-java-lang-6 + 0.0.1-SNAPSHOT + + + + org.testcontainers + testcontainers + ${testcontainers.junit.version} + test + + + org.testcontainers + junit-jupiter + ${testcontainers.junit.version} + test + + + org.junit.jupiter + junit-jupiter-api + 5.10.1 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.10.1 + test + + + + + 1.19.3 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/pom.xml b/core-java-modules/core-java-lang-6/pom.xml index accb014963..7bf2fafaa1 100644 --- a/core-java-modules/core-java-lang-6/pom.xml +++ b/core-java-modules/core-java-lang-6/pom.xml @@ -33,6 +33,25 @@ jmh-generator-annprocess ${jmh.version} + + org.junit-pioneer + junit-pioneer + ${junit.pioneer.version} + test + + + org.testcontainers + testcontainers + ${testcontaienr.version} + test + + + org.testcontainers + junit-jupiter + ${testcontaienr.version} + test + + @@ -53,6 +72,8 @@ ${jmh.version} + 14 + 14 @@ -61,6 +82,8 @@ 1.6.0.Beta1 1.37 + 2.2.0 + 1.19.3 \ No newline at end of file diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingChildProcessEnvironmentVariableUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingChildProcessEnvironmentVariableUnitTest.java new file mode 100644 index 0000000000..609f6be739 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingChildProcessEnvironmentVariableUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.setenvironment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.Map; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; + +class SettingChildProcessEnvironmentVariableUnitTest { + + public static final String ENVIRONMENT_VARIABLE_NAME = "test"; + public static final String ENVIRONMENT_VARIABLE_VALUE = "Hello World"; + public static final String CHILD_PROCESS_CONDITION = "CHILD_PROCESS_TEST"; + public static final String CHILD_PROCESS_VALUE = "true"; + public static final String CHILD_PROCESS_TAG = "child_process"; + public static final String TAG = String.format("-Dgroups=%s", CHILD_PROCESS_TAG); + private final String testClass = String.format("-Dtest=%s", getClass().getName()); + private final String[] arguments = {"mvn", "test", TAG, testClass}; + + @Test + void givenChildProcessTestRunner_whenRunTheTest_thenAllSucceed() + throws IOException, InterruptedException { + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.inheritIO(); + + Map environment = processBuilder.environment(); + environment.put(CHILD_PROCESS_CONDITION, CHILD_PROCESS_VALUE); + environment.put(ENVIRONMENT_VARIABLE_NAME, ENVIRONMENT_VARIABLE_VALUE); + Process process = processBuilder.command(arguments).start(); + + int errorCode = process.waitFor(); + assertThat(errorCode).isZero(); + } + + @Test + @EnabledIfEnvironmentVariable(named = CHILD_PROCESS_CONDITION, matches = CHILD_PROCESS_VALUE) + @Tag(CHILD_PROCESS_TAG) + void givenChildProcess_whenGetEnvironmentVariable_thenReturnsCorrectValue() { + String actual = System.getenv(ENVIRONMENT_VARIABLE_NAME); + assertThat(actual).isEqualTo(ENVIRONMENT_VARIABLE_VALUE); + } +} diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingDockerEnvironmentVariableUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingDockerEnvironmentVariableUnitTest.java new file mode 100644 index 0000000000..5621b431a8 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingDockerEnvironmentVariableUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.setenvironment; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; + +class SettingDockerEnvironmentVariableUnitTest { + + public static final String ENV_VARIABLE_NAME = "CUSTOM_DOCKER_ENV_VARIABLE"; + public static final String ENV_VARIABLE_VALUE = "TRUE"; + + @Test + @EnabledIfEnvironmentVariable(named = ENV_VARIABLE_NAME, matches = ENV_VARIABLE_VALUE) + void givenDockerEnvironment_whenGetEnvironmentVariable_thenReturnsCorrectValue() { + String actual = System.getenv(ENV_VARIABLE_NAME); + assertEquals(ENV_VARIABLE_VALUE, actual); + } +} diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingSameProcessEnvironmentVariableUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingSameProcessEnvironmentVariableUnitTest.java new file mode 100644 index 0000000000..dacd351c83 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingSameProcessEnvironmentVariableUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.setenvironment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.JRE; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junitpioneer.jupiter.SetEnvironmentVariable; + +class SettingSameProcessEnvironmentVariableUnitTest { + + private static final String PROCESS_ENVIRONMENT = "java.lang.ProcessEnvironment"; + private static final String ENVIRONMENT = "theUnmodifiableEnvironment"; + private static final String SOURCE_MAP = "m"; + private static final Object STATIC_METHOD = null; + private static final Class UMODIFIABLE_MAP_CLASS + = Collections.unmodifiableMap(Collections.emptyMap()).getClass(); + private static final Class MAP_CLASS = Map.class; + public static final String ENV_VARIABLE_NAME = "test"; + public static final String ENB_VARIABLE_VALUE = "Hello World"; + + @ParameterizedTest + @CsvSource({ENB_VARIABLE_VALUE + "," + ENV_VARIABLE_NAME}) + @EnabledForJreRange(max = JRE.JAVA_16) + void givenReflexiveAccess_whenGetSourceMap_thenSuccessfullyModifyVariables(String environmentVariable, String value) + throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Map modifiableEnvironment = getModifiableEnvironment(); + assertThat(modifiableEnvironment).isNotNull(); + + modifiableEnvironment.put(environmentVariable, value); + String actual = modifiableEnvironment.get(environmentVariable); + assertThat(actual).isEqualTo(value); + } + + @Test + @EnabledIfEnvironmentVariable(named = "PATH", matches = ".*", + disabledReason = "The test relies on the presence of PATH variable") + void givenOS_whenGetPath_thenVariableIsPresent() { + String classPath = System.getenv("PATH"); + assertThat(classPath).isNotNull(); + } + + @Test + void givenOS_whenGetPath_thenVariablesArePresent() { + Map environment = System.getenv(); + assertThat(environment).isNotNull(); + } + + @Test + @SetEnvironmentVariable(key = ENV_VARIABLE_NAME, value = ENB_VARIABLE_VALUE) + @EnabledForJreRange(max = JRE.JAVA_16) + void givenVariableSet_whenGetEnvironmentVariable_thenReturnsCorrectValue() { + String actual = System.getenv(ENV_VARIABLE_NAME); + assertThat(actual).isEqualTo(ENB_VARIABLE_VALUE); + } + + @SuppressWarnings("unchecked") + private static Map getModifiableEnvironment() + throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class environmentClass = Class.forName(PROCESS_ENVIRONMENT); + Field environmentField = environmentClass.getDeclaredField(ENVIRONMENT); + assertThat(environmentField).isNotNull(); + environmentField.setAccessible(true); + + Object unmodifiableEnvironmentMap = environmentField.get(STATIC_METHOD); + assertThat(unmodifiableEnvironmentMap).isNotNull(); + assertThat(unmodifiableEnvironmentMap).isInstanceOf(UMODIFIABLE_MAP_CLASS); + + Field underlyingMapField = unmodifiableEnvironmentMap.getClass().getDeclaredField(SOURCE_MAP); + underlyingMapField.setAccessible(true); + Object underlyingMap = underlyingMapField.get(unmodifiableEnvironmentMap); + assertThat(underlyingMap).isNotNull(); + assertThat(underlyingMap).isInstanceOf(MAP_CLASS); + + return (Map) underlyingMap; + } +} diff --git a/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingTestcontainerVariableUnitTest.java b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingTestcontainerVariableUnitTest.java new file mode 100644 index 0000000000..b6f9054931 --- /dev/null +++ b/core-java-modules/core-java-lang-6/src/test/java/com/baeldung/setenvironment/SettingTestcontainerVariableUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.setenvironment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.ImageFromDockerfile; + +class SettingTestcontainerVariableUnitTest { + + public static final String CONTAINER_REPORT_FILE = "/app/target/surefire-reports/TEST-com.baeldung.setenvironment.SettingDockerEnvironmentVariableUnitTest.xml"; + public static final String HOST_REPORT_FILE = "./container-test-report.xml"; + public static final String DOCKERFILE = "./Dockerfile"; + + @Test + @Disabled("Requires working Docker environment ") + void givenTestcontainerEnvironment_whenGetEnvironmentVariable_thenReturnsCorrectValue() { + Path dockerfilePath = Paths.get(DOCKERFILE); + GenericContainer container = new GenericContainer( + new ImageFromDockerfile().withDockerfile(dockerfilePath)); + assertThat(container).isNotNull(); + container.start(); + while (container.isRunning()) { + // Busy spin + } + container.copyFileFromContainer(CONTAINER_REPORT_FILE, HOST_REPORT_FILE); + } +}