[KLIB tool] Update KLIB metadata dump tests

^KT-62340
This commit is contained in:
Dmitriy Dolovov
2024-02-09 15:23:40 +01:00
committed by Space Team
parent f9f97f2050
commit 07767f88e2
170 changed files with 9177 additions and 2207 deletions
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.konan.test.blackbox
import com.intellij.openapi.util.text.StringUtilRt
import com.intellij.testFramework.TestDataFile
import org.jetbrains.kotlin.konan.test.blackbox.support.*
import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilationArtifact.KLIB
@@ -14,12 +13,15 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilat
import org.jetbrains.kotlin.konan.test.blackbox.support.group.UsePartialLinkage
import org.jetbrains.kotlin.konan.test.blackbox.support.runner.TestRunChecks
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.KotlinNativeClassLoader
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.PipelineType
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts
import org.jetbrains.kotlin.konan.test.blackbox.support.util.getAbsoluteFile
import org.jetbrains.kotlin.konan.test.blackbox.support.util.dumpMetadata
import org.jetbrains.kotlin.library.KotlinIrSignatureVersion
import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEqualsToFile
import org.jetbrains.kotlin.test.services.JUnit5Assertions.fail
import org.jetbrains.kotlin.test.utils.withSuffixAndExtension
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.junit.jupiter.api.Tag
import java.io.File
@@ -37,23 +39,37 @@ abstract class AbstractNativeKlibDumpMetadataTest : AbstractNativeSimpleTest() {
val kotlinNativeClassLoader = testRunSettings.get<KotlinNativeClassLoader>()
val klib: KLIB = testCompilationResult.assertSuccess().resultingArtifact
val isFir = testRunSettings.get<PipelineType>() == PipelineType.K2
val isFirIdentical = firIdentical(testPathFull)
(KotlinIrSignatureVersion.CURRENTLY_SUPPORTED_VERSIONS + null).forEach { signatureVersion: KotlinIrSignatureVersion? ->
val metadataDump = klib.dumpMetadata(
kotlinNativeClassLoader.classLoader,
printSignatures = signatureVersion != null,
signatureVersion
)
val filteredMetadataDump = StringUtilRt.convertLineSeparators(filterMetadataDump(metadataDump))
val goldenDataFile = testPathFull.withSuffixAndExtension(
suffix = signatureVersion?.let { ".v${it.number}" } ?: "",
extension = "txt"
)
val testDataFileK1 = testDataFile(testPathFull, signatureVersion, isFir = false)
val testDataFileK2 = testDataFile(testPathFull, signatureVersion, isFir = true)
assertEqualsToFile(goldenDataFile, filteredMetadataDump)
checkTestDataFilesNotEqual(testPathFull, testDataFileK1, testDataFileK2)
val testDataFile = if (isFir && !isFirIdentical) testDataFileK2 else testDataFileK1
assertEqualsToFile(testDataFile, metadataDump)
}
}
private fun testDataFile(testPathFull: File, signatureVersion: KotlinIrSignatureVersion?, isFir: Boolean): File {
val versionSpecificSuffix = signatureVersion?.let { ".v${it.number}" }.orEmpty()
val firSpecificSuffix = runIf(isFir) { ".fir" }.orEmpty()
return testPathFull.withSuffixAndExtension(
suffix = "$versionSpecificSuffix$firSpecificSuffix",
extension = "txt"
)
}
private fun generateTestCaseWithSingleSource(source: File, extraArgs: List<String>): TestCase {
val moduleName: String = source.name
val module = TestModule.Exclusive(moduleName, emptySet(), emptySet(), emptySet())
@@ -72,25 +88,27 @@ abstract class AbstractNativeKlibDumpMetadataTest : AbstractNativeSimpleTest() {
}
}
// Remove intermediate "}\n\npackage ABC {\n" parts.
private fun filterMetadataDump(contents: String): String {
var packageLineMet = false
return contents.lineSequence()
.dropWhile { line -> line.isBlank() }
.filter { line ->
when {
line.isBlank() -> false
line.startsWith("package ") -> {
if (packageLineMet)
false
else {
packageLineMet = true
true
}
}
line == "}" -> false
else -> true
private fun checkTestDataFilesNotEqual(kotlinTestDataFile: File, testDataFileK1: File, testDataFileK2: File) {
if (testDataFileK1.exists() && testDataFileK2.exists()) {
val originalText = testDataFileK1.readText().trimEnd()
val firText = testDataFileK2.readText().trimEnd()
val sameDumps = originalText == firText
if (sameDumps) {
testDataFileK2.delete()
kotlinTestDataFile.writeText("// FIR_IDENTICAL\n" + kotlinTestDataFile.readText())
fail {
"""
Dump files are equal. Please re-run the test.
K1: ${testDataFileK1.absolutePath}
K2: ${testDataFileK2.absolutePath}
""".trimIndent()
}
}.joinToString(separator = "\n", postfix = "\n}")
}
}
}
}
@@ -29,7 +29,8 @@ internal fun TestCompilationArtifact.KLIB.dumpMetadata(
klibFile = klibFile,
functionName = "dumpMetadata",
/* printSignatures= */ printSignatures,
/* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) }
/* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) },
/* testMode= */ true
)
internal fun TestCompilationArtifact.KLIB.dumpIr(