Avoid resolving deprecated configurations in tests (#3970)

* Avoid resolving deprecated configurations in tests

This PR enables more integration tests run with warning-mode=fail by
updating "resolveAllConfigurations" task in a way where we don't resolve
deprecated configurations and instead check dependencies on alternative
configurations.

* Add custom resolvable configuration for testing
This commit is contained in:
Bingran
2021-01-25 20:00:12 +00:00
committed by GitHub
parent 3b0f4f3164
commit d4965b1e6e
4 changed files with 76 additions and 48 deletions
@@ -776,7 +776,7 @@ class KotlinGradleIT : BaseGradleIT() {
setupWorkingDir() setupWorkingDir()
// Add a dependency with an explicit lower Kotlin version that has a kotlin-stdlib transitive dependency: // Add a dependency with an explicit lower Kotlin version that has a kotlin-stdlib transitive dependency:
gradleBuildScript().appendText("\ndependencies { implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.71' }") gradleBuildScript().appendText("\ndependencies { implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.71' }")
testResolveAllConfigurations(options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) { testResolveAllConfigurations {
assertSuccessful() assertSuccessful()
assertContains(">> :compileClasspath --> kotlin-reflect-1.2.71.jar") assertContains(">> :compileClasspath --> kotlin-reflect-1.2.71.jar")
// Check that the default newer Kotlin version still wins for 'kotlin-stdlib': // Check that the default newer Kotlin version still wins for 'kotlin-stdlib':
@@ -1368,14 +1368,12 @@ class NewMultiplatformIT : BaseGradleIT() {
fun testDependenciesDsl() = with(transformProjectWithPluginsDsl("newMppDependenciesDsl")) { fun testDependenciesDsl() = with(transformProjectWithPluginsDsl("newMppDependenciesDsl")) {
val originalBuildscriptContent = gradleBuildScript("app").readText() val originalBuildscriptContent = gradleBuildScript("app").readText()
fun testDependencies() = fun testDependencies() = testResolveAllConfigurations("app") {
testResolveAllConfigurations("app", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) { assertContains(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata --> junit-4.12.jar")
assertContains(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata --> junit-4.12.jar") assertEquals(
assertEquals( 1,
1, (Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output).count()
(Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output) )
.count()
)
assertContains(">> :app:testNonTransitiveDependencyNotationApiDependenciesMetadata --> kotlin-reflect-${defaultBuildOptions().kotlinVersion}.jar") assertContains(">> :app:testNonTransitiveDependencyNotationApiDependenciesMetadata --> kotlin-reflect-${defaultBuildOptions().kotlinVersion}.jar")
assertEquals( assertEquals(
@@ -1405,7 +1403,7 @@ class NewMultiplatformIT : BaseGradleIT() {
@Test @Test
fun testMultipleTargetsSamePlatform() = with(Project("newMppMultipleTargetsSamePlatform", gradleVersion)) { fun testMultipleTargetsSamePlatform() = with(Project("newMppMultipleTargetsSamePlatform", gradleVersion)) {
testResolveAllConfigurations("app", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) { testResolveAllConfigurations("app") {
assertContains(">> :app:junitCompileClasspath --> lib-junit.jar") assertContains(">> :app:junitCompileClasspath --> lib-junit.jar")
assertContains(">> :app:junitCompileClasspath --> junit-4.12.jar") assertContains(">> :app:junitCompileClasspath --> junit-4.12.jar")
@@ -14,10 +14,6 @@ import kotlin.test.assertTrue
class VariantAwareDependenciesIT : BaseGradleIT() { class VariantAwareDependenciesIT : BaseGradleIT() {
private val gradleVersion = GradleVersionRequired.FOR_MPP_SUPPORT private val gradleVersion = GradleVersionRequired.FOR_MPP_SUPPORT
override fun defaultBuildOptions(): BuildOptions {
return super.defaultBuildOptions().copy(warningMode = WarningMode.Summary)
}
@Test @Test
fun testJvmKtAppResolvesMppLib() { fun testJvmKtAppResolvesMppLib() {
val outerProject = Project("sample-lib", gradleVersion, "new-mpp-lib-and-app") val outerProject = Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")
@@ -25,10 +21,9 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) { with(outerProject) {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }") gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
testResolveAllConfigurations(innerProject.projectName) { testResolveAllConfigurations(innerProject.projectName) {
assertContains(">> :${innerProject.projectName}:runtime --> sample-lib-jvm6-1.0.jar") assertContains(">> :${innerProject.projectName}:runtimeClasspath --> sample-lib-jvm6-1.0.jar")
} }
} }
} }
@@ -40,21 +35,23 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) { with(outerProject) {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\nrepositories { jcenter() }; dependencies { compile rootProject }") gradleBuildScript(innerProject.projectName).appendText("\nrepositories { jcenter() }; dependencies { implementation rootProject }")
testResolveAllConfigurations( testResolveAllConfigurations(
subproject = innerProject.projectName subproject = innerProject.projectName,
options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)
) { ) {
assertContains(">> :${innerProject.projectName}:runtime --> sample-lib-nodejs-1.0.jar") assertContains(">> :${innerProject.projectName}:runtimeClasspath --> sample-lib-nodejs-1.0.jar")
} }
gradleProperties().appendText(jsCompilerType(KotlinJsCompilerType.IR)) gradleProperties().appendText(jsCompilerType(KotlinJsCompilerType.IR))
testResolveAllConfigurations( testResolveAllConfigurations(
subproject = innerProject.projectName, subproject = innerProject.projectName,
skipSetup = true skipSetup = true,
options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)
) { ) {
assertContains(">> :${innerProject.projectName}:runtime --> sample-lib-nodejs-1.0.klib") assertContains(">> :${innerProject.projectName}:runtimeClasspath --> sample-lib-nodejs-1.0.klib")
} }
} }
} }
@@ -81,7 +78,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript().appendText("\ndependencies { nodeJsMainImplementation project(':${innerProject.projectName}') }") gradleBuildScript().appendText("\ndependencies { nodeJsMainImplementation project(':${innerProject.projectName}') }")
testResolveAllConfigurations(innerProject.projectName) testResolveAllConfigurations(innerProject.projectName, options = defaultBuildOptions().copy(warningMode = WarningMode.Summary))
} }
} }
@@ -110,7 +107,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) { with(outerProject) {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }") gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
testResolveAllConfigurations(innerProject.projectName) testResolveAllConfigurations(innerProject.projectName)
} }
@@ -123,7 +120,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) { with(outerProject) {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }") gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
testResolveAllConfigurations(innerProject.projectName) testResolveAllConfigurations(innerProject.projectName)
} }
@@ -136,7 +133,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) { with(outerProject) {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }") gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
gradleBuildScript(innerProject.projectName).appendText( gradleBuildScript(innerProject.projectName).appendText(
// Newer Gradle versions fail to resolve the deprecated configurations because of variant-aware resolution ambiguity between // Newer Gradle versions fail to resolve the deprecated configurations because of variant-aware resolution ambiguity between
@@ -150,7 +147,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
""".trimIndent() """.trimIndent()
) )
testResolveAllConfigurations(innerProject.projectName) testResolveAllConfigurations(innerProject.projectName, options = defaultBuildOptions().copy(warningMode = WarningMode.Summary))
} }
} }
@@ -175,7 +172,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
""".trimIndent() """.trimIndent()
) )
testResolveAllConfigurations(innerJvmProject.projectName) testResolveAllConfigurations(innerJvmProject.projectName, options = defaultBuildOptions().copy(warningMode = WarningMode.Summary))
} }
} }
@@ -188,12 +185,12 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
embedProject(innerProject) embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText( gradleBuildScript(innerProject.projectName).appendText(
"\ndependencies { testCompile project(path: ':', configuration: 'jvm6TestRuntime') }" "\ndependencies { testImplementation project(path: ':', configuration: 'jvm6TestRuntime') }"
) )
testResolveAllConfigurations(innerProject.projectName) { testResolveAllConfigurations(innerProject.projectName) {
assertContains(">> :${innerProject.projectName}:testCompile --> sample-lib-jvm6-1.0.jar") assertContains(">> :${innerProject.projectName}:testCompileClasspath --> sample-lib-jvm6-1.0.jar")
assertContains(">> :${innerProject.projectName}:testRuntime --> sample-lib-jvm6-1.0.jar") assertContains(">> :${innerProject.projectName}:testRuntimeClasspath --> sample-lib-jvm6-1.0.jar")
} }
} }
} }
@@ -220,7 +217,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
testResolveAllConfigurations( testResolveAllConfigurations(
project.projectName, project.projectName,
excludePredicate = "it.name in ['compile', 'runtime', 'testCompile', 'testRuntime', 'default']" options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)
) )
} }
} }
@@ -229,7 +226,6 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
@Test @Test
fun testResolvesOldKotlinArtifactsPublishedWithMetadata() = with(Project("multiplatformProject", gradleVersion)) { fun testResolvesOldKotlinArtifactsPublishedWithMetadata() = with(Project("multiplatformProject", gradleVersion)) {
setupWorkingDir() setupWorkingDir()
projectDir.resolve("settings.gradle").appendText("\nenableFeaturePreview 'GRADLE_METADATA'")
gradleBuildScript().appendText( gradleBuildScript().appendText(
"\n" + """ "\n" + """
configure([project(':lib'), project(':libJvm'), project(':libJs')]) { configure([project(':lib'), project(':libJvm'), project(':libJs')]) {
@@ -252,13 +248,13 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
"\nsubprojects { repositories { maven { url \"file://${'$'}{rootDir.absolutePath.replace('\\\\', '/')}/repo\" } } }" "\nsubprojects { repositories { maven { url \"file://${'$'}{rootDir.absolutePath.replace('\\\\', '/')}/repo\" } } }"
} }
gradleBuildScript("lib").appendText("\ndependencies { compile 'com.example.oldmpp:lib:1.0' }") gradleBuildScript("lib").appendText("\ndependencies { implementation 'com.example.oldmpp:lib:1.0' }")
testResolveAllConfigurations("lib") testResolveAllConfigurations("lib")
gradleBuildScript("libJvm").appendText("\ndependencies { compile 'com.example.oldmpp:libJvm:1.0' }") gradleBuildScript("libJvm").appendText("\ndependencies { implementation 'com.example.oldmpp:libJvm:1.0' }")
testResolveAllConfigurations("libJvm") testResolveAllConfigurations("libJvm")
gradleBuildScript("libJs").appendText("\ndependencies { compile 'com.example.oldmpp:libJs:1.0' }") gradleBuildScript("libJs").appendText("\ndependencies { implementation 'com.example.oldmpp:libJs:1.0' }")
testResolveAllConfigurations("libJs") testResolveAllConfigurations("libJs")
embedProject(Project("sample-lib", directoryPrefix = "new-mpp-lib-and-app")) embedProject(Project("sample-lib", directoryPrefix = "new-mpp-lib-and-app"))
@@ -287,13 +283,22 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
// variants chosen over the runtime ones when resolving a configuration with no required Usage: // variants chosen over the runtime ones when resolving a configuration with no required Usage:
with(Project("simpleProject")) { with(Project("simpleProject")) {
setupWorkingDir() setupWorkingDir()
gradleBuildScript().appendText("\ndependencies { compile 'org.jetbrains.kotlin:kotlin-compiler-embeddable' }") gradleBuildScript().appendText(
"\n" + """
dependencies { implementation 'org.jetbrains.kotlin:kotlin-compiler-embeddable' }
configurations {
customConfiguration.extendsFrom implementation
customConfiguration.canBeResolved(true)
}
""".trimIndent()
)
testResolveAllConfigurations { testResolveAllConfigurations {
assertContains(">> :compile --> kotlin-compiler-embeddable-${defaultBuildOptions().kotlinVersion}.jar") assertContains(">> :customConfiguration --> kotlin-compiler-embeddable-${defaultBuildOptions().kotlinVersion}.jar")
// Check that the transitive dependencies with 'runtime' scope are also available: // Check that the transitive dependencies with 'runtime' scope are also available:
assertContains(">> :compile --> kotlin-script-runtime-${defaultBuildOptions().kotlinVersion}.jar") assertContains(">> :customConfiguration --> kotlin-script-runtime-${defaultBuildOptions().kotlinVersion}.jar")
} }
} }
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.util package org.jetbrains.kotlin.gradle.util
import org.gradle.api.logging.configuration.WarningMode
import org.jetbrains.kotlin.gradle.BaseGradleIT import org.jetbrains.kotlin.gradle.BaseGradleIT
import kotlin.test.assertTrue import kotlin.test.assertTrue
@@ -16,7 +15,7 @@ private val unresolvedConfigurationRegex = "${Regex.escape(UNRESOLVED_MARKER)}(.
fun BaseGradleIT.Project.testResolveAllConfigurations( fun BaseGradleIT.Project.testResolveAllConfigurations(
subproject: String? = null, subproject: String? = null,
skipSetup: Boolean = false, skipSetup: Boolean = false,
excludePredicate: String = "false", excludeConfigurations: List<String> = listOf(),
options: BaseGradleIT.BuildOptions = testCase.defaultBuildOptions(), options: BaseGradleIT.BuildOptions = testCase.defaultBuildOptions(),
withUnresolvedConfigurationNames: BaseGradleIT.CompiledProject.(List<String>) -> Unit = { assertTrue("Unresolved configurations: $it") { it.isEmpty() } } withUnresolvedConfigurationNames: BaseGradleIT.CompiledProject.(List<String>) -> Unit = { assertTrue("Unresolved configurations: $it") { it.isEmpty() } }
) = with(testCase) { ) = with(testCase) {
@@ -25,8 +24,8 @@ fun BaseGradleIT.Project.testResolveAllConfigurations(
setupWorkingDir() setupWorkingDir()
gradleBuildScript(subproject).run { gradleBuildScript(subproject).run {
val taskCode = when (extension) { val taskCode = when (extension) {
"gradle" -> generateResolveAllConfigurationsTask(excludePredicate) "gradle" -> generateResolveAllConfigurationsTask(excludeConfigurations)
"kts" -> generateResolveAllConfigurationsTaskKts(excludePredicate) "kts" -> generateResolveAllConfigurationsTaskKts(excludeConfigurations)
else -> error("Unexpected build script extension $extension") else -> error("Unexpected build script extension $extension")
} }
appendText("\n" + taskCode) appendText("\n" + taskCode)
@@ -41,13 +40,16 @@ fun BaseGradleIT.Project.testResolveAllConfigurations(
} }
} }
private fun generateResolveAllConfigurationsTask(exclude: String) = private fun generateResolveAllConfigurationsTask(excludes: List<String>) =
""" """
task $RESOLVE_ALL_CONFIGURATIONS_TASK_NAME { task $RESOLVE_ALL_CONFIGURATIONS_TASK_NAME {
doFirst { doFirst {
def excludeConfigs = ["default", "archives"]
${computeExcludeConfigurations(excludes)}
project.configurations project.configurations
.matching { it.canBeResolved } .matching { it.canBeResolved }
.matching { !{ $exclude }.call(it) } .matching { !excludeConfigs.contains(it.name) }
.each { configuration -> .each { configuration ->
try { try {
println "Resolving " + configuration.path println "Resolving " + configuration.path
@@ -66,13 +68,16 @@ private fun generateResolveAllConfigurationsTask(exclude: String) =
} }
""".trimIndent() """.trimIndent()
private fun generateResolveAllConfigurationsTaskKts(exclude: String) = private fun generateResolveAllConfigurationsTaskKts(excludes: List<String>) =
""" """
tasks.create("$RESOLVE_ALL_CONFIGURATIONS_TASK_NAME") { tasks.create("$RESOLVE_ALL_CONFIGURATIONS_TASK_NAME") {
doFirst { doFirst {
val excludeConfigs = mutableListOf("default", "archives")
${computeExcludeConfigurations(excludes)}
project.configurations project.configurations
.filter { it.isCanBeResolved } .filter { it.isCanBeResolved }
.filterNot { $exclude } .filterNot { excludeConfigs.contains(it.name) }
.forEach { configuration -> .forEach { configuration ->
val path = (configuration as org.gradle.api.internal.artifacts.configurations.ConfigurationInternal).path val path = (configuration as org.gradle.api.internal.artifacts.configurations.ConfigurationInternal).path
try { try {
@@ -91,3 +96,23 @@ private fun generateResolveAllConfigurationsTaskKts(exclude: String) =
} }
} }
""".trimIndent() """.trimIndent()
private fun computeExcludeConfigurations(excludes: List<String>): String {
val deprecatedConfigurations = listOf("compile", "runtime", "compileOnly", "runtimeOnly")
return """
sourceSets.forEach { sourceSet ->
"${deprecatedConfigurations.joinToString()}".split(", ").toList().forEach {
excludeConfigs.add(sourceSet.name + it.capitalize())
}
}
"${deprecatedConfigurations.joinToString()}".split(", ").toList().forEach {
excludeConfigs.add(it)
excludeConfigs.add("test" + it.capitalize())
}
"${excludes.joinToString()}".split(", ").toList().forEach {
excludeConfigs.add(it)
}
""".trimIndent()
}