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()
// 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' }")
testResolveAllConfigurations(options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) {
testResolveAllConfigurations {
assertSuccessful()
assertContains(">> :compileClasspath --> kotlin-reflect-1.2.71.jar")
// Check that the default newer Kotlin version still wins for 'kotlin-stdlib':
@@ -1368,14 +1368,12 @@ class NewMultiplatformIT : BaseGradleIT() {
fun testDependenciesDsl() = with(transformProjectWithPluginsDsl("newMppDependenciesDsl")) {
val originalBuildscriptContent = gradleBuildScript("app").readText()
fun testDependencies() =
testResolveAllConfigurations("app", options = defaultBuildOptions().copy(warningMode = WarningMode.Summary)) {
assertContains(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata --> junit-4.12.jar")
assertEquals(
1,
(Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output)
.count()
)
fun testDependencies() = testResolveAllConfigurations("app") {
assertContains(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata --> junit-4.12.jar")
assertEquals(
1,
(Regex.escape(">> :app:testNonTransitiveStringNotationApiDependenciesMetadata") + " .*").toRegex().findAll(output).count()
)
assertContains(">> :app:testNonTransitiveDependencyNotationApiDependenciesMetadata --> kotlin-reflect-${defaultBuildOptions().kotlinVersion}.jar")
assertEquals(
@@ -1405,7 +1403,7 @@ class NewMultiplatformIT : BaseGradleIT() {
@Test
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 --> junit-4.12.jar")
@@ -14,10 +14,6 @@ import kotlin.test.assertTrue
class VariantAwareDependenciesIT : BaseGradleIT() {
private val gradleVersion = GradleVersionRequired.FOR_MPP_SUPPORT
override fun defaultBuildOptions(): BuildOptions {
return super.defaultBuildOptions().copy(warningMode = WarningMode.Summary)
}
@Test
fun testJvmKtAppResolvesMppLib() {
val outerProject = Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")
@@ -25,10 +21,9 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }")
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
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) {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\nrepositories { jcenter() }; dependencies { compile rootProject }")
gradleBuildScript(innerProject.projectName).appendText("\nrepositories { jcenter() }; dependencies { implementation rootProject }")
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))
testResolveAllConfigurations(
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)
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) {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }")
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
testResolveAllConfigurations(innerProject.projectName)
}
@@ -123,7 +120,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }")
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
testResolveAllConfigurations(innerProject.projectName)
}
@@ -136,7 +133,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
with(outerProject) {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { compile rootProject }")
gradleBuildScript(innerProject.projectName).appendText("\ndependencies { implementation rootProject }")
gradleBuildScript(innerProject.projectName).appendText(
// Newer Gradle versions fail to resolve the deprecated configurations because of variant-aware resolution ambiguity between
@@ -150,7 +147,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
""".trimIndent()
)
testResolveAllConfigurations(innerProject.projectName)
testResolveAllConfigurations(innerProject.projectName, options = defaultBuildOptions().copy(warningMode = WarningMode.Summary))
}
}
@@ -175,7 +172,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
""".trimIndent()
)
testResolveAllConfigurations(innerJvmProject.projectName)
testResolveAllConfigurations(innerJvmProject.projectName, options = defaultBuildOptions().copy(warningMode = WarningMode.Summary))
}
}
@@ -188,12 +185,12 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
embedProject(innerProject)
gradleBuildScript(innerProject.projectName).appendText(
"\ndependencies { testCompile project(path: ':', configuration: 'jvm6TestRuntime') }"
"\ndependencies { testImplementation project(path: ':', configuration: 'jvm6TestRuntime') }"
)
testResolveAllConfigurations(innerProject.projectName) {
assertContains(">> :${innerProject.projectName}:testCompile --> sample-lib-jvm6-1.0.jar")
assertContains(">> :${innerProject.projectName}:testRuntime --> sample-lib-jvm6-1.0.jar")
assertContains(">> :${innerProject.projectName}:testCompileClasspath --> sample-lib-jvm6-1.0.jar")
assertContains(">> :${innerProject.projectName}:testRuntimeClasspath --> sample-lib-jvm6-1.0.jar")
}
}
}
@@ -220,7 +217,7 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
testResolveAllConfigurations(
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
fun testResolvesOldKotlinArtifactsPublishedWithMetadata() = with(Project("multiplatformProject", gradleVersion)) {
setupWorkingDir()
projectDir.resolve("settings.gradle").appendText("\nenableFeaturePreview 'GRADLE_METADATA'")
gradleBuildScript().appendText(
"\n" + """
configure([project(':lib'), project(':libJvm'), project(':libJs')]) {
@@ -252,13 +248,13 @@ class VariantAwareDependenciesIT : BaseGradleIT() {
"\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")
gradleBuildScript("libJvm").appendText("\ndependencies { compile 'com.example.oldmpp:libJvm:1.0' }")
gradleBuildScript("libJvm").appendText("\ndependencies { implementation 'com.example.oldmpp:libJvm:1.0' }")
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")
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:
with(Project("simpleProject")) {
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 {
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:
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
import org.gradle.api.logging.configuration.WarningMode
import org.jetbrains.kotlin.gradle.BaseGradleIT
import kotlin.test.assertTrue
@@ -16,7 +15,7 @@ private val unresolvedConfigurationRegex = "${Regex.escape(UNRESOLVED_MARKER)}(.
fun BaseGradleIT.Project.testResolveAllConfigurations(
subproject: String? = null,
skipSetup: Boolean = false,
excludePredicate: String = "false",
excludeConfigurations: List<String> = listOf(),
options: BaseGradleIT.BuildOptions = testCase.defaultBuildOptions(),
withUnresolvedConfigurationNames: BaseGradleIT.CompiledProject.(List<String>) -> Unit = { assertTrue("Unresolved configurations: $it") { it.isEmpty() } }
) = with(testCase) {
@@ -25,8 +24,8 @@ fun BaseGradleIT.Project.testResolveAllConfigurations(
setupWorkingDir()
gradleBuildScript(subproject).run {
val taskCode = when (extension) {
"gradle" -> generateResolveAllConfigurationsTask(excludePredicate)
"kts" -> generateResolveAllConfigurationsTaskKts(excludePredicate)
"gradle" -> generateResolveAllConfigurationsTask(excludeConfigurations)
"kts" -> generateResolveAllConfigurationsTaskKts(excludeConfigurations)
else -> error("Unexpected build script extension $extension")
}
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 {
doFirst {
def excludeConfigs = ["default", "archives"]
${computeExcludeConfigurations(excludes)}
project.configurations
.matching { it.canBeResolved }
.matching { !{ $exclude }.call(it) }
.matching { !excludeConfigs.contains(it.name) }
.each { configuration ->
try {
println "Resolving " + configuration.path
@@ -66,13 +68,16 @@ private fun generateResolveAllConfigurationsTask(exclude: String) =
}
""".trimIndent()
private fun generateResolveAllConfigurationsTaskKts(exclude: String) =
private fun generateResolveAllConfigurationsTaskKts(excludes: List<String>) =
"""
tasks.create("$RESOLVE_ALL_CONFIGURATIONS_TASK_NAME") {
doFirst {
val excludeConfigs = mutableListOf("default", "archives")
${computeExcludeConfigurations(excludes)}
project.configurations
.filter { it.isCanBeResolved }
.filterNot { $exclude }
.filterNot { excludeConfigs.contains(it.name) }
.forEach { configuration ->
val path = (configuration as org.gradle.api.internal.artifacts.configurations.ConfigurationInternal).path
try {
@@ -90,4 +95,24 @@ 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()
}