[KLIB tool] Update KLIB metadata dump tests
^KT-62340
This commit is contained in:
committed by
Space Team
parent
f9f97f2050
commit
07767f88e2
+44
-26
@@ -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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-1
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user