diff --git a/native/native.tests/build.gradle.kts b/native/native.tests/build.gradle.kts index 05f65af0cf9..0609ce9734a 100644 --- a/native/native.tests/build.gradle.kts +++ b/native/native.tests/build.gradle.kts @@ -39,14 +39,24 @@ if (kotlinBuildProperties.isInJpsBuildIdeaSync) { } } -if (kotlinBuildProperties.isKotlinNativeEnabled) { - val kotlinNativeHome = project(":kotlin-native").projectDir.resolve("dist") +enum class TestProperty(shortName: String) { + // Use a separate Gradle property to pass Kotlin/Native home to tests: "kotlin.internal.native.test.nativeHome". + // Don't use "kotlin.native.home" and similar properties for this purpose, as these properties may have undesired + // effect on other Gradle tasks (ex: :kotlin-native:dist) that might be executed along with test task. + KOTLIN_NATIVE_HOME("nativeHome"), + COMPILER_CLASSPATH("compilerClasspath"), + TEST_MODE("mode"), + USE_CACHE("useCache"); - val kotlinNativeCompilerClassPath: Configuration by configurations.creating - dependencies { - kotlinNativeCompilerClassPath(project(":kotlin-native-compiler-embeddable")) + private val propertyName = "kotlin.internal.native.test.$shortName" + + fun setUpFromGradleProperty(task: Test, defaultValue: () -> Any? = { null }) { + val propertyValue = task.project.findProperty(propertyName) ?: defaultValue() + if (propertyValue != null) task.systemProperty(propertyName, propertyValue) } +} +if (kotlinBuildProperties.isKotlinNativeEnabled) { projectTest(taskName = "test", jUnitMode = JUnitMode.JUnit5) { dependsOn(":kotlin-native:dist" /*, ":kotlin-native:distPlatformLibs"*/) workingDir = rootDir @@ -60,14 +70,17 @@ if (kotlinBuildProperties.isKotlinNativeEnabled) { // additional stack frames more compared to the old one because of another launcher, etc. and it turns out this is not enough. jvmArgs("-Xss2m") - systemProperty("kotlin.native.home", kotlinNativeHome.absolutePath) - systemProperty("kotlin.internal.native.classpath", kotlinNativeCompilerClassPath.files.joinToString(";")) + TestProperty.KOTLIN_NATIVE_HOME.setUpFromGradleProperty(this) { + project(":kotlin-native").projectDir.resolve("dist").absolutePath + } + + TestProperty.COMPILER_CLASSPATH.setUpFromGradleProperty(this) { + configurations.detachedConfiguration(dependencies.project(":kotlin-native-compiler-embeddable")).files.joinToString(";") + } // Pass Gradle properties as JVM properties so test process can read them. - listOf( - "kotlin.internal.native.test.mode", - "kotlin.internal.native.test.useCache" - ).forEach { propertyName -> findProperty(propertyName)?.let { systemProperty(propertyName, it) } } + TestProperty.TEST_MODE.setUpFromGradleProperty(this) + TestProperty.USE_CACHE.setUpFromGradleProperty(this) useJUnitPlatform() } diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/NativeBlackBoxTestSupport.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/NativeBlackBoxTestSupport.kt index 78e04915c17..eda94024aa8 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/NativeBlackBoxTestSupport.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/NativeBlackBoxTestSupport.kt @@ -27,8 +27,11 @@ class NativeBlackBoxTestSupport : BeforeEachCallback { * Also, [TestInstancePostProcessor.postProcessTestInstance] allows accessing only the currently created test instance and does * not allow accessing its parent test instance in case there are inner test classes in the generated test suite. */ - override fun beforeEach(extensionContext: ExtensionContext) = with(extensionContext) { + override fun beforeEach(extensionContext: ExtensionContext): Unit = with(extensionContext) { enclosingTestInstance.testRunProvider = getOrCreateTestRunProvider() + + // Set the essential compiler property. + System.setProperty("kotlin.native.home", getOrCreateGlobalEnvironment().kotlinNativeHome.path) } companion object { diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/TestEnvironment.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/TestEnvironment.kt index 55dee005cb7..a4155c702d4 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/TestEnvironment.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/TestEnvironment.kt @@ -38,22 +38,22 @@ internal class GlobalTestEnvironment( // Use isolated cached class loader. private val defaultKotlinNativeClassLoader: Lazy = lazy { - val nativeClassPath = System.getProperty(KOTLIN_NATIVE_CLASSPATH) + val nativeClassPath = System.getProperty(COMPILER_CLASSPATH) ?.split(':', ';') ?.map { File(it).toURI().toURL() } ?.toTypedArray() - ?: fail { "Non-specified $KOTLIN_NATIVE_CLASSPATH system property" } + ?: fail { "Non-specified $COMPILER_CLASSPATH system property" } URLClassLoader(nativeClassPath, /* no parent class loader */ null).apply { setDefaultAssertionStatus(true) } } private val defaultTestMode: TestMode = run { - val testModeName = System.getProperty(KOTLIN_NATIVE_TEST_MODE) ?: return@run TestMode.WITH_MODULES + val testModeName = System.getProperty(TEST_MODE) ?: return@run TestMode.WITH_MODULES TestMode.values().firstOrNull { it.name == testModeName } ?: fail { buildString { appendLine("Unknown test mode name $testModeName.") - appendLine("One of the following test modes should be passed through $KOTLIN_NATIVE_TEST_MODE system property:") + appendLine("One of the following test modes should be passed through $TEST_MODE system property:") TestMode.values().forEach { testMode -> appendLine("- ${testMode.name}: ${testMode.description}") } @@ -62,10 +62,9 @@ internal class GlobalTestEnvironment( } private val defaultCacheSettings: TestCacheSettings = run { - val useCacheValue = System.getProperty(KOTLIN_NATIVE_TEST_USE_CACHE) + val useCacheValue = System.getProperty(USE_CACHE) val useCache = if (useCacheValue != null) { - useCacheValue.toBooleanStrictOrNull() - ?: fail { "Invalid value for $KOTLIN_NATIVE_TEST_USE_CACHE system property: $useCacheValue" } + useCacheValue.toBooleanStrictOrNull() ?: fail { "Invalid value for $USE_CACHE system property: $useCacheValue" } } else true @@ -75,10 +74,10 @@ internal class GlobalTestEnvironment( private val projectBuildDir: File get() = System.getenv(PROJECT_BUILD_DIR)?.let(::File) ?: fail { "Non-specified $PROJECT_BUILD_DIR environment variable" } - private const val KOTLIN_NATIVE_HOME = "kotlin.native.home" - private const val KOTLIN_NATIVE_CLASSPATH = "kotlin.internal.native.classpath" - private const val KOTLIN_NATIVE_TEST_MODE = "kotlin.internal.native.test.mode" - private const val KOTLIN_NATIVE_TEST_USE_CACHE = "kotlin.internal.native.test.useCache" + private const val KOTLIN_NATIVE_HOME = "kotlin.internal.native.test.nativeHome" + private const val COMPILER_CLASSPATH = "kotlin.internal.native.test.compilerClasspath" + private const val TEST_MODE = "kotlin.internal.native.test.mode" + private const val USE_CACHE = "kotlin.internal.native.test.useCache" private const val PROJECT_BUILD_DIR = "PROJECT_BUILD_DIR" } }