From 2b2c6858272bffdda058f5d0afccc55a9c55f2db Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Thu, 15 Feb 2024 13:57:30 +0100 Subject: [PATCH] [K/N][Tests] Migrate dylib-interop-exe tests ^KT-61259 --- .../backend.native/tests/build.gradle | 303 ------------------ .../objcExceptionMode_default.out | 1 - .../objcExceptionMode_wrap.out | 1 - .../interop/objc/include_categories/main.out | 10 - .../objc_include_categories.def | 4 - .../tests/interop/objc/kt42172/main.out | 1 - .../tests/interop/objc/kt42172/objclib.def | 3 - .../tests/interop/objc/kt55938/lib.kt | 11 - .../tests/interop/objc/kt55938/main.kt | 10 - .../tests/interop/objc/kt55938/main.out | 1 - .../tests/interop/objc/kt55938/objclib.def | 3 - .../tests/interop/objc/kt55938/objclib.h | 5 - .../tests/interop/objc/kt55938/objclib.m | 11 - .../tests/interop/objc/kt56402/objclib.def | 3 - .../objc/objc_friendly_dealloc/objclib.def | 3 - .../objc_with_initializer/objc_misc.def | 5 - .../objc_with_initializer/objc_test.out | 1 - .../testData/codegen/cinterop/kt55938.kt | 40 +++ .../foreignException/objcExceptionMode.def | 2 +- .../objcExceptionMode_default.kt | 0 .../objcExceptionMode_wrap.kt | 0 .../objc/foreignException/objc_wrap.def | 2 +- .../interop/objc/foreignException/objc_wrap.h | 0 .../objc/foreignException/objc_wrap.kt | 0 .../interop/objc/foreignException/objc_wrap.m | 0 .../friendly_dealloc/friendly_dealloc.def | 3 + .../objc/friendly_dealloc/friendly_dealloc.h | 0 .../objc/friendly_dealloc/friendly_dealloc.kt | 3 +- .../objc/friendly_dealloc/friendly_dealloc.m | 2 +- .../include_categories/include_categories.def | 4 + .../include_categories/include_categories.h | 0 .../include_categories/include_categories.kt | 2 +- .../include_categories/include_categories.m | 2 +- .../testData/interop/objc/kt42172/kt42172.def | 3 + .../testData/interop/objc/kt42172/kt42172.h | 0 .../testData/interop/objc/kt42172/kt42172.kt | 2 +- .../testData/interop/objc/kt42172/kt42172.m | 2 +- .../testData/interop/objc/kt56402/kt56402.def | 3 + .../testData/interop/objc/kt56402/kt56402.h | 0 .../testData/interop/objc/kt56402/kt56402.kt | 4 +- .../testData/interop/objc/kt56402/kt56402.m | 2 +- .../interop/objc/messaging}/messaging.def | 2 +- .../interop/objc/messaging}/messaging.h | 0 .../interop/objc/messaging/messaging.kt | 0 .../interop/objc/messaging}/messaging.m | 0 .../interop/objc/objCAction/objCAction.def | 2 +- .../interop/objc/objCAction/objCAction.h | 0 .../interop/objc/objCAction/objCAction.kt | 2 +- .../interop/objc/objCAction/objCAction.m | 2 +- .../with_initializer/with_initializer.def | 5 + .../objc/with_initializer/with_initializer.h | 0 .../objc/with_initializer/with_initializer.kt | 2 +- .../objc/with_initializer/with_initializer.m | 2 +- .../FirNativeCodegenLocalTestGenerated.java | 6 + .../NativeCodegenLocalTestGenerated.java | 6 + .../test/blackbox/ComplexCInteropTest.kt | 194 ++++++++++- 56 files changed, 278 insertions(+), 397 deletions(-) delete mode 100644 kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.out delete mode 100644 kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.out delete mode 100644 kotlin-native/backend.native/tests/interop/objc/include_categories/main.out delete mode 100644 kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt42172/main.out delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/lib.kt delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/main.kt delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/main.out delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.h delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.m delete mode 100644 kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.def delete mode 100644 kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.out create mode 100644 native/native.tests/testData/codegen/cinterop/kt55938.kt rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objcExceptionMode.def (62%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objcExceptionMode_default.kt (100%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objcExceptionMode_wrap.kt (100%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objc_wrap.def (72%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objc_wrap.h (100%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objc_wrap.kt (100%) rename {kotlin-native/backend.native/tests => native/native.tests/testData}/interop/objc/foreignException/objc_wrap.m (100%) create mode 100644 native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.def rename kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.h => native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.h (100%) rename kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/main.kt => native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.kt (98%) rename kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.m => native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.m (94%) create mode 100644 native/native.tests/testData/interop/objc/include_categories/include_categories.def rename kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.h => native/native.tests/testData/interop/objc/include_categories/include_categories.h (100%) rename kotlin-native/backend.native/tests/interop/objc/include_categories/main.kt => native/native.tests/testData/interop/objc/include_categories/include_categories.kt (96%) rename kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.m => native/native.tests/testData/interop/objc/include_categories/include_categories.m (94%) create mode 100644 native/native.tests/testData/interop/objc/kt42172/kt42172.def rename kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.h => native/native.tests/testData/interop/objc/kt42172/kt42172.h (100%) rename kotlin-native/backend.native/tests/interop/objc/kt42172/main.kt => native/native.tests/testData/interop/objc/kt42172/kt42172.kt (98%) rename kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.m => native/native.tests/testData/interop/objc/kt42172/kt42172.m (92%) create mode 100644 native/native.tests/testData/interop/objc/kt56402/kt56402.def rename kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.h => native/native.tests/testData/interop/objc/kt56402/kt56402.h (100%) rename kotlin-native/backend.native/tests/interop/objc/kt56402/main.kt => native/native.tests/testData/interop/objc/kt56402/kt56402.kt (98%) rename kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.m => native/native.tests/testData/interop/objc/kt56402/kt56402.m (99%) rename {kotlin-native/backend.native/tests/interop/objc/msg_send => native/native.tests/testData/interop/objc/messaging}/messaging.def (65%) rename {kotlin-native/backend.native/tests/interop/objc/msg_send => native/native.tests/testData/interop/objc/messaging}/messaging.h (100%) rename kotlin-native/backend.native/tests/interop/objc/msg_send/main.kt => native/native.tests/testData/interop/objc/messaging/messaging.kt (100%) rename {kotlin-native/backend.native/tests/interop/objc/msg_send => native/native.tests/testData/interop/objc/messaging}/messaging.m (100%) rename kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.def => native/native.tests/testData/interop/objc/objCAction/objCAction.def (61%) rename kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.h => native/native.tests/testData/interop/objc/objCAction/objCAction.h (100%) rename kotlin-native/backend.native/tests/interop/objc/objCAction/main.kt => native/native.tests/testData/interop/objc/objCAction/objCAction.kt (99%) rename kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.m => native/native.tests/testData/interop/objc/objCAction/objCAction.m (98%) create mode 100644 native/native.tests/testData/interop/objc/with_initializer/with_initializer.def rename kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.h => native/native.tests/testData/interop/objc/with_initializer/with_initializer.h (100%) rename kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.kt => native/native.tests/testData/interop/objc/with_initializer/with_initializer.kt (88%) rename kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.m => native/native.tests/testData/interop/objc/with_initializer/with_initializer.m (86%) diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index d0a6a2ea4e1..f0ab53253e8 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -963,73 +963,6 @@ createInterop("workerSignals") { } if (PlatformInfo.isAppleTarget(project)) { - createInterop("objcSmoke") { - it.defFile 'interop/objc/objcSmoke.def' - it.headers "$projectDir/interop/objc/smoke.h" - } - - createInterop("objcTests") { - it.defFile 'interop/objc/objcTests.def' - it.headers fileTree("$projectDir/interop/objc/tests") { include '**/*.h' } - } - - createInterop("objcMisc") { - it.defFile 'interop/objc_with_initializer/objc_misc.def' - it.headers "$projectDir/interop/objc_with_initializer/objc_misc.h" - } - - createInterop("objcMessaging") { - it.defFile 'interop/objc/msg_send/messaging.def' - it.headers "$projectDir/interop/objc/msg_send/messaging.h" - } - - createInterop("foreignException") { - it.defFile 'interop/objc/foreignException/objc_wrap.def' - it.headers "$projectDir/interop/objc/foreignException/objc_wrap.h" - } - - createInterop("foreignExceptionMode_default") { - it.defFile 'interop/objc/foreignException/objcExceptionMode.def' - it.headers "$projectDir/interop/objc/foreignException/objc_wrap.h" - } - - createInterop("foreignExceptionMode_wrap") { - it.defFile 'interop/objc/foreignException/objcExceptionMode.def' - it.headers "$projectDir/interop/objc/foreignException/objc_wrap.h" - it.extraOpts '-Xforeign-exception-mode', "objc-wrap" - } - - createInterop("objcKt43517") { - it.defFile 'framework/kt43517/kt43517.def' - } - createInterop("objc_kt42172") { - it.defFile 'interop/objc/kt42172/objclib.def' - it.headers "$projectDir/interop/objc/kt42172/objclib.h" - } - createInterop("objc_kt55938") { - it.defFile 'interop/objc/kt55938/objclib.def' - it.headers "$projectDir/interop/objc/kt55938/objclib.h" - } - - createInterop("objc_include_categories") { - it.defFile 'interop/objc/include_categories/objc_include_categories.def' - it.headers "$projectDir/interop/objc/include_categories/objc_include_categories.h" - } - createInterop("frameworkForwardDeclarations") { - it.defFile 'framework/forwardDeclarations/clib.def' - } - createInterop("objc_kt56402") { - it.defFile 'interop/objc/kt56402/objclib.def' - it.headers "$projectDir/interop/objc/kt56402/objclib.h" - } - createInterop("objc_friendly_dealloc") { - it.defFile 'interop/objc/objc_friendly_dealloc/objclib.def' - it.headers "$projectDir/interop/objc/objc_friendly_dealloc/objclib.h" - } - createInterop("objCAction") { - it.defFile 'interop/objc/objCAction/objclib.def' - it.headers "$projectDir/interop/objc/objCAction/objclib.h" - } createInterop("kt63423_dispose_on_main_stress") { it.defFile 'interop/objc/kt63423_dispose_on_main_stress/objclib.def' it.headers "$projectDir/interop/objc/kt63423_dispose_on_main_stress/objclib.h" @@ -1157,160 +1090,6 @@ if (PlatformInfo.isAppleTarget(project)) { UtilsKt.dependsOnPlatformLibs(it) } - - interopTest("interop_objc_global_initializer") { - useGoldenData = true - source = "interop/objc_with_initializer/objc_test.kt" - interop = 'objcMisc' - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcmisc.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc_with_initializer/objc_misc.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_msg_send") { - source = "interop/objc/msg_send/main.kt" - interop = 'objcMessaging' - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcmessaging.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/msg_send/messaging.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_foreignException") { - source = "interop/objc/foreignException/objc_wrap.kt" - interop = 'foreignException' - UtilsKt.dependsOnPlatformLibs(it) - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcexception.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/foreignException/objc_wrap.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_foreignExceptionMode_wrap") { - source = "interop/objc/foreignException/objcExceptionMode_wrap.kt" - interop = 'foreignExceptionMode_wrap' - useGoldenData = true - UtilsKt.dependsOnPlatformLibs(it) - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcexception.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/foreignException/objc_wrap.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_foreignExceptionMode_default") { - source = "interop/objc/foreignException/objcExceptionMode_default.kt" - interop = 'foreignExceptionMode_default' - useGoldenData = true - UtilsKt.dependsOnPlatformLibs(it) - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcexception.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/foreignException/objc_wrap.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_kt42172") { - enabled = !isNoopGC - source = "interop/objc/kt42172/main.kt" - interop = "objc_kt42172" - flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative'] - useGoldenData = true - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjc_kt42172.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/kt42172/objclib.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_kt55938") { - source = "interop/objc/kt55938/main.kt" - lib = "interop/objc/kt55938/lib.kt" - interop = "objc_kt55938" - useGoldenData = true - enabled = cacheTesting != null - flags = [ - "-Xauto-cache-from=$testOutputRoot/local/objc_kt55938", - "-Xauto-cache-from=$testOutputRoot/local/interop_objc_kt55938", - "-Xauto-cache-dir=$testOutputRoot/local/interop_objc_kt55938/cache", - "-Xsuppress-version-warnings", // suppresses warning about experimental language version, otherwise test fails with K2 due to -Werror - "-Werror" // to forbid retry with auto-cache disabled - ] - - UtilsKt.findKonanBuildTask(project, "objc_kt55938", target).configure { - it.doFirst { - def cacheDir = new File("$testOutputRoot/local/interop_objc_kt55938/cache") - cacheDir.deleteDir() - mkdir(cacheDir) - } - } - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjc_kt55938.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/kt55938/objclib.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - standaloneTest("objc_arc_contract") { def bcFile = project.layout.buildDirectory.file("objc_arc_contract.bc").get().asFile doBeforeBuild { @@ -1325,24 +1104,6 @@ if (PlatformInfo.isAppleTarget(project)) { flags = ["-native-library", bcFile.toString()] } - interopTest("interop_objc_include_categories") { - useGoldenData = true - source = "interop/objc/include_categories/main.kt" - interop = "objc_include_categories" - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjcincludecategories.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/include_categories/objc_include_categories.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - standaloneTest("interop_kt55653") { // Test depends on macOS-specific AppKit enabled = (project.testTarget == 'macos_x64' || project.testTarget == 'macos_arm64' || project.testTarget == null) @@ -1359,70 +1120,6 @@ if (PlatformInfo.isAppleTarget(project)) { UtilsKt.dependsOnPlatformLibs(it) } - interopTest("interop_objc_kt56402") { - // Test depends on macOS-specific AppKit - enabled = (project.testTarget == 'macos_x64' || project.testTarget == 'macos_arm64' || project.testTarget == null) - && !isNoopGC // requires some GC - source = 'interop/objc/kt56402/main.kt' - interop = "objc_kt56402" - flags = ["-tr", "-e", "runAllTests"] // Generate test suites, but use custom entrypoint. - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjc_kt56402.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/kt56402/objclib.m" - args "-g" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - args '-framework', 'AppKit' - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - } - - interopTest("interop_objc_friendly_dealloc") { - enabled = !isNoopGC // requires some GC - source = 'interop/objc/objc_friendly_dealloc/main.kt' - interop = "objc_friendly_dealloc" - flags = ["-tr"] - - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjc_friendly_dealloc.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/objc_friendly_dealloc/objclib.m" - args "-lobjc", '-fno-objc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - UtilsKt.dependsOnPlatformLibs(it) - } - - interopTest("interop_objCAction") { - source = 'interop/objc/objCAction/main.kt' - interop = "objCAction" - flags = ["-tr"] - doBeforeBuild { - def dylibFile = project.layout.buildDirectory.file("libobjCAction.dylib").get().asFile - mkdir(dylibFile.parentFile) - project.extensions.execClang.execClangForCompilerTests(project.target) { - args "$projectDir/interop/objc/objCAction/objclib.m" - args "-lobjc", '-fobjc-arc' - args '-fPIC', '-shared', '-o', dylibFile.toString() - } - if (UtilsKt.isSimulatorTarget(project, project.target)) { - UtilsKt.codesign(project, dylibFile.toString()) - } - } - UtilsKt.dependsOnPlatformLibs(it) - } - interopTest("interop_objc_kt63423_dispose_on_main_stress") { // Test depends on macOS-specific AppKit enabled = (project.testTarget == 'macos_x64' || project.testTarget == 'macos_arm64' || project.testTarget == null) diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.out b/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.out deleted file mode 100644 index 57f3ce1c06a..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.out +++ /dev/null @@ -1 +0,0 @@ -OK: Ends with uncaught exception handler diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.out b/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.out deleted file mode 100644 index 40000985f0b..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.out +++ /dev/null @@ -1 +0,0 @@ -OK: ForeignException diff --git a/kotlin-native/backend.native/tests/interop/objc/include_categories/main.out b/kotlin-native/backend.native/tests/interop/objc/include_categories/main.out deleted file mode 100644 index b4d3e584ab4..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/include_categories/main.out +++ /dev/null @@ -1,10 +0,0 @@ -3.0 -3.14 -6.0 - -3 -6 -6.0 - -3.0 -600.0 diff --git a/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.def b/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.def deleted file mode 100644 index 5a716852076..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.def +++ /dev/null @@ -1,4 +0,0 @@ -language = Objective-C -headerFilter = **/objc_include_categories.h -linkerOpts = -lobjcincludecategories -objcClassesIncludingCategories = BaseClass DerivedClass \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/kt42172/main.out b/kotlin-native/backend.native/tests/interop/objc/kt42172/main.out deleted file mode 100644 index a69cc2df1a7..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt42172/main.out +++ /dev/null @@ -1 +0,0 @@ -Executed finalizer diff --git a/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.def b/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.def deleted file mode 100644 index 65bbb0a8ba1..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.def +++ /dev/null @@ -1,3 +0,0 @@ -language = Objective-C -headerFilter = **/objclib.h -linkerOpts = -lobjc_kt42172 diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/lib.kt b/kotlin-native/backend.native/tests/interop/objc/kt55938/lib.kt deleted file mode 100644 index 56025b3bf2d..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/lib.kt +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright 2010-2023 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. - */ -@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) - -package kt55938lib - -import objclib.* - -inline fun foo() = ObjCClass.foo() diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/main.kt b/kotlin-native/backend.native/tests/interop/objc/kt55938/main.kt deleted file mode 100644 index d8c0c7b0432..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/main.kt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright 2010-2023 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. - */ - -import kt55938lib.* - -fun main() { - print("foo() call result is ${foo()}") -} \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/main.out b/kotlin-native/backend.native/tests/interop/objc/kt55938/main.out deleted file mode 100644 index 7b82c159e9f..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/main.out +++ /dev/null @@ -1 +0,0 @@ -foo() call result is 42 \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.def b/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.def deleted file mode 100644 index de366f8dd4c..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.def +++ /dev/null @@ -1,3 +0,0 @@ -language = Objective-C -headerFilter = **/objclib.h -linkerOpts = -lobjc_kt55938 diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.h b/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.h deleted file mode 100644 index 5103e881985..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.h +++ /dev/null @@ -1,5 +0,0 @@ -#import - -@interface ObjCClass : NSObject -+ (int)foo; -@end \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.m b/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.m deleted file mode 100644 index a0f318fb45a..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt55938/objclib.m +++ /dev/null @@ -1,11 +0,0 @@ -#include "objclib.h" - - -@implementation ObjCClass { -} - -+ (int)foo { - return 42; -} - -@end \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.def b/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.def deleted file mode 100644 index dddbd136f1c..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.def +++ /dev/null @@ -1,3 +0,0 @@ -language = Objective-C -headerFilter = **/objclib.h -linkerOpts = -lobjc_kt56402 diff --git a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.def b/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.def deleted file mode 100644 index e81baa18763..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.def +++ /dev/null @@ -1,3 +0,0 @@ -language = Objective-C -headerFilter = **/objclib.h -linkerOpts = -lobjc_friendly_dealloc diff --git a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.def b/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.def deleted file mode 100644 index df262119679..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.def +++ /dev/null @@ -1,5 +0,0 @@ -language = Objective-C -headers = Foundation/NSArray.h Foundation/NSValue.h Foundation/NSString.h -headerFilter = **/objc_misc.h Foundation/NSArray.h Foundation/NSValue.h Foundation/NSString.h -linkerOpts = -lobjcmisc - diff --git a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.out b/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.out deleted file mode 100644 index d86bac9de59..00000000000 --- a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.out +++ /dev/null @@ -1 +0,0 @@ -OK diff --git a/native/native.tests/testData/codegen/cinterop/kt55938.kt b/native/native.tests/testData/codegen/cinterop/kt55938.kt new file mode 100644 index 00000000000..b5ed0c23891 --- /dev/null +++ b/native/native.tests/testData/codegen/cinterop/kt55938.kt @@ -0,0 +1,40 @@ +// TARGET_BACKEND: NATIVE +// MODULE: cinterop +// FILE: kt55938.def +language = Objective-C +headers = kt55938.h + +// FILE: kt55938.h +#import + +@interface ObjCClass : NSObject ++ (int)foo; +@end + +// FILE: kt55938.m +#include "kt55938.h" + +@implementation ObjCClass { +} ++ (int)foo { + return 42; +} +@end + +// MODULE: lib(cinterop) +// FILE: lib.kt +@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) +package kt55938lib + +import kt55938.* +inline fun foo() = ObjCClass.foo() + +// MODULE: main(lib, cinterop) +// FILE: main.kt +import kt55938lib.* + +fun box(): String { + val foo = foo() + if (foo != 42) return "FAIL $foo" + return "OK" +} diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode.def b/native/native.tests/testData/interop/objc/foreignException/objcExceptionMode.def similarity index 62% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode.def rename to native/native.tests/testData/interop/objc/foreignException/objcExceptionMode.def index a4e99951650..55f0e84e6a2 100644 --- a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode.def +++ b/native/native.tests/testData/interop/objc/foreignException/objcExceptionMode.def @@ -1,3 +1,3 @@ language = Objective-C headerFilter = **/objc_wrap.h -linkerOpts = -lobjcexception +linkerOpts = -lforeignException diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.kt b/native/native.tests/testData/interop/objc/foreignException/objcExceptionMode_default.kt similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_default.kt rename to native/native.tests/testData/interop/objc/foreignException/objcExceptionMode_default.kt diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.kt b/native/native.tests/testData/interop/objc/foreignException/objcExceptionMode_wrap.kt similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objcExceptionMode_wrap.kt rename to native/native.tests/testData/interop/objc/foreignException/objcExceptionMode_wrap.kt diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.def b/native/native.tests/testData/interop/objc/foreignException/objc_wrap.def similarity index 72% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.def rename to native/native.tests/testData/interop/objc/foreignException/objc_wrap.def index 48416e6d2d0..a294e2bfec4 100644 --- a/kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.def +++ b/native/native.tests/testData/interop/objc/foreignException/objc_wrap.def @@ -1,4 +1,4 @@ language = Objective-C headerFilter = **/objc_wrap.h -linkerOpts = -lobjcexception +linkerOpts = -lforeignException foreignExceptionMode = objc-wrap diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.h b/native/native.tests/testData/interop/objc/foreignException/objc_wrap.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.h rename to native/native.tests/testData/interop/objc/foreignException/objc_wrap.h diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.kt b/native/native.tests/testData/interop/objc/foreignException/objc_wrap.kt similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.kt rename to native/native.tests/testData/interop/objc/foreignException/objc_wrap.kt diff --git a/kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.m b/native/native.tests/testData/interop/objc/foreignException/objc_wrap.m similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/foreignException/objc_wrap.m rename to native/native.tests/testData/interop/objc/foreignException/objc_wrap.m diff --git a/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.def b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.def new file mode 100644 index 00000000000..297e0ccffba --- /dev/null +++ b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.def @@ -0,0 +1,3 @@ +language = Objective-C +headerFilter = **/friendly_dealloc.h +linkerOpts = -lfriendly_dealloc diff --git a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.h b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.h rename to native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.h diff --git a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/main.kt b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.kt similarity index 98% rename from kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/main.kt rename to native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.kt index 710b3ac58b5..f2779929b18 100644 --- a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/main.kt +++ b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.kt @@ -4,7 +4,7 @@ */ @file:OptIn(kotlin.experimental.ExperimentalNativeApi::class) -import objclib.* +import friendly_dealloc.* import platform.objc.* import platform.Foundation.* @@ -15,7 +15,6 @@ import kotlin.system.exitProcess import kotlin.test.* import kotlin.time.* import kotlin.time.Duration.Companion.seconds -import kotlin.time.Duration.Companion.minutes import kotlinx.cinterop.* val timeout = 10.seconds diff --git a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.m b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.m similarity index 94% rename from kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.m rename to native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.m index 0794351e80d..27595c42f47 100644 --- a/kotlin-native/backend.native/tests/interop/objc/objc_friendly_dealloc/objclib.m +++ b/native/native.tests/testData/interop/objc/friendly_dealloc/friendly_dealloc.m @@ -1,4 +1,4 @@ -#include "objclib.h" +#include "friendly_dealloc.h" @implementation OnDestroyHook { void (^_onDestroy)(uintptr_t); diff --git a/native/native.tests/testData/interop/objc/include_categories/include_categories.def b/native/native.tests/testData/interop/objc/include_categories/include_categories.def new file mode 100644 index 00000000000..21fd366ea75 --- /dev/null +++ b/native/native.tests/testData/interop/objc/include_categories/include_categories.def @@ -0,0 +1,4 @@ +language = Objective-C +headerFilter = **/include_categories.h +linkerOpts = -linclude_categories +objcClassesIncludingCategories = BaseClass DerivedClass \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.h b/native/native.tests/testData/interop/objc/include_categories/include_categories.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.h rename to native/native.tests/testData/interop/objc/include_categories/include_categories.h diff --git a/kotlin-native/backend.native/tests/interop/objc/include_categories/main.kt b/native/native.tests/testData/interop/objc/include_categories/include_categories.kt similarity index 96% rename from kotlin-native/backend.native/tests/interop/objc/include_categories/main.kt rename to native/native.tests/testData/interop/objc/include_categories/include_categories.kt index 5d605a172bc..2bdc5bb0476 100644 --- a/kotlin-native/backend.native/tests/interop/objc/include_categories/main.kt +++ b/native/native.tests/testData/interop/objc/include_categories/include_categories.kt @@ -2,7 +2,7 @@ * Copyright 2010-2023 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. */ -import objc_include_categories.* +import include_categories.* class KotlinDerived : BaseClass() { override fun multiplyBy(value: Int): Float { diff --git a/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.m b/native/native.tests/testData/interop/objc/include_categories/include_categories.m similarity index 94% rename from kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.m rename to native/native.tests/testData/interop/objc/include_categories/include_categories.m index 768ba73c9b7..aa5c78b3c43 100644 --- a/kotlin-native/backend.native/tests/interop/objc/include_categories/objc_include_categories.m +++ b/native/native.tests/testData/interop/objc/include_categories/include_categories.m @@ -1,4 +1,4 @@ -#include "objc_include_categories.h" +#include "include_categories.h" @implementation BaseClass -(id) init { diff --git a/native/native.tests/testData/interop/objc/kt42172/kt42172.def b/native/native.tests/testData/interop/objc/kt42172/kt42172.def new file mode 100644 index 00000000000..01f7437ec9f --- /dev/null +++ b/native/native.tests/testData/interop/objc/kt42172/kt42172.def @@ -0,0 +1,3 @@ +language = Objective-C +headerFilter = **/kt42172.h +linkerOpts = -lkt42172 diff --git a/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.h b/native/native.tests/testData/interop/objc/kt42172/kt42172.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.h rename to native/native.tests/testData/interop/objc/kt42172/kt42172.h diff --git a/kotlin-native/backend.native/tests/interop/objc/kt42172/main.kt b/native/native.tests/testData/interop/objc/kt42172/kt42172.kt similarity index 98% rename from kotlin-native/backend.native/tests/interop/objc/kt42172/main.kt rename to native/native.tests/testData/interop/objc/kt42172/kt42172.kt index a1d05db3473..4ca643c9602 100644 --- a/kotlin-native/backend.native/tests/interop/objc/kt42172/main.kt +++ b/native/native.tests/testData/interop/objc/kt42172/kt42172.kt @@ -1,6 +1,6 @@ @file:OptIn(kotlin.experimental.ExperimentalNativeApi::class, kotlin.native.runtime.NativeRuntimeApi::class, ObsoleteWorkersApi::class) -import objclib.* +import kt42172.* import kotlin.native.concurrent.* import kotlinx.cinterop.* diff --git a/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.m b/native/native.tests/testData/interop/objc/kt42172/kt42172.m similarity index 92% rename from kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.m rename to native/native.tests/testData/interop/objc/kt42172/kt42172.m index 856eede0330..985c6d6d4fc 100644 --- a/kotlin-native/backend.native/tests/interop/objc/kt42172/objclib.m +++ b/native/native.tests/testData/interop/objc/kt42172/kt42172.m @@ -1,4 +1,4 @@ -#include "objclib.h" +#include "kt42172.h" @implementation WithFinalizer { Finalizer finalizer_; diff --git a/native/native.tests/testData/interop/objc/kt56402/kt56402.def b/native/native.tests/testData/interop/objc/kt56402/kt56402.def new file mode 100644 index 00000000000..e3564ec5ca0 --- /dev/null +++ b/native/native.tests/testData/interop/objc/kt56402/kt56402.def @@ -0,0 +1,3 @@ +language = Objective-C +headerFilter = **/kt56402.h +linkerOpts = -lkt56402 diff --git a/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.h b/native/native.tests/testData/interop/objc/kt56402/kt56402.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.h rename to native/native.tests/testData/interop/objc/kt56402/kt56402.h diff --git a/kotlin-native/backend.native/tests/interop/objc/kt56402/main.kt b/native/native.tests/testData/interop/objc/kt56402/kt56402.kt similarity index 98% rename from kotlin-native/backend.native/tests/interop/objc/kt56402/main.kt rename to native/native.tests/testData/interop/objc/kt56402/kt56402.kt index 774feab69b0..19f6f696a93 100644 --- a/kotlin-native/backend.native/tests/interop/objc/kt56402/main.kt +++ b/native/native.tests/testData/interop/objc/kt56402/kt56402.kt @@ -4,7 +4,7 @@ */ @file:OptIn(kotlin.experimental.ExperimentalNativeApi::class) -import objclib.* +import kt56402.* import kotlin.concurrent.AtomicInt import kotlin.native.concurrent.* @@ -185,7 +185,7 @@ fun testProtocolOnSecondaryThread() { waitDestruction(id) } -fun runAllTests(args: Array) = startApp { +fun main(args: Array) = startApp { val exitCode = testLauncherEntryPoint(args) if (exitCode != 0) { exitProcess(exitCode) diff --git a/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.m b/native/native.tests/testData/interop/objc/kt56402/kt56402.m similarity index 99% rename from kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.m rename to native/native.tests/testData/interop/objc/kt56402/kt56402.m index 311fc1a2eba..1f8ebfd8714 100644 --- a/kotlin-native/backend.native/tests/interop/objc/kt56402/objclib.m +++ b/native/native.tests/testData/interop/objc/kt56402/kt56402.m @@ -1,4 +1,4 @@ -#include "objclib.h" +#include "kt56402.h" #include #include diff --git a/kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.def b/native/native.tests/testData/interop/objc/messaging/messaging.def similarity index 65% rename from kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.def rename to native/native.tests/testData/interop/objc/messaging/messaging.def index c1aab35b013..774e400b2df 100644 --- a/kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.def +++ b/native/native.tests/testData/interop/objc/messaging/messaging.def @@ -1,3 +1,3 @@ language = Objective-C headerFilter = **/messaging.h -linkerOpts = -lobjcmessaging \ No newline at end of file +linkerOpts = -lmessaging \ No newline at end of file diff --git a/kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.h b/native/native.tests/testData/interop/objc/messaging/messaging.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.h rename to native/native.tests/testData/interop/objc/messaging/messaging.h diff --git a/kotlin-native/backend.native/tests/interop/objc/msg_send/main.kt b/native/native.tests/testData/interop/objc/messaging/messaging.kt similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/msg_send/main.kt rename to native/native.tests/testData/interop/objc/messaging/messaging.kt diff --git a/kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.m b/native/native.tests/testData/interop/objc/messaging/messaging.m similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/msg_send/messaging.m rename to native/native.tests/testData/interop/objc/messaging/messaging.m diff --git a/kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.def b/native/native.tests/testData/interop/objc/objCAction/objCAction.def similarity index 61% rename from kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.def rename to native/native.tests/testData/interop/objc/objCAction/objCAction.def index 9bca35b833d..e13bea56e4b 100644 --- a/kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.def +++ b/native/native.tests/testData/interop/objc/objCAction/objCAction.def @@ -1,3 +1,3 @@ language = Objective-C -headerFilter = **/objclib.h +headerFilter = **/objCAction.h linkerOpts = -lobjCAction diff --git a/kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.h b/native/native.tests/testData/interop/objc/objCAction/objCAction.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.h rename to native/native.tests/testData/interop/objc/objCAction/objCAction.h diff --git a/kotlin-native/backend.native/tests/interop/objc/objCAction/main.kt b/native/native.tests/testData/interop/objc/objCAction/objCAction.kt similarity index 99% rename from kotlin-native/backend.native/tests/interop/objc/objCAction/main.kt rename to native/native.tests/testData/interop/objc/objCAction/objCAction.kt index 4f26be70b97..4922b85d46e 100644 --- a/kotlin-native/backend.native/tests/interop/objc/objCAction/main.kt +++ b/native/native.tests/testData/interop/objc/objCAction/objCAction.kt @@ -5,7 +5,7 @@ @file:OptIn(kotlin.ExperimentalStdlibApi::class) -import objclib.* +import objCAction.* import platform.Foundation.* import kotlin.test.* diff --git a/kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.m b/native/native.tests/testData/interop/objc/objCAction/objCAction.m similarity index 98% rename from kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.m rename to native/native.tests/testData/interop/objc/objCAction/objCAction.m index b1e57cfccb7..5e84554bace 100644 --- a/kotlin-native/backend.native/tests/interop/objc/objCAction/objclib.m +++ b/native/native.tests/testData/interop/objc/objCAction/objCAction.m @@ -1,4 +1,4 @@ -#include "objclib.h" +#include "objCAction.h" void performSelector0(id target, NSString* selectorName) { NSLog(@"performSelector0(%@, %@)", target, selectorName); diff --git a/native/native.tests/testData/interop/objc/with_initializer/with_initializer.def b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.def new file mode 100644 index 00000000000..30c80bd6998 --- /dev/null +++ b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.def @@ -0,0 +1,5 @@ +language = Objective-C +headers = Foundation/NSArray.h Foundation/NSValue.h Foundation/NSString.h +headerFilter = **/with_initializer.h Foundation/NSArray.h Foundation/NSValue.h Foundation/NSString.h +linkerOpts = -lwith_initializer + diff --git a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.h b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.h similarity index 100% rename from kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.h rename to native/native.tests/testData/interop/objc/with_initializer/with_initializer.h diff --git a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.kt b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.kt similarity index 88% rename from kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.kt rename to native/native.tests/testData/interop/objc/with_initializer/with_initializer.kt index 93387a16e6a..e5e14d6f82b 100644 --- a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_test.kt +++ b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.kt @@ -1,6 +1,6 @@ @file:OptIn(kotlin.experimental.ExperimentalNativeApi::class) -import objc_misc.* +import with_initializer.* import kotlin.native.Platform val a = B.giveC()!! as C diff --git a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.m b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.m similarity index 86% rename from kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.m rename to native/native.tests/testData/interop/objc/with_initializer/with_initializer.m index a186c1ef729..5ef0093b818 100644 --- a/kotlin-native/backend.native/tests/interop/objc_with_initializer/objc_misc.m +++ b/native/native.tests/testData/interop/objc/with_initializer/with_initializer.m @@ -1,5 +1,5 @@ #import -#include "objc_misc.h" +#include "with_initializer.h" @implementation A @end diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java index 8914e715337..2c4999722dc 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/FirNativeCodegenLocalTestGenerated.java @@ -927,6 +927,12 @@ public class FirNativeCodegenLocalTestGenerated extends AbstractNativeCodegenBox runTest("native/native.tests/testData/codegen/cinterop/kt54284_fmodules.kt"); } + @Test + @TestMetadata("kt55938.kt") + public void testKt55938() { + runTest("native/native.tests/testData/codegen/cinterop/kt55938.kt"); + } + @Test @TestMetadata("kt57640.kt") public void testKt57640() { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java index 9c5fc4228d1..7f7d656c515 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/test/blackbox/NativeCodegenLocalTestGenerated.java @@ -905,6 +905,12 @@ public class NativeCodegenLocalTestGenerated extends AbstractNativeCodegenBoxTes runTest("native/native.tests/testData/codegen/cinterop/kt54284_fmodules.kt"); } + @Test + @TestMetadata("kt55938.kt") + public void testKt55938() { + runTest("native/native.tests/testData/codegen/cinterop/kt55938.kt"); + } + @Test @TestMetadata("kt57640.kt") public void testKt57640() { diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/ComplexCInteropTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/ComplexCInteropTest.kt index 86b8d28032b..8cbc63175a5 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/ComplexCInteropTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/ComplexCInteropTest.kt @@ -22,12 +22,14 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.settings.* import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts import org.jetbrains.kotlin.konan.test.blackbox.support.util.ClangDistribution import org.jetbrains.kotlin.konan.test.blackbox.support.util.compileWithClang +import org.jetbrains.kotlin.native.executors.RunProcessResult import org.jetbrains.kotlin.native.executors.runProcess import org.jetbrains.kotlin.test.TestMetadata import org.junit.jupiter.api.Assumptions import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import java.io.File +import kotlin.test.assertEquals import kotlin.test.assertTrue import kotlin.time.Duration @@ -205,6 +207,192 @@ abstract class ComplexCInteropTestBase : AbstractNativeSimpleTest() { runExecutableAndVerify(testCase, testExecutable) } + @Test + @TestMetadata("with_initializer") + fun testObjCWithGlobalInitializer() { + val execResult = testDylibCinteropExe("with_initializer") + assertEquals("OK", execResult.stdout) + } + + @Test + @TestMetadata("messaging") + fun testMessaging() { + testDylibCinteropExe("messaging") + } + + @Test + @TestMetadata("kt42172") + fun testKt42172() { + Assumptions.assumeFalse(testRunSettings.get() == GCType.NOOP) + val execResult = testDylibCinteropExe("kt42172") + assertEquals("Executed finalizer", execResult.stdout) + } + + @Test + @TestMetadata("include_categories") + fun testInclude_categories() { + val execResult = testDylibCinteropExe("include_categories") + assertEquals(""" + 3.0 + 3.14 + 6.0 + + 3 + 6 + 6.0 + + 3.0 + 600.0 + """.trimIndent(), execResult.stdout) + } + + @Test + @TestMetadata("kt56402") + fun testKt56402() { + // Test depends on macOS-specific AppKit and some GC + Assumptions.assumeTrue(targets.testTarget.family == Family.OSX) + Assumptions.assumeFalse(testRunSettings.get() == GCType.NOOP) + val execResult = testDylibCinteropExe( + "kt56402", + extraClangOpts = listOf("-framework", "AppKit", "-fobjc-arc"), + extraCompilerOpts = listOf("-tr"), + ) + assertTrue(execResult.stdout.contains("[ PASSED ] 8 tests")) + } + + @Test + @TestMetadata("friendly_dealloc") + fun testFriendly_dealloc() { + Assumptions.assumeFalse(testRunSettings.get() == GCType.NOOP) + val execResult = testDylibCinteropExe( + "friendly_dealloc", + extraClangOpts = listOf("-fno-objc-arc"), + extraCompilerOpts = listOf("-tr", "-XXLanguage:+ImplicitSignedToUnsignedIntegerConversion"), + extras = TestCase.WithTestRunnerExtras(TestRunnerType.DEFAULT), + ) + assertTrue(execResult.stdout.contains("[ PASSED ] 4 tests")) + } + + @Test + @TestMetadata("objCAction") + fun testObjCAction() { + val execResult = testDylibCinteropExe( + "objCAction", + extraCompilerOpts = listOf("-tr"), + extras = TestCase.WithTestRunnerExtras(TestRunnerType.DEFAULT), + ) + assertTrue(execResult.stdout.contains("[ PASSED ] 5 tests")) + } + + @Test + @TestMetadata("foreignException") + fun testForeignException() { + val res = testDylibCinteropExe( + "foreignException", + "objc_wrap.h", + "objc_wrap.m", + "objc_wrap.def", + "objc_wrap.kt", + ) + assertEquals("", res.stdout) + assertEquals("", res.stderr) + } + + @Test + @TestMetadata("foreignException") + fun testForeignExceptionMode_default() { + val res = testDylibCinteropExe( + "foreignException", + "objc_wrap.h", + "objc_wrap.m", + "objcExceptionMode.def", + "objcExceptionMode_wrap.kt", + ) + assertEquals("OK: Ends with uncaught exception handler", res.stdout) + assertEquals("", res.stderr) + } + + @Test + @TestMetadata("foreignException") + fun testForeignExceptionMode_wrap() { + val res = testDylibCinteropExe( + "foreignException", + "objc_wrap.h", + "objc_wrap.m", + "objcExceptionMode.def", + "objcExceptionMode_wrap.kt", + extraCinteropArgs = listOf("-Xforeign-exception-mode", "objc-wrap") + ) + assertEquals("OK: ForeignException", res.stdout) + assertEquals("", res.stderr) + } + + private fun testDylibCinteropExe( + testName: String, + extraClangOpts: List = listOf("-fobjc-arc"), + extraCompilerOpts: List = emptyList(), + extras: TestCase.Extras = TestCase.NoTestRunnerExtras("main"), + ): RunProcessResult { + return testDylibCinteropExe( + testName, + hFile = "$testName.h", + mFile = "$testName.m", + defFile = "$testName.def", + ktFile = "$testName.kt", + extraClangOpts = extraClangOpts, + extraCompilerOpts = extraCompilerOpts, + extras = extras, + ) + } + + private fun testDylibCinteropExe( + testName: String, + hFile: String, + mFile: String, + defFile: String, + ktFile: String, + extraCinteropArgs: List = emptyList(), + extraClangOpts: List = listOf("-fobjc-arc"), + extraCompilerOpts: List = emptyList(), + extras: TestCase.Extras = TestCase.NoTestRunnerExtras("main"), + ): RunProcessResult { + Assumptions.assumeTrue(targets.testTarget.family.isAppleFamily) + val srcDir = interopObjCDir.resolve(testName) + val dylib = compileDylib(testName, listOf(srcDir.resolve(mFile)), extraClangOpts) + if (testRunSettings.configurables.targetTriple.isSimulator) + codesign(dylib.resultingArtifact.path) + + val cinteropKlib = cinteropToLibrary( + targets = targets, + defFile = srcDir.resolve(defFile), + outputDir = buildDir, + freeCompilerArgs = TestCompilerArgs( + compilerArgs = emptyList(), + cinteropArgs = extraCinteropArgs + listOf("-header", srcDir.resolve(hFile).absolutePath) + ) + ).assertSuccess().resultingArtifact + + val testKind = when (extras) { + is TestCase.NoTestRunnerExtras -> TestKind.STANDALONE_NO_TR + is TestCase.WithTestRunnerExtras -> TestKind.STANDALONE + } + val testCase = generateTestCaseWithSingleFile( + sourceFile = srcDir.resolve(ktFile), + moduleName = testName, + testKind = testKind, + extras = extras, + freeCompilerArgs = TestCompilerArgs( + "-opt-in=kotlinx.cinterop.ExperimentalForeignApi", + "-opt-in=kotlin.native.internal.InternalForKotlinNative", + "-linker-option", "-L${buildDir.absolutePath}", + *extraCompilerOpts.toTypedArray() + ) + ) + + val success = compileToExecutable(testCase, cinteropKlib.asLibraryDependency()).assertSuccess() + return testRunSettings.executor.runProcess(success.resultingArtifact.executableFile.absolutePath) + } + @Test @TestMetadata("withSpaces.kt") fun testWithSpaces() { @@ -255,7 +443,7 @@ abstract class ComplexCInteropTestBase : AbstractNativeSimpleTest() { assertTrue(mapfile.exists()) } - private fun compileDylib(name: String, mSources: List): TestCompilationResult.Success { + private fun compileDylib(name: String, mSources: List, extraClangOpts: List = listOf("-fobjc-arc")): TestCompilationResult.Success { val clangResult = compileWithClang( clangDistribution = ClangDistribution.Llvm, sourceFiles = mSources, @@ -263,8 +451,8 @@ abstract class ComplexCInteropTestBase : AbstractNativeSimpleTest() { outputFile = buildDir.resolve("lib$name.dylib"), libraryDirectories = emptyList(), libraries = emptyList(), - additionalClangFlags = listOf( - "-DNS_FORMAT_ARGUMENT(A)=", "-lobjc", "-fobjc-arc", "-fPIC", "-shared", + additionalClangFlags = extraClangOpts + listOf( + "-DNS_FORMAT_ARGUMENT(A)=", "-lobjc", "-fPIC", "-shared", // Enable ARC optimizations to prevent some objects from leaking in Obj-C code due to exceptions: "-O2" ),