diff --git a/settings.gradle b/settings.gradle index 0421ca35a278..54a7bc343c76 100644 --- a/settings.gradle +++ b/settings.gradle @@ -75,7 +75,6 @@ include "spring-boot-project:spring-boot-test" include "spring-boot-project:spring-boot-testcontainers" include "spring-boot-project:spring-boot-test-autoconfigure" include "spring-boot-tests:spring-boot-integration-tests:spring-boot-configuration-processor-tests" -include "spring-boot-tests:spring-boot-integration-tests:spring-boot-console-tests" include "spring-boot-tests:spring-boot-integration-tests:spring-boot-launch-script-tests" include "spring-boot-tests:spring-boot-integration-tests:spring-boot-loader-tests" include "spring-boot-tests:spring-boot-integration-tests:spring-boot-loader-classic-tests" diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java index b27ff6590d46..29a240b6b978 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/AbstractLoggingSystemTests.java @@ -25,8 +25,6 @@ import org.junit.jupiter.api.io.TempDir; import org.slf4j.MDC; -import org.springframework.boot.ansi.AnsiOutput; -import org.springframework.boot.ansi.AnsiOutput.Enabled; import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.contentOf; @@ -44,39 +42,18 @@ public abstract class AbstractLoggingSystemTests { private String originalTempDirectory; - private AnsiOutput.Enabled ansiOutputEnabled; - @BeforeEach - void beforeEach(@TempDir Path temp) { - disableAnsiOutput(); - configureTempDir(temp); - } - - private void disableAnsiOutput() { - this.ansiOutputEnabled = AnsiOutput.getEnabled(); - AnsiOutput.setEnabled(Enabled.NEVER); - } - - private void configureTempDir(@TempDir Path temp) { + void configureTempDir(@TempDir Path temp) { this.originalTempDirectory = System.getProperty(JAVA_IO_TMPDIR); System.setProperty(JAVA_IO_TMPDIR, temp.toAbsolutePath().toString()); MDC.clear(); } @AfterEach - void afterEach() { - reinstateTempDir(); - restoreAnsiOutputEnabled(); - } - - private void reinstateTempDir() { + void reinstateTempDir() { System.setProperty(JAVA_IO_TMPDIR, this.originalTempDirectory); } - private void restoreAnsiOutputEnabled() { - AnsiOutput.setEnabled(this.ansiOutputEnabled); - } - @AfterEach void clear() { for (LoggingSystemProperty property : LoggingSystemProperty.values()) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java index 31802e0eab6d..6b7c6338313a 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/java/JavaLoggingSystemTests.java @@ -185,4 +185,12 @@ void getLoggerConfiguration() { .isEqualTo(new LoggerConfiguration(getClass().getName(), LogLevel.DEBUG, LogLevel.DEBUG)); } + @Test + void shouldNotContainAnsiEscapeCodes(CapturedOutput output) { + this.loggingSystem.beforeInitialize(); + this.loggingSystem.initialize(null, null, null); + this.logger.info("Hello world"); + assertThat(output).doesNotContain("\033["); + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java index 61b6af416fae..7d089c175089 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java @@ -651,6 +651,14 @@ void applicationNameLoggingToFileWhenDisabled() { .doesNotContain("myapp"); } + @Test + void shouldNotContainAnsiEscapeCodes(CapturedOutput output) { + this.loggingSystem.beforeInitialize(); + this.loggingSystem.initialize(this.initializationContext, null, null); + this.logger.info("Hello world"); + assertThat(output).doesNotContain("\033["); + } + private String getRelativeClasspathLocation(String fileName) { String defaultPath = ClassUtils.getPackageName(getClass()); defaultPath = defaultPath.replace('.', '/'); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java index b381da5b24ad..df80c9418434 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java @@ -877,6 +877,14 @@ void applyingSystemPropertiesDoesNotCauseUnwantedStatusWarnings(CapturedOutput o assertThat(output).doesNotContain("WARN"); } + @Test + void shouldNotContainAnsiEscapeCodes(CapturedOutput output) { + this.loggingSystem.beforeInitialize(); + initialize(this.initializationContext, null, null); + this.logger.info("Hello world"); + assertThat(output).doesNotContain("\033["); + } + private void initialize(LoggingInitializationContext context, String configLocation, LogFile logFile) { this.loggingSystem.getSystemProperties((ConfigurableEnvironment) context.getEnvironment()).apply(logFile); this.loggingSystem.beforeInitialize(); diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/build.gradle deleted file mode 100644 index 3b90a0ee07ab..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "java" - id "org.springframework.boot.conventions" - id "org.springframework.boot.integration-test" -} - -description = "Spring Boot Console Integration Tests" - -configurations { - app -} - -dependencies { - app project(path: ":spring-boot-project:spring-boot-dependencies", configuration: "mavenRepository") - app project(path: ":spring-boot-project:spring-boot-tools:spring-boot-gradle-plugin", configuration: "mavenRepository") - app project(path: ":spring-boot-project:spring-boot-starters:spring-boot-starter", configuration: "mavenRepository") - - intTestImplementation(enforcedPlatform(project(":spring-boot-project:spring-boot-parent"))) - intTestImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) - intTestImplementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-test")) - intTestImplementation("org.testcontainers:junit-jupiter") - intTestImplementation("org.testcontainers:testcontainers") -} - -task syncMavenRepository(type: Sync) { - from configurations.app - into "${buildDir}/int-test-maven-repository" -} - -task syncAppSource(type: org.springframework.boot.build.SyncAppSource) { - sourceDirectory = file("spring-boot-console-tests-app") - destinationDirectory = file("${buildDir}/spring-boot-console-tests-app") -} - -task buildApp(type: GradleBuild) { - dependsOn syncAppSource, syncMavenRepository - dir = "${buildDir}/spring-boot-console-tests-app" - startParameter.buildCacheEnabled = false - tasks = ["build"] -} - -intTest { - dependsOn buildApp -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/build.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/build.gradle deleted file mode 100644 index 6447e8660308..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/build.gradle +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id "java" - id "org.springframework.boot" -} - -apply plugin: "io.spring.dependency-management" - -repositories { - maven { url "file:${rootDir}/../int-test-maven-repository"} - mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } -} - -dependencies { - implementation("org.springframework.boot:spring-boot-starter") -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/settings.gradle b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/settings.gradle deleted file mode 100644 index 06d9554ad0d6..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -pluginManagement { - repositories { - maven { url "file:${rootDir}/../int-test-maven-repository"} - mavenCentral() - maven { url "https://repo.spring.io/snapshot" } - maven { url "https://repo.spring.io/milestone" } - } - resolutionStrategy { - eachPlugin { - if (requested.id.id == "org.springframework.boot") { - useModule "org.springframework.boot:spring-boot-gradle-plugin:${requested.version}" - } - } - } -} \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/src/main/java/org/springframework/boot/consoleapp/ConsoleTestApplication.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/src/main/java/org/springframework/boot/consoleapp/ConsoleTestApplication.java deleted file mode 100644 index 8ed6d2092446..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/spring-boot-console-tests-app/src/main/java/org/springframework/boot/consoleapp/ConsoleTestApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * 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 - * - * https://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 org.springframework.boot.consoleapp; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.ansi.AnsiOutput; -import org.springframework.boot.ansi.AnsiOutput.Enabled; - -@SpringBootApplication -public class ConsoleTestApplication { - - public static void main(String[] args) { - System.out.println("System.console() is " + System.console()); - SpringApplication.run(ConsoleTestApplication.class, args); - } - -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/java/org/springframework/boot/console/ConsoleIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/java/org/springframework/boot/console/ConsoleIntegrationTests.java deleted file mode 100644 index 5cbdf328fc05..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/java/org/springframework/boot/console/ConsoleIntegrationTests.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * 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 - * - * https://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 org.springframework.boot.console; - -import java.io.File; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.function.Supplier; - -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.output.ToStringConsumer; -import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; -import org.testcontainers.utility.DockerImageName; -import org.testcontainers.utility.MountableFile; - -import org.springframework.boot.system.JavaVersion; -import org.springframework.boot.testsupport.testcontainers.DisabledIfDockerUnavailable; -import org.springframework.util.Assert; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Integration tests that checks ANSI output is not turned on in JDK 22 or later. - * - * @author Yong-Hyun Kim - */ -@DisabledIfDockerUnavailable -class ConsoleIntegrationTests { - - private static final String ENCODE_START = "\033["; - - private static final JavaRuntime JDK_17_RUNTIME = JavaRuntime.openJdk(JavaVersion.SEVENTEEN); - - private static final JavaRuntime JDK_22_RUNTIME = JavaRuntime.openJdk(JavaVersion.TWENTY_TWO); - - private final ToStringConsumer output = new ToStringConsumer().withRemoveAnsiCodes(false); - - @Test - void runJarOn17() { - try (GenericContainer container = createContainer(JDK_17_RUNTIME)) { - container.start(); - assertThat(this.output.toString(StandardCharsets.UTF_8)).contains("System.console() is null") - .doesNotContain(ENCODE_START); - } - } - - @Test - void runJarOn22() { - try (GenericContainer container = createContainer(JDK_22_RUNTIME)) { - container.start(); - assertThat(this.output.toString(StandardCharsets.UTF_8)).doesNotContain("System.console() is null") - .doesNotContain(ENCODE_START); - } - } - - private GenericContainer createContainer(JavaRuntime javaRuntime) { - return javaRuntime.getContainer() - .withLogConsumer(this.output) - .withCopyFileToContainer(findApplication(), "/app.jar") - .withStartupCheckStrategy(new OneShotStartupCheckStrategy().withTimeout(Duration.ofMinutes(5))) - .withCommand("java", "-jar", "app.jar"); - } - - private MountableFile findApplication() { - return MountableFile.forHostPath(findJarFile().toPath()); - } - - private File findJarFile() { - String path = String.format("build/%1$s/build/libs/%1$s.jar", "spring-boot-console-tests-app"); - File jar = new File(path); - Assert.state(jar.isFile(), () -> "Could not find " + path + ". Have you built it?"); - return jar; - } - - static final class JavaRuntime { - - private final String name; - - private final JavaVersion version; - - private final Supplier> container; - - private JavaRuntime(String name, JavaVersion version, Supplier> container) { - this.name = name; - this.version = version; - this.container = container; - } - - private boolean isCompatible() { - return this.version.isEqualOrNewerThan(JavaVersion.getJavaVersion()); - } - - GenericContainer getContainer() { - return this.container.get(); - } - - @Override - public String toString() { - return this.name; - } - - static JavaRuntime openJdk(JavaVersion version) { - String imageVersion = version.toString(); - DockerImageName image = DockerImageName.parse("bellsoft/liberica-openjdk-debian:" + imageVersion); - return new JavaRuntime("OpenJDK " + imageVersion, version, () -> new GenericContainer<>(image)); - } - - } - -} diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/resources/logback.xml b/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/resources/logback.xml deleted file mode 100644 index b8a41480d7d6..000000000000 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-console-tests/src/intTest/resources/logback.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - -