[K/N] Tests for DefFile.excludeFilter property
This commit is contained in:
@@ -53,6 +53,31 @@ tasks {
|
|||||||
allWarningsAsErrors = true
|
allWarningsAsErrors = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy-pasted from Indexer build.gradle.kts.
|
||||||
|
withType<Test>().configureEach {
|
||||||
|
val projectsWithNativeLibs = listOf(
|
||||||
|
project(":kotlin-native:Interop:Indexer"),
|
||||||
|
project(":kotlin-native:Interop:Runtime")
|
||||||
|
)
|
||||||
|
dependsOn(projectsWithNativeLibs.map { "${it.path}:nativelibs" })
|
||||||
|
systemProperty("java.library.path", projectsWithNativeLibs.joinToString(File.pathSeparator) {
|
||||||
|
File(it.buildDir, "nativelibs").absolutePath
|
||||||
|
})
|
||||||
|
val llvmDir = project.findProperty("llvmDir")
|
||||||
|
val libclangPath = "$llvmDir/" + if (org.jetbrains.kotlin.konan.target.HostManager.hostIsMingw) {
|
||||||
|
"bin/libclang.dll"
|
||||||
|
} else {
|
||||||
|
"lib/${System.mapLibraryName("clang")}"
|
||||||
|
}
|
||||||
|
systemProperty("kotlin.native.llvm.libclang", libclangPath)
|
||||||
|
systemProperty("kotlin.native.interop.stubgenerator.temp", File(buildDir, "stubGeneratorTestTemp"))
|
||||||
|
|
||||||
|
// Set the konan.home property because we run the cinterop tool not from a distribution jar
|
||||||
|
// so it will not be able to determine this path by itself.
|
||||||
|
systemProperty("konan.home", project.project(":kotlin-native").projectDir)
|
||||||
|
environment["LIBCLANG_DISABLE_CRASH_RECOVERY"] = "1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
|||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.native.interop.gen
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.native.interop.indexer.getHeaderPaths
|
||||||
|
import kotlin.test.*
|
||||||
|
|
||||||
|
class ExcludeFilterTests : InteropTestsBase() {
|
||||||
|
@Test
|
||||||
|
fun `excludeFilter smoke 0`() {
|
||||||
|
val files = TempFiles("excludeFilterSmoke0")
|
||||||
|
val header1 = files.file("header1.h", "")
|
||||||
|
val header2 = files.file("header2.h", "")
|
||||||
|
val header3 = files.file("header3.h", "")
|
||||||
|
val defFile = files.file("excludeSmoke.def", """
|
||||||
|
headers = header1.h header2.h header3.h
|
||||||
|
headerFilter = **
|
||||||
|
excludeFilter = header3.h
|
||||||
|
""".trimIndent())
|
||||||
|
val library = buildNativeLibraryFrom(defFile, files.directory)
|
||||||
|
val headers = library.getHeaderPaths().ownHeaders
|
||||||
|
assertContains(headers, header1.absolutePath)
|
||||||
|
assertContains(headers, header2.absolutePath)
|
||||||
|
assertFalse(header3.absolutePath in headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `excludeFilter smoke 1`() {
|
||||||
|
val files = TempFiles("excludeFilterSmoke1")
|
||||||
|
val header1 = files.file("header1.h", "")
|
||||||
|
val header2 = files.file("header2.h", "")
|
||||||
|
val header3 = files.file("header3.h", "")
|
||||||
|
val defFile = files.file("excludeSmoke.def", """
|
||||||
|
headers = header1.h header2.h header3.h
|
||||||
|
headerFilter = **
|
||||||
|
excludeFilter = header[2-3].h
|
||||||
|
""".trimIndent())
|
||||||
|
val library = buildNativeLibraryFrom(defFile, files.directory)
|
||||||
|
val headers = library.getHeaderPaths().ownHeaders
|
||||||
|
assertContains(headers, header1.absolutePath)
|
||||||
|
assertFalse(header2.absolutePath in headers)
|
||||||
|
assertFalse(header3.absolutePath in headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `excludeFilter empty`() {
|
||||||
|
val files = TempFiles("excludeFilterEmpty")
|
||||||
|
val header1 = files.file("header1.h", "")
|
||||||
|
val defFile = files.file("excludeSmoke.def", """
|
||||||
|
headers = header1.h
|
||||||
|
headerFilter = **
|
||||||
|
excludeFilter =
|
||||||
|
""".trimIndent())
|
||||||
|
val library = buildNativeLibraryFrom(defFile, files.directory)
|
||||||
|
val headers = library.getHeaderPaths().ownHeaders
|
||||||
|
assertContains(headers, header1.absolutePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `excludeFilter has higher priority than headerFilter`() {
|
||||||
|
val files = TempFiles("excludeFilterHasHigherPriority")
|
||||||
|
val header1 = files.file("header1.h", "")
|
||||||
|
val defFile = files.file("excludeSmoke.def", """
|
||||||
|
headers = header1.h
|
||||||
|
headerFilter = header1.h
|
||||||
|
excludeFilter = header1.h
|
||||||
|
""".trimIndent())
|
||||||
|
val library = buildNativeLibraryFrom(defFile, files.directory)
|
||||||
|
val headers = library.getHeaderPaths().ownHeaders
|
||||||
|
assertFalse(header1.absolutePath in headers)
|
||||||
|
}
|
||||||
|
}
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.native.interop.gen
|
||||||
|
|
||||||
|
import kotlinx.cinterop.JvmCInteropCallbacks
|
||||||
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
|
import org.jetbrains.kotlin.konan.util.DefFile
|
||||||
|
import org.jetbrains.kotlin.konan.util.NativeMemoryAllocator
|
||||||
|
import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform
|
||||||
|
import org.jetbrains.kotlin.native.interop.gen.jvm.buildNativeLibrary
|
||||||
|
import org.jetbrains.kotlin.native.interop.gen.jvm.prepareTool
|
||||||
|
import org.jetbrains.kotlin.native.interop.indexer.NativeLibrary
|
||||||
|
import org.jetbrains.kotlin.native.interop.indexer.getHeaderPaths
|
||||||
|
import org.jetbrains.kotlin.native.interop.tool.CInteropArguments
|
||||||
|
import kotlin.test.*
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
abstract class InteropTestsBase {
|
||||||
|
init {
|
||||||
|
System.load(System.getProperty("kotlin.native.llvm.libclang"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeTest
|
||||||
|
fun init() {
|
||||||
|
NativeMemoryAllocator.init()
|
||||||
|
JvmCInteropCallbacks.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterTest
|
||||||
|
fun dispose() {
|
||||||
|
JvmCInteropCallbacks.dispose()
|
||||||
|
NativeMemoryAllocator.dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
class TempFiles(name: String) {
|
||||||
|
private val tempRootDir = System.getProperty("kotlin.native.interop.stubgenerator.temp") ?: System.getProperty("java.io.tmpdir") ?: "."
|
||||||
|
|
||||||
|
val directory: File = File(tempRootDir, name).canonicalFile.also {
|
||||||
|
it.mkdirs()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun file(relativePath: String, contents: String): File = File(directory, relativePath).canonicalFile.apply {
|
||||||
|
parentFile.mkdirs()
|
||||||
|
writeText(contents)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun buildNativeLibraryFrom(defFile: File, headersDirectory: File): NativeLibrary {
|
||||||
|
val tool = prepareTool(HostManager.hostName, KotlinPlatform.NATIVE, runFromDaemon = true)
|
||||||
|
val cinteropArguments = CInteropArguments()
|
||||||
|
cinteropArguments.argParser.parse(arrayOf(
|
||||||
|
"-compiler-option", "-I${headersDirectory.absolutePath}"
|
||||||
|
))
|
||||||
|
return buildNativeLibrary(
|
||||||
|
tool,
|
||||||
|
DefFile(defFile, tool.substitutions),
|
||||||
|
cinteropArguments,
|
||||||
|
ImportsImpl(emptyMap())
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user