diff --git a/gradle.properties b/gradle.properties --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ group=org.implab.gradle version=0.1.0 +testMinGradleVersion=8.10.2 diff --git a/variants/build.gradle b/variants/build.gradle --- a/variants/build.gradle +++ b/variants/build.gradle @@ -36,6 +36,18 @@ test { useJUnitPlatform() } +tasks.register("minGradleCompatibilityTest", Test) { + description = "Runs functional TestKit tests against the minimum supported Gradle version." + group = "verification" + useJUnitPlatform() + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath + include "**/*FunctionalTest.class" + systemProperty "org.implab.gradle.test.gradleVersion", providers.gradleProperty("testMinGradleVersion").get() + inputs.property("testMinGradleVersion", providers.gradleProperty("testMinGradleVersion")) + shouldRunAfter test +} + javadoc { exclude "**/internal/**" } diff --git a/variants/src/test/java/org/implab/gradle/variants/AbstractFunctionalTest.java b/variants/src/test/java/org/implab/gradle/variants/AbstractFunctionalTest.java --- a/variants/src/test/java/org/implab/gradle/variants/AbstractFunctionalTest.java +++ b/variants/src/test/java/org/implab/gradle/variants/AbstractFunctionalTest.java @@ -13,6 +13,7 @@ import java.util.regex.Pattern; import org.gradle.testkit.runner.GradleRunner; import org.gradle.testkit.runner.UnexpectedBuildFailure; +import org.gradle.util.GradleVersion; import org.implab.gradle.common.core.lang.Deferred; import org.implab.gradle.variants.sources.GenericSourceSet; import org.junit.jupiter.api.io.TempDir; @@ -20,6 +21,7 @@ import org.junit.jupiter.api.io.TempDir; abstract class AbstractFunctionalTest { private static final String SETTINGS_FILE = "settings.gradle"; private static final String BUILD_FILE = "build.gradle"; + private static final String TEST_GRADLE_VERSION_PROPERTY = "org.implab.gradle.test.gradleVersion"; private static final Pattern INCLUDE_DECLARATION = Pattern.compile("^include(?:\\s|\\().*"); private static final Pattern QUOTED_LITERAL = Pattern.compile("['\"]([^'\"]+)['\"]"); @@ -35,10 +37,23 @@ abstract class AbstractFunctionalTest { } protected GradleRunner runner(String... arguments) { - return GradleRunner.create() + var runner = GradleRunner.create() .withProjectDir(testProjectDir.toFile()) .withArguments(arguments) .forwardOutput(); + + var gradleVersion = System.getProperty(TEST_GRADLE_VERSION_PROPERTY); + if (gradleVersion != null && !gradleVersion.isBlank()) + runner = runner.withGradleVersion(gradleVersion); + + return runner; + } + + protected GradleVersion targetGradleVersion() { + var gradleVersion = System.getProperty(TEST_GRADLE_VERSION_PROPERTY); + if (gradleVersion == null || gradleVersion.isBlank()) + return GradleVersion.current(); + return GradleVersion.version(gradleVersion); } protected void assertBuildFails(String expectedError, String... arguments) { diff --git a/variants/src/test/java/org/implab/gradle/variants/VariantArtifactsPluginFunctionalTest.java b/variants/src/test/java/org/implab/gradle/variants/VariantArtifactsPluginFunctionalTest.java --- a/variants/src/test/java/org/implab/gradle/variants/VariantArtifactsPluginFunctionalTest.java +++ b/variants/src/test/java/org/implab/gradle/variants/VariantArtifactsPluginFunctionalTest.java @@ -103,7 +103,7 @@ class VariantArtifactsPluginFunctionalTe } @Test - void gradleReferenceRegisteredSecondaryArtifactVariantAllowsSecondaryArtifactSelection() throws Exception { + void gradleReferenceRegisteredSecondaryArtifactVariantMatchesGradleBehavior() throws Exception { writeFile("settings.gradle", """ rootProject.name = 'gradle-reference-registered-secondary-variant' include 'producer', 'consumer' @@ -164,10 +164,15 @@ class VariantArtifactsPluginFunctionalTe } """); - BuildResult result = runner(":consumer:probe").build(); + if (targetGradleVersion().compareTo(org.gradle.util.GradleVersion.version("9.4.1")) < 0) { + assertBuildFails("Cannot create variant 'js' after dependency configuration ':producer:browserElements' has been resolved", + ":consumer:probe"); + } else { + BuildResult result = runner(":consumer:probe").build(); - assertTrue(result.getOutput().contains("compileFiles=typesPackage")); - assertTrue(result.getOutput().contains("jsFiles=js")); + assertTrue(result.getOutput().contains("compileFiles=typesPackage")); + assertTrue(result.getOutput().contains("jsFiles=js")); + } } @Test