[Gradle] Add tests for K/N binary options

This commit is contained in:
Ilya Matveev
2021-08-26 20:21:31 +07:00
committed by Space
parent cbe5dc40ef
commit 3d9966818d
3 changed files with 66 additions and 21 deletions
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle
import org.gradle.api.logging.LogLevel
import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.checkNativeCommandLineArguments
import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.withNativeCommandLineArguments
import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.containsSequentially
import org.gradle.api.logging.configuration.WarningMode
import org.gradle.util.GradleVersion
@@ -155,7 +155,7 @@ class NewMultiplatformIT : BaseGradleIT() {
assertFileExists("build/bin/linux64/mainDebugExecutable/$nativeExeName")
// Check that linker options were correctly passed to the K/N compiler.
checkNativeCommandLineArguments(":linkMainDebugExecutableLinux64") { arguments ->
withNativeCommandLineArguments(":linkMainDebugExecutableLinux64") { arguments ->
assertTrue(arguments.containsSequentially("-linker-option", "-L."))
}
}
@@ -362,17 +362,17 @@ class GeneralNativeIT : BaseGradleIT() {
fileInWorkingDir(headerPaths[0]).readText().contains("+ (int32_t)exported")
// Check that by default release frameworks have bitcode embedded.
checkNativeCommandLineArguments(":linkMainReleaseFrameworkIos") { arguments ->
withNativeCommandLineArguments(":linkMainReleaseFrameworkIos") { arguments ->
assertTrue("-Xembed-bitcode" in arguments)
assertTrue("-opt" in arguments)
}
// Check that by default debug frameworks have bitcode marker embedded.
checkNativeCommandLineArguments(":linkMainDebugFrameworkIos") { arguments ->
withNativeCommandLineArguments(":linkMainDebugFrameworkIos") { arguments ->
assertTrue("-Xembed-bitcode-marker" in arguments)
assertTrue("-g" in arguments)
}
// Check that bitcode can be disabled by setting custom compiler options
checkNativeCommandLineArguments(":linkCustomDebugFrameworkIos") { arguments ->
withNativeCommandLineArguments(":linkCustomDebugFrameworkIos") { arguments ->
assertTrue(arguments.containsSequentially("-linker-option", "-L."))
assertTrue("-Xtime" in arguments)
assertTrue("-Xstatic-framework" in arguments)
@@ -380,7 +380,7 @@ class GeneralNativeIT : BaseGradleIT() {
assertFalse("-Xembed-bitcode" in arguments)
}
// Check that bitcode is disabled for iOS simulator.
checkNativeCommandLineArguments(":linkMainReleaseFrameworkIosSim", ":linkMainDebugFrameworkIosSim") { arguments ->
withNativeCommandLineArguments(":linkMainReleaseFrameworkIosSim", ":linkMainDebugFrameworkIosSim") { arguments ->
assertFalse("-Xembed-bitcode" in arguments)
assertFalse("-Xembed-bitcode-marker" in arguments)
}
@@ -519,7 +519,7 @@ class GeneralNativeIT : BaseGradleIT() {
) {
build(":compileKotlinHost") {
assertSuccessful()
checkNativeCommandLineArguments(":compileKotlinHost") { arguments ->
withNativeCommandLineArguments(":compileKotlinHost") { arguments ->
assertFalse("-verbose" in arguments)
}
}
@@ -533,7 +533,7 @@ class GeneralNativeIT : BaseGradleIT() {
)
build(":compileKotlinHost") {
assertSuccessful()
checkNativeCommandLineArguments(":compileKotlinHost") { arguments ->
withNativeCommandLineArguments(":compileKotlinHost") { arguments ->
assertTrue("-verbose" in arguments)
}
}
@@ -828,7 +828,7 @@ class GeneralNativeIT : BaseGradleIT() {
assertSuccessful()
assertTasksExecuted(":projectLibrary:cinteropAnotherNumberHost")
libraryFiles("projectLibrary", "anotherNumber").forEach { assertFileExists(it) }
checkNativeCustomEnvironment(":projectLibrary:cinteropAnotherNumberHost", toolName = "cinterop") { env ->
withNativeCustomEnvironment(":projectLibrary:cinteropAnotherNumberHost", toolName = "cinterop") { env ->
assertEquals("1", env["LIBCLANG_DISABLE_CRASH_RECOVERY"])
}
}
@@ -959,21 +959,21 @@ class GeneralNativeIT : BaseGradleIT() {
@Test
fun testNativeArgsWithSpaces() = with(transformNativeTestProject("sample-lib", directoryPrefix = "new-mpp-lib-and-app")) {
val compilcatedDirectoryName = if (HostManager.hostIsMingw) {
val complicatedDirectoryName = if (HostManager.hostIsMingw) {
// Windows doesn't allow creating a file with " in its name.
"path with spaces"
} else {
"path with spaces and \""
}
val fileWithSpacesInPath = projectDir.resolve("src/commonMain/kotlin/$compilcatedDirectoryName")
val fileWithSpacesInPath = projectDir.resolve("src/commonMain/kotlin/$complicatedDirectoryName")
.apply { mkdirs() }
.resolve("B.kt")
fileWithSpacesInPath.writeText("fun foo() = 42")
build("compileKotlin${nativeHostTargetName.capitalize()}") {
assertSuccessful()
checkNativeCommandLineArguments(":compileKotlin${nativeHostTargetName.capitalize()}") { arguments ->
withNativeCommandLineArguments(":compileKotlin${nativeHostTargetName.capitalize()}") { arguments ->
val escapedQuotedPath =
"\"${fileWithSpacesInPath.absolutePath.replace("\\", "\\\\").replace("\"", "\\\"")}\""
assertTrue(
@@ -989,6 +989,51 @@ class GeneralNativeIT : BaseGradleIT() {
}
}
@Test
fun testBinaryOptionsDSL() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
gradleBuildScript().appendText(
"""
kotlin.targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java) {
binaries.all { binaryOptions["memoryModel"] = "experimental" }
}
""".trimIndent()
)
build(":linkDebugExecutableHost") {
assertSuccessful()
withNativeCommandLineArguments(":linkDebugExecutableHost") {
assertTrue(it.contains("-Xbinary=memoryModel=experimental"))
}
}
}
@Test
fun testBinaryOptionsProperty() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
build(":linkDebugExecutableHost", "-Pkotlin.native.binary.memoryModel=experimental") {
assertSuccessful()
withNativeCommandLineArguments(":linkDebugExecutableHost") {
assertTrue(it.contains("-Xbinary=memoryModel=experimental"))
}
}
}
@Test
fun testBinaryOptionsPriority() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
gradleBuildScript().appendText(
"""
kotlin.targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget::class.java) {
binaries.all { binaryOptions["memoryModel"] = "experimental" }
}
""".trimIndent()
)
build(":linkDebugExecutableHost", "-Pkotlin.native.binary.memoryModel=strict") {
assertSuccessful()
withNativeCommandLineArguments(":linkDebugExecutableHost") {
// Options set in the DSL have higher priority than options set in project properties.
assertTrue(it.contains("-Xbinary=memoryModel=experimental"))
}
}
}
companion object {
fun List<String>.containsSequentially(vararg elements: String): Boolean {
check(elements.isNotEmpty())
@@ -1044,19 +1089,19 @@ class GeneralNativeIT : BaseGradleIT() {
key.trim() to value.trim()
}.toMap()
fun CompiledProject.checkNativeCommandLineArguments(
fun CompiledProject.withNativeCommandLineArguments(
vararg taskPaths: String,
toolName: String = "konanc",
check: (List<String>) -> Unit
) = taskPaths.forEach { taskPath -> check(extractNativeCommandLineArguments(taskPath, toolName)) }
fun CompiledProject.checkNativeCompilerClasspath(
fun CompiledProject.withNativeCompilerClasspath(
vararg taskPaths: String,
toolName: String = "konanc",
check: (List<String>) -> Unit
) = taskPaths.forEach { taskPath -> check(extractNativeCompilerClasspath(taskPath, toolName)) }
fun CompiledProject.checkNativeCustomEnvironment(
fun CompiledProject.withNativeCustomEnvironment(
vararg taskPaths: String,
toolName: String = "konanc",
check: (Map<String, String>) -> Unit
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.native
import org.jetbrains.kotlin.gradle.BaseGradleIT
import org.jetbrains.kotlin.gradle.GradleVersionRequired
import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.checkNativeCompilerClasspath
import org.jetbrains.kotlin.gradle.native.GeneralNativeIT.Companion.withNativeCompilerClasspath
import org.junit.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
@@ -27,7 +27,7 @@ class NativeEmbeddableCompilerJarIT : BaseGradleIT() {
fun testDefault() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
build(":linkDebugExecutableHost") {
assertSuccessful()
checkNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
withNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
assertTrue(it.includesRegularJar())
assertFalse(it.includesEmbeddableJar())
}
@@ -38,7 +38,7 @@ class NativeEmbeddableCompilerJarIT : BaseGradleIT() {
fun testEmbeddableJarFalse() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
build(":linkDebugExecutableHost", "-Pkotlin.native.useEmbeddableCompilerJar=false") {
assertSuccessful()
checkNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
withNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
assertTrue(it.includesRegularJar())
assertFalse(it.includesEmbeddableJar())
}
@@ -49,7 +49,7 @@ class NativeEmbeddableCompilerJarIT : BaseGradleIT() {
fun testEmbeddableJarTrue() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
build(":linkDebugExecutableHost", "-Pkotlin.native.useEmbeddableCompilerJar=true") {
assertSuccessful()
checkNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
withNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
assertFalse(it.includesRegularJar())
assertTrue(it.includesEmbeddableJar())
}
@@ -60,7 +60,7 @@ class NativeEmbeddableCompilerJarIT : BaseGradleIT() {
fun testSwitch() = with(transformNativeTestProjectWithPluginDsl("executables", directoryPrefix = "native-binaries")) {
build(":linkDebugExecutableHost") {
assertSuccessful()
checkNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
withNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
assertTrue(it.includesRegularJar())
assertFalse(it.includesEmbeddableJar())
}
@@ -73,7 +73,7 @@ class NativeEmbeddableCompilerJarIT : BaseGradleIT() {
build(":linkDebugExecutableHost", "-Pkotlin.native.useEmbeddableCompilerJar=true") {
assertSuccessful()
assertTasksExecuted(":linkDebugExecutableHost", ":compileKotlinHost")
checkNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
withNativeCompilerClasspath(":linkDebugExecutableHost", ":compileKotlinHost") {
assertFalse(it.includesRegularJar())
assertTrue(it.includesEmbeddableJar())
}