Fix Android unit test tasks not running in allTests

The Android unit test tasks were not created by the Kotlin Gradle
plugin, so the plugin didn't add the
tadk dependencies to its aggregating
`allTests` task.

Issue #KT-38456
Issue #KT-44227
This commit is contained in:
Sergey Igushkin
2021-11-15 19:27:57 +04:00
committed by Space
parent 8ea6221932
commit 3ac472ceb3
2 changed files with 31 additions and 4 deletions
@@ -457,6 +457,15 @@ open class KotlinAndroid36GradleIT : KotlinAndroid34GradleIT() {
} }
} }
} }
@Test
fun `test MPP allTests task depending on Android unit tests`(): Unit = with(Project("new-mpp-android")) {
build(":lib:allTests", "--dry-run") {
assertSuccessful()
assertContains(":lib:testDebugUnitTest SKIPPED")
assertContains(":lib:testReleaseUnitTest SKIPPED")
}
}
} }
open class KotlinAndroid70GradleIT : KotlinAndroid36GradleIT() { open class KotlinAndroid70GradleIT : KotlinAndroid36GradleIT() {
@@ -7,12 +7,9 @@ package org.jetbrains.kotlin.gradle.plugin
import com.android.build.gradle.* import com.android.build.gradle.*
import com.android.build.gradle.BasePlugin import com.android.build.gradle.BasePlugin
import com.android.build.gradle.api.AndroidSourceSet import com.android.build.gradle.api.*
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.api.SourceKind
import org.gradle.api.* import org.gradle.api.*
import org.gradle.api.artifacts.repositories.ArtifactRepository import org.gradle.api.artifacts.repositories.ArtifactRepository
import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category import org.gradle.api.attributes.Category
import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage
import org.gradle.api.file.ConfigurableFileTree import org.gradle.api.file.ConfigurableFileTree
@@ -47,6 +44,7 @@ import org.jetbrains.kotlin.gradle.targets.js.jsPluginDeprecationMessage
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -883,6 +881,8 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
} }
project.includeKotlinToolingMetadataInApk() project.includeKotlinToolingMetadataInApk()
addAndroidUnitTestTasksAsDependenciesToAllTest(project)
} }
/** /**
@@ -981,6 +981,24 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
kotlinOptions.jvmTarget = "1.6" kotlinOptions.jvmTarget = "1.6"
} }
private fun addAndroidUnitTestTasksAsDependenciesToAllTest(project: Project) {
val allTestTaskName = project.kotlinTestRegistry.allTestsTaskName
project.tasks.matching { it.name == allTestTaskName }.configureEach { task ->
task.dependsOn(project.provider {
val androidUnitTestTasks = mutableListOf<Any>()
forEachVariant(project) { variant ->
if (variant is UnitTestVariant) {
// There's no API for getting the Android unit test tasks from the variant, so match them by name:
androidUnitTestTasks.add(project.provider {
project.tasks.matching { it.name == lowerCamelCaseName("test", variant.name) }
})
}
}
androidUnitTestTasks
})
}
}
private fun preprocessVariant( private fun preprocessVariant(
variantData: BaseVariant, variantData: BaseVariant,
compilation: KotlinJvmAndroidCompilation, compilation: KotlinJvmAndroidCompilation,