diff --git a/native/native.tests/build.gradle.kts b/native/native.tests/build.gradle.kts index 609952ef5cf..b4c35c4cde1 100644 --- a/native/native.tests/build.gradle.kts +++ b/native/native.tests/build.gradle.kts @@ -50,6 +50,7 @@ enum class TestProperty(shortName: String) { TEST_MODE("mode"), OPTIMIZATION_MODE("optimizationMode"), MEMORY_MODEL("memoryModel"), + USE_THREAD_STATE_CHECKER("useThreadStateChecker"), USE_CACHE("useCache"), EXECUTION_TIMEOUT("executionTimeout"); diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt index ab8618060af..caf09c27a29 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/NativeBlackBoxTestSupport.kt @@ -50,20 +50,35 @@ class NativeBlackBoxTestSupport : BeforeEachCallback { /*************** Test process settings ***************/ - private fun ExtensionContext.getOrCreateTestProcessSettings(): TestProcessSettings = - root.getStore(NAMESPACE).getOrComputeIfAbsent(TestProcessSettings::class.java.name) { + private fun ExtensionContext.getOrCreateTestProcessSettings(): TestProcessSettings { + val optimizationMode = computeOptimizationMode() + val memoryModel = computeMemoryModel() + + val threadStateChecker = computeThreadStateChecker() + if (threadStateChecker == ThreadStateChecker.ENABLED) { + assertEquals(MemoryModel.EXPERIMENTAL, memoryModel) { + "Thread state checker can be enabled only with experimental memory model" + } + assertEquals(OptimizationMode.DEBUG, optimizationMode) { + "Thread state checker can be enabled only with debug optimization mode" + } + } + + return root.getStore(NAMESPACE).getOrComputeIfAbsent(TestProcessSettings::class.java.name) { TestProcessSettings( computeNativeTargets(), computeNativeHome(), computeNativeClassLoader(), computeTestMode(), - computeOptimizationMode(), - computeMemoryModel(), + optimizationMode, + memoryModel, + threadStateChecker, CacheKind::class to computeCacheKind(), computeBaseDirs(), computeTimeouts() ) }.cast() + } private fun computeNativeTargets(): KotlinNativeTargets { val hostTarget = HostManager.host @@ -91,6 +106,11 @@ class NativeBlackBoxTestSupport : BeforeEachCallback { private fun computeMemoryModel(): MemoryModel = enumSystemProperty(MEMORY_MODEL, MemoryModel.values(), default = MemoryModel.DEFAULT) + private fun computeThreadStateChecker(): ThreadStateChecker { + val useThreadStateChecker = systemProperty(USE_THREAD_STATE_CHECKER, String::toBooleanStrictOrNull, default = false) + return if (useThreadStateChecker) ThreadStateChecker.ENABLED else ThreadStateChecker.DISABLED + } + private fun computeCacheKind(): CacheKind { val useCache = systemProperty(USE_CACHE, String::toBooleanStrictOrNull, default = true) return if (useCache) CacheKind.WithStaticCache else CacheKind.WithoutCache @@ -138,6 +158,7 @@ class NativeBlackBoxTestSupport : BeforeEachCallback { private const val TEST_MODE = "kotlin.internal.native.test.mode" private const val OPTIMIZATION_MODE = "kotlin.internal.native.test.optimizationMode" private const val MEMORY_MODEL = "kotlin.internal.native.test.memoryModel" + private const val USE_THREAD_STATE_CHECKER = "kotlin.internal.native.test.useThreadStateChecker" private const val USE_CACHE = "kotlin.internal.native.test.useCache" private const val EXECUTION_TIMEOUT = "kotlin.internal.native.test.executionTimeout" private const val PROJECT_BUILD_DIR = "PROJECT_BUILD_DIR" diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestCompiler.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestCompiler.kt index d79c15c5792..cdb589c3517 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestCompiler.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestCompiler.kt @@ -52,6 +52,7 @@ internal class TestCompilationFactory { classLoader = settings.get(), optimizationMode = settings.get(), memoryModel = settings.get(), + threadStateChecker = settings.get(), freeCompilerArgs = freeCompilerArgs, sourceModules = rootModules, dependencies = TestCompilationDependencies(libraries = libraries, friends = friends), @@ -95,6 +96,7 @@ internal class TestCompilationFactory { classLoader = settings.get(), optimizationMode = settings.get(), memoryModel = settings.get(), + threadStateChecker = settings.get(), freeCompilerArgs = freeCompilerArgs, sourceModules = sourceModules, dependencies = TestCompilationDependencies(libraries = libraries, friends = friends), @@ -245,6 +247,7 @@ private class TestCompilationImpl( private val classLoader: KotlinNativeClassLoader, private val optimizationMode: OptimizationMode, private val memoryModel: MemoryModel, + private val threadStateChecker: ThreadStateChecker, private val freeCompilerArgs: TestCompilerArgs, private val sourceModules: Collection, private val dependencies: TestCompilationDependencies, @@ -272,6 +275,7 @@ private class TestCompilationImpl( ) optimizationMode.compilerFlag?.let { compilerFlag -> add(compilerFlag) } memoryModel.compilerFlags?.let { compilerFlags -> add(compilerFlags) } + threadStateChecker.compilerFlag?.let { compilerFlag -> add(compilerFlag) } addFlattened(dependencies.libraries) { library -> listOf("-l", library.resultingArtifactPath) } dependencies.friends.takeIf(Collection<*>::isNotEmpty)?.let { friends -> diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestDirectives.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestDirectives.kt index c9e52950b08..9add844b70d 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestDirectives.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/TestDirectives.kt @@ -119,7 +119,8 @@ internal class TestCompilerArgs(val compilerArgs: List) { "-target", "-Xinclude", "-g", "-opt", - "-memory-model" + "-memory-model", + "-Xcheck-state-at-external-calls" ) } } diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt index 8907625cbc1..a5390006fed 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/settings/TestProcessSettings.kt @@ -50,7 +50,7 @@ internal enum class OptimizationMode(private val description: String, val compil OPT("Build with optimizations applied", "-opt"), NO("Don't use any specific optimizations", null); - override fun toString() = description + if (compilerFlag == null) "" else " ($compilerFlag)" + override fun toString() = description + compilerFlag?.let { " ($it)" }.orEmpty() } internal enum class MemoryModel(val compilerFlags: List?) { @@ -60,6 +60,13 @@ internal enum class MemoryModel(val compilerFlags: List?) { override fun toString() = compilerFlags?.joinToString(prefix = "(", separator = " ", postfix = ")").orEmpty() } +internal enum class ThreadStateChecker(val compilerFlag: String?) { + DISABLED(null), + ENABLED("-Xcheck-state-at-external-calls"); + + override fun toString() = compilerFlag?.let { "($it)" }.orEmpty() +} + /** * Current project's directories. */