From 7e9e0647481810fb92e69ab69869c6add4051ee9 Mon Sep 17 00:00:00 2001 From: Timofey Solonin Date: Mon, 26 Feb 2024 18:10:23 +0100 Subject: [PATCH] Add an IT for publication of multiplatform resources in a jvm target ^KT-65540 --- .../testingUtils/classFilesComparison.kt | 19 ++- .../MultiplatformResourcesPublicationIT.kt | 108 ++++++++++++++++++ .../publication/build.gradle.kts | 40 +++++++ .../reference/jvm/embed/inside/inCommon | 1 + .../jvm/embed/inside/inner/innerInCommon | 0 .../jvm/embed/inside/inner/platformOverride | 1 + .../reference/jvm/embed/inside/onlyInJvm | 1 + .../publication/src/commonMain/kotlin/stub.kt | 1 + .../multiplatformResources/inCommon | 1 + .../inner/innerInCommon | 0 .../inner/platformOverride | 1 + .../inner/platformOverride | 1 + .../jvmMain/multiplatformResources/onlyInJvm | 1 + 13 files changed, 170 insertions(+), 5 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/resources/MultiplatformResourcesPublicationIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inCommon create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/innerInCommon create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/platformOverride create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/onlyInJvm create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/kotlin/stub.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inCommon create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/innerInCommon create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/platformOverride create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/inner/platformOverride create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/onlyInJvm diff --git a/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt b/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt index 054e4a6e6d5..a9483569db3 100644 --- a/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt +++ b/build-common/test/org/jetbrains/kotlin/incremental/testingUtils/classFilesComparison.kt @@ -46,7 +46,12 @@ import java.util.zip.GZIPInputStream // Set this to true if you want to dump all bytecode (test will fail in this case) private val DUMP_ALL = System.getProperty("comparison.dump.all") == "true" -fun assertEqualDirectories(expected: File, actual: File, forgiveExtraFiles: Boolean) { +fun assertEqualDirectories( + expected: File, + actual: File, + forgiveExtraFiles: Boolean, + filter: (File) -> (Boolean) = { true }, +) { val pathsInExpected = getAllRelativePaths(expected) val pathsInActual = getAllRelativePaths(actual) @@ -55,8 +60,8 @@ fun assertEqualDirectories(expected: File, actual: File, forgiveExtraFiles: Bool .filter { DUMP_ALL || !Arrays.equals(File(expected, it).readBytes(), File(actual, it).readBytes()) } .sorted() - val expectedString = getDirectoryString(expected, changedPaths) - val actualString = getDirectoryString(actual, changedPaths) + val expectedString = getDirectoryString(expected, changedPaths, filter) + val actualString = getDirectoryString(actual, changedPaths, filter) if (DUMP_ALL) { Assert.assertEquals(expectedString, actualString + " ") @@ -92,7 +97,11 @@ private fun File.checksumString(): String { private const val DIR_ROOT_PLACEHOLDER = "" -private fun getDirectoryString(dir: File, interestingPaths: List): String { +private fun getDirectoryString( + dir: File, + interestingPaths: List, + predicate: (File) -> (Boolean), +): String { val buf = StringBuilder() val p = Printer(buf) @@ -100,7 +109,7 @@ private fun getDirectoryString(dir: File, interestingPaths: List): Strin fun addDirContent(dir: File) { p.pushIndent() - val listFiles = dir.listFiles() + val listFiles = dir.listFiles()?.filter(predicate) assertNotNull("$dir does not exist", listFiles) val children = listFiles!!.sortedWith(compareBy({ it.isDirectory }, { it.name })) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/resources/MultiplatformResourcesPublicationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/resources/MultiplatformResourcesPublicationIT.kt new file mode 100644 index 00000000000..e81db934186 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/mpp/resources/MultiplatformResourcesPublicationIT.kt @@ -0,0 +1,108 @@ +package org.jetbrains.kotlin.gradle.mpp.resources + +import java.nio.file.Files +import java.nio.file.Paths +import java.nio.file.StandardCopyOption +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.gradle.util.capitalize +import org.jetbrains.kotlin.incremental.testingUtils.assertEqualDirectories +import org.junit.jupiter.api.DisplayName +import java.nio.file.Path +import java.util.zip.ZipFile + +@MppGradlePluginTests +@DisplayName("Test multiplatform resources publication") +class MultiplatformResourcesPublicationIT : KGPBaseTest() { + + @DisplayName("Multiplatform resources publication for jvm target") + @GradleAndroidTest + fun testJvmResourcesPublication( + gradleVersion: GradleVersion, + androidVersion: String, + providedJdk: JdkVersions.ProvidedJdk, + ) { + testEmbeddedResources( + gradleVersion, + androidVersion, + providedJdk, + publicationTask = ":publishJvmPublicationToMavenRepository", + publishedArchive = "build/repo/test/publication-jvm/1.0/publication-jvm-1.0.jar", + reference = "jvm", + ) + } + + private fun testEmbeddedResources( + gradleVersion: GradleVersion, + androidVersion: String, + providedJdk: JdkVersions.ProvidedJdk, + publicationTask: String, + publishedArchive: String, + reference: String, + ) { + project( + "multiplatformResources/publication", + gradleVersion, + buildJdk = providedJdk.location, + ) { + buildWithAGPVersion( + publicationTask, + androidVersion, + ) + compareEmbeddedResources( + publishedArchive, + reference + ) + } + } + + private fun TestProject.buildWithAGPVersion( + task: String, + androidVersion: String, + ) { + build( + task, + buildOptions = defaultBuildOptions.copy(androidVersion = androidVersion) + ) + } + + private fun TestProject.compareEmbeddedResources( + inputZip: String, + reference: String, + ) { + val publishedResources = projectPath.resolve("published/${reference}") + unzip( + inputZip = inputZip, + outputDir = publishedResources, + filesStartingWith = "embed", + ) + val referenceResources = projectPath.resolve("reference/$reference") + assertDirectoryExists(publishedResources) + assertDirectoryExists(referenceResources) + assertEqualDirectories( + publishedResources.toFile(), + referenceResources.toFile(), + forgiveExtraFiles = false, + filter = { !it.name.startsWith(".") } + ) + } + + private fun TestProject.unzip( + inputZip: String, + outputDir: Path, + filesStartingWith: String, + ) { + ZipFile(projectPath.resolve(inputZip).toFile()).use { + it.entries().asSequence().filter { it.name.startsWith(filesStartingWith) && !it.isDirectory }.forEach { entry -> + val outputFile = outputDir.resolve(Paths.get(entry.name)) + if (!outputFile.parent.toFile().exists()) + Files.createDirectories(outputFile.parent) + + it.getInputStream(entry).use { input -> + Files.copy(input, outputFile, StandardCopyOption.REPLACE_EXISTING) + } + } + } + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/build.gradle.kts new file mode 100644 index 00000000000..d759e7b9127 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/build.gradle.kts @@ -0,0 +1,40 @@ +@file:OptIn(ComposeKotlinGradlePluginApi::class) + +import org.jetbrains.kotlin.gradle.ComposeKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.plugin.mpp.resources.KotlinTargetResourcesPublication + +group = "test" +version = "1.0" + +plugins { + kotlin("multiplatform") + `maven-publish` +} + +kotlin { + val publication = project.ext.get( + KotlinTargetResourcesPublication.EXTENSION_NAME + ) as KotlinTargetResourcesPublication + + listOf( + jvm(), + ).forEach { target -> + publication.publishResourcesAsKotlinComponent( + target, + { sourceSet -> + KotlinTargetResourcesPublication.ResourceRoot( + resourcesBaseDirectory = project.provider { project.file("src/${sourceSet.name}/multiplatformResources") }, + includes = emptyList(), + excludes = emptyList() + ) + }, + provider { File("embed/inside") } + ) + } +} + +publishing { + repositories { + maven("${buildDir}/repo") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inCommon b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inCommon new file mode 100644 index 00000000000..7cbcb793c05 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inCommon @@ -0,0 +1 @@ +inCommon \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/innerInCommon b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/innerInCommon new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/platformOverride b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/platformOverride new file mode 100644 index 00000000000..89aa2c5efd9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/inner/platformOverride @@ -0,0 +1 @@ +jvmOverride \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/onlyInJvm b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/onlyInJvm new file mode 100644 index 00000000000..d4cb69decac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/reference/jvm/embed/inside/onlyInJvm @@ -0,0 +1 @@ +onlyInJvm \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/kotlin/stub.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/kotlin/stub.kt new file mode 100644 index 00000000000..761254b6c6f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/kotlin/stub.kt @@ -0,0 +1 @@ +package test \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inCommon b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inCommon new file mode 100644 index 00000000000..7cbcb793c05 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inCommon @@ -0,0 +1 @@ +inCommon \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/innerInCommon b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/innerInCommon new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/platformOverride b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/platformOverride new file mode 100644 index 00000000000..a1c18013349 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/commonMain/multiplatformResources/inner/platformOverride @@ -0,0 +1 @@ +platformOverride \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/inner/platformOverride b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/inner/platformOverride new file mode 100644 index 00000000000..89aa2c5efd9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/inner/platformOverride @@ -0,0 +1 @@ +jvmOverride \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/onlyInJvm b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/onlyInJvm new file mode 100644 index 00000000000..d4cb69decac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/multiplatformResources/publication/src/jvmMain/multiplatformResources/onlyInJvm @@ -0,0 +1 @@ +onlyInJvm \ No newline at end of file