Add worker test runner. (#2303)

This commit is contained in:
Nikolay Igotti
2018-11-07 12:46:19 +03:00
committed by GitHub
parent 15d522c2fe
commit 2a77459f48
8 changed files with 52 additions and 23 deletions
@@ -177,14 +177,17 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
put(ENABLE_ASSERTIONS, arguments.enableAssertions) put(ENABLE_ASSERTIONS, arguments.enableAssertions)
put(GENERATE_TEST_RUNNER, arguments.generateTestRunner) when {
arguments.generateWorkerTestRunner -> put(GENERATE_TEST_RUNNER, TestRunnerKind.WORKER)
arguments.generateTestRunner -> put(GENERATE_TEST_RUNNER, TestRunnerKind.MAIN_THREAD)
else -> put(GENERATE_TEST_RUNNER, TestRunnerKind.NONE)
}
// We need to download dependencies only if we use them ( = there are files to compile). // We need to download dependencies only if we use them ( = there are files to compile).
put(CHECK_DEPENDENCIES, if (configuration.kotlinSourceRoots.isNotEmpty()) { put(CHECK_DEPENDENCIES, if (configuration.kotlinSourceRoots.isNotEmpty()) {
true true
} else { } else {
arguments.checkDependencies arguments.checkDependencies
}) })
if (arguments.friendModules != null) if (arguments.friendModules != null)
put(FRIEND_MODULES, arguments.friendModules!!.split(File.pathSeparator).filterNot(String::isEmpty)) put(FRIEND_MODULES, arguments.friendModules!!.split(File.pathSeparator).filterNot(String::isEmpty))
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.cli.bc package org.jetbrains.kotlin.cli.bc
import org.jetbrains.kotlin.backend.konan.TestRunnerKind
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.Argument import org.jetbrains.kotlin.cli.common.arguments.Argument
import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector
@@ -22,8 +23,12 @@ class K2NativeCompilerArguments : CommonCompilerArguments() {
@Argument(value = "-g", description = "Enable emitting debug information") @Argument(value = "-g", description = "Enable emitting debug information")
var debug: Boolean = false var debug: Boolean = false
@Argument(value = "-generate-test-runner", deprecatedName = "-generate_test_runner", shortName = "-tr", description = "Produce a runner for unit tests") @Argument(value = "-generate-test-runner", deprecatedName = "-generate_test_runner",
var generateTestRunner: Boolean = false shortName = "-tr", description = "Produce a runner for unit tests")
var generateTestRunner = false
@Argument(value = "-generate-worker-test-runner",
shortName = "-trw", description = "Produce a worker runner for unit tests")
var generateWorkerTestRunner = false
@Argument(value="-include-binary", deprecatedName = "-includeBinary", shortName = "-ib", valueDescription = "<path>", description = "Pack external binary within the klib") @Argument(value="-include-binary", deprecatedName = "-includeBinary", shortName = "-ib", valueDescription = "<path>", description = "Pack external binary within the klib")
var includeBinaries: Array<String>? = null var includeBinaries: Array<String>? = null
@@ -502,9 +502,6 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
fun shouldOptimize() = config.configuration.getBoolean(KonanConfigKeys.OPTIMIZATION) fun shouldOptimize() = config.configuration.getBoolean(KonanConfigKeys.OPTIMIZATION)
fun shouldGenerateTestRunner() =
config.configuration.getBoolean(KonanConfigKeys.GENERATE_TEST_RUNNER)
override fun log(message: () -> String) { override fun log(message: () -> String) {
if (phase?.verbose ?: false) { if (phase?.verbose ?: false) {
println(message()) println(message())
@@ -32,7 +32,7 @@ class KonanConfigKeys {
= CompilerConfigurationKey.create<List<String>>("libraries included into produced framework API") = CompilerConfigurationKey.create<List<String>>("libraries included into produced framework API")
val FRIEND_MODULES: CompilerConfigurationKey<List<String>> val FRIEND_MODULES: CompilerConfigurationKey<List<String>>
= CompilerConfigurationKey.create<List<String>>("friend module paths") = CompilerConfigurationKey.create<List<String>>("friend module paths")
val GENERATE_TEST_RUNNER: CompilerConfigurationKey<Boolean> val GENERATE_TEST_RUNNER: CompilerConfigurationKey<TestRunnerKind>
= CompilerConfigurationKey.create("generate test runner") = CompilerConfigurationKey.create("generate test runner")
val INCLUDED_BINARY_FILES: CompilerConfigurationKey<List<String>> val INCLUDED_BINARY_FILES: CompilerConfigurationKey<List<String>>
= CompilerConfigurationKey.create("included binary file paths") = CompilerConfigurationKey.create("included binary file paths")
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.backend.konan package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.config.CompilerConfigurationKey
import org.jetbrains.kotlin.konan.util.* import org.jetbrains.kotlin.konan.util.*
import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind
@@ -83,7 +84,8 @@ object KonanPhases {
(config.produce == CompilerOutputKind.LIBRARY) (config.produce == CompilerOutputKind.LIBRARY)
KonanPhase.LINK_STAGE.enabled = config.produce.isNativeBinary KonanPhase.LINK_STAGE.enabled = config.produce.isNativeBinary
KonanPhase.TEST_PROCESSOR.enabled = getBoolean(GENERATE_TEST_RUNNER) KonanPhase.TEST_PROCESSOR.enabled =
getNotNull(KonanConfigKeys.GENERATE_TEST_RUNNER) != TestRunnerKind.NONE
val disabled = get(DISABLED_PHASES) val disabled = get(DISABLED_PHASES)
disabled?.forEach { phases[known(it)]!!.enabled = false } disabled?.forEach { phases[known(it)]!!.enabled = false }
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package org.jetbrains.kotlin.backend.konan
enum class TestRunnerKind {
NONE,
MAIN_THREAD,
WORKER
}
@@ -5,12 +5,10 @@
package org.jetbrains.kotlin.backend.konan.llvm package org.jetbrains.kotlin.backend.konan.llvm
import org.jetbrains.kotlin.backend.konan.reportCompilationError import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
import org.jetbrains.kotlin.backend.konan.descriptors.isArray import org.jetbrains.kotlin.backend.konan.descriptors.isArray
import org.jetbrains.kotlin.backend.konan.report
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -28,8 +26,7 @@ internal fun findMainEntryPoint(context: Context): FunctionDescriptor? {
val config = context.config.configuration val config = context.config.configuration
if (config.get(KonanConfigKeys.PRODUCE) != PROGRAM) return null if (config.get(KonanConfigKeys.PRODUCE) != PROGRAM) return null
val entryPoint = FqName(config.get(KonanConfigKeys.ENTRY) ?: val entryPoint = FqName(config.get(KonanConfigKeys.ENTRY) ?: defaultEntryName(config))
if (context.shouldGenerateTestRunner()) testEntryName else defaultEntryName)
val entryName = entryPoint.shortName() val entryName = entryPoint.shortName()
val packageName = entryPoint.parent() val packageName = entryPoint.parent()
@@ -59,10 +56,12 @@ internal fun findMainEntryPoint(context: Context): FunctionDescriptor? {
return main return main
} }
private val defaultEntryName = "main" private fun defaultEntryName(config: CompilerConfiguration): String =
private val testEntryName = "kotlin.native.internal.test.main" when (config.get(KonanConfigKeys.GENERATE_TEST_RUNNER)) {
TestRunnerKind.MAIN_THREAD -> "kotlin.native.internal.test.main"
private val defaultEntryPackage = FqName.ROOT TestRunnerKind.WORKER -> "kotlin.native.internal.test.worker"
else -> "main"
}
private val KotlinType.filterClass: ClassDescriptor? private val KotlinType.filterClass: ClassDescriptor?
get() { get() {
@@ -6,6 +6,7 @@
package kotlin.native.internal.test package kotlin.native.internal.test
import kotlin.system.exitProcess import kotlin.system.exitProcess
import kotlin.native.concurrent.*
@ThreadLocal @ThreadLocal
private val _generatedSuites = mutableListOf<TestSuite>() private val _generatedSuites = mutableListOf<TestSuite>()
@@ -21,3 +22,12 @@ fun testLauncherEntryPoint(args: Array<String>): Int {
fun main(args: Array<String>) { fun main(args: Array<String>) {
exitProcess(testLauncherEntryPoint(args)) exitProcess(testLauncherEntryPoint(args))
} }
fun worker(args: Array<String>) {
val worker = Worker.start()
val result = worker.execute(TransferMode.SAFE, { args.freeze() }) {
it -> testLauncherEntryPoint(it)
}.result
worker.requestTermination().result
exitProcess(result)
}