From be38ce36451f8704d49ecb72bb7c07d1c1cef11e Mon Sep 17 00:00:00 2001 From: dreis2211 Date: Wed, 14 Jul 2021 16:02:13 +0200 Subject: [PATCH] Disable Gradle plugin tests that fail on JDK 17 See gh-27328 --- .../DisabledTemplateInvocationContext.java | 49 +++++++++++ .../junit/GradleCompatibilityExtension.java | 3 + .../gradle/junit/GradleMultiDslExtension.java | 3 + .../gradle/junit/GradleProjectBuilder.java | 81 +++++++++++++++++++ .../gradle/plugin/SpringBootPluginTests.java | 6 +- .../tasks/buildinfo/BuildInfoTests.java | 6 +- .../bundling/AbstractBootArchiveTests.java | 4 +- .../tasks/bundling/BootBuildImageTests.java | 4 +- 8 files changed, 146 insertions(+), 10 deletions(-) create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java create mode 100644 spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java new file mode 100644 index 0000000000..fe2ee65dd4 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/DisabledTemplateInvocationContext.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012-2021 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.gradle.junit; + +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestTemplateInvocationContext; + +/** + * {@link TestTemplateInvocationContext} that disables tests. + * + * @author Christoph Dreis + */ +final class DisabledTemplateInvocationContext implements TestTemplateInvocationContext { + + @Override + public List getAdditionalExtensions() { + return Collections.singletonList(new DisabledCondition()); + } + + private static class DisabledCondition implements ExecutionCondition { + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + return ConditionEvaluationResult.disabled(""); + } + + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java index 7d4876e20a..76e285970b 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java @@ -57,6 +57,9 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { + if (JavaVersion.current() == JavaVersion.VERSION_17) { + return Stream.of(new DisabledTemplateInvocationContext()); + } Stream gradleVersions = GRADLE_VERSIONS.stream().map((version) -> { if (version.equals("current")) { return GradleVersion.current().getVersion(); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java index 829e220e1b..3f7122dac5 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java @@ -42,6 +42,9 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { + if (JavaVersion.current() == JavaVersion.VERSION_17) { + return Stream.of(new DisabledTemplateInvocationContext()); + } return Stream.of(Dsl.values()).map(DslTestTemplateInvocationContext::new); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java new file mode 100644 index 0000000000..4fee624902 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleProjectBuilder.java @@ -0,0 +1,81 @@ +/* + * Copyright 2012-2021 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.gradle.junit; + +import java.io.File; + +import org.gradle.api.JavaVersion; +import org.gradle.api.Project; +import org.gradle.internal.nativeintegration.services.NativeServices; +import org.gradle.testfixtures.ProjectBuilder; +import org.gradle.testfixtures.internal.ProjectBuilderImpl; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Helper class to build Gradle {@link Project Projects} for test fixtures. Wraps + * functionality of Gradle's own {@link ProjectBuilder} in order to workaround an issue on + * JDK 17. + * + * @author Christoph Dreis + * @see Gradle Support JDK 17 + */ +public final class GradleProjectBuilder { + + private File projectDir; + + private String name; + + private GradleProjectBuilder() { + } + + public static GradleProjectBuilder builder() { + return new GradleProjectBuilder(); + } + + public GradleProjectBuilder withProjectDir(File dir) { + this.projectDir = dir; + return this; + } + + public GradleProjectBuilder withName(String name) { + this.name = name; + return this; + } + + public Project build() { + Assert.notNull(this.projectDir, "ProjectDir must not be null"); + ProjectBuilder builder = ProjectBuilder.builder(); + builder.withProjectDir(this.projectDir); + File userHome = new File(this.projectDir, "userHome"); + builder.withGradleUserHomeDir(userHome); + if (StringUtils.hasText(this.name)) { + builder.withName(this.name); + } + if (JavaVersion.current() == JavaVersion.VERSION_17) { + NativeServices.initialize(userHome); + try { + ProjectBuilderImpl.getGlobalServices(); + } + catch (Throwable ignore) { + } + } + return builder.build(); + } + +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java index 47213255b6..072baa977d 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/SpringBootPluginTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -20,10 +20,10 @@ import java.io.File; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; -import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +42,7 @@ class SpringBootPluginTests { @Test void bootArchivesConfigurationsCannotBeResolved() { - Project project = ProjectBuilder.builder().withProjectDir(this.temp).build(); + Project project = GradleProjectBuilder.builder().withProjectDir(this.temp).build(); project.getPlugins().apply(SpringBootPlugin.class); Configuration bootArchives = project.getConfigurations() .getByName(SpringBootPlugin.BOOT_ARCHIVES_CONFIGURATION_NAME); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java index e831385ffc..61d2629dfd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 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. @@ -26,10 +26,10 @@ import java.util.Properties; import org.gradle.api.Project; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.initialization.GradlePropertiesController; -import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import static org.assertj.core.api.Assertions.assertThat; @@ -131,7 +131,7 @@ class BuildInfoTests { private Project createProject(String projectName) { File projectDir = new File(this.temp, projectName); - Project project = ProjectBuilder.builder().withProjectDir(projectDir).withName(projectName).build(); + Project project = GradleProjectBuilder.builder().withProjectDir(projectDir).withName(projectName).build(); ((ProjectInternal) project).getServices().get(GradlePropertiesController.class) .loadGradlePropertiesFrom(projectDir); return project; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java index 0ace9f6fcc..96a14088a1 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveTests.java @@ -61,11 +61,11 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier; import org.gradle.api.internal.file.archive.ZipCopyAction; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Jar; -import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.springframework.boot.gradle.junit.GradleProjectBuilder; import org.springframework.boot.loader.tools.DefaultLaunchScript; import org.springframework.boot.loader.tools.JarModeLibrary; @@ -115,7 +115,7 @@ abstract class AbstractBootArchiveTests { try { File projectDir = new File(this.temp, "project"); projectDir.mkdirs(); - this.project = ProjectBuilder.builder().withProjectDir(projectDir).build(); + this.project = GradleProjectBuilder.builder().withProjectDir(projectDir).build(); this.project.setDescription("Test project for " + this.taskClass.getSimpleName()); this.task = configure(this.project.getTasks().create("testArchive", this.taskClass)); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java index 23836fa57e..31d2d10dd8 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImageTests.java @@ -24,7 +24,6 @@ import java.util.Map; import org.gradle.api.GradleException; import org.gradle.api.JavaVersion; import org.gradle.api.Project; -import org.gradle.testfixtures.ProjectBuilder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -32,6 +31,7 @@ import org.springframework.boot.buildpack.platform.build.BuildRequest; import org.springframework.boot.buildpack.platform.build.BuildpackReference; import org.springframework.boot.buildpack.platform.build.PullPolicy; import org.springframework.boot.buildpack.platform.docker.type.Binding; +import org.springframework.boot.gradle.junit.GradleProjectBuilder; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -55,7 +55,7 @@ class BootBuildImageTests { BootBuildImageTests() { File projectDir = new File(this.temp, "project"); projectDir.mkdirs(); - this.project = ProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); + this.project = GradleProjectBuilder.builder().withProjectDir(projectDir).withName("build-image-test").build(); this.project.setDescription("Test project for BootBuildImage"); this.buildImage = this.project.getTasks().create("buildImage", BootBuildImage.class); }