From 938dd65881875d58e3585e5bf74d169460f000a1 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Mon, 5 Jun 2023 12:38:21 +0200 Subject: [PATCH] [Gradle] test lazy resolved configuration can handle circular dependencies In gradle it is possible to add dependency to configuration which is resolved to itself. It is possible due to nature of Configuration that can contain both: dependencies and artifacts. When configuration has dependency on itself, it practically means that this dependency will be resolved to configuration's artifacts. LazyResolvedConfiguration should be capable to handle such dependencies --- .../LazyResolvedConfigurationTest.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/LazyResolvedConfigurationTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/LazyResolvedConfigurationTest.kt index 7bd4bad955d..733846ea185 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/LazyResolvedConfigurationTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/LazyResolvedConfigurationTest.kt @@ -9,7 +9,9 @@ package org.jetbrains.kotlin.gradle.dependencyResolutionTests import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.component.ModuleComponentIdentifier +import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.internal.component.external.model.DefaultModuleComponentSelector +import org.gradle.kotlin.dsl.project import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.plugin.kotlinToolingVersion import org.jetbrains.kotlin.gradle.plugin.mpp.internal @@ -146,4 +148,28 @@ class LazyResolvedConfigurationTest { if (lazyConfiguration.allResolvedDependencies.isNotEmpty()) fail("Expected no resolved dependencies") } + + @Test + fun `test - circular dependency handling`() { + val project = buildProject() + val configuration = project.configurations.create("forTest") + configuration.isCanBeConsumed = true + // add dependency to itself + project.dependencies.add(configuration.name, project.dependencies.project(":", configuration = configuration.name)) + project.artifacts.add(configuration.name, project.file("artifact.tmp")) + + val lazyConfiguration = LazyResolvedConfiguration(configuration) + + val dependency = lazyConfiguration.allResolvedDependencies.singleOrNull() ?: fail("Expected to have single dependency") + val id = dependency.resolvedVariant.owner + if (id !is ProjectComponentIdentifier || id.projectPath != ":") fail("Expected project(:) dependency") + + val artifactName = lazyConfiguration + .resolvedArtifacts + .map { it.file.name } + .singleOrNull() + ?: fail("Expected to have single artifact") + + assertEquals("artifact.tmp", artifactName) + } }