[Native][Tests] Add tests for -Xbinary=cInterfaceMode=none

This commit is contained in:
Sergey Bogolepov
2024-02-16 11:17:10 +02:00
committed by Space Team
parent dd25130464
commit 4f9c1860b1
18 changed files with 338 additions and 16 deletions
@@ -0,0 +1,59 @@
#include <stdint.h>
#undef NDEBUG // Make sure that asserts are enabled.
#include <assert.h>
#include <math.h>
#define DECLARE_ADDER(T) \
T add_##T(T a, T b)
DECLARE_ADDER(int8_t);
DECLARE_ADDER(int16_t);
DECLARE_ADDER(int32_t);
DECLARE_ADDER(int64_t);
DECLARE_ADDER(uint8_t);
DECLARE_ADDER(uint16_t);
DECLARE_ADDER(uint32_t);
DECLARE_ADDER(uint64_t);
DECLARE_ADDER(float);
DECLARE_ADDER(double);
float float_nan();
double double_nan();
_Bool logical_or(_Bool a, _Bool b);
int main() {
assert(add_int8_t(1, 1) == 2);
assert(add_int16_t(1, 1) == 2);
assert(add_int32_t(1, 1) == 2);
assert(add_int32_t(1, 1) == 2);
assert(add_uint8_t(1, 1) == 2);
assert(add_uint16_t(1, 1) == 2);
assert(add_uint32_t(1, 1) == 2);
assert(add_uint32_t(1, 1) == 2);
assert(add_int8_t(INT8_MAX, 1) == INT8_MIN);
assert(add_int16_t(INT16_MAX, 1) == INT16_MIN);
assert(add_int32_t(INT32_MAX, 1) == INT32_MIN);
assert(add_int64_t(INT64_MAX, 1) == INT64_MIN);
assert(add_uint8_t(UINT8_MAX, 1) == 0);
assert(add_uint16_t(UINT16_MAX, 1) == 0);
assert(add_uint32_t(UINT32_MAX, 1) == 0);
assert(add_uint64_t(UINT64_MAX, 1) == 0);
assert(logical_or(1, 1) == 1);
assert(logical_or(0, 1) == 1);
assert(add_float(3.0, -3.0) == 0.0);
assert(add_double(3.0, -3.0) == 0.0);
assert(add_float(3.0, -3.0) == 0.0);
assert(add_double(3.0, -3.0) == 0.0);
assert(isnan(float_nan()));
assert(isnan(double_nan()));
}
@@ -0,0 +1,42 @@
package org.lab.mat
import kotlin.native.internal.ExportedBridge
@ExportedBridge("add_int8_t")
fun add(a: Byte, b: Byte): Int = a + b
@ExportedBridge("add_int16_t")
fun add(a: Short, b: Short): Int = a + b
@ExportedBridge("add_int32_t")
fun add(a: Int, b: Int): Int = a + b
@ExportedBridge("add_int64_t")
fun add(a: Long, b: Long): Long = a + b
@ExportedBridge("add_uint8_t")
fun add(a: UByte, b: UByte): UInt = a + b
@ExportedBridge("add_uint16_t")
fun add(a: UShort, b: UShort): UInt = a + b
@ExportedBridge("add_uint32_t")
fun add(a: UInt, b: UInt): UInt = a + b
@ExportedBridge("add_uint64_t")
fun add(a: ULong, b: ULong): ULong = a + b
@ExportedBridge("add_float")
fun add(a: Float, b: Float): Float = a + b
@ExportedBridge("add_double")
fun add(a: Double, b: Double): Double = a + b
@ExportedBridge("logical_or")
fun or(a: Boolean, b: Boolean): Boolean = a || b
@ExportedBridge("float_nan")
fun floatNaN(): Float = Float.NaN
@ExportedBridge("double_nan")
fun doubleNaN(): Double = Double.NaN
@@ -0,0 +1,9 @@
#include <stdint.h>
int32_t my_function(int32_t);
int main() {
if (my_function(5) != 5) {
return -1;
}
}
@@ -0,0 +1,4 @@
import kotlin.native.internal.ExportedBridge
@ExportedBridge("my_function")
fun myFunction(value: Int): Int = value
@@ -0,0 +1,42 @@
/*
* Copyright 2010-2024 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.konan.test.blackbox;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.konan.test.blackbox.support.EnforcedProperty;
import org.jetbrains.kotlin.konan.test.blackbox.support.ClassLevelProperty;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("native/native.tests/testData/CExport/InterfaceNone")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "DYNAMIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "NONE")
public class CExportDynamicInterfaceNoneTestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceNone() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceNone"), Pattern.compile("^([^_](.+))$"), null, false);
}
@Test
@TestMetadata("primitiveTypes")
public void testPrimitiveTypes() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/primitiveTypes/");
}
@Test
@TestMetadata("smoke0")
public void testSmoke0() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/smoke0/");
}
}
@@ -21,7 +21,8 @@ import java.util.regex.Pattern;
@TestMetadata("native/native.tests/testData/CExport/InterfaceV1")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "DYNAMIC")
public class CExportDynamicTestGenerated extends AbstractNativeCExportTest {
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "V1")
public class CExportDynamicInterfaceV1TestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceV1() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceV1"), Pattern.compile("^([^_](.+))$"), null, false);
@@ -0,0 +1,42 @@
/*
* Copyright 2010-2024 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.konan.test.blackbox;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.konan.test.blackbox.support.EnforcedProperty;
import org.jetbrains.kotlin.konan.test.blackbox.support.ClassLevelProperty;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("native/native.tests/testData/CExport/InterfaceNone")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "STATIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "NONE")
public class CExportStaticInterfaceNoneTestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceNone() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceNone"), Pattern.compile("^([^_](.+))$"), null, false);
}
@Test
@TestMetadata("primitiveTypes")
public void testPrimitiveTypes() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/primitiveTypes/");
}
@Test
@TestMetadata("smoke0")
public void testSmoke0() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/smoke0/");
}
}
@@ -21,7 +21,8 @@ import java.util.regex.Pattern;
@TestMetadata("native/native.tests/testData/CExport/InterfaceV1")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "STATIC")
public class CExportStaticTestGenerated extends AbstractNativeCExportTest {
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "V1")
public class CExportStaticInterfaceV1TestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceV1() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceV1"), Pattern.compile("^([^_](.+))$"), null, false);
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2024 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.konan.test.blackbox;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.konan.test.blackbox.support.EnforcedProperty;
import org.jetbrains.kotlin.konan.test.blackbox.support.ClassLevelProperty;
import org.junit.jupiter.api.Tag;
import org.jetbrains.kotlin.konan.test.blackbox.support.group.FirPipeline;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("native/native.tests/testData/CExport/InterfaceNone")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "DYNAMIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "NONE")
@Tag("frontend-fir")
@FirPipeline()
public class FirCExportDynamicInterfaceNoneTestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceNone() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceNone"), Pattern.compile("^([^_](.+))$"), null, false);
}
@Test
@TestMetadata("primitiveTypes")
public void testPrimitiveTypes() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/primitiveTypes/");
}
@Test
@TestMetadata("smoke0")
public void testSmoke0() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/smoke0/");
}
}
@@ -23,9 +23,10 @@ import java.util.regex.Pattern;
@TestMetadata("native/native.tests/testData/CExport/InterfaceV1")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "DYNAMIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "V1")
@Tag("frontend-fir")
@FirPipeline()
public class FirCExportDynamicTestGenerated extends AbstractNativeCExportTest {
public class FirCExportDynamicInterfaceV1TestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceV1() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceV1"), Pattern.compile("^([^_](.+))$"), null, false);
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2024 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.konan.test.blackbox;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.konan.test.blackbox.support.EnforcedProperty;
import org.jetbrains.kotlin.konan.test.blackbox.support.ClassLevelProperty;
import org.junit.jupiter.api.Tag;
import org.jetbrains.kotlin.konan.test.blackbox.support.group.FirPipeline;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("native/native.tests/testData/CExport/InterfaceNone")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "STATIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "NONE")
@Tag("frontend-fir")
@FirPipeline()
public class FirCExportStaticInterfaceNoneTestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceNone() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceNone"), Pattern.compile("^([^_](.+))$"), null, false);
}
@Test
@TestMetadata("primitiveTypes")
public void testPrimitiveTypes() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/primitiveTypes/");
}
@Test
@TestMetadata("smoke0")
public void testSmoke0() throws Exception {
runTest("native/native.tests/testData/CExport/InterfaceNone/smoke0/");
}
}
@@ -23,9 +23,10 @@ import java.util.regex.Pattern;
@TestMetadata("native/native.tests/testData/CExport/InterfaceV1")
@TestDataPath("$PROJECT_ROOT")
@EnforcedProperty(property = ClassLevelProperty.BINARY_LIBRARY_KIND, propertyValue = "STATIC")
@EnforcedProperty(property = ClassLevelProperty.C_INTERFACE_MODE, propertyValue = "V1")
@Tag("frontend-fir")
@FirPipeline()
public class FirCExportStaticTestGenerated extends AbstractNativeCExportTest {
public class FirCExportStaticInterfaceV1TestGenerated extends AbstractNativeCExportTest {
@Test
public void testAllFilesPresentInInterfaceV1() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CExport/InterfaceV1"), Pattern.compile("^([^_](.+))$"), null, false);
@@ -469,18 +469,25 @@ fun main() {
)
// C Export
testGroup("native/native.tests/tests-gen", "native/native.tests/testData") {
val cinterfaceModes = mapOf(
"InterfaceV1" to cinterfaceMode("V1"),
"InterfaceNone" to cinterfaceMode("NONE")
)
binaryLibraryKinds.forEach { binaryKind ->
frontendFlags.forEach { frontend ->
val frontendKey = if (frontend.key == "Classic") "" else frontend.key
val suiteTestClassName = "${frontendKey}CExport${binaryKind.key}TestGenerated"
testClass<AbstractNativeCExportTest>(
suiteTestClassName,
annotations = listOf(
binaryKind.value,
*frontend.value
)
) {
model("CExport/InterfaceV1", pattern = "^([^_](.+))$", recursive = false)
cinterfaceModes.forEach { cinterfaceMode ->
val frontendKey = if (frontend.key == "Classic") "" else frontend.key
val suiteTestClassName = "${frontendKey}CExport${binaryKind.key}${cinterfaceMode.key}TestGenerated"
testClass<AbstractNativeCExportTest>(
suiteTestClassName,
annotations = listOf(
binaryKind.value,
cinterfaceMode.value,
*frontend.value
)
) {
model("CExport/${cinterfaceMode.key}", pattern = "^([^_](.+))$", recursive = false)
}
}
}
}
@@ -566,3 +573,8 @@ private fun binaryLibraryKind(kind: String = "DYNAMIC") = annotation(
"property" to ClassLevelProperty.BINARY_LIBRARY_KIND,
"propertyValue" to kind
)
private fun cinterfaceMode(mode: String = "V1") = annotation(
EnforcedProperty::class.java,
"property" to ClassLevelProperty.C_INTERFACE_MODE,
"propertyValue" to mode
)
@@ -122,7 +122,10 @@ abstract class AbstractNativeCExportTest() : AbstractNativeSimpleTest() {
id = TestCaseId.Named(moduleName),
kind = TestKind.STANDALONE_NO_TR,
modules = setOf(module),
freeCompilerArgs = TestCompilerArgs(listOf()),
freeCompilerArgs = TestCompilerArgs(listOf(
"-opt-in", "kotlin.experimental.ExperimentalNativeApi",
"-opt-in", "kotlinx.cinterop.ExperimentalForeignApi",
)),
nominalPackageName = PackageName(moduleName),
checks = TestRunChecks(
executionTimeoutCheck = TestRunCheck.ExecutionTimeout.ShouldNotExceed(testRunSettings.get<Timeouts>().executionTimeout),
@@ -73,6 +73,7 @@ internal enum class ClassLevelProperty(val shortName: String) {
PIPELINE_TYPE("pipelineType"),
SHARED_TEST_EXECUTION("sharedTestExecution"),
BINARY_LIBRARY_KIND("binaryLibraryKind"),
C_INTERFACE_MODE("cInterfaceMode"),
;
internal val propertyName = fullPropertyName(shortName)
@@ -210,6 +210,7 @@ internal object NativeTestSupport {
output += computeUsedPartialLinkageConfig(enclosingTestClass)
output += computeCompilerOutputInterceptor(enforcedProperties)
output += computeBinaryLibraryKind(enforcedProperties)
output += computeCInterfaceMode(enforcedProperties)
return nativeTargets
}
@@ -508,6 +509,10 @@ internal object NativeTestSupport {
private fun computeBinaryLibraryKind(enforcedProperties: EnforcedProperties): BinaryLibraryKind =
ClassLevelProperty.BINARY_LIBRARY_KIND.readValue(enforcedProperties, BinaryLibraryKind.values(), BinaryLibraryKind.STATIC)
private fun computeCInterfaceMode(enforcedProperties: EnforcedProperties): CInterfaceMode =
ClassLevelProperty.C_INTERFACE_MODE.readValue(enforcedProperties, CInterfaceMode.values(), CInterfaceMode.NONE)
/*************** Test class settings (simplified) ***************/
private fun ExtensionContext.getOrCreateSimpleTestClassSettings(): SimpleTestClassSettings =
@@ -351,6 +351,7 @@ internal class BinaryLibraryCompilation(
dependencies = CategorizedDependencies(dependencies),
expectedArtifact = expectedArtifact
) {
private val cinterfaceMode = settings.get<CInterfaceMode>().compilerFlag
override val binaryOptions get() = BinaryOptions.RuntimeAssertionsMode.defaultForTesting(optimizationMode, freeCompilerArgs.assertionsMode)
override fun applySpecificArgs(argsBuilder: ArgsBuilder) = with(argsBuilder) {
@@ -360,7 +361,8 @@ internal class BinaryLibraryCompilation(
}
add(
"-produce", libraryKind,
"-output", expectedArtifact.libraryFile.absolutePath
"-output", expectedArtifact.libraryFile.absolutePath,
cinterfaceMode
)
super.applySpecificArgs(argsBuilder)
}
@@ -299,3 +299,8 @@ internal enum class CompilerOutputInterceptor {
internal enum class BinaryLibraryKind {
STATIC, DYNAMIC
}
internal enum class CInterfaceMode(val compilerFlag: String) {
V1("-Xbinary=cInterfaceMode=v1"),
NONE("-Xbinary=cInterfaceMode=none")
}