From 7341f3783859f63dcca2c0dd048a70dc63639878 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Mon, 6 Feb 2023 09:56:50 +0100 Subject: [PATCH] [Gradle] Implement IdeAndroidDependencyResolutionTest Added failing test for: KT-56430 --- .../ide/IdeAdditionalArtifactResolver.kt | 4 + .../plugin/ide/IdeMultiplatformImport.kt | 2 +- .../plugin/ide/IdeMultiplatformImportImpl.kt | 1 + .../tcs/IdeAndroidDependencyResolutionTest.kt | 79 +++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/IdeAndroidDependencyResolutionTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver.kt index 3c889c7b1a9..ca369d4e6b1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeAdditionalArtifactResolver.kt @@ -17,6 +17,10 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeDependencyResolver.Companion.SO fun interface IdeAdditionalArtifactResolver { fun resolve(sourceSet: KotlinSourceSet, dependencies: Set) + + object Empty : IdeAdditionalArtifactResolver { + override fun resolve(sourceSet: KotlinSourceSet, dependencies: Set) = Unit + } } internal fun IdeDependencyResolver.withAdditionalArtifactResolver(resolver: IdeAdditionalArtifactResolver) = diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt index 4a8cd6e6a12..a2a866a1d97 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImport.kt @@ -129,7 +129,7 @@ interface IdeMultiplatformImport { enum class AdditionalArtifactResolutionPhase { PreAdditionalArtifactResolution, - SourcesAndJavadocArtifactResolution, + SourcesAndDocumentationResolution, PostAdditionalArtifactResolution } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt index 00c51943893..e20e085e621 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/ide/IdeMultiplatformImportImpl.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.measureTimeMillisWithResult import kotlin.system.measureTimeMillis +@Suppress("LoggingStringTemplateAsArgument") internal class IdeMultiplatformImportImpl( private val extension: KotlinProjectExtension ) : IdeMultiplatformImport { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/IdeAndroidDependencyResolutionTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/IdeAndroidDependencyResolutionTest.kt new file mode 100644 index 00000000000..b9d19b6bb6c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/dependencyResolutionTests/tcs/IdeAndroidDependencyResolutionTest.kt @@ -0,0 +1,79 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.dependencyResolutionTests.tcs + +import org.jetbrains.kotlin.gradle.dependencyResolutionTests.mavenCentralCacheRedirector +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryDependency +import org.jetbrains.kotlin.gradle.plugin.ide.dependencyResolvers.IdeArtifactResolutionQuerySourcesAndDocumentationResolver +import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport +import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImportStatistics +import org.jetbrains.kotlin.gradle.util.* +import org.jetbrains.kotlin.gradle.utils.androidExtension +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.fail + +/** + * Android is not supposed to resolve any dependencies in this import. + * 'Android' refers to the 'classic' Android plugins (like com.android.application, ...library, ...) + */ +class IdeAndroidDependencyResolutionTest { + + private val project = buildProject { + enableDefaultStdlibDependency(true) + enableDependencyVerification(false) + setMultiplatformAndroidSourceSetLayoutVersion(2) + applyMultiplatformPlugin() + plugins.apply("com.android.library") + androidExtension.compileSdkVersion(33) + repositories.mavenLocal() + repositories.mavenCentralCacheRedirector() + + multiplatformExtension.apply { + android() + sourceSets.getByName("commonMain").dependencies { + implementation("com.arkivanov.mvikotlin:mvikotlin:3.0.2") + } + } + }.evaluate() + + private val androidSourceSets = project.multiplatformExtension.android().compilations.flatMap { it.kotlinSourceSets } + .ifEmpty { fail("Expected at least one Android SourceSet") } + + @BeforeTest + fun checkEnvironment() { + assumeAndroidSdkAvailable() + } + + @Test + fun `test - android source sets do not resolve binary dependencies`() { + androidSourceSets.forEach { sourceSet -> + val binaryDependencies = project.kotlinIdeMultiplatformImport.resolveDependencies(sourceSet) + .filterIsInstance() + + if (binaryDependencies.isNotEmpty()) { + fail("Expected no binary dependencies being resolved for Android. Found $binaryDependencies") + } + } + } + + @Test + fun `test - Android SourceSets - do not execute Sources And Documentation Resolver`() { + androidSourceSets.forEach { sourceSet -> + project.kotlinIdeMultiplatformImport.resolveDependencies(sourceSet) + if ( + IdeArtifactResolutionQuerySourcesAndDocumentationResolver::class.java in + project.kotlinIdeMultiplatformImportStatistics.getExecutionTimes() + ) { + fail("${IdeArtifactResolutionQuerySourcesAndDocumentationResolver::class.simpleName} as executed on ${sourceSet.name}") + } + } + } + +}