[Native][tests] Use new KLIB tool entry point for running tests
^KT-62340
This commit is contained in:
committed by
Space Team
parent
215303606b
commit
1c3633c9f2
+68
-40
@@ -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)!!
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user