Browse Source

Use build instead of temp dir for Gradle TestKit directories

Closes gh-46479
pull/46604/head
Andy Wilkinson 5 months ago
parent
commit
3e6e64ec49
  1. 19
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleCompatibilityExtension.java
  2. 11
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/junit/GradleMultiDslExtension.java
  3. 3
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java
  4. 9
      spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/testkit/PluginClasspathGradleBuild.java
  5. 2
      spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle
  6. 16
      spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/src/main/java/org/springframework/boot/testsupport/gradle/testkit/GradleBuild.java
  7. 12
      spring-boot-system-tests/spring-boot-image-tests/src/systemTest/java/org/springframework/boot/image/junit/GradleBuildInjectionExtension.java

19
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.junit.platform.commons.util.AnnotationUtils;
import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; 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.GradleBuild;
import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension;
import org.springframework.boot.testsupport.gradle.testkit.GradleVersions; import org.springframework.boot.testsupport.gradle.testkit.GradleVersions;
@ -54,8 +55,8 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex
.map(GradleVersion::version) .map(GradleVersion::version)
.collect(Collectors.toCollection(TreeSet::new)) .collect(Collectors.toCollection(TreeSet::new))
.last(); .last();
GradleCompatibility gradleCompatibility = AnnotationUtils Class<?> testClass = context.getRequiredTestClass();
.findAnnotation(context.getRequiredTestClass(), GradleCompatibility.class) GradleCompatibility gradleCompatibility = AnnotationUtils.findAnnotation(testClass, GradleCompatibility.class)
.get(); .get();
Stream<String> gradleVersions = GRADLE_VERSIONS.stream(); Stream<String> gradleVersions = GRADLE_VERSIONS.stream();
if (StringUtils.hasText(gradleCompatibility.versionsLessThan())) { if (StringUtils.hasText(gradleCompatibility.versionsLessThan())) {
@ -65,10 +66,11 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex
} }
return gradleVersions.flatMap((version) -> { return gradleVersions.flatMap((version) -> {
List<TestTemplateInvocationContext> invocationContexts = new ArrayList<>(); List<TestTemplateInvocationContext> 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(); boolean configurationCache = gradleCompatibility.configurationCache();
if (configurationCache && GradleVersion.version(version).equals(highestVersion)) { if (configurationCache && GradleVersion.version(version).equals(highestVersion)) {
invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, true)); invocationContexts.add(new GradleVersionTestTemplateInvocationContext(version, true, buildOutput));
} }
return invocationContexts.stream(); return invocationContexts.stream();
}); });
@ -81,11 +83,15 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex
private static final class GradleVersionTestTemplateInvocationContext implements TestTemplateInvocationContext { private static final class GradleVersionTestTemplateInvocationContext implements TestTemplateInvocationContext {
private final BuildOutput buildOutput;
private final String gradleVersion; private final String gradleVersion;
private final boolean configurationCache; private final boolean configurationCache;
GradleVersionTestTemplateInvocationContext(String gradleVersion, boolean configurationCache) { GradleVersionTestTemplateInvocationContext(String gradleVersion, boolean configurationCache,
BuildOutput buildOutput) {
this.buildOutput = buildOutput;
this.gradleVersion = gradleVersion; this.gradleVersion = gradleVersion;
this.configurationCache = configurationCache; this.configurationCache = configurationCache;
} }
@ -97,7 +103,8 @@ final class GradleCompatibilityExtension implements TestTemplateInvocationContex
@Override @Override
public List<Extension> getAdditionalExtensions() { public List<Extension> getAdditionalExtensions() {
GradleBuild gradleBuild = new PluginClasspathGradleBuild().gradleVersion(this.gradleVersion); GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.buildOutput)
.gradleVersion(this.gradleVersion);
if (this.configurationCache) { if (this.configurationCache) {
gradleBuild.configurationCache(); gradleBuild.configurationCache();
} }

11
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.junit.jupiter.api.extension.TestTemplateInvocationContextProvider;
import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; 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.Dsl;
import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; import org.springframework.boot.testsupport.gradle.testkit.GradleBuild;
import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension;
@ -43,7 +44,8 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro
@Override @Override
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(ExtensionContext context) { public Stream<TestTemplateInvocationContext> 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 @Override
@ -53,15 +55,18 @@ public class GradleMultiDslExtension implements TestTemplateInvocationContextPro
private static final class DslTestTemplateInvocationContext implements TestTemplateInvocationContext { private static final class DslTestTemplateInvocationContext implements TestTemplateInvocationContext {
private final BuildOutput buildOutput;
private final Dsl dsl; private final Dsl dsl;
DslTestTemplateInvocationContext(Dsl dsl) { DslTestTemplateInvocationContext(BuildOutput buildOutput, Dsl dsl) {
this.buildOutput = buildOutput;
this.dsl = dsl; this.dsl = dsl;
} }
@Override @Override
public List<Extension> getAdditionalExtensions() { public List<Extension> getAdditionalExtensions() {
GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.dsl) GradleBuild gradleBuild = new PluginClasspathGradleBuild(this.buildOutput, this.dsl)
.gradleVersion(GradleVersions.minimumCompatible()); .gradleVersion(GradleVersions.minimumCompatible());
return Arrays.asList(new GradleBuildFieldSetter(gradleBuild), new GradleBuildExtension()); return Arrays.asList(new GradleBuildFieldSetter(gradleBuild), new GradleBuildExtension());
} }

3
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.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.gradle.testkit.PluginClasspathGradleBuild; 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.GradleBuild;
import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension; import org.springframework.boot.testsupport.gradle.testkit.GradleBuildExtension;
@ -44,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@ExtendWith(GradleBuildExtension.class) @ExtendWith(GradleBuildExtension.class)
class KotlinPluginActionIntegrationTests { class KotlinPluginActionIntegrationTests {
GradleBuild gradleBuild = new PluginClasspathGradleBuild(); GradleBuild gradleBuild = new PluginClasspathGradleBuild(new BuildOutput(getClass()));
@Test @Test
void noKotlinVersionPropertyWithoutKotlinPlugin() { void noKotlinVersionPropertyWithoutKotlinPlugin() {

9
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.asm.ClassVisitor;
import org.springframework.boot.buildpack.platform.build.BuildRequest; import org.springframework.boot.buildpack.platform.build.BuildRequest;
import org.springframework.boot.loader.tools.LaunchScript; 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.Dsl;
import org.springframework.boot.testsupport.gradle.testkit.GradleBuild; 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 class PluginClasspathGradleBuild extends GradleBuild {
public PluginClasspathGradleBuild() { public PluginClasspathGradleBuild(BuildOutput buildOutput) {
super(); super(buildOutput);
} }
public PluginClasspathGradleBuild(Dsl dsl) { public PluginClasspathGradleBuild(BuildOutput buildOutput, Dsl dsl) {
super(dsl); super(buildOutput, dsl);
} }
@Override @Override

2
spring-boot-project/spring-boot-tools/spring-boot-gradle-test-support/build.gradle

@ -21,6 +21,8 @@ plugins {
description = "Spring Boot Gradle Testing Support" description = "Spring Boot Gradle Testing Support"
dependencies { dependencies {
api(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
compileOnly("org.junit.jupiter:junit-jupiter") compileOnly("org.junit.jupiter:junit-jupiter")
implementation(gradleTestKit()) implementation(gradleTestKit())

16
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.testkit.runner.GradleRunner;
import org.gradle.util.GradleVersion; import org.gradle.util.GradleVersion;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
import org.springframework.util.FileSystemUtils; import org.springframework.util.FileSystemUtils;
@ -51,6 +52,8 @@ import static org.assertj.core.api.Assertions.fail;
*/ */
public class GradleBuild { public class GradleBuild {
private final BuildOutput buildOutput;
private final Dsl dsl; private final Dsl dsl;
private File projectDir; private File projectDir;
@ -71,11 +74,12 @@ public class GradleBuild {
private final Map<String, String> scriptProperties = new HashMap<>(); private final Map<String, String> scriptProperties = new HashMap<>();
public GradleBuild() { public GradleBuild(BuildOutput buildOutput) {
this(Dsl.GROOVY); this(buildOutput, Dsl.GROOVY);
} }
protected GradleBuild(Dsl dsl) { protected GradleBuild(BuildOutput buildOutput, Dsl dsl) {
this.buildOutput = buildOutput;
this.dsl = dsl; this.dsl = dsl;
} }
@ -202,10 +206,10 @@ public class GradleBuild {
} }
private File getTestKitDir() { private File getTestKitDir() {
File temp = new File(System.getProperty("java.io.tmpdir")); File build = this.buildOutput.getRootLocation();
String username = System.getProperty("user.name"); File testKitRoot = new File(build, "gradle-test-kit");
String gradleVersion = (this.gradleVersion != null) ? this.gradleVersion : "default"; 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() { public File getProjectDir() {

12
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.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext; 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.GradleBuild;
import org.springframework.boot.testsupport.gradle.testkit.GradleVersions; import org.springframework.boot.testsupport.gradle.testkit.GradleVersions;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -34,21 +35,22 @@ import org.springframework.util.ReflectionUtils;
*/ */
public class GradleBuildInjectionExtension implements BeforeEachCallback { public class GradleBuildInjectionExtension implements BeforeEachCallback {
private final GradleBuild gradleBuild; private final String bootVersion;
GradleBuildInjectionExtension() { GradleBuildInjectionExtension() {
this.gradleBuild = new GradleBuild();
this.gradleBuild.gradleVersion(GradleVersions.minimumCompatible());
String bootVersion = System.getProperty("springBootVersion"); String bootVersion = System.getProperty("springBootVersion");
Assert.notNull(bootVersion, "Property 'springBootVersion' must be set in build environment"); Assert.notNull(bootVersion, "Property 'springBootVersion' must be set in build environment");
this.gradleBuild.bootVersion(bootVersion); this.bootVersion = bootVersion;
} }
@Override @Override
public void beforeEach(ExtensionContext context) throws Exception { 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 field = ReflectionUtils.findField(context.getRequiredTestClass(), "gradleBuild");
field.setAccessible(true); field.setAccessible(true);
field.set(context.getRequiredTestInstance(), this.gradleBuild); field.set(context.getRequiredTestInstance(), gradleBuild);
} }
} }

Loading…
Cancel
Save