[Gradle] Add/update tests about Sources Publication in MPP

^KT-48839
This commit is contained in:
Anton Lakotka
2022-10-12 12:46:18 +02:00
committed by Space Team
parent 1fd779e7f4
commit 42cda2633d
23 changed files with 249 additions and 4 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.jetbrains.kotlin.gradle.util.checkedReplace
import org.jetbrains.kotlin.gradle.util.modify
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.OS
import org.junit.jupiter.api.io.TempDir
import java.io.File
import java.nio.file.Path
@@ -357,11 +358,11 @@ class HierarchicalMppIT : KGPBaseTest() {
"com/example/foo/my-lib-foo/1.0/my-lib-foo-1.0-sources.jar"
)
).use { publishedSourcesJar ->
publishedSourcesJar.checkAllEntryNamesArePresent(
publishedSourcesJar.checkExactEntries(
"META-INF/MANIFEST.MF",
"commonMain/Foo.kt",
"jvmAndJsMain/FooJvmAndJs.kt",
"linuxAndJsMain/FooLinuxAndJs.kt",
"linuxX64Main/FooLinux.kt"
)
}
}
@@ -407,11 +408,11 @@ class HierarchicalMppIT : KGPBaseTest() {
"com/example/bar/my-lib-bar/1.0/my-lib-bar-1.0-sources.jar"
)
).use { publishedSourcesJar ->
publishedSourcesJar.checkAllEntryNamesArePresent(
publishedSourcesJar.checkExactEntries(
"META-INF/MANIFEST.MF",
"commonMain/Bar.kt",
"jvmAndJsMain/BarJvmAndJs.kt",
"linuxAndJsMain/BarLinuxAndJs.kt",
"linuxX64Main/BarLinux.kt"
)
}
@@ -583,6 +584,26 @@ class HierarchicalMppIT : KGPBaseTest() {
}
}
private fun ZipFile.checkExactEntries(vararg expectedEntryNames: String, ignoreDirectories: Boolean = true) {
val entryNamesSet = entries()
.asSequence()
.map { it.name }
.run { if (ignoreDirectories) filterNot { it.endsWith("/") } else this }
.sorted()
.joinToString("\n")
val expectedEntryNamesSet = expectedEntryNames.toList().sorted().joinToString("\n")
assertEquals(expectedEntryNamesSet, entryNamesSet)
}
private fun ZipFile.sourceSetDirectories(): List<String> {
return entries()
.asSequence()
.map { it.name.split("/").first() }
.toSet()
.minus("META-INF")
.toList()
}
private fun ZipFile.getProjectStructureMetadata(): KotlinProjectStructureMetadata {
val json = getInputStream(getEntry("META-INF/$MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME")).reader().readText()
return checkNotNull(parseKotlinSourceSetMetadataFromJson(json))
@@ -689,6 +710,81 @@ class HierarchicalMppIT : KGPBaseTest() {
}
}
@GradleTest
@OsCondition(enabledOnCI = [OS.LINUX, OS.MAC, OS.WINDOWS])
@DisplayName("Test sources publication of a multiplatform library")
fun testSourcesPublication(gradleVersion: GradleVersion, @TempDir tempDir: Path) {
project(
"mpp-sources-publication",
gradleVersion = gradleVersion,
localRepoDir = tempDir
).run {
build("publish")
fun macOnly(code: () -> List<String>): List<String> = if (OS.MAC.isCurrentOs) code() else emptyList()
val rootModuleSources = listOf("test/lib/1.0/lib-1.0-sources.jar")
val jvmModuleSources = listOf("test/lib-jvm/1.0/lib-jvm-1.0-sources.jar")
val jvm2ModuleSources = listOf("test/lib-jvm2/1.0/lib-jvm2-1.0-sources.jar")
val linuxX64ModuleSources = listOf("test/lib-linuxx64/1.0/lib-linuxx64-1.0-sources.jar")
val linuxArm64ModuleSources = listOf("test/lib-linuxarm64/1.0/lib-linuxarm64-1.0-sources.jar")
val iosX64ModuleSources = macOnly { listOf("test/lib-iosx64/1.0/lib-iosx64-1.0-sources.jar") }
val iosArm64ModuleSources = macOnly { listOf("test/lib-iosarm64/1.0/lib-iosarm64-1.0-sources.jar") }
val allPublishedSources = rootModuleSources +
jvmModuleSources + jvm2ModuleSources +
linuxX64ModuleSources + linuxArm64ModuleSources +
iosX64ModuleSources + iosArm64ModuleSources
infix fun Pair<String, List<String>>.and(that: List<String>) = first to (second + that)
// Here mentioned only source sets that should be published
val expectedSourcePublicationLayout = listOf(
"commonMain" to rootModuleSources
and jvmModuleSources and jvm2ModuleSources
and iosX64ModuleSources and iosArm64ModuleSources
and linuxArm64ModuleSources and linuxX64ModuleSources,
"linuxMain" to rootModuleSources and linuxArm64ModuleSources and linuxX64ModuleSources,
"jvmMain" to jvmModuleSources,
"jvm2Main" to jvm2ModuleSources,
// since commonJvmMain is compiled to JVM only, it doesn't appear it metadata variant,
// it should be published only to jvm variants
"commonJvmMain" to jvmModuleSources and jvm2ModuleSources,
// iosMain is a host-specific sourceset and even though it isn't present in common metadata artifact
// it should be published in common sources. more details: KT-54413
"iosMain" to rootModuleSources and iosX64ModuleSources and iosArm64ModuleSources,
"iosX64Main" to iosX64ModuleSources,
"iosArm64Main" to iosArm64ModuleSources,
"linuxX64Main" to linuxX64ModuleSources,
"linuxArm64Main" to linuxArm64ModuleSources,
)
val expectedSourcePublicationLayoutBySourcesFile: Map<String, List<String>> = expectedSourcePublicationLayout
.flatMap { (sourceSet, sources) -> sources.map { sourceSet to it } }
.groupBy(
keySelector = { it.second },
valueTransform = { it.first }
)
val actualSourcePublicationLayoutBySourcesFile: Map<String, List<String>> = allPublishedSources
.associateWith { jarPath ->
tempDir
.resolve(jarPath)
.toFile()
.let(::ZipFile)
.use { it.sourceSetDirectories() }
}
fun Map<String, List<String>>.stringifyForBeautifulDiff() = entries
.sortedBy { it.key }
.joinToString("\n") { "${it.key} => ${it.value.sorted()}" }
assertEquals(
expectedSourcePublicationLayoutBySourcesFile.stringifyForBeautifulDiff(),
actualSourcePublicationLayoutBySourcesFile.stringifyForBeautifulDiff()
)
}
}
@GradleTest
@DisplayName("KT-44845: all external dependencies is unresolved in IDE with kotlin.mpp.enableGranularSourceSetsMetadata=true")
fun testMixedScopesFilesExistKt44845(gradleVersion: GradleVersion, @TempDir tempDir: Path) {
@@ -0,0 +1,67 @@
plugins {
kotlin("multiplatform")
`maven-publish`
}
repositories {
mavenLocal()
mavenCentral()
}
group = "test"
version = "1.0"
kotlin {
val disambiguationAttribute = Attribute.of("disambiguationAttribute", String::class.java)
targets.all { attributes { attribute(disambiguationAttribute, targetName) } }
jvm {}
jvm("jvm2") {}
linuxX64 {}
linuxArm64 {}
ios()
sourceSets {
val commonMain by getting
val jvmMain by getting
val jvm2Main by getting
val linuxX64Main by getting
val linuxArm64Main by getting
val commonTest by getting
val jvmTest by getting
val jvm2Test by getting
val linuxX64Test by getting
val linuxArm64Test by getting
val linuxMain by creating {
dependsOn(commonMain)
linuxX64Main.dependsOn(this)
linuxArm64Main.dependsOn(this)
}
val linuxTest by creating {
dependsOn(commonTest)
linuxX64Test.dependsOn(this)
linuxArm64Test.dependsOn(this)
}
val commonJvmMain by creating {
dependsOn(commonMain)
jvmMain.dependsOn(this)
jvm2Main.dependsOn(this)
}
val commonJvmTest by creating {
dependsOn(commonTest)
jvmTest.dependsOn(this)
jvm2Test.dependsOn(this)
}
}
}
publishing {
repositories {
maven("<localRepo>")
}
}
@@ -0,0 +1,14 @@
pluginManagement {
repositories {
mavenLocal()
gradlePluginPortal()
}
plugins {
val kotlin_version: String by settings
val test_fixes_version: String by settings
kotlin("multiplatform").version(kotlin_version)
id("org.jetbrains.kotlin.test.fixes.android") version test_fixes_version
}
}
rootProject.name = "lib"
@@ -0,0 +1,11 @@
package app
import kotlin.test.Test
import kotlin.test.assertEquals
class LinuxX64Text {
@Test
fun test1() {
assertEquals(cinterop.dummy.foo_linux(), 42)
}
}