diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
index f4fe4ecd421..492681bdb72 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
@@ -784,6 +784,31 @@ open class KotlinAndroid71GradleIT : KotlinAndroid70GradleIT() {
}
}
}
+
+ @Test
+ fun `test associate compilation dependencies are passed correctly to android test compilations`() {
+ with(Project("kt-49877")) {
+ build("allTests") {
+ assertSuccessful()
+ assertTasksExecuted(
+ ":compileDebugKotlinAndroid",
+ ":compileReleaseKotlinAndroid",
+ ":compileDebugUnitTestKotlinAndroid",
+ ":compileReleaseUnitTestKotlinAndroid",
+ ":testDebugUnitTest",
+ ":testReleaseUnitTest",
+ )
+ }
+
+ // instrumented tests don't work without a device, so we only compile them
+ build("packageDebugAndroidTest") {
+ assertSuccessful()
+ assertTasksExecuted(
+ ":compileDebugAndroidTestKotlinAndroid",
+ )
+ }
+ }
+ }
}
abstract class KotlinAndroid3GradleIT : AbstractKotlinAndroidGradleTests() {
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
index e5f953b725e..c01e0493b5d 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
@@ -955,6 +955,7 @@ Finished executing task ':$taskName'|
options.androidHome?.let { sdkDir ->
sdkDir.parentFile.mkdirs()
put("ANDROID_HOME", sdkDir.canonicalPath)
+ put("ANDROID_SDK_ROOT", sdkDir.canonicalPath)
}
options.javaHome?.let {
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/build.gradle.kts
new file mode 100644
index 00000000000..4934fedc981
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/build.gradle.kts
@@ -0,0 +1,27 @@
+plugins {
+ kotlin("multiplatform")
+ id("com.android.library")
+}
+
+repositories {
+ mavenLocal()
+ mavenCentral()
+ google()
+}
+
+android {
+ compileSdk = 30
+}
+
+kotlin {
+ android()
+ linuxX64()
+
+ sourceSets {
+ getByName("commonMain") {
+ dependencies {
+ implementation("com.squareup.okio:okio:3.2.0")
+ }
+ }
+ }
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/settings.gradle.kts
new file mode 100644
index 00000000000..049b3d5325c
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/settings.gradle.kts
@@ -0,0 +1 @@
+rootProject.name = "kt-49877"
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidAndroidTest/kotlin/aTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidAndroidTest/kotlin/aTest.kt
new file mode 100644
index 00000000000..5cee5cbeb7b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidAndroidTest/kotlin/aTest.kt
@@ -0,0 +1,3 @@
+private fun test() {
+ val sink: okio.Sink = null!!
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidMain/kotlin/aMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidMain/kotlin/aMain.kt
new file mode 100644
index 00000000000..5cee5cbeb7b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/androidMain/kotlin/aMain.kt
@@ -0,0 +1,3 @@
+private fun test() {
+ val sink: okio.Sink = null!!
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/commonMain/kotlin/pkg/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/commonMain/kotlin/pkg/test.kt
new file mode 100644
index 00000000000..5cee5cbeb7b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/commonMain/kotlin/pkg/test.kt
@@ -0,0 +1,3 @@
+private fun test() {
+ val sink: okio.Sink = null!!
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..b6961a87161
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/test/kotlin/aTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/test/kotlin/aTest.kt
new file mode 100644
index 00000000000..5cee5cbeb7b
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-49877/src/test/kotlin/aTest.kt
@@ -0,0 +1,3 @@
+private fun test() {
+ val sink: okio.Sink = null!!
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt
index e5573dd18c3..bfb4a073ea7 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CompilationDetails.kt
@@ -251,7 +251,7 @@ open class DefaultCompilationDetails(
* Adds `allDependencies` of configurations mentioned in `configurationNames` to configuration named [this] in
* a lazy manner
*/
- private fun String.addAllDependenciesFromOtherConfigurations(project: Project, vararg configurationNames: String) {
+ protected fun String.addAllDependenciesFromOtherConfigurations(project: Project, vararg configurationNames: String) {
project.configurations.named(this).configure { receiverConfiguration ->
receiverConfiguration.dependencies.addAllLater(
project.objects.listProperty(Dependency::class.java).apply {
@@ -528,10 +528,29 @@ class AndroidCompilationDetails(
override val friendArtifacts: FileCollection
get() = target.project.files(super.friendArtifacts, compilation.testedVariantArtifacts)
+ /*
+ * Example of how multiplatform dependencies from common would get to Android test classpath:
+ * commonMainImplementation -> androidDebugImplementation -> debugImplementation -> debugAndroidTestCompileClasspath
+ * After the fix for KT-35916 MPP compilation configurations receive a 'compilation' postfix for disambiguation.
+ * androidDebugImplementation remains a source set configuration, but no longer contains compilation dependencies.
+ * Therefore, it doesn't get dependencies from common source sets.
+ * We now explicitly add associate compilation dependencies to the Kotlin test compilation configurations (test classpaths).
+ * This helps, because the Android test classpath configurations extend from the Kotlin test compilations' directly.
+ */
override fun addAssociateCompilationDependencies(other: KotlinCompilation<*>) {
- if ((other as? KotlinJvmAndroidCompilation)?.androidVariant != getTestedVariantData(androidVariant)) {
- super.addAssociateCompilationDependencies(other)
- } // otherwise, do nothing: the Android Gradle plugin adds these dependencies for us, we don't need to add them to the classpath
+ compilation.compileDependencyConfigurationName.addAllDependenciesFromOtherConfigurations(
+ project,
+ other.apiConfigurationName,
+ other.implementationConfigurationName,
+ other.compileOnlyConfigurationName
+ )
+
+ compilation.runtimeDependencyConfigurationName.addAllDependenciesFromOtherConfigurations(
+ project,
+ other.apiConfigurationName,
+ other.implementationConfigurationName,
+ other.runtimeOnlyConfigurationName
+ )
}
override val kotlinDependenciesHolder: HasKotlinDependencies