From 2a77459f481b71163522f4e4cd2777d17acc8b10 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Wed, 7 Nov 2018 12:46:19 +0300 Subject: [PATCH] Add worker test runner. (#2303) --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 15 +++++++++------ .../cli/bc/K2NativeCompilerArguments.kt | 9 +++++++-- .../jetbrains/kotlin/backend/konan/Context.kt | 3 --- .../backend/konan/KonanConfigurationKeys.kt | 2 +- .../kotlin/backend/konan/KonanPhases.kt | 4 +++- .../kotlin/backend/konan/TestRunnerKind.kt | 13 +++++++++++++ .../kotlin/backend/konan/llvm/EntryPoint.kt | 19 +++++++++---------- .../kotlin/native/internal/test/Launcher.kt | 10 ++++++++++ 8 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TestRunnerKind.kt diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 24aaeafab02..72749d4b423 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -177,14 +177,17 @@ class K2Native : CLICompiler() { 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). put(CHECK_DEPENDENCIES, if (configuration.kotlinSourceRoots.isNotEmpty()) { - true - } else { - arguments.checkDependencies - }) + true + } else { + arguments.checkDependencies + }) if (arguments.friendModules != null) put(FRIEND_MODULES, arguments.friendModules!!.split(File.pathSeparator).filterNot(String::isEmpty)) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index e48c1f8e179..8eb36dab728 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -5,6 +5,7 @@ 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.Argument import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -22,8 +23,12 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { @Argument(value = "-g", description = "Enable emitting debug information") var debug: Boolean = false - @Argument(value = "-generate-test-runner", deprecatedName = "-generate_test_runner", shortName = "-tr", description = "Produce a runner for unit tests") - var generateTestRunner: Boolean = false + @Argument(value = "-generate-test-runner", deprecatedName = "-generate_test_runner", + 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 = "", description = "Pack external binary within the klib") var includeBinaries: Array? = null diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index 4c65ac50e6c..f0cbecdc5e6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -502,9 +502,6 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { fun shouldOptimize() = config.configuration.getBoolean(KonanConfigKeys.OPTIMIZATION) - fun shouldGenerateTestRunner() = - config.configuration.getBoolean(KonanConfigKeys.GENERATE_TEST_RUNNER) - override fun log(message: () -> String) { if (phase?.verbose ?: false) { println(message()) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 77299be3ff3..bbaf67ef4d4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -32,7 +32,7 @@ class KonanConfigKeys { = CompilerConfigurationKey.create>("libraries included into produced framework API") val FRIEND_MODULES: CompilerConfigurationKey> = CompilerConfigurationKey.create>("friend module paths") - val GENERATE_TEST_RUNNER: CompilerConfigurationKey + val GENERATE_TEST_RUNNER: CompilerConfigurationKey = CompilerConfigurationKey.create("generate test runner") val INCLUDED_BINARY_FILES: CompilerConfigurationKey> = CompilerConfigurationKey.create("included binary file paths") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt index 649918084b6..7aeae254f61 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanPhases.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.konan +import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.konan.util.* import org.jetbrains.kotlin.konan.target.CompilerOutputKind @@ -83,7 +84,8 @@ object KonanPhases { (config.produce == CompilerOutputKind.LIBRARY) 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) disabled?.forEach { phases[known(it)]!!.enabled = false } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TestRunnerKind.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TestRunnerKind.kt new file mode 100644 index 00000000000..06b264b5498 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TestRunnerKind.kt @@ -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 +} \ No newline at end of file diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt index b023273ad36..d0d93faa446 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt @@ -5,12 +5,10 @@ package org.jetbrains.kotlin.backend.konan.llvm -import org.jetbrains.kotlin.backend.konan.reportCompilationError -import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.backend.konan.KonanConfigKeys +import org.jetbrains.kotlin.backend.konan.* 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.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -28,8 +26,7 @@ internal fun findMainEntryPoint(context: Context): FunctionDescriptor? { val config = context.config.configuration if (config.get(KonanConfigKeys.PRODUCE) != PROGRAM) return null - val entryPoint = FqName(config.get(KonanConfigKeys.ENTRY) ?: - if (context.shouldGenerateTestRunner()) testEntryName else defaultEntryName) + val entryPoint = FqName(config.get(KonanConfigKeys.ENTRY) ?: defaultEntryName(config)) val entryName = entryPoint.shortName() val packageName = entryPoint.parent() @@ -59,10 +56,12 @@ internal fun findMainEntryPoint(context: Context): FunctionDescriptor? { return main } -private val defaultEntryName = "main" -private val testEntryName = "kotlin.native.internal.test.main" - -private val defaultEntryPackage = FqName.ROOT +private fun defaultEntryName(config: CompilerConfiguration): String = + when (config.get(KonanConfigKeys.GENERATE_TEST_RUNNER)) { + TestRunnerKind.MAIN_THREAD -> "kotlin.native.internal.test.main" + TestRunnerKind.WORKER -> "kotlin.native.internal.test.worker" + else -> "main" + } private val KotlinType.filterClass: ClassDescriptor? get() { diff --git a/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt b/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt index 6613facdb04..e2ee278c144 100644 --- a/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt +++ b/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt @@ -6,6 +6,7 @@ package kotlin.native.internal.test import kotlin.system.exitProcess +import kotlin.native.concurrent.* @ThreadLocal private val _generatedSuites = mutableListOf() @@ -21,3 +22,12 @@ fun testLauncherEntryPoint(args: Array): Int { fun main(args: Array) { exitProcess(testLauncherEntryPoint(args)) } + +fun worker(args: Array) { + val worker = Worker.start() + val result = worker.execute(TransferMode.SAFE, { args.freeze() }) { + it -> testLauncherEntryPoint(it) + }.result + worker.requestTermination().result + exitProcess(result) +}