[Native][tests] Use new KLIB tool entry point for running tests

^KT-62340
This commit is contained in:
Dmitriy Dolovov
2024-02-16 23:45:10 +01:00
committed by Space Team
parent 215303606b
commit 1c3633c9f2
@@ -7,17 +7,58 @@ package org.jetbrains.kotlin.konan.test.blackbox.support.util
import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilationArtifact import org.jetbrains.kotlin.konan.test.blackbox.support.compilation.TestCompilationArtifact
import org.jetbrains.kotlin.library.KotlinIrSignatureVersion import org.jetbrains.kotlin.library.KotlinIrSignatureVersion
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import java.io.File import java.io.File
private fun invokeKlibTool(kotlinNativeClassLoader: ClassLoader, klibFile: File, functionName: String, vararg args: Any?): String { private fun invokeKlibTool(
val libraryClass = Class.forName("org.jetbrains.kotlin.cli.klib.Library", true, kotlinNativeClassLoader) kotlinNativeClassLoader: ClassLoader,
val entryPoint = libraryClass.declaredMethods.single { it.name == functionName } klibFile: File,
val lib = libraryClass.getDeclaredConstructor(String::class.java, String::class.java).newInstance(klibFile.canonicalPath, null) command: String,
printSignatures: Boolean,
signatureVersion: KotlinIrSignatureVersion?
): String {
val entryPoint = Class.forName("org.jetbrains.kotlin.cli.klib.Main", true, kotlinNativeClassLoader)
.declaredMethods
.single { it.name == "exec" }
val output = StringBuilder() val stdout = StringBuilder()
entryPoint.invoke(lib, output, *args) val stderr = StringBuilder()
return output.toString()
val args: Array<String> = mutableListOf(
command, klibFile.canonicalPath,
"-test-mode", "true",
).apply {
runIf(printSignatures) {
this += "-print-signatures"
this += "true"
}
signatureVersion?.let {
this += "-signature-version"
this += signatureVersion.number.toString()
}
}.toTypedArray()
val exitCode = entryPoint.invoke(null, stdout, stderr, args) as Int
if (exitCode != 0) {
error(
buildString {
appendLine("Execution of KLIB tool finished with exit code $exitCode")
args.joinTo(this, prefix = "Arguments: [", postfix = "]\n")
appendLine()
appendLine("========== BEGIN: STDOUT ==========")
append(stdout)
if (stdout.isNotEmpty() && stdout.last() != '\n') appendLine()
appendLine("========== END: STDOUT ==========")
appendLine()
appendLine("========== BEGIN: STDERR ==========")
append(stderr)
if (stderr.isNotEmpty() && stderr.last() != '\n') appendLine()
appendLine("========== END: STDERR ==========")
}
)
} else {
return stdout.toString()
}
} }
internal fun TestCompilationArtifact.KLIB.dumpMetadata( internal fun TestCompilationArtifact.KLIB.dumpMetadata(
@@ -25,12 +66,11 @@ internal fun TestCompilationArtifact.KLIB.dumpMetadata(
printSignatures: Boolean, printSignatures: Boolean,
signatureVersion: KotlinIrSignatureVersion? signatureVersion: KotlinIrSignatureVersion?
): String = invokeKlibTool( ): String = invokeKlibTool(
kotlinNativeClassLoader = kotlinNativeClassLoader, kotlinNativeClassLoader,
klibFile = klibFile, klibFile,
functionName = "dumpMetadata", command = "dump-metadata",
/* printSignatures= */ printSignatures, printSignatures,
/* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) }, signatureVersion
/* testMode= */ true
) )
internal fun TestCompilationArtifact.KLIB.dumpIr( internal fun TestCompilationArtifact.KLIB.dumpIr(
@@ -38,43 +78,31 @@ internal fun TestCompilationArtifact.KLIB.dumpIr(
printSignatures: Boolean, printSignatures: Boolean,
signatureVersion: KotlinIrSignatureVersion? signatureVersion: KotlinIrSignatureVersion?
): String = invokeKlibTool( ): String = invokeKlibTool(
kotlinNativeClassLoader = kotlinNativeClassLoader, kotlinNativeClassLoader,
klibFile = klibFile, klibFile,
functionName = "dumpIr", command = "dump-ir",
/* printSignatures= */ printSignatures, printSignatures,
/* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) } signatureVersion
) )
internal fun TestCompilationArtifact.KLIB.dumpMetadataSignatures( internal fun TestCompilationArtifact.KLIB.dumpMetadataSignatures(
kotlinNativeClassLoader: ClassLoader, kotlinNativeClassLoader: ClassLoader,
signatureVersion: KotlinIrSignatureVersion, signatureVersion: KotlinIrSignatureVersion,
): String = invokeKlibTool( ): String = invokeKlibTool(
kotlinNativeClassLoader = kotlinNativeClassLoader, kotlinNativeClassLoader,
klibFile = klibFile, klibFile,
functionName = "dumpMetadataSignatures", command = "dump-metadata-signatures",
/* signatureVersion= */ getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) printSignatures = false,
signatureVersion
) )
internal fun TestCompilationArtifact.KLIB.dumpIrSignatures( internal fun TestCompilationArtifact.KLIB.dumpIrSignatures(
kotlinNativeClassLoader: ClassLoader, kotlinNativeClassLoader: ClassLoader,
signatureVersion: KotlinIrSignatureVersion, signatureVersion: KotlinIrSignatureVersion,
): String = invokeKlibTool( ): String = invokeKlibTool(
kotlinNativeClassLoader = kotlinNativeClassLoader, kotlinNativeClassLoader,
klibFile = klibFile, klibFile,
functionName = "dumpIrSignatures", command = "dump-ir-signatures",
/* signatureVersion= */ getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) printSignatures = false,
signatureVersion
) )
// This ceremony is required to load `KotlinIrSignatureVersion` class from the isolated class loader and thus avoid
// "argument type mismatch" exception raised by the Java reflection API.
// TODO: migrate on CLI-based scheme of invocation of all KLIB tool commands
private fun getSignatureVersionForIsolatedClassLoader(
kotlinNativeClassLoader: ClassLoader,
signatureVersion: KotlinIrSignatureVersion,
): Any {
return Class.forName(
signatureVersion::class.java.canonicalName,
true,
kotlinNativeClassLoader
).getDeclaredConstructor(Int::class.java).newInstance(signatureVersion.number)!!
}