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 4c2d4c7f237..2075f2b6712 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 @@ -32,6 +32,7 @@ import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; import org.junit.platform.commons.util.AnnotationUtils; import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; import org.springframework.boot.testsupport.gradle.testkit.GradleVersions; @@ -54,8 +55,8 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex .map(GradleVersion::version) .collect(Collectors.toCollection(TreeSet::new)) .last(); - GradleCompatibility gradleCompatibility = AnnotationUtils - .findAnnotation(context.getRequiredTestClass(), GradleCompatibility.class) + Class testClass = context.getRequiredTestClass(); + GradleCompatibility gradleCompatibility = AnnotationUtils.findAnnotation(testClass, GradleCompatibility.class) .get(); Stream gradleVersions = GRADLE_VERSIONS.stream(); if (StringUtils.hasText(gradleCompatibility.versionsLessThan())) { @@ -65,10 +66,11 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex } return gradleVersions.flatMap((version) -> { List invocationContexts = new ArrayList<>(); - invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, false)); + BuildOutput buildOutput = new BuildOutput(testClass); + invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, false, buildOutput)); boolean configurationCache = gradleCompatibility.configurationCache(); if (configurationCache && GradleVersion.version(version).equals(highestVersion)) { - invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, true)); + invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, true, buildOutput)); } return invocationContexts.stream(); }); @@ -81,11 +83,15 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex private static final class GradleVersionTestTemplateInvocationContext implements TestTemplateInvocationContext { + private final BuildOutput buildOutput; + private final String gradleVersion; private final boolean configurationCache; - GradleVersionTestTemplateInvocationContext(String gradleVersion, boolean configurationCache) { + GradleVersionTestTemplateInvocationContext(String gradleVersion, boolean configurationCache, + BuildOutput buildOutput) { + this.buildOutput = buildOutput; this.gradleVersion = gradleVersion; this.configurationCache = configurationCache; } @@ -97,7 +103,8 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex @Override public List getAdditionalExtensions() { - GradleBuild gradleBuild = new PluginClasspathGradleBuild().gradleVersion(this.gradleVersion); + GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.buildOutput) + .gradleVersion(this.gradleVersion); if (this.configurationCache) { gradleBuild.configurationCache(); } 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 295fd8135e5..c10d573c363 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 @@ -27,6 +27,7 @@ import org.junit.jupiter.api.extension.TestTemplateInvocationContext; import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider; import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.gradle.testkit.Dsl; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; @@ -43,7 +44,8 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro @Override public Stream provideTestTemplateInvocationContexts(ExtensionContext context) { - return Stream.of(Dsl.values()).map(DslTestTemplateInvocationContext::new); + BuildOutput buildOutput = new BuildOutput(context.getRequiredTestClass()); + return Stream.of(Dsl.values()).map((dsl) -> new DslTestTemplateInvocationContext(buildOutput, dsl)); } @Override @@ -53,15 +55,18 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro private static final class DslTestTemplateInvocationContext implements TestTemplateInvocationContext { + private final BuildOutput buildOutput; + private final Dsl dsl; - DslTestTemplateInvocationContext(Dsl dsl) { + DslTestTemplateInvocationContext(BuildOutput buildOutput, Dsl dsl) { + this.buildOutput = buildOutput; this.dsl = dsl; } @Override public List getAdditionalExtensions() { - GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.dsl) + GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.buildOutput, this.dsl) .gradleVersion(GradleVersions.minimumCompatible()); return Arrays.asList(new GradleBuildFieldSetter(gradleBuild), new GradleBuildExtension()); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java index 1b4e883b67d..68f5986a904 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java @@ -30,6 +30,7 @@ import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; @@ -44,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(GradleBuildExtension.class) class KotlinPluginActionIntegrationTests { - GradleBuild gradleBuild = new PluginClasspathGradleBuild(); + GradleBuild gradleBuild = new PluginClasspathGradleBuild(new BuildOutput(getClass())); @Test void noKotlinVersionPropertyWithoutKotlinPlugin() { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/PluginClasspathGradleBuild.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/PluginClasspathGradleBuild.java index 8328423248f..73a7cb307e6 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/PluginClasspathGradleBuild.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/PluginClasspathGradleBuild.java @@ -43,6 +43,7 @@ import org.tomlj.Toml; import org.springframework.asm.ClassVisitor; import org.springframework.boot.buildpack.platform.build.BuildRequest; import org.springframework.boot.loader.tools.LaunchScript; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.gradle.testkit.Dsl; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; @@ -55,12 +56,12 @@ import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; */ public class PluginClasspathGradleBuild extends GradleBuild { - public PluginClasspathGradleBuild() { - super(); + public PluginClasspathGradleBuild(BuildOutput buildOutput) { + super(buildOutput); } - public PluginClasspathGradleBuild(Dsl dsl) { - super(dsl); + public PluginClasspathGradleBuild(BuildOutput buildOutput, Dsl dsl) { + super(buildOutput, dsl); } @Override diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle index c10d00134f2..a47faf3395e 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle @@ -21,6 +21,8 @@ plugins { description = "Spring Boot Gradle Testing Support" dependencies { + api(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) + compileOnly("org.junit.jupiter:junit-jupiter") implementation(gradleTestKit()) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java index 1d4922b2eb5..c522bc38550 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java @@ -37,6 +37,7 @@ import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; import org.gradle.util.GradleVersion; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.util.FileCopyUtils; import org.springframework.util.FileSystemUtils; @@ -51,6 +52,8 @@ import static org.assertj.core.api.Assertions.fail; */ public class GradleBuild { + private final BuildOutput buildOutput; + private final Dsl dsl; private File projectDir; @@ -71,11 +74,12 @@ public class GradleBuild { private final Map scriptProperties = new HashMap<>(); - public GradleBuild() { - this(Dsl.GROOVY); + public GradleBuild(BuildOutput buildOutput) { + this(buildOutput, Dsl.GROOVY); } - protected GradleBuild(Dsl dsl) { + protected GradleBuild(BuildOutput buildOutput, Dsl dsl) { + this.buildOutput = buildOutput; this.dsl = dsl; } @@ -202,10 +206,10 @@ public class GradleBuild { } private File getTestKitDir() { - File temp = new File(System.getProperty("java.io.tmpdir")); - String username = System.getProperty("user.name"); + File build = this.buildOutput.getRootLocation(); + File testKitRoot = new File(build, "gradle-test-kit"); String gradleVersion = (this.gradleVersion != null) ? this.gradleVersion : "default"; - return new File(temp, ".gradle-test-kit-" + username + "-" + getBootVersion() + "-" + gradleVersion); + return new File(testKitRoot, gradleVersion).getAbsoluteFile(); } public File getProjectDir() { diff --git a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/junit/GradleBuildInjectionExtension.java b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/junit/GradleBuildInjectionExtension.java index c95648372df..078242f0cea 100644 --- a/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/junit/GradleBuildInjectionExtension.java +++ b/spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/junit/GradleBuildInjectionExtension.java @@ -21,6 +21,7 @@ import java.lang.reflect.Field; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; +import org.springframework.boot.testsupport.BuildOutput; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import org.springframework.boot.testsupport.gradle.testkit.GradleVersions; import org.springframework.util.Assert; @@ -34,21 +35,22 @@ import org.springframework.util.ReflectionUtils; */ public class GradleBuildInjectionExtension implements BeforeEachCallback { - private final GradleBuild gradleBuild; + private final String bootVersion; GradleBuildInjectionExtension() { - this.gradleBuild = new GradleBuild(); - this.gradleBuild.gradleVersion(GradleVersions.minimumCompatible()); String bootVersion = System.getProperty("springBootVersion"); Assert.notNull(bootVersion, "Property 'springBootVersion' must be set in build environment"); - this.gradleBuild.bootVersion(bootVersion); + this.bootVersion = bootVersion; } @Override public void beforeEach(ExtensionContext context) throws Exception { + GradleBuild gradleBuild = new GradleBuild(new BuildOutput(context.getRequiredTestClass())) + .gradleVersion(GradleVersions.minimumCompatible()) + .bootVersion(this.bootVersion); Field field = ReflectionUtils.findField(context.getRequiredTestClass(), "gradleBuild"); field.setAccessible(true); - field.set(context.getRequiredTestInstance(), this.gradleBuild); + field.set(context.getRequiredTestInstance(), gradleBuild); } }