diff --git a/.github/workflows/detekt-with-type-resolution.yaml b/.github/workflows/detekt-with-type-resolution.yaml index abac5ff8368..f9a9480a41b 100644 --- a/.github/workflows/detekt-with-type-resolution.yaml +++ b/.github/workflows/detekt-with-type-resolution.yaml @@ -64,7 +64,7 @@ jobs: gradle-home-cache-cleanup: true - name: Run analysis - run: ./gradlew detektMain detektTest detektFunctionalTest detektTestFixtures detektReportMergeSarif --continue + run: ./gradlew detektMain detektTest detektFunctionalTest detektTestFixtures detektFunctionalTestMinSupportedGradle detektReportMergeSarif --continue - name: Upload SARIF to GitHub using the upload-sarif action uses: github/codeql-action/upload-sarif@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3 diff --git a/build.gradle.kts b/build.gradle.kts index 7247cf571e3..416fa17880d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,7 @@ setOf( "detektMain", "detektTest", "detektFunctionalTest", + "detektFunctionalTestMinSupportedGradle", "detektTestFixtures", ).forEach { taskName -> tasks.register(taskName) { diff --git a/detekt-gradle-plugin/build.gradle.kts b/detekt-gradle-plugin/build.gradle.kts index 4674c758d08..8d590c01195 100644 --- a/detekt-gradle-plugin/build.gradle.kts +++ b/detekt-gradle-plugin/build.gradle.kts @@ -60,11 +60,25 @@ testing { } } } + register("functionalTestMinSupportedGradle") { + dependencies { + implementation(libs.assertj) + implementation(testFixtures(project())) + } + targets { + all { + testTask { + dependsOn(gradleMinVersionPluginUnderTestMetadata) + } + } + } + } } } val testKitRuntimeOnly: Configuration by configurations.creating val testKitJava17RuntimeOnly: Configuration by configurations.creating +val testKitGradleMinVersionRuntimeOnly: Configuration by configurations.creating dependencies { compileOnly(libs.android.gradle.minSupported) @@ -75,6 +89,11 @@ dependencies { compileOnly("io.gitlab.arturbosch.detekt:detekt-cli:1.23.5") testKitRuntimeOnly(libs.kotlin.gradle) + testKitGradleMinVersionRuntimeOnly(libs.kotlin.gradle) { + attributes { + attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, objects.named("6.8.3")) + } + } testKitJava17RuntimeOnly(libs.android.gradle.maxSupported) // We use this published version of the detekt-formatting to self analyse this project. @@ -111,6 +130,7 @@ gradlePlugin { testSourceSets( sourceSets["testFixtures"], sourceSets["functionalTest"], + sourceSets["functionalTestMinSupportedGradle"], ) } @@ -129,6 +149,11 @@ tasks.pluginUnderTestMetadata { } } +val gradleMinVersionPluginUnderTestMetadata by tasks.registering(PluginUnderTestMetadata::class) { + pluginClasspath.setFrom(sourceSets.main.get().runtimeClasspath, testKitGradleMinVersionRuntimeOnly) + outputDirectory = layout.buildDirectory.dir(name) +} + tasks.validatePlugins { enableStricterValidation = true } @@ -164,7 +189,10 @@ tasks { } check { - dependsOn(testing.suites.named("functionalTest")) + dependsOn( + testing.suites.named("functionalTest"), + testing.suites.named("functionalTestMinSupportedGradle"), + ) } ideaModule { diff --git a/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt b/detekt-gradle-plugin/src/functionalTestMinSupportedGradle/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt similarity index 64% rename from detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt rename to detekt-gradle-plugin/src/functionalTestMinSupportedGradle/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt index d1a73aacb7c..4ca1b24a7e2 100644 --- a/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt +++ b/detekt-gradle-plugin/src/functionalTestMinSupportedGradle/kotlin/io/gitlab/arturbosch/detekt/GradleVersionSpec.kt @@ -3,10 +3,12 @@ package io.gitlab.arturbosch.detekt import io.gitlab.arturbosch.detekt.testkit.DslTestBuilder import org.assertj.core.api.Assertions.assertThat import org.gradle.testkit.runner.TaskOutcome +import org.gradle.testkit.runner.internal.PluginUnderTestMetadataReading import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import org.junit.jupiter.api.condition.EnabledForJreRange import org.junit.jupiter.api.condition.JRE.JAVA_15 +import java.nio.file.Paths class GradleVersionSpec { @@ -15,7 +17,14 @@ class GradleVersionSpec { @EnabledForJreRange(max = JAVA_15, disabledReason = "Gradle $GRADLE_VERSION unsupported on this Java version") fun runsOnOldestSupportedGradleVersion() { val builder = DslTestBuilder.kotlin() - val gradleRunner = builder.withGradleVersion(GRADLE_VERSION).build() + val metadataUrl = + Paths.get("build/gradleMinVersionPluginUnderTestMetadata/plugin-under-test-metadata.properties") + .toUri() + .toURL() + val gradleRunner = builder + .withGradleVersion(GRADLE_VERSION) + .withPluginClasspath(PluginUnderTestMetadataReading.readImplementationClasspath(metadataUrl)) + .build() gradleRunner.runDetektTaskAndCheckResult { result -> assertThat(result.task(":detekt")?.outcome).isEqualTo(TaskOutcome.SUCCESS) } diff --git a/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslGradleRunner.kt b/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslGradleRunner.kt index b714b736a4c..28db61341e0 100644 --- a/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslGradleRunner.kt +++ b/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslGradleRunner.kt @@ -22,6 +22,7 @@ constructor( val gradleVersionOrNone: String? = null, val dryRun: Boolean = false, val jvmArgs: String = "-Xmx2g -XX:MaxMetaspaceSize=1g", + val customPluginClasspath: List = emptyList(), val projectScript: Project.() -> Unit = {} ) { @@ -141,7 +142,11 @@ constructor( return GradleRunner.create().apply { withProjectDir(rootDir) - withPluginClasspath() + if (customPluginClasspath.isNotEmpty()) { + withPluginClasspath(customPluginClasspath) + } else { + withPluginClasspath() + } withArguments(args) gradleVersionOrNone?.let(::withGradleVersion) } diff --git a/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslTestBuilder.kt b/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslTestBuilder.kt index d5e6d230788..fd8647345d5 100644 --- a/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslTestBuilder.kt +++ b/detekt-gradle-plugin/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/testkit/DslTestBuilder.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.testkit import org.intellij.lang.annotations.Language +import java.io.File abstract class DslTestBuilder { @@ -24,6 +25,7 @@ abstract class DslTestBuilder { private var configFile: String? = null private var gradleVersion: String? = null private var dryRun: Boolean = false + private val customPluginClasspath: MutableList = mutableListOf() fun withDetektConfig(@Language("gradle.kts") config: String): DslTestBuilder { detektConfig = config @@ -50,6 +52,11 @@ abstract class DslTestBuilder { return this } + fun withPluginClasspath(files: Collection): DslTestBuilder { + customPluginClasspath.addAll(files) + return this + } + fun dryRun(): DslTestBuilder { dryRun = true return this @@ -64,6 +71,7 @@ abstract class DslTestBuilder { baselineFiles = baselineFile?.let { listOf(it) }.orEmpty(), gradleVersionOrNone = gradleVersion, dryRun = dryRun, + customPluginClasspath = customPluginClasspath, ) runner.setupProject() return runner