/* * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ import org.jetbrains.kotlin.gradle.plugin.tasks.KonanCompileNativeBinary import org.jetbrains.kotlin.* import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.UtilsKt import java.nio.file.Paths import java.util.regex.Pattern import static org.jetbrains.kotlin.konan.target.Architecture.* buildscript { repositories { if (UtilsKt.getCacheRedirectorEnabled(project)) maven { url 'https://cache-redirector.jetbrains.com/maven-central'} else mavenCentral() maven { url project.bootstrapKotlinRepo } } ext.useCustomDist = UtilsKt.getUseCustomDist(project) ext.kotlinNativeDist = UtilsKt.getKotlinNativeDist(project) if (!useCustomDist) { ext.setProperty("kotlin.native.home", kotlinNativeDist.absolutePath) ext.setProperty("org.jetbrains.kotlin.native.home", kotlinNativeDist.absolutePath) ext.setProperty("konan.home", kotlinNativeDist.absolutePath) } } apply plugin: 'konan' apply plugin: 'kotlin' configurations { cli_bc update_tests update_stdlib_tests nopPluginApi api.extendsFrom nopPluginApi } dependencies { api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' cli_bc project(path: ':kotlin-native:backend.native', configuration: 'cli_bcApiElements') } ext.testOutputRoot = rootProject.file("test.output").absolutePath ext.externalTestsDir = project.file("build/external") ext.externalStdlibTestsDir = project.file("build/stdlib_external/stdlib") externalTestsDir.mkdirs() externalStdlibTestsDir.mkdirs() ext.platformManager = project.project(":kotlin-native").platformManager ext.target = platformManager.targetManager(project.testTarget).target ext.testLibraryDir = "${ext.testOutputRoot}/klib/platform/${project.target.name}" // Add executor to run tests depending on a target project.extensions.executor = ExecutorServiceKt.create(project) compileTestKotlin { kotlinOptions { freeCompilerArgs += "-Xskip-prerelease-check" } } // Do not generate run tasks for konan built artifacts ext.konanNoRun = true final CacheTesting cacheTesting = CacheTestingKt.configureCacheTesting(project) if (cacheTesting != null) { // Check for debug build and set the -g option. if (project.globalTestArgs.contains("-opt")) { throw new IllegalArgumentException("Cache testing should be run with debug build. " + "Remove -opt options from the test args") } if (!project.globalTestArgs.contains("-g")) { project.globalTestArgs.add("-g") } // Note: can't do this in [CacheTesting.configure] since task classes aren't accessible there. tasks.withType(KonanCompileNativeBinary.class).configureEach { dependsOn cacheTesting.buildCacheTask extraOpts cacheTesting.compilerArgs } tasks.withType(RunExternalTestGroup.class).configureEach { dependsOn cacheTesting.buildCacheTask flags = (flags ?: []) + cacheTesting.compilerArgs } } // Enable two-stage test compilation if the test_two_stage property is set. ext.twoStageEnabled = project.hasProperty("test_two_stage") tasks.withType(KonanCompileNativeBinary.class).configureEach { enableTwoStageCompilation = twoStageEnabled } tasks.withType(RunExternalTestGroup.class).configureEach { enableTwoStageCompilation = twoStageEnabled } ext.isExperimentalMM = project.globalTestArgs.contains("-memory-model") && project.globalTestArgs.contains("experimental") ext.isNoopGC = project.globalTestArgs.contains("-Xgc=noop") if (ext.isExperimentalMM) { // TODO: Make it more aggressive and only turn it on for a subset of tests. tasks.withType(KonanCompileNativeBinary.class).configureEach { extraOpts "-Xgc-aggressive" } } // TODO: It also makes sense to test -g without asserts, and also to test -opt with asserts. if (project.globalTestArgs.contains("-g")) { tasks.withType(KonanCompileNativeBinary.class).configureEach { extraOpts "-Xbinary=runtimeAssertionsMode=panic" } tasks.withType(RunExternalTestGroup.class).configureEach { flags = (flags ?: []) + "-Xbinary=runtimeAssertionsMode=panic" } } allprojects { // Root directories for test output (logs, compiled files, statistics etc). Only single path must be in each set. // backend.native/tests ext.testOutputLocal = rootProject.file("$testOutputRoot/local") // backend.native/tests/external ext.testOutputExternal = rootProject.file("$testOutputRoot/external") // backend.native/tests/stdlib_external ext.testOutputStdlib = rootProject.file("$testOutputRoot/stdlib") // backend.native/tests/framework ext.testOutputFramework = rootProject.file("$testOutputRoot/framework") // backent.native/tests/coverage ext.testOutputCoverage = rootProject.file("$testOutputRoot/coverage") ext.testOutputFileCheck = rootProject.file("$testOutputRoot/filecheck") } testOutputExternal.mkdirs() testOutputStdlib.mkdirs() konanArtifacts { library('testLibrary') { srcDir 'testLibrary' } library('baseTestClass', targets: [target]) { srcFiles 'testing/library.kt' } UtilsKt.dependsOnDist(UtilsKt.findKonanBuildTask(project, "testLibrary", HostManager.@Companion.getHost())) } configure(project.tasks.findByName("compileKonanBaseTestClass${UtilsKt.getTestTargetSuffix(project)}")) { UtilsKt.dependsOnDist(it) } def installTestLib = tasks.register("installTestLibrary", KonanKlibInstallTask) { dependsOn "compileKonanTestLibraryHost" klib = project.provider { konanArtifacts.testLibrary.getArtifactByTarget('host') } repo = rootProject.file(testLibraryDir) doLast { // Remove the version in build/, so that we don't link two copies. def file = project.file("build/konan/libs/${project.target.name}/testLibrary.klib") file.delete() } } void konanc(String[] args) { def konancScript = isWindows() ? "konanc.bat" : "konanc" def konanc = "$kotlinNativeDist/bin/$konancScript" def allArgs = args.join(" ") println("$konanc $allArgs") "$konanc $allArgs".execute().waitFor() } clean { doLast { delete(project(":kotlin-native").file(testOutputRoot)) } } TaskCollection tasksOf(Class type, Closure filter = { return true }) { String prefix = project.findProperty("prefix") project.tasks.withType(type) .matching { filter(it) && it.enabled && (prefix != null ? it.name.startsWith(prefix) : true) } } run { dependsOn(tasksOf(KonanTest)) // Add framework tests dependsOn(tasksOf(FrameworkTest)) dependsOn(tasksOf(MetadataComparisonTest)) // Add regular gradle test tasks dependsOn(tasksOf(Test)) dependsOn(tasksOf(CoverageTest)) dependsOn(":kotlin-native:Interop:Indexer:check") } task sanity { def platformLibsTasks =":distPlatformLibs" + ":kotlin-native:platformLibs" dependsOn(tasksOf(KonanTest) { task -> !UtilsKt.isDependsOnPlatformLibs(task) && task.name != "library_mismatch" // This test requires the wasm32 stdlib which is unavailable during a sanity run. }) // Add framework tests dependsOn(tasksOf(FrameworkTest) { task -> !UtilsKt.isDependsOnPlatformLibs(task) }) dependsOn(tasksOf(MetadataComparisonTest)) // Add regular gradle test tasks dependsOn(tasksOf(Test)) dependsOn(tasksOf(CoverageTest)) dependsOn(tasksOf(FileCheckTest)) dependsOn(":kotlin-native:Interop:Indexer:check") dependsOn(":kotlin-native:Interop:StubGenerator:check") } // Collect reports in one json. task resultsTask() { doLast { List reports = [] def statistics = new Statistics() tasks.withType(RunExternalTestGroup).matching { it.state.executed }.each { reports += new KonanTestGroupReport(it.name, it.testGroupReporter.suiteReports) statistics.add(it.testGroupReporter.statistics) } tasks.withType(KonanGTest).matching { it.state.executed }.each { statistics.add(it.statistics) } ExternalReportUtilsKt.saveReport("$testOutputExternal/reports.json", statistics, reports) use(KonanTestSuiteReportKt) { project.logger.quiet("DONE.\n\n" + "TOTAL: $statistics.total\n" + "PASSED: $statistics.passed\n" + "FAILED: $statistics.failed\n" + (statistics.error != 0 ? "ERROR: $statistics.error\n" : "") + "SKIPPED: $statistics.skipped") } } } boolean isExcluded(String dir) { // List of tests that fail due to unresolved compiler bugs def excluded = [ ] boolean result = false excluded.forEach { if (dir.endsWith(it.replace("/", File.separator))) { result = true } } return result } /** * Creates a task for a standalone test. Configures runner and adds building task. */ Task standaloneTest(String name, Closure configureClosure) { return KotlinNativeTestKt.createTest(project, name, KonanStandaloneTest) { task -> task.configure(configureClosure) if (task.enabled) { konanArtifacts { program(name, targets: [target.name]) { baseDir "$testOutputLocal/$name" srcFiles task.getSources() extraOpts task.flags extraOpts project.globalTestArgs } } } } } /** * Creates a task for a linking test. Configures runner and adds library and test build tasks. */ Task linkTest(String name, Closure configureClosure) { return KotlinNativeTestKt.createTest(project, name, KonanLinkTest) { task -> task.configure(configureClosure) if (task.enabled) { konanArtifacts { def lib = "lib$name" def targetName = target.name // build a library from KonanLinkTest::lib property library(lib, targets: [targetName]) { srcFiles task.lib baseDir "$testOutputLocal/$name" extraOpts task.flags extraOpts project.globalTestArgs } UtilsKt.dependsOnKonanBuildingTask(task, lib, target) // Build an executable with library program(name, targets: [targetName]) { libraries { klib lib } baseDir "$testOutputLocal/$name" srcFiles task.getSources() extraOpts task.flags extraOpts project.globalTestArgs } } } } } /** * Creates a task for a dynamic test. Configures runner and adds library and test build tasks. */ Task dynamicTest(String name, Closure configureClosure) { return KotlinNativeTestKt.createTest(project, name, KonanDynamicTest) { task -> task.configure(configureClosure) if (task.enabled) { konanArtifacts { def targetName = target.name def lib = task.interop if (lib != null) { UtilsKt.dependsOnKonanBuildingTask(task, lib, target) } dynamic(name, targets: [targetName]) { if (lib != null) { libraries { artifact lib } } srcFiles task.getSources() baseDir "$testOutputLocal/$name" extraOpts task.flags extraOpts project.globalTestArgs if (targetName == "mingw_x64" || targetName == "mingw_x86") { extraOpts "-linker-option", "-Wl,--out-implib,$testOutputLocal/$name/$targetName/${name}.dll.a" } } } def buildTask = UtilsKt.findKonanBuildTask(project, name, target) UtilsKt.dependsOnDist(buildTask) } } } Map> ignoredTests = [:] task run_external () { outputs.upToDateWhen{ false } rootProject.files( 'compiler/testData/codegen/box', 'compiler/testData/codegen/boxInline' ).asFileTree.visit { file -> if (!file.isDirectory() || !file.file.list().any{ it.endsWith(".kt")}) return def taskPath = rootProject.relativePath(file.file) def fileSeparator = System.properties["file.separator"] def taskName = taskPath.split("\\$fileSeparator").join('_') project.tasks.register(taskName, RunExternalTestGroup) { it.groupDirectory = taskPath it.finalizedBy resultsTask it.ignoredTests = ignoredTests[taskName] } } // Set up dependencies. dependsOn(tasksOf(RunExternalTestGroup)) dependsOn("stdlibTest") dependsOn("stdlibTestInWorker") } task daily() { dependsOn(run_external) } task slackReport(type:Reporter) { reportHome = rootProject.file("test.output").absoluteFile } task slackReportNightly(type:NightlyReporter) { externalMacosReport = "external_macos_results/reports.json" externalLinuxReport = "external_linux_results/reports.json" externalWindowsReport = "external_windows_results/reports.json" } linkTest("localDelegatedPropertyLink") { source = "lower/local_delegated_property_link/main.kt" lib = "lower/local_delegated_property_link/lib.kt" } task sum(type: KonanLocalTest) { source = "codegen/function/sum.kt" } task method_call(type: KonanLocalTest) { source = "codegen/object/method_call.kt" } task fields(type: KonanLocalTest) { source = "codegen/object/fields.kt" } task fields1(type: KonanLocalTest) { source = "codegen/object/fields1.kt" } task fields2(type: KonanLocalTest) { useGoldenData = true source = "codegen/object/fields2.kt" } // This test checks object layout can't be done in // KonanLocalTest paradigm //task constructor(type: UnitKonanTest) { // source = "codegen/object/constructor.kt" //} task objectInitialization(type: KonanLocalTest) { source = "codegen/object/initialization.kt" } task objectInitialization1(type: KonanLocalTest) { useGoldenData = true source = "codegen/object/initialization1.kt" } standaloneTest("object_globalInitializer") { source = "codegen/object/globalInitializer.kt" } task check_type(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/check_type.kt" } task safe_cast(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/safe_cast.kt" } task typealias1(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/typealias1.kt" } task aritmetic(type: KonanLocalTest) { source = "codegen/function/arithmetic.kt" } task sum1(type: KonanLocalTest) { source = "codegen/function/sum_foo_bar.kt" } task sum2(type: KonanLocalTest) { source = "codegen/function/sum_imm.kt" } task sum_func(type: KonanLocalTest) { source = "codegen/function/sum_func.kt" } task sum_mixed(type: KonanLocalTest) { source = "codegen/function/sum_mixed.kt" } task sum_illy(type: KonanLocalTest) { source = "codegen/function/sum_silly.kt" } task function_defaults(type: KonanLocalTest) { source = "codegen/function/defaults.kt" } task function_defaults1(type: KonanLocalTest) { source = "codegen/function/defaults1.kt" } task function_defaults2(type: KonanLocalTest) { source = "codegen/function/defaults2.kt" } task function_defaults3(type: KonanLocalTest) { source = "codegen/function/defaults3.kt" } task function_defaults4(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults4.kt" } task function_defaults5(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults5.kt" } task function_defaults6(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults6.kt" } task function_defaults7(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults7.kt" } task function_defaults8(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults8.kt" } task function_defaults9(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults9.kt" } task function_defaults10(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaults10.kt" } task function_defaults_from_fake_override(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaultsFromFakeOverride.kt" } task function_defaults_with_vararg1(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaultsWithVarArg1.kt" } task function_defaults_with_vararg2(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/defaultsWithVarArg2.kt" } task function_defaults_with_inline_classes(type: KonanLocalTest) { source = "codegen/function/defaultsWithInlineClasses.kt" } task sum_3const(type: KonanLocalTest) { source = "codegen/function/sum_3const.kt" } standaloneTest("function_nothingN_returning_safe_call") { flags = ["-g", "-entry", "codegen.function.nothingN_returning_safe_call.main"] source = "codegen/function/nothingNReturningSafeCall.kt" } standaloneTest("unreachable_statement_after_return") { flags = ["-g", "-entry", "codegen.function.unreachable_statement_after_return.main"] source = "codegen/function/unreachableStatementAfterReturn.kt" useGoldenData = true } task codegen_controlflow_for_loops(type: KonanLocalTest) { source = "codegen/controlflow/for_loops.kt" useGoldenData = true } task codegen_controlflow_for_loops_types(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_types.kt" useGoldenData = true } task codegen_controlflow_for_loops_overflow(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_overflow.kt" useGoldenData = true } task codegen_controlflow_for_loops_errors(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Uses exceptions. source = "codegen/controlflow/for_loops_errors.kt" useGoldenData = true } task codegen_controlflow_for_loops_empty_range(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_empty_range.kt" useGoldenData = true } task codegen_controlflow_for_loops_nested(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_nested.kt" useGoldenData = true } task codegen_controlflow_for_loops_coroutines(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_coroutines.kt" useGoldenData = true } task codegen_controlflow_for_loops_let_with_nullable(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_let_with_nullable.kt" useGoldenData = true } task codegen_controlflow_for_loops_call_order(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_call_order.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_indices(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_indices.kt" useGoldenData = true } task codegen_controlflow_for_loops_array(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_nested(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_nested.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_side_effects(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_side_effects.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_break_continue(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_break_continue.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_mutation(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_mutation.kt" useGoldenData = true } task codegen_controlflow_for_loops_array_nullable(type: KonanLocalTest) { source = "codegen/controlflow/for_loops_array_nullable.kt" useGoldenData = true } task local_variable(type: KonanLocalTest) { source = "codegen/basics/local_variable.kt" } task canonical_name(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/canonical_name.kt" } task cast_simple(type: KonanLocalTest) { source = "codegen/basics/cast_simple.kt" } task cast_null(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/basics/cast_null.kt" } task unchecked_cast1(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/unchecked_cast1.kt" } task unchecked_cast2(type: KonanLocalTest) { enabled = false useGoldenData = true source = "codegen/basics/unchecked_cast2.kt" } task unchecked_cast3(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/basics/unchecked_cast3.kt" } task unchecked_cast4(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/basics/unchecked_cast4.kt" } task null_check(type: KonanLocalTest) { source = "codegen/basics/null_check.kt" } task array_to_any(type: KonanLocalTest) { source = "codegen/basics/array_to_any.kt" } standaloneTest("runtime_basic_init") { source = "runtime/basic/init.kt" expectedExitStatus = 0 } standaloneTest("runtime_basic_exit") { source = "runtime/basic/exit.kt" expectedExitStatus = 42 } task runtime_random(type: KonanLocalTest) { source = "runtime/basic/random.kt" } task runtime_basic_simd(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "runtime/basic/simd.kt" } task runtime_worker_random(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Uses workers. source = "runtime/basic/worker_random.kt" } task hello0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/hello0.kt" } task stringTrim(type: KonanLocalTest) { source = "codegen/stringTrim/stringTrim.kt" } standaloneTest("hello1") { useGoldenData = true useTestData = true source = "runtime/basic/hello1.kt" } standaloneTest("hello2") { useGoldenData = true useTestData = true source = "runtime/basic/hello2.kt" } standaloneTest("readlnOrNull_empty") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readlnOrNull_empty.kt" } standaloneTest("readln_empty") { enabled = (project.testTarget != 'wasm32') // KT-48738 useTestData = true outputChecker = { s -> s.contains("ReadAfterEOFException") } expectedExitStatusChecker = { it != 0 } source = "runtime/basic/readln_empty.kt" } standaloneTest("readln_alone_CR") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_alone_CR.kt" } standaloneTest("readln_empty_new_line") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_empty_new_line.kt" } standaloneTest("readln_multiline") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_multiline.kt" } standaloneTest("readln_CR_and_CRLF") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_CR_and_CRLF.kt" } standaloneTest("readln_long_line") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_long_line.kt" } standaloneTest("readln_cyrillic") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_cyrillic.kt" } standaloneTest("readln_multiple_empty_new_lines") { enabled = (project.testTarget != 'wasm32') // KT-48738 useGoldenData = true useTestData = true source = "runtime/basic/readln_multiple_empty_new_lines.kt" } task hello3(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/hello3.kt" } task hello4(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/hello4.kt" } standaloneTest('enumEquals') { useGoldenData = true source = "runtime/basic/enum_equals.kt" flags = ['-XXLanguage:-ProhibitComparisonOfIncompatibleEnums', '-e', 'runtime.basic.enum_equals.main'] } standaloneTest("entry0") { useGoldenData = true source = "runtime/basic/entry0.kt" flags = ["-entry", "runtime.basic.entry0.main"] } standaloneTest("entry1") { useGoldenData = true source = "runtime/basic/entry1.kt" flags = ["-entry", "foo"] } linkTest("entry2") { useGoldenData = true source = "runtime/basic/entry2.kt" lib = "runtime/basic/libentry2.kt" flags = ["-entry", "foo"] } standaloneTest("entry3") { useGoldenData = true source = "runtime/basic/entry3.kt" flags = ["-entry", "bar"] } standaloneTest("entry4") { useGoldenData = true source = "runtime/basic/entry4.kt" } standaloneTest("readline0") { useGoldenData = true useTestData = true source = "runtime/basic/readline0.kt" } standaloneTest("readline1") { useGoldenData = true useTestData = true source = "runtime/basic/readline1.kt" } task tostring0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/tostring0.kt" } task tostring1(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/tostring1.kt" } task tostring2(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/tostring2.kt" } task tostring3(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/tostring3.kt" } task tostring4(type: KonanLocalTest) { source = "runtime/basic/tostring4.kt" } task empty_substring(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/empty_substring.kt" } standaloneTest("cleaner_basic") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_basic.kt" flags = ['-tr', '-opt-in=kotlin.native.internal.InternalForKotlinNative'] } standaloneTest("cleaner_workers") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_workers.kt" flags = ['-tr', '-opt-in=kotlin.native.internal.InternalForKotlinNative'] } standaloneTest("cleaner_in_main_with_checker") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_in_main_with_checker.kt" useGoldenData = true } standaloneTest("cleaner_in_main_without_checker") { enabled = (project.testTarget != 'wasm32') // Cleaners need workers source = "runtime/basic/cleaner_in_main_without_checker.kt" useGoldenData = true } standaloneTest("cleaner_leak_without_checker") { enabled = (project.testTarget != 'wasm32') // Cleaners need workers source = "runtime/basic/cleaner_leak_without_checker.kt" useGoldenData = true } standaloneTest("cleaner_leak_with_checker") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_leak_with_checker.kt" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> (s =~ /Cleaner (0x)?[0-9a-fA-F]+ was disposed during program exit/).find() } } standaloneTest("cleaner_in_tls_main_without_checker") { enabled = (project.testTarget != 'wasm32') // Cleaners need workers source = "runtime/basic/cleaner_in_tls_main_without_checker.kt" } standaloneTest("cleaner_in_tls_main_with_checker") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_in_tls_main_with_checker.kt" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> (s =~ /Cleaner (0x)?[0-9a-fA-F]+ was disposed during program exit/).find() } } standaloneTest("cleaner_in_tls_worker") { enabled = (project.testTarget != 'wasm32') && // Cleaners need workers !isNoopGC source = "runtime/basic/cleaner_in_tls_worker.kt" flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative'] } standaloneTest("worker_bound_reference0") { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. source = "runtime/concurrent/worker_bound_reference0.kt" flags = ['-tr'] if (isNoopGC) { def exclude = [ "*.testCollect", "*.testCollectFrozen", "*.testCollectInWorkerFrozen", "*.collectCyclicGarbage", "*.collectCyclicGarbageWithAtomicsFrozen", "*.collectCrossThreadCyclicGarbageWithAtomicsFrozen" ] arguments += ["--ktest_filter=*-${exclude.join(":")}"] } } task worker0(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker0.kt" } task worker1(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker1.kt" } task worker2(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker2.kt" } task worker3(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker3.kt" } task worker4(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker4.kt" } // This tests changes main thread worker queue state, so better be executed alone. standaloneTest("worker5") { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker5.kt" } task worker6(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker6.kt" } task worker7(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker7.kt" } task worker8(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker8.kt" } task worker9(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') && // Workers need pthreads. !isExperimentalMM useGoldenData = true source = "runtime/workers/worker9.kt" } task worker9_experimentalMM(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') && // Workers need pthreads. isExperimentalMM useGoldenData = true source = "runtime/workers/worker9_experimentalMM.kt" } task worker10(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') && // Workers need pthreads. !isNoopGC useGoldenData = true source = "runtime/workers/worker10.kt" } task worker11(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/worker11.kt" } task worker_exception_messages(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. source = "runtime/workers/worker_exception_messages.kt" } standaloneTest("worker_exceptions") { flags = ["-tr", "-Xworker-exception-handling=use-hook"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { !it.contains("testExecuteAfterStartQuiet error") && it.contains("testExecuteStart error") && !it.contains("testExecuteStartQuiet error") } source = "runtime/workers/worker_exceptions.kt" } standaloneTest("worker_exceptions_legacy") { flags = ["-tr", "-Xworker-exception-handling=legacy"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { it.contains("testExecuteAfterStartLegacy error") && it.contains("testExecuteStartLegacy error") } source = "runtime/workers/worker_exceptions_legacy.kt" } standaloneTest("worker_exceptions_terminate") { flags = ["-Xworker-exception-handling=use-hook"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. expectedExitStatusChecker = { it != 0 } outputChecker = { it.contains("some error") && !it.contains("Will not happen") } source = "runtime/workers/worker_exceptions_terminate.kt" } standaloneTest("worker_exceptions_terminate_legacy") { flags = ["-Xworker-exception-handling=legacy"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { it.contains("some error") && it.contains("Will not happen") } source = "runtime/workers/worker_exceptions_terminate.kt" } standaloneTest("worker_exceptions_terminate_hook") { flags = ["-Xworker-exception-handling=use-hook"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { it.contains("hook called") && !it.contains("some error") && it.contains("Will happen") } source = "runtime/workers/worker_exceptions_terminate_hook.kt" } standaloneTest("worker_exceptions_terminate_hook_legacy") { flags = ["-Xworker-exception-handling=legacy"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { !it.contains("hook called") && it.contains("some error") && it.contains("Will happen") } source = "runtime/workers/worker_exceptions_terminate_hook.kt" } standaloneTest("worker_exceptions_terminate_current") { flags = ["-Xworker-exception-handling=use-hook"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. expectedExitStatusChecker = { it != 0 } outputChecker = { it.contains("some error") && !it.contains("Will not happen") } source = "runtime/workers/worker_exceptions_terminate_current.kt" } standaloneTest("worker_exceptions_terminate_current_legacy") { flags = ["-Xworker-exception-handling=legacy"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { it.contains("some error") && it.contains("Will not happen") } source = "runtime/workers/worker_exceptions_terminate_current.kt" } standaloneTest("worker_exceptions_terminate_hook_current") { flags = ["-Xworker-exception-handling=use-hook"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { it.contains("hook called") && !it.contains("some error") && it.contains("Will happen") } source = "runtime/workers/worker_exceptions_terminate_hook_current.kt" } standaloneTest("worker_exceptions_terminate_hook_current_legacy") { flags = ["-Xworker-exception-handling=legacy"] enabled = (project.testTarget != 'wasm32') // Workers need pthreads. outputChecker = { !it.contains("hook called") && it.contains("some error") && it.contains("Will happen") } source = "runtime/workers/worker_exceptions_terminate_hook_current.kt" } standaloneTest("worker_threadlocal_no_leak") { disabled = (project.testTarget == 'wasm32') // Needs pthreads. source = "runtime/workers/worker_threadlocal_no_leak.kt" } task freeze0(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No workers on WASM. useGoldenData = true source = "runtime/workers/freeze0.kt" } task freeze1(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/workers/freeze1.kt" } task freeze_stress(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/workers/freeze_stress.kt" } task freeze2(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/workers/freeze2.kt" } task freeze3(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/workers/freeze3.kt" } task freeze4(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/workers/freeze4.kt" } task freeze5(type: KonanLocalTest) { useGoldenData = true source = "runtime/workers/freeze5.kt" } task freeze6(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') && // No exceptions on WASM. !isNoopGC useGoldenData = true source = "runtime/workers/freeze6.kt" } task atomic0(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/atomic0.kt" } standaloneTest("atomic1") { // Note: This test reproduces a race, so it'll start flaking if problem is reintroduced. enabled = false // Needs USE_CYCLIC_GC, which is disabled. source = "runtime/workers/atomic1.kt" } task atomic2(type: KonanLocalTest) { source = "runtime/workers/atomic2.kt" } task lazy0(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/lazy0.kt" } task lazy1(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Need exceptions. useGoldenData = true source = "runtime/workers/lazy1.kt" } standaloneTest("lazy2") { useGoldenData = true source = "runtime/workers/lazy2.kt" } standaloneTest("lazy3") { enabled = !isNoopGC source = "runtime/workers/lazy3.kt" } task lazy4(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. Need exceptions source = "runtime/workers/lazy4.kt" } task mutableData1(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. Need exceptions source = "runtime/workers/mutableData1.kt" } task enumIdentity(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Workers need pthreads. useGoldenData = true source = "runtime/workers/enum_identity.kt" } standaloneTest("leakWorker") { disabled = (project.testTarget == 'wasm32') // Needs pthreads. source = "runtime/workers/leak_worker.kt" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Unfinished workers detected, 1 workers leaked!") } } standaloneTest("leakMemoryWithWorkerTermination") { disabled = (project.testTarget == 'wasm32') // Needs pthreads. source = "runtime/workers/leak_memory_with_worker_termination.kt" if (!isExperimentalMM) { // Experimental MM will not report memory leaks. expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Memory leaks detected, 1 objects leaked!") } } } task superFunCall(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/superFunCall.kt" } task superGetterCall(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/superGetterCall.kt" } task superSetterCall(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/superSetterCall.kt" } task enum0(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/test0.kt" } task enum1(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/test1.kt" } task enum_valueOf(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/valueOf.kt" } task enum_values(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/values.kt" } task enum_vCallNoEntryClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/vCallNoEntryClass.kt" } task enum_vCallWithEntryClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/vCallWithEntryClass.kt" } task enum_companionObject(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/companionObject.kt" } task enum_interfaceCallNoEntryClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/interfaceCallNoEntryClass.kt" } task enum_interfaceCallWithEntryClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/interfaceCallWithEntryClass.kt" } linkTest("enum_linkTest") { useGoldenData = true source = "codegen/enum/linkTest_main.kt" lib = "codegen/enum/linkTest_lib.kt" } task enum_varargParam(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/varargParam.kt" } task enum_nested(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/nested.kt" } task enum_isFrozen(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/enum/isFrozen.kt" } task enum_loop(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/loop.kt" } task enum_reorderedArguments(type: KonanLocalTest) { source = "codegen/enum/reorderedArguments.kt" } standaloneTest('switchLowering') { useGoldenData = true source = "codegen/enum/switchLowering.kt" flags = ['-XXLanguage:-ProhibitComparisonOfIncompatibleEnums', '-e', 'codegen.enum.switchLowering.main'] } task enum_lambdaInDefault(type: KonanLocalTest) { useGoldenData = true source = "codegen/enum/lambdaInDefault.kt" } linkTest("mangling") { useGoldenData = true source = "mangling/mangling.kt" lib = "mangling/manglinglib.kt" } task innerClass_simple(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/simple.kt" } task innerClass_getOuterVal(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/getOuterVal.kt" } task innerClass_generic(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/generic.kt" } task innerClass_doubleInner(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/doubleInner.kt" } task innerClass_qualifiedThis(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/qualifiedThis.kt" } task innerClass_superOuter(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/superOuter.kt" } task innerClass_noPrimaryConstructor(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/noPrimaryConstructor.kt" } task innerClass_secondaryConstructor(type: KonanLocalTest) { useGoldenData = true source = "codegen/innerClass/secondaryConstructor.kt" } linkTest("innerClass_linkTest") { source = "codegen/innerClass/linkTest_main.kt" lib = "codegen/innerClass/linkTest_lib.kt" } linkTest("innerClass_inheritance_linkTest") { useGoldenData = true source = "codegen/innerClass/inheritance_linkTest_main.kt" lib = "codegen/innerClass/inheritance_linkTest_lib.kt" } linkTest("innerClass_inheritance2_linkTest") { useGoldenData = true source = "codegen/innerClass/inheritance2_linkTest_main.kt" lib = "codegen/innerClass/inheritance2_linkTest_lib.kt" } linkTest("innerClass_inheritance3_linkTest") { useGoldenData = true source = "codegen/innerClass/inheritance3_linkTest_main.kt" lib = "codegen/innerClass/inheritance3_linkTest_lib.kt" } task localClass_localHierarchy(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/localHierarchy.kt" } standaloneTest("objectDeclaration_globalConstants") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. flags = ["-opt", "-opt-in=kotlin.native.internal.InternalForKotlinNative", "-tr"] source = "codegen/objectDeclaration/globalConstants.kt" } task object_isFrozen(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/objectDeclaration/isFrozen.kt" } task localClass_objectExpressionInProperty(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/objectExpressionInProperty.kt" } task localClass_objectExpressionInInitializer(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/objectExpressionInInitializer.kt" } task localClass_innerWithCapture(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/innerWithCapture.kt" } task localClass_innerTakesCapturedFromOuter(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/innerTakesCapturedFromOuter.kt" } task localClass_virtualCallFromConstructor(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/virtualCallFromConstructor.kt" } task localClass_noPrimaryConstructor(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/noPrimaryConstructor.kt" } task localClass_localFunctionCallFromLocalClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/localFunctionCallFromLocalClass.kt" } task localClass_localFunctionInLocalClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/localFunctionInLocalClass.kt" } task localClass_tryCatch(type: KonanLocalTest) { useGoldenData = true source = "codegen/localClass/tryCatch.kt" } task function_localFunction(type : KonanLocalTest) { useGoldenData = true source = "codegen/function/localFunction.kt" } task function_localFunction2(type : KonanLocalTest) { useGoldenData = true source = "codegen/function/localFunction2.kt" } task function_localFunction3(type : KonanLocalTest) { useGoldenData = true source = "codegen/function/localFunction3.kt" } task initializers_correctOrder1(type: KonanLocalTest) { useGoldenData = true source = "codegen/initializers/correctOrder1.kt" } task initializers_correctOrder2(type: KonanLocalTest) { useGoldenData = true source = "codegen/initializers/correctOrder2.kt" } standaloneTest("initializers_correctOrder3") { source = "codegen/initializers/correctOrder3.kt" useGoldenData = true } standaloneTest("initializers_globalInitedAfterAccessingFile") { source = "codegen/initializers/globalInitedAfterAccessingFile.kt" } standaloneTest("initializers_globalNotInitedAfterAccessingClassInternals") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/globalNotInitedAfterAccessingClassInternals.kt" } standaloneTest("initializers_globalInitedBeforeThreadLocal") { source = "codegen/initializers/globalInitedBeforeThreadLocal.kt" } standaloneTest("initializers_eagerInitializationGlobal1") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/eagerInitializationGlobal1.kt" } standaloneTest("initializers_eagerInitializationGlobal2") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/eagerInitializationGlobal2.kt" } standaloneTest("initializers_eagerInitializationThreadLocal1") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/eagerInitializationThreadLocal1.kt" } standaloneTest("initializers_eagerInitializationThreadLocal2") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/eagerInitializationThreadLocal2.kt" } standaloneTest("initializers_testInfrastructure") { enabled = project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM source = "codegen/initializers/testInfrastructure.kt" flags = ["-tr"] } standaloneTest("initializers_workers1") { expectedFail = (project.testTarget == 'wasm32') // Workers are not supported source = "codegen/initializers/workers1.kt" useGoldenData = true } standaloneTest("initializers_workers2") { expectedFail = (project.testTarget == 'wasm32') // Workers are not supported source = "codegen/initializers/workers2.kt" useGoldenData = true } standaloneTest("initializers_failInInitializer1") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/failInInitializer1.kt" useGoldenData = true flags = ['-Xir-property-lazy-initialization=enable'] } standaloneTest("initializers_failInInitializer2") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/failInInitializer2.kt" useGoldenData = true flags = ['-Xir-property-lazy-initialization=enable'] } standaloneTest("initializers_failInInitializer3") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/failInInitializer3.kt" useGoldenData = true flags = ['-Xir-property-lazy-initialization=enable'] } standaloneTest("initializers_failInInitializer4") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/failInInitializer4.kt" useGoldenData = true flags = ['-Xir-property-lazy-initialization=enable'] } standaloneTest("initializers_when1") { source = "codegen/initializers/when1.kt" useGoldenData = true } standaloneTest("initializers_when2") { source = "codegen/initializers/when2.kt" useGoldenData = true } standaloneTest("initializers_throw1") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/throw1.kt" useGoldenData = true } standaloneTest("initializers_throw2") { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/initializers/throw2.kt" useGoldenData = true } standaloneTest("initializers_while1") { source = "codegen/initializers/while1.kt" useGoldenData = true } standaloneTest("initializers_while2") { source = "codegen/initializers/while2.kt" useGoldenData = true } standaloneTest("initializers_while3") { source = "codegen/initializers/while3.kt" useGoldenData = true } standaloneTest("initializers_return1") { source = "codegen/initializers/return1.kt" useGoldenData = true } standaloneTest("initializers_return2") { source = "codegen/initializers/return2.kt" useGoldenData = true } standaloneTest("initializers_object") { source = "codegen/initializers/object.kt" flags = ['-Xir-property-lazy-initialization=enable'] } linkTest("initializers_linkTest1") { useGoldenData = true source = "codegen/initializers/linkTest1_main.kt" lib = "codegen/initializers/linkTest1_lib.kt" } linkTest("initializers_linkTest2") { useGoldenData = true source = "codegen/initializers/linkTest2_main.kt" lib = "codegen/initializers/linkTest2_lib.kt" } linkTest("initializers_sharedVarInInitBlock") { source = "codegen/initializers/sharedVarInInitBlock_main.kt" lib = "codegen/initializers/sharedVarInInitBlock_lib.kt" } standaloneTest("initializers_static") { source = "codegen/initializers/static.kt" flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative', "-tr"] } task arithmetic_basic(type: KonanLocalTest) { source = "codegen/arithmetic/basic.kt" } task arithmetic_division(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/arithmetic/division.kt" } task arithmetic_github1856(type: KonanLocalTest) { source = "codegen/arithmetic/github1856.kt" } task bridges_test0(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test0.kt" } task bridges_test1(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test1.kt" } task bridges_test2(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test2.kt" } task bridges_test3(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test3.kt" } task bridges_test4(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test4.kt" } task bridges_test5(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test5.kt" } task bridges_test6(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test6.kt" } task bridges_test7(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test7.kt" } task bridges_test8(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test8.kt" } task bridges_test9(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test9.kt" } task bridges_test10(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test10.kt" } task bridges_test11(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test11.kt" } task bridges_test12(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test12.kt" } task bridges_test13(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test13.kt" } task bridges_test14(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test14.kt" } task bridges_test15(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test15.kt" } task bridges_test16(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test16.kt" } task bridges_test17(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test17.kt" } task bridges_test18(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/test18.kt" } linkTest("bridges_linkTest") { useGoldenData = true source = "codegen/bridges/linkTest_main.kt" lib = "codegen/bridges/linkTest_lib.kt" } linkTest("bridges_linkTest2") { useGoldenData = true source = "codegen/bridges/linkTest2_main.kt" lib = "codegen/bridges/linkTest2_lib.kt" } task bridges_special(type: KonanLocalTest) { useGoldenData = true source = "codegen/bridges/special.kt" } task bridges_specialGeneric(type: KonanLocalTest) { source = "codegen/bridges/specialGeneric.kt" } task bridges_nativePointed(type: KonanLocalTest) { source = "codegen/bridges/nativePointed.kt" } task returnTypeSignature(type: KonanLocalTest) { source = "codegen/bridges/returnTypeSignature.kt" } task classDelegation_method(type: KonanLocalTest) { useGoldenData = true source = "codegen/classDelegation/method.kt" } task classDelegation_property(type: KonanLocalTest) { useGoldenData = true source = "codegen/classDelegation/property.kt" } task classDelegation_generic(type: KonanLocalTest) { useGoldenData = true source = "codegen/classDelegation/generic.kt" } task classDelegation_withBridge(type: KonanLocalTest) { useGoldenData = true source = "codegen/classDelegation/withBridge.kt" } linkTest("classDelegation_linkTest") { useGoldenData = true source = "codegen/classDelegation/linkTest_main.kt" lib = "codegen/classDelegation/linkTest_lib.kt" } standaloneTest("contracts") { flags = [ '-opt-in=kotlin.RequiresOptIn', '-tr' ] source = "codegen/contracts/contracts.kt" } task delegatedProperty_simpleVal(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/simpleVal.kt" } task delegatedProperty_simpleVar(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/simpleVar.kt" } task delegatedProperty_packageLevel(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/packageLevel.kt" } task delegatedProperty_local(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/local.kt" } linkTest("delegatedProperty_delegatedOverride") { useGoldenData = true source = "codegen/delegatedProperty/delegatedOverride_main.kt" lib = "codegen/delegatedProperty/delegatedOverride_lib.kt" } linkTest("delegatedProperty_correctFieldsOrder") { useGoldenData = true source = "codegen/delegatedProperty/correctFieldsOrder_main.kt" lib = "codegen/delegatedProperty/correctFieldsOrder_lib.kt" } task delegatedProperty_lazy(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/lazy.kt" } task delegatedProperty_observable(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/observable.kt" } task delegatedProperty_map(type: KonanLocalTest) { useGoldenData = true source = "codegen/delegatedProperty/map.kt" } task propertyCallableReference_valClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/valClass.kt" } task propertyCallableReference_valModule(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/valModule.kt" } task propertyCallableReference_varClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/varClass.kt" } task propertyCallableReference_varModule(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/varModule.kt" } task propertyCallableReference_valExtension(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/valExtension.kt" } task propertyCallableReference_varExtension(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/varExtension.kt" } linkTest("propertyCallableReference_linkTest") { useGoldenData = true source = "codegen/propertyCallableReference/linkTest_main.kt" lib = "codegen/propertyCallableReference/linkTest_lib.kt" } task propertyCallableReference_dynamicReceiver(type: KonanLocalTest) { useGoldenData = true source = "codegen/propertyCallableReference/dynamicReceiver.kt" } task lateinit_initialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/initialized.kt" } task lateinit_notInitialized(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/lateinit/notInitialized.kt" } task lateinit_inBaseClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/inBaseClass.kt" } task lateinit_localInitialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/localInitialized.kt" } task lateinit_localNotInitialized(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/lateinit/localNotInitialized.kt" } task lateinit_localCapturedInitialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/localCapturedInitialized.kt" } task lateinit_localCapturedNotInitialized(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/lateinit/localCapturedNotInitialized.kt" } task lateinit_isInitialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/isInitialized.kt" } task lateinit_globalIsInitialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/globalIsInitialized.kt" } task lateinit_innerIsInitialized(type: KonanLocalTest) { useGoldenData = true source = "codegen/lateinit/innerIsInitialized.kt" } task sanity_assertions_enabled_for_local_tests(type: KonanLocalTest) { source = "sanity/assertions_enabled_for_local_tests.kt" } task kclass0(type: KonanLocalTest) { source = "codegen/kclass/kclass0.kt" } task kclass1(type: KonanLocalTest) { useGoldenData = true source = "codegen/kclass/kclass1.kt" } task kclassEnumArgument(type: KonanLocalTest) { useGoldenData = true source = "codegen/kclass/kClassEnumArgument.kt" } task ktype1(type: KonanLocalTest) { source = "codegen/ktype/ktype1.kt" } task ktype_nonReified(type: KonanLocalTest) { source = "codegen/ktype/nonReified.kt" } task associatedObjects1(type: KonanLocalTest) { source = "codegen/associatedObjects/associatedObjects1.kt" } task coroutines_simple(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/simple.kt" } task coroutines_degenerate1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/degenerate1.kt" } task coroutines_degenerate2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/degenerate2.kt" } task coroutines_withReceiver(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/withReceiver.kt" } task coroutines_correctOrder1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/correctOrder1.kt" } task coroutines_controlFlow_chain(type: KonanLocalTest) { source = "codegen/coroutines/controlFlow_chain.kt" } task coroutines_controlFlow_if1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_if1.kt" } task coroutines_controlFlow_if2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_if2.kt" } task coroutines_controlFlow_finally1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_finally1.kt" } task coroutines_controlFlow_finally2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_finally2.kt" } task coroutines_controlFlow_finally3(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_finally3.kt" } task coroutines_controlFlow_finally4(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_finally4.kt" } task coroutines_controlFlow_finally5(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_finally5.kt" } task coroutines_controlFlow_finally6(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_finally6.kt" } task coroutines_controlFlow_finally7(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_finally7.kt" } task coroutines_controlFlow_inline1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_inline1.kt" } task coroutines_controlFlow_inline2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_inline2.kt" } task coroutines_controlFlow_inline3(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_inline3.kt" } task coroutines_controlFlow_tryCatch1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_tryCatch1.kt" } task coroutines_controlFlow_tryCatch2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_tryCatch2.kt" } task coroutines_controlFlow_tryCatch3(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_tryCatch3.kt" } task coroutines_controlFlow_tryCatch4(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_tryCatch4.kt" } task coroutines_controlFlow_tryCatch5(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/coroutines/controlFlow_tryCatch5.kt" } task coroutines_controlFlow_while1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_while1.kt" } task coroutines_controlFlow_while2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/controlFlow_while2.kt" } task coroutines_returnsNothing1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/returnsNothing1.kt" } task coroutines_returnsUnit1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/returnsUnit1.kt" } task coroutines_coroutineContext1(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/coroutineContext1.kt" } task coroutines_coroutineContext2(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/coroutineContext2.kt" } task coroutines_anonymousObject(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/anonymousObject.kt" } task coroutines_functionReference_simple(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/functionReference_simple.kt" } task coroutines_functionReference_eqeq_name(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/functionReference_eqeq_name.kt" } task coroutines_functionReference_invokeAsFunction(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/functionReference_invokeAsFunction.kt" } task coroutines_functionReference_lambdaAsSuspendLambda(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/functionReference_lambdaAsSuspendLambda.kt" } task coroutines_kt41394(type: KonanLocalTest) { useGoldenData = true source = "codegen/coroutines/kt41394.kt" } standaloneTest('coroutines_suspendConversion') { useGoldenData = true source = "codegen/coroutines/suspendConversion.kt" flags = ['-XXLanguage:+SuspendConversion'] } task AbstractMutableCollection(type: KonanLocalTest) { expectedExitStatus = 0 source = "runtime/collections/AbstractMutableCollection.kt" } task BitSet(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. expectedExitStatus = 0 source = "runtime/collections/BitSet.kt" } task stack_array(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/stack_array.kt" } task array0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/array0.kt" } task array1(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/array1.kt" } task array2(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/array2.kt" } task array3(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/array3.kt" } task array4(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/collections/array4.kt" } task array5(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Uses exceptions. source = "runtime/collections/array5.kt" } task typed_array0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/typed_array0.kt" } task typed_array1(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // No exceptions on WASM. useGoldenData = true source = "runtime/collections/typed_array1.kt" } task sort0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/sort0.kt" } task sort1(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/sort1.kt" } task sortWith(type: KonanLocalTest) { source = "runtime/collections/SortWith.kt" } task if_else(type: KonanLocalTest) { source = "codegen/branching/if_else.kt" } task immutable_binary_blob_in_lambda(type: KonanLocalTest) { source = "lower/immutable_blob_in_lambda.kt" useGoldenData = true } task when2(type: KonanLocalTest) { source = "codegen/branching/when2.kt" } task when5(type: KonanLocalTest) { source = "codegen/branching/when5.kt" } task when6(type: KonanLocalTest) { source = "codegen/branching/when6.kt" } task when7(type: KonanLocalTest) { source = "codegen/branching/when7.kt" } task when8(type: KonanLocalTest) { source = "codegen/branching/when8.kt" useGoldenData = true } task when9(type: KonanLocalTest) { useGoldenData = true source = "codegen/branching/when9.kt" } task when_through(type: KonanLocalTest) { source = "codegen/branching/when_through.kt" } task advanced_when2(type: KonanLocalTest) { source = "codegen/branching/advanced_when2.kt" } task advanced_when5(type: KonanLocalTest) { source = "codegen/branching/advanced_when5.kt" } task when_with_try1(type: KonanLocalTest) { useGoldenData = true source = "codegen/branching/when_with_try1.kt" } task arraysForLoops(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Uses exceptions. source = "codegen/bce/arraysForLoops.kt" } task bool_yes(type: KonanLocalTest) { source = "codegen/function/boolean.kt" } task named(type: KonanLocalTest) { source = "codegen/function/named.kt" } task plus_eq(type: KonanLocalTest) { source = "codegen/function/plus_eq.kt" } task minus_eq(type: KonanLocalTest) { source = "codegen/function/minus_eq.kt" } task eqeq(type: KonanLocalTest) { source = "codegen/function/eqeq.kt" } task function_referenceBigArity(type: KonanLocalTest) { useGoldenData = true source = "codegen/function/referenceBigArity.kt" } task cycle(type: KonanLocalTest) { source = "codegen/cycles/cycle.kt" } task cycle_do(type: KonanLocalTest) { source = "codegen/cycles/cycle_do.kt" } task cycle_for(type: KonanLocalTest) { source = "codegen/cycles/cycle_for.kt" } task abstract_super(type: KonanLocalTest) { source = "datagen/rtti/abstract_super.kt" } task vtable1(type: KonanLocalTest) { source = "datagen/rtti/vtable1.kt" } task vtable_any(type: KonanLocalTest) { source = "datagen/rtti/vtable_any.kt" useGoldenData = true } task strdedup1(type: KonanLocalTest) { useGoldenData = true source = "datagen/literals/strdedup1.kt" } task strdedup2(type: KonanLocalTest) { // TODO: string deduplication across several components seems to require // linking them as bitcode modules before translating to machine code. enabled = false useGoldenData = true source = "datagen/literals/strdedup2.kt" } task empty_string(type: KonanLocalTest) { useGoldenData = true source = "datagen/literals/empty_string.kt" } task intrinsic(type: KonanLocalTest) { source = "codegen/function/intrinsic.kt" } // Disabled until we extract the classes that should be // always present from stdlib into a separate binary. // //linkTest("link") { // useGoldenData = true // source = "link/src/bar.kt" // lib = "link/lib" //}( linkTest("link_omit_unused") { useGoldenData = true source = "link/omit/main.kt" lib = "link/omit/library.kt" } standaloneTest("link_default_libs") { enabled = (project.testTarget != 'wasm32') // there will be no posix.klib for wasm useGoldenData = true source = "link/default/default.kt" UtilsKt.dependsOnPlatformLibs(it) } standaloneTest("link_testLib_explicitly1") { // there is no testLibrary for cross targets yet. enabled = project.target.name == project.hostName && (project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM) dependsOn installTestLib useGoldenData = true source = "link/testLib_explicitly1.kt" // We force library inclusion, so need to see the warning banner. flags = ['-l', 'testLibrary', '-r', testLibraryDir] doLast { def file = new File("$testLibraryDir/testLibrary") file.deleteDir() } } standaloneTest("link_testLib_explicitly2") { // there is no testLibrary for cross targets yet. enabled = project.target.name == project.hostName && !(project.globalTestArgs.contains('-Xir-property-lazy-initialization=enable') || isExperimentalMM) dependsOn installTestLib useGoldenData = true source = "link/testLib_explicitly2.kt" // We force library inclusion, so need to see the warning banner. flags = ['-l', 'testLibrary', '-r', testLibraryDir] doLast { def file = new File("$testLibraryDir/testLibrary") file.deleteDir() } } linkTest("no_purge_for_dependencies") { enabled = (project.testTarget != 'wasm32') // there will be no posix.klib for wasm useGoldenData = true source = "link/purge1/prog.kt" lib = "link/purge1/lib.kt" UtilsKt.dependsOnPlatformLibs(it) } linkTest("lib@name") { useGoldenData = true source = "link/klib_name/prog.kt" lib = "link/klib_name/lib.kt" } task for0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/for0.kt" } task throw0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/throw0.kt" } task statements0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/statements0.kt" } standaloneTest("annotations0") { source = "codegen/annotations/annotations0.kt" flags = ['-tr'] } task boxing0(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing0.kt" } task boxing1(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing1.kt" } task boxing2(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing2.kt" } task boxing3(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing3.kt" } task boxing4(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing4.kt" } task boxing5(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing5.kt" } task boxing6(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing6.kt" } task boxing7(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/boxing/boxing7.kt" } task boxing8(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing8.kt" } task boxing9(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing9.kt" } task boxing10(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing10.kt" } task boxing11(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing11.kt" } task boxing12(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing12.kt" } task boxing13(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing13.kt" } task boxing14(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing14.kt" } task boxing15(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/boxing15.kt" } task boxCache0(type: KonanLocalTest) { useGoldenData = true source = "codegen/boxing/box_cache0.kt" } task interface0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/interface0.kt" } task hash0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/hash0.kt" } task ieee754(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/ieee754.kt" } standaloneTest("hypotenuse") { source = "runtime/basic/hypot.kt" } task array_list1(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/array_list1.kt" } task array_list2(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // uses exceptions useGoldenData = true source = "runtime/collections/array_list2.kt" } task hash_map0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/hash_map0.kt" } task hash_map1(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/hash_map1.kt" } task hash_set0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/hash_set0.kt" } task listof0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/listof0.kt" } task listof1(type: KonanLocalTest) { enabled = false useGoldenData = true source = "datagen/literals/listof1.kt" } task moderately_large_array(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/moderately_large_array.kt" } task moderately_large_array1(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/moderately_large_array1.kt" } task string_builder0(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/text/string_builder0.kt" } task string_builder1(type: KonanLocalTest) { useGoldenData = true source = "runtime/text/string_builder1.kt" } task string0(type: KonanLocalTest) { useGoldenData = true source = "runtime/text/string0.kt" } task parse0(type: KonanLocalTest) { source = "runtime/text/parse0.kt" } task to_string0(type: KonanLocalTest) { useGoldenData = true source = "runtime/text/to_string0.kt" } task trim(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions useGoldenData = true source = "runtime/text/trim.kt" } task chars0(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. source = "runtime/text/chars0.kt" expectedExitStatus = 0 } task indexof(type: KonanLocalTest) { source = "runtime/text/indexof.kt" } task utf8(type: KonanLocalTest) { // Uses exceptions so cannot run on wasm. enabled = project.testTarget != 'wasm32' useGoldenData = true source = "runtime/text/utf8.kt" } task catch1(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/exceptions/catch1.kt" } task catch2(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/exceptions/catch2.kt" } task catch7(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/exceptions/catch7.kt" } task extend_exception(type: KonanLocalTest) { useGoldenData = true source = "runtime/exceptions/extend0.kt" } standaloneTest("check_stacktrace_format") { disabled = !supportsCoreSymbolication(project) || project.globalTestArgs.contains('-opt') flags = ['-g'] source = "runtime/exceptions/check_stacktrace_format.kt" } standaloneTest("check_stacktrace_format_coresymbolication") { disabled = !supportsCoreSymbolication(project) || project.globalTestArgs.contains('-opt') flags = ['-g', '-Xbinary=sourceInfoType=coresymbolication'] source = "runtime/exceptions/check_stacktrace_format.kt" } standaloneTest("stack_trace_inline") { disabled = !supportsCoreSymbolication(project) || project.globalTestArgs.contains('-opt') flags = ['-g', '-Xg-generate-debug-trampoline=enable', '-Xbinary=sourceInfoType=coresymbolication'] source = "runtime/exceptions/stack_trace_inline.kt" // test on simulator is writing Invalid connection: com.apple.coresymbolicationd by unknown reason // so we need to use custom checker as workaround outputChecker = { str -> str.split("\n").contains("0") } } standaloneTest("stack_trace_out_of_bounds") { disabled = !supportsCoreSymbolication(project) || project.globalTestArgs.contains('-opt') || (project.testTarget == 'ios_arm64') flags = ['-g', '-Xg-generate-debug-trampoline=enable', '-Xbinary=stripDebugInfoFromNativeLibs=false'] source = "runtime/exceptions/stack_trace_out_of_bounds.kt" } standaloneTest("kt-37572") { disabled = !supportsCoreSymbolication(project) || project.globalTestArgs.contains('-opt') flags = ['-g', '-Xbinary=sourceInfoType=coresymbolication'] source = "runtime/exceptions/kt-37572.kt" // test on simulator is writing Invalid connection: com.apple.coresymbolicationd by unknown reason // so we need to use custom checker as workaround outputChecker = { str -> str.split("\n").contains("0") } } standaloneTest("check_stacktrace_format_libbacktrace") { disabled = !supportsLibBacktrace(project)|| project.globalTestArgs.contains('-opt') flags = ['-g', '-Xbinary=sourceInfoType=libbacktrace'] source = "runtime/exceptions/check_stacktrace_format.kt" } standaloneTest("stack_trace_inline_libbacktrace") { disabled = !supportsLibBacktrace(project) || project.globalTestArgs.contains('-opt') flags = ['-g', '-Xbinary=sourceInfoType=libbacktrace'] source = "runtime/exceptions/stack_trace_inline.kt" outputChecker = { str -> str.split("\n").contains("1") } } standaloneTest("kt-37572-libbacktrace") { disabled = !supportsLibBacktrace(project) || project.globalTestArgs.contains('-opt') flags = ['-g', '-Xbinary=sourceInfoType=libbacktrace'] source = "runtime/exceptions/kt-37572.kt" outputChecker = { str -> str.split("\n").contains("2") } } standaloneTest("custom_hook") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("value 42: Error. Runnable state: true") && it.contains("Uncaught Kotlin exception: kotlin.Error: an error") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook.kt" } standaloneTest("custom_hook_memory_leak") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Hook 42") && it.contains("Uncaught Kotlin exception: kotlin.Error: an error") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook_memory_leak.kt" } standaloneTest("custom_hook_get") { source = "runtime/exceptions/custom_hook_get.kt" } standaloneTest("custom_hook_no_reset") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Hook called") && it.contains("Uncaught Kotlin exception: kotlin.Error: some error") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook_no_reset.kt" } standaloneTest("custom_hook_throws") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Hook called") && it.contains("Uncaught Kotlin exception: kotlin.Error: another error") && !it.contains("some error") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook_throws.kt" } standaloneTest("custom_hook_unhandled_exception") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/exceptions/custom_hook_unhandled_exception.kt" } standaloneTest("custom_hook_terminate") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Hook called") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook_terminate.kt" } standaloneTest("custom_hook_terminate_unhandled_exception") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Hook called") && it.contains("Uncaught Kotlin exception: kotlin.Error: some error") && !it.contains("Not going to happen") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/custom_hook_terminate_unhandled_exception.kt" } standaloneTest("exception_in_global_init") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. source = "runtime/exceptions/exception_in_global_init.kt" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Uncaught Kotlin exception: kotlin.IllegalStateException: FAIL") && !s.contains("in kotlin main") } } task rethrow_exception(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Uses exceptions. source = "runtime/exceptions/rethrow.kt" } task throw_from_catch(type: KonanLocalTest) { enabled = (project.testTarget != 'wasm32') // Uses exceptions. source = "runtime/exceptions/throw_from_catch.kt" } standaloneTest("terminate") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/terminate.kt" } standaloneTest("unhandled_exception") { enabled = (project.testTarget != 'wasm32') // Uses exceptions. outputChecker = { it.contains("Uncaught Kotlin exception: kotlin.Error: some error") } expectedExitStatusChecker = { it != 0 } source = "runtime/exceptions/unhandled_exception.kt" } standaloneTest("runtime_math_exceptions") { enabled = (project.testTarget != 'wasm32') source = "stdlib_external/numbers/MathExceptionTest.kt" flags = ['-tr'] } standaloneTest("runtime_math") { source = "stdlib_external/numbers/MathTest.kt" flags = ['-tr'] } standaloneTest("runtime_math_harmony") { source = "stdlib_external/numbers/HarmonyMathTests.kt" flags = ['-tr'] } task catch3(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/catch3.kt" } task catch4(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/catch4.kt" } task catch5(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/try/catch5.kt" } task catch6(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/try/catch6.kt" } task catch8(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/catch8.kt" } task finally1(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally1.kt" } task finally2(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally2.kt" } task finally3(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally3.kt" } task finally4(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally4.kt" } task finally5(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally5.kt" } task finally6(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally6.kt" } task finally7(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally7.kt" } task finally8(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally8.kt" } task finally9(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally9.kt" } task finally10(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally10.kt" } task finally11(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/finally11.kt" } task finally_returnsDifferentTypes(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/returnsDifferentTypes.kt" } task scope1(type: KonanLocalTest) { useGoldenData = true source = "codegen/dataflow/scope1.kt" } task uninitialized_val(type: KonanLocalTest) { useGoldenData = true source = "codegen/dataflow/uninitialized_val.kt" } task try1(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/try1.kt" } task try2(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/try2.kt" } task try3(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/try3.kt" } task try4(type: KonanLocalTest) { useGoldenData = true source = "codegen/try/try4.kt" } task unreachable1(type: KonanLocalTest) { useGoldenData = true source = "codegen/controlflow/unreachable1.kt" } task break_continue(type: KonanLocalTest) { useGoldenData = true source = "codegen/controlflow/break.kt" } task break1(type: KonanLocalTest) { useGoldenData = true source = "codegen/controlflow/break1.kt" } task range0(type: KonanLocalTest) { useGoldenData = true source = "runtime/collections/range0.kt" } standaloneTest("args0") { arguments = ["AAA", "BB", "C"] useGoldenData = true source = "runtime/basic/args0.kt" } standaloneTest("devirtualization_lateinitInterface") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true flags = ["-opt"] source = "codegen/devirtualization/lateinitInterface.kt" } standaloneTest("devirtualization_getter_looking_as_box_function") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true flags = ["-opt"] source = "codegen/devirtualization/getter_looking_as_box_function.kt" } standaloneTest("devirtualization_inline_getter") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true flags = ["-opt"] source = "codegen/devirtualization/inline_getter.kt" } standaloneTest("devirtualization_anonymousObject") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true flags = ["-opt"] source = "codegen/devirtualization/anonymousObject.kt" } task interfaceCallsNCasts_conservativeItable(type: KonanLocalTest) { useGoldenData = true source = "codegen/interfaceCallsNCasts/conservativeItable.kt" } task interfaceCallsNCasts_functionNameClash(type: KonanLocalTest) { source = "codegen/interfaceCallsNCasts/functionNameClash.kt" } task interfaceCallsNCasts_finalMethod(type: KonanLocalTest) { source = "codegen/interfaceCallsNCasts/finalMethod.kt" } task interfaceCallsNCasts_diamond(type: KonanLocalTest) { source = "codegen/interfaceCallsNCasts/diamond.kt" } task spread_operator_0(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/spread_operator_0.kt" } task main_exception(type: KonanLocalTest) { outputChecker = { s -> s.contains("kotlin.Error: Hello!") } expectedExitStatus = 1 source = "runtime/basic/main_exception.kt" } task runtime_basic_standard(type: KonanLocalTest) { source = "runtime/basic/standard.kt" } standaloneTest("runtime_basic_assert_failed") { expectedExitStatusChecker = { it != 0 } source = "runtime/basic/assert_failed.kt" } standaloneTest("runtime_basic_assert_passed") { expectedExitStatus = 0 source = "runtime/basic/assert_passed.kt" } standaloneTest("runtime_basic_assert_disabled") { expectedExitStatus = 0 enableKonanAssertions = false source = "runtime/basic/assert_failed.kt" } task initializers0(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/initializers0.kt" } task initializers1(type: KonanLocalTest) { useGoldenData = true enabled = false source = "runtime/basic/initializers1.kt" } task concatenation(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/concatenation.kt" } task const_infinity(type: KonanLocalTest) { source = "codegen/basics/const_infinity.kt" } task lambda1(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda1.kt" } task lambda2(type: KonanLocalTest) { arguments = ["arg0"] useGoldenData = true source = "codegen/lambda/lambda2.kt" } task lambda3(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda3.kt" } task lambda4(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda4.kt" } task lambda5(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda5.kt" } task lambda6(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda6.kt" } task lambda7(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda7.kt" } task lambda8(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda8.kt" } task lambda9(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda9.kt" } task lambda10(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda10.kt" } task lambda11(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda11.kt" } task lambda12(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda12.kt" } task lambda13(type: KonanLocalTest) { useGoldenData = true source = "codegen/lambda/lambda13.kt" } standaloneTest("lambda14") { source = "codegen/lambda/lambda14.kt" flags = ['-tr'] } task lambda_kt49360(type: KonanLocalTest) { source = "codegen/lambda/lambda_kt49360.kt" } task funInterface_implIsNotFunction(type: KonanLocalTest) { source = "codegen/funInterface/implIsNotFunction.kt" } task funInterface_nonTrivialProjectionInSuperType(type: KonanLocalTest) { source = "codegen/funInterface/nonTrivialProjectionInSuperType.kt" } task funInterface_kt43887(type: KonanLocalTest) { source = "codegen/funInterface/kt43887.kt" } task funInterface_kt49384(type: KonanLocalTest) { source = "codegen/funInterface/kt49384.kt" } task objectExpression1(type: KonanLocalTest) { useGoldenData = true source = "codegen/objectExpression/expr1.kt" } task objectExpression2(type: KonanLocalTest) { useGoldenData = true source = "codegen/objectExpression/expr2.kt" } task objectExpression3(type: KonanLocalTest) { useGoldenData = true source = "codegen/objectExpression/expr3.kt" } standaloneTest("initializers2") { useGoldenData = true source = "runtime/basic/initializers2.kt" } task initializers3(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/initializers3.kt" } task initializers4(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/initializers4.kt" } task initializers5(type: KonanLocalTest) { useGoldenData = true source = "runtime/basic/initializers5.kt" } task initializers6(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Needs workers. source = "runtime/basic/initializers6.kt" } task initializers7(type: KonanLocalTest) { source = "runtime/basic/initializers7.kt" } task initializers8(type: KonanLocalTest) { source = "runtime/basic/initializers8.kt" } task expression_as_statement(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // uses exceptions. useGoldenData = true source = "codegen/basics/expression_as_statement.kt" } task codegen_escapeAnalysis_zeroOutObjectOnAlloc(type: KonanLocalTest) { source = "codegen/escapeAnalysis/zeroOutObjectOnAlloc.kt" } task codegen_escapeAnalysis_recursion(type: KonanLocalTest) { source = "codegen/escapeAnalysis/recursion.kt" } standaloneTest("codegen_escapeAnalysis_stackAllocated") { disabled = (cacheTesting != null) || // Cache is not compatible with -opt. project.globalTestArgs.contains('-g') // -g and -opt are incompatible flags = ['-opt', '-tr', '-opt-in=kotlin.native.internal.InternalForKotlinNative'] source = "codegen/escapeAnalysis/stackAllocated.kt" } task memory_var1(type: KonanLocalTest) { source = "runtime/memory/var1.kt" } task memory_var2(type: KonanLocalTest) { source = "runtime/memory/var2.kt" } task memory_var3(type: KonanLocalTest) { source = "runtime/memory/var3.kt" } task memory_var4(type: KonanLocalTest) { source = "runtime/memory/var4.kt" } task memory_throw_cleanup(type: KonanLocalTest) { expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "runtime/memory/throw_cleanup.kt" } task memory_escape0(type: KonanLocalTest) { source = "runtime/memory/escape0.kt" } task memory_escape1(type: KonanLocalTest) { useGoldenData = true source = "runtime/memory/escape1.kt" } task memory_cycles0(type: KonanLocalTest) { useGoldenData = true source = "runtime/memory/cycles0.kt" } task memory_cycles1(type: KonanLocalTest) { enabled = !isNoopGC source = "runtime/memory/cycles1.kt" } task memory_basic0(type: KonanLocalTest) { source = "runtime/memory/basic0.kt" } task memory_escape2(type: KonanLocalTest) { useGoldenData = true source = "runtime/memory/escape2.kt" } task memory_weak0(type: KonanLocalTest) { enabled = !isNoopGC useGoldenData = true source = "runtime/memory/weak0.kt" } task memory_weak1(type: KonanLocalTest) { useGoldenData = true source = "runtime/memory/weak1.kt" } standaloneTest("memory_only_gc") { source = "runtime/memory/only_gc.kt" } task memory_stable_ref_cross_thread_check(type: KonanLocalTest) { disabled = (project.testTarget == 'wasm32') // Needs workers. source = "runtime/memory/stable_ref_cross_thread_check.kt" } standaloneTest("cycle_detector") { disabled = project.globalTestArgs.contains('-opt') || // Needs debug build. (project.testTarget == 'wasm32') || // CycleDetector is disabled on WASM. isExperimentalMM // Experimental MM will not support CycleDetector. flags = ['-tr', '-g'] source = "runtime/memory/cycle_detector.kt" } standaloneTest("cycle_collector") { disabled = true // Needs USE_CYCLIC_GC, which is disabled. source = "runtime/memory/cycle_collector.kt" } standaloneTest("cycle_collector_deadlock1") { disabled = true // Needs USE_CYCLIC_GC, which is disabled. source = "runtime/memory/cycle_collector_deadlock1.kt" } standaloneTest("leakMemory") { source = "runtime/memory/leak_memory.kt" if (!isExperimentalMM) { // Experimental MM will not report memory leaks. expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Memory leaks detected, 1 objects leaked!") } } } standaloneTest("leakMemoryWithTestRunner") { source = "runtime/memory/leak_memory_test_runner.kt" flags = ['-tr'] if (!isExperimentalMM) { // Experimental MM will not report memory leaks. expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Memory leaks detected, 1 objects leaked!") } } } standaloneTest("stress_gc_allocations") { // TODO: Support obtaining peak RSS on more platforms. enabled = (project.testTarget != "wasm32") && (project.testTarget != "watchos_arm32") && (project.testTarget != "watchos_arm64") && (project.testTarget != "watchos_x86") && (project.testTarget != "watchos_x64") && (project.testTarget != "watchos_simulator_arm64") && !isNoopGC source = "runtime/memory/stress_gc_allocations.kt" flags = ['-tr', '-opt-in=kotlin.native.internal.InternalForKotlinNative'] } standaloneTest("mpp1") { source = "codegen/mpp/mpp1.kt" flags = ['-tr', '-Xmulti-platform'] } linkTest("mpp2") { useGoldenData = true source = "codegen/mpp/mpp2.kt" lib = "codegen/mpp/libmpp2.kt" flags = ['-Xmulti-platform'] } standaloneTest("mpp_default_args") { source = "codegen/mpp/mpp_default_args.kt" flags = ['-tr', '-Xmulti-platform'] } standaloneTest("mpp_optional_expectation") { source = "codegen/mpp/mpp_optional_expectation.kt" def outputRoot = project.ext.testOutputLocal.toString() def srcPath = "$outputRoot/$name/mpp_optional_expectation.kt".with { isWindows() ? it.replaceAll("/", "\\\\") : it } flags = [ '-Xmulti-platform', "-Xcommon-sources=$srcPath" ] } standaloneTest("freezing_control_basic_full") { enabled = isExperimentalMM source = "runtime/freezing_control/basic.kt" flags = [ '-Xbinary=freezing=full', '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath ] arguments = ['full'] } standaloneTest("freezing_control_basic_disabled") { enabled = isExperimentalMM source = "runtime/freezing_control/basic.kt" flags = [ '-Xbinary=freezing=disabled', '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath ] arguments = ['disabled'] } standaloneTest("freezing_control_basic_explicitOnly") { enabled = isExperimentalMM source = "runtime/freezing_control/basic.kt" flags = [ '-Xbinary=freezing=explicitOnly', '-friend-modules', project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath ] arguments = ['explicitOnly'] } task unit1(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/unit1.kt" } task unit2(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/unit2.kt" } task unit3(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/unit3.kt" } task unit4(type: KonanLocalTest) { useGoldenData = true source = "codegen/basics/unit4.kt" } task kt42000_1(type: KonanLocalTest) { source = "codegen/basics/k42000_1.kt" } task kt42000_2(type: KonanLocalTest) { source = "codegen/basics/k42000_2.kt" } task inline0(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline0.kt" } task vararg0(type: KonanLocalTest) { source = "lower/vararg.kt" } task vararg_of_literals(type: KonanLocalTest) { enabled = false useGoldenData = true source = "lower/vararg_of_literals.kt" } standaloneTest('tailrec') { useGoldenData = true source = "lower/tailrec.kt" flags = ['-XXLanguage:-ProhibitTailrecOnVirtualMember', '-e', 'lower.tailrec.main'] } task inline1(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline1.kt" } task inline2(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline2.kt" } task inline3(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline3.kt" } task inline4(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline4.kt" } task inline5(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline5.kt" } task inline6(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline6.kt" } task inline7(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline7.kt" } task inline8(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline8.kt" } task inline9(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline9.kt" } task inline10(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline10.kt" } task inline13(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline13.kt" } task inline14(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline14.kt" } task inline15(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline15.kt" } task inline16(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline16.kt" } task inline17(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline17.kt" } task inline18(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline18.kt" } task inline19(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline19.kt" } task inline20(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline20.kt" } task inline21(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline21.kt" } task inline22(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline22.kt" } task inline23(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline23.kt" } task inline24(type: KonanLocalTest) { enabled = false useGoldenData = true source = "codegen/inline/inline24.kt" } task inline25(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline25.kt" } task inline26(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/inline26.kt" } task inline_type_substitution_in_fake_override(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/typeSubstitutionInFakeOverride.kt" } task inline_localFunctionInInitializerBlock(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/localFunctionInInitializerBlock.kt" } task inline_lambdaInDefaultValue(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/lambdaInDefaultValue.kt" } task inline_lambdaAsAny(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/lambdaAsAny.kt" } task inline_getClass(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/getClass.kt" } task inline_statementAsLastExprInBlock(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/statementAsLastExprInBlock.kt" } task inline_returnLocalClassFromBlock(type: KonanLocalTest) { enabled = false useGoldenData = true source = "codegen/inline/returnLocalClassFromBlock.kt" } task inline_changingCapturedLocal(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/changingCapturedLocal.kt" } task inline_defaultArgs(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/defaultArgs.kt" } task inline_propertyAccessorInline(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/propertyAccessorInline.kt" } task inline_twiceInlinedObject(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/twiceInlinedObject.kt" } task inline_localObjectReturnedFromWhen(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/localObjectReturnedFromWhen.kt" } task inline_genericFunctionReference(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/genericFunctionReference.kt" } task inline_correctOrderFunctionReference(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/correctOrderFunctionReference.kt" } task inline_coercionToUnit(type: KonanLocalTest) { useGoldenData = true source = "codegen/inline/coercionToUnit.kt" } task inline_redundantCoercionsCleaner(type: KonanLocalTest) { source = "codegen/inline/redundantCoercionsCleaner.kt" } task classDeclarationInsideInline(type: KonanLocalTest) { source = "codegen/inline/classDeclarationInsideInline.kt" useGoldenData = true } task inlineClass0(type: KonanLocalTest) { source = "codegen/inlineClass/inlineClass0.kt" } task inlineClass_customEquals(type: KonanLocalTest) { source = "codegen/inlineClass/customEquals.kt" } task inlineClass_defaultEquals(type: KonanLocalTest) { source = "codegen/inlineClass/defaultEquals.kt" } task inlineClass_secondaryConstructorWithGenerics(type: KonanLocalTest) { source = "codegen/inlineClass/secondaryConstructorWithGenerics.kt" } task inlineClass_nestedInlineClasses(type: KonanLocalTest) { source = "codegen/inlineClass/nestedInlineClasses.kt" } task valueClass0(type: KonanLocalTest) { source = "codegen/inlineClass/valueClass0.kt" } task deserialized_inline0(type: KonanLocalTest) { source = "serialization/deserialized_inline0.kt" } task deserialized_listof0(type: KonanLocalTest) { source = "serialization/deserialized_listof0.kt" } task deserialized_fields(type: KonanLocalTest) { source = "serialization/deserialized_fields.kt" } KotlinNativeTestKt.createTest(project, "kt39548", KonanStandaloneTest) { task -> // Test infrastructure doesn't support generated source; // workaround by specifying dummy source: task.source = "does/not/exist/kt39548.dummy.kt" task.enabled = isWindowsTarget(project) if (task.enabled) { konanArtifacts { program(name, targets: [target.name]) { baseDir "$testOutputLocal/$name" srcFiles "$buildDir/kt39548/kt39548.kt" // Generated by doBeforeBuild task. extraOpts task.flags extraOpts project.globalTestArgs } } doBeforeBuild { GenTestKT39548Kt.genTestKT39548(file("$buildDir/kt39548/kt39548.kt")) } } } linkTest("deserialized_members") { source = "serialization/deserialized_members/main.kt" lib = "serialization/deserialized_members/library.kt" useGoldenData = true } linkTest("serialized_catch") { source = "serialization/serialized_catch/main.kt" lib = "serialization/serialized_catch/library.kt" useGoldenData = true } linkTest("serialized_doWhile") { source = "serialization/serialized_doWhile/main.kt" lib = "serialization/serialized_doWhile/library.kt" useGoldenData = true } linkTest("serialized_vararg") { source = "serialization/serialized_vararg/main.kt" lib = "serialization/serialized_vararg/library.kt" useGoldenData = true } linkTest("serialized_default_args") { source = "serialization/serialized_default_args/main.kt" lib = "serialization/serialized_default_args/library.kt" useGoldenData = true } standaloneTest("serialized_no_typemap") { source = "serialization/regression/no_type_map.kt" useGoldenData = true } linkTest("serialized_enum_ordinal") { source = "serialization/enum_ordinal/main.kt" lib = "serialization/enum_ordinal/library.kt" useGoldenData = true } linkTest("serialized_char_constant") { source = "serialization/serialized_char_constant/main.kt" lib = "serialization/serialized_char_constant/library.kt" useGoldenData = true } standaloneTest("testing_annotations") { source = "testing/annotations.kt" flags = ['-tr'] arguments = ['--ktest_logger=SIMPLE'] useGoldenData = true } standaloneTest("testing_assertions") { source = "testing/assertions.kt" flags = ['-tr'] expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. expectedExitStatus = 0 } standaloneTest("testing_custom_main") { source = "testing/custom_main.kt" flags = ['-tr', '-e', 'kotlin.test.tests.main'] arguments = ['--ktest_logger=SIMPLE', '--ktest_repeat=2'] useGoldenData = true } standaloneTest("testing_library_usage") { def target = project.testTarget ?: 'host' dependsOn konanArtifacts.baseTestClass.getByTarget(target) def klib = konanArtifacts.baseTestClass.getArtifactByTarget(target) source = 'testing/library_user.kt' flags = ['-tr', '-e', 'main', '-l', klib.absolutePath] arguments = ['--ktest_logger=SILENT'] } class Filter { List positive List negative List expectedTests Filter(List positive, List negative, List expectedTests) { this.positive = positive this.negative = negative this.expectedTests = expectedTests } List args() { List result = [] if (positive != null && !positive.isEmpty()) { result += "--ktest_gradle_filter=${asListOfPatterns(positive)}" } if (negative != null && !negative.isEmpty()) { result += "--ktest_negative_gradle_filter=${asListOfPatterns(negative)}" } return result } static private String asListOfPatterns(List input) { return input.collect { "kotlin.test.tests.$it" }.join(",") } } standaloneTest("testing_filters") { source = "testing/filters.kt" flags = ['-tr', '-ea'] def filters = [ new Filter(["A.foo1", "B", "FiltersKt.foo1"], [], ["A.foo1", "B.foo1", "B.foo2", "B.bar", "FiltersKt.foo1"]), new Filter([], ["A.foo1", "B", "FiltersKt.foo1"], ["A.foo2", "A.bar", "FiltersKt.foo2", "FiltersKt.bar"]), new Filter(["A", "FiltersKt"], ["A.foo1", "FiltersKt.foo1"], ["A.foo2", "A.bar", "FiltersKt.foo2", "FiltersKt.bar"]), new Filter(["A.foo*", "B.*"], [], ["A.foo1", "A.foo2", "B.foo1", "B.foo2", "B.bar"]), new Filter([], ["A.foo*", "B.*"], ["A.bar", "FiltersKt.foo1", "FiltersKt.foo2", "FiltersKt.bar"]), new Filter(["*.foo*"], ["B"], ["A.foo1", "A.foo2", "FiltersKt.foo1", "FiltersKt.foo2"]), new Filter(["A"], ["*.foo*"], ["A.bar"]) ] multiRuns = true multiArguments = filters.collect { it.args() + '--ktest_logger=SIMPLE' } outputChecker = { String output -> // The first chunk is empty - drop it. def outputs = output.split("Starting testing\n").drop(1) if (outputs.size() != filters.size()) { println("Incorrect number of test runs. Expected: ${filters.size()}, actual: ${outputs.size()}") return false } // Check the correct set of tests was executed in each run. for (int i = 0; i < outputs.size(); i++) { def actualMessages = outputs[i].split('\n').findAll { it.startsWith("Passed: ") } def expectedMessages = filters[i].expectedTests.collect { String test -> def method = test.substring(test.lastIndexOf('.') + 1) def suite = test.substring(0, test.lastIndexOf('.')) "Passed: $method (kotlin.test.tests.$suite)".toString() } if (actualMessages.size() != expectedMessages.size()) { println("Incorrect number of tests executed for filters[$i]. Expected: ${expectedMessages.size()}. Actual: ${actualMessages.size()}") return false } for (message in expectedMessages) { if (!actualMessages.contains(message)) { println("Test run output for filters[$i] doesn't contain the expected message '$message'") return false } } } return true } } standaloneTest("testing_filtered_suites") { source = "testing/filtered_suites.kt" flags = ["-tr", "-ea"] def filters = [ ["Filtered_suitesKt.*"], // filter out a class. ["A.*"], // filter out a top-level suite. ["*.common"], // run a test from all suites -> all hooks executed. ["Ignored.*"], // an ignored suite -> no hooks executed. ["A.ignored"] // a suite with only ignored tests -> no hooks executed. ] def expectedHooks = [ ["Filtered_suitesKt.before", "Filtered_suitesKt.after"], ["A.before", "A.after"], ["A.before", "A.after", "Filtered_suitesKt.before", "Filtered_suitesKt.after"], [], [] ] multiRuns = true multiArguments = filters.collect { def filter = it.collect { "kotlin.test.tests.$it" }.join(",") ["--ktest_gradle_filter=$filter", "--ktest_logger=SIMPLE"] } outputChecker = { String output -> // The first chunk is empty - drop it. def outputs = output.split("Starting testing\n").drop(1) if (outputs.size() != expectedHooks.size()) { println("Incorrect number of test runs. Expected: ${expectedHooks.size()}, actual: ${outputs.size()}") return false } // Check the correct set of hooks was executed on each run. for (int i = 0; i < outputs.size(); i++) { def actual = outputs[i].split('\n') .findAll { it.startsWith("Hook:") } .collect { it.replace("Hook: ", "") } def expected = expectedHooks[i] if (actual.size() != expected.size()) { println("Incorrect number of executed hooks for run #$i. Expected: ${expected.size()}. Actual: ${actual.size()}") println("Expected hooks: $expected") println("Actual hooks: $actual") return false } for (expectedHook in expected) { if (!actual.contains(expectedHook)) { println("Expected hook wasn't executed for run #$i: $expectedHook") println("Expected hooks: $expected") println("Actual hooks: $actual") return false } } } return true } } // Check that stacktraces and ignored suite are correctly reported in the TC logger. standaloneTest("testing_stacktrace") { source = "testing/stacktrace.kt" flags = ['-tr', '-ea'] arguments = ["--ktest_logger=TEAMCITY", "--ktest_no_exit_code"] expectedFail = (project.testTarget == 'wasm32') // Uses exceptions. // This test prints TeamCity service messages about failed test causing false negative failure at CI. // So we need to suppress printing these messages to stdout. // printOutput = false outputChecker = { String output -> def ignoredOutput = """\ |##teamcity[testSuiteStarted name='kotlin.test.tests.Ignored' locationHint='ktest:suite://kotlin.test.tests.Ignored'] |##teamcity[testIgnored name='foo'] |##teamcity[testSuiteFinished name='kotlin.test.tests.Ignored']""".stripMargin() def failedOutput = """\ |##teamcity[testSuiteStarted name='kotlin.test.tests.Failed' locationHint='ktest:suite://kotlin.test.tests.Failed'] |##teamcity[testStarted name='bar' locationHint='ktest:test://kotlin.test.tests.Failed.bar'] |##teamcity[testFailed name='bar' message='Bar' details='kotlin.Exception: Bar|n""".stripMargin() def shownInnerException = output.readLines() .find { it.startsWith("##teamcity[testFailed name='bar'") } ?.contains("Caused by: kotlin.Exception: Baz") ?: false return output.contains(ignoredOutput) && output.contains(failedOutput) && shownInnerException } } // Just check that the driver is able to produce runnable binaries. tasks.register("driver0", KonanDriverTest) { useGoldenData = true source = "runtime/basic/driver0.kt" } tasks.register("driver_opt", KonanDriverTest) { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true source = "runtime/basic/driver_opt.kt" flags = ["-opt"] } // Enable when deserialization for default arguments is fixed. linkTest("inline_defaultArgs_linkTest") { useGoldenData = true source = "codegen/inline/defaultArgs_linkTest_main.kt" lib = "codegen/inline/defaultArgs_linkTest_lib.kt" } linkTest("inline_sharedVar_linkTest") { useGoldenData = true source = "codegen/inline/sharedVar_linkTest_main.kt" lib = "codegen/inline/sharedVar_linkTest_lib.kt" } linkTest("inline_lateinitProperty_linkTest") { disabled = (project.testTarget == 'wasm32') // Uses exceptions. useGoldenData = true source = "codegen/inline/lateinitProperty_linkTest_main.kt" lib = "codegen/inline/lateinitProperty_linkTest_lib.kt" } linkTest("inline_inlineCtor_linkTest") { source = "codegen/inline/inlineCtor_linkTest_main.kt" lib = "codegen/inline/inlineCtor_linkTest_lib.kt" } linkTest("inline_innerInlineFunCapturesOuter_linkTest") { useGoldenData = true source = "codegen/inline/innerInlineFunCapturesOuter_linkTest_main.kt" lib = "codegen/inline/innerInlineFunCapturesOuter_linkTest_lib.kt" } def generateWithSpaceDefFile() { def mapOption = "--Map \"${buildDir}/cutom map.map\"" if (isAppleTarget(project)) { mapOption = "-map \"${buildDir}/cutom map.map\"" } else if (isWindowsTarget(project)) { mapOption = "\"-Wl,--Map,${buildDir}/cutom map.map\"" } def file = new File("${buildDir}/withSpaces.def") file.write """ headers = stdio.h "${projectDir}/interop/basics/custom headers/custom.h" linkerOpts = $mapOption --- int customCompare(const char* str1, const char* str2) { return custom_strcmp(str1, str2); } """ return file.absolutePath } // A helper method to create interop artifacts void createInterop(String name, Closure conf) { konanArtifacts { interop(name, targets: [target.name]) { conf(it) noDefaultLibs(true) noEndorsedLibs(true) baseDir "$testOutputLocal/$name" } } } createInterop("sysstat") { // FIXME: creates empty file to workaround konan gradle plugin issue (should be able to have no def file) def f = File.createTempFile("sysstat.empty", ".def") it.packageName 'sysstat' // FIXME: this option doesn't work due to an issue in plugin: it tries to resolve header in project dir. //it.headers 'sys/stat.h' f.write("headers = sys/stat.h") it.defFile f } createInterop("cstdlib") { def f = File.createTempFile("cstdlib.empty", ".def") it.packageName 'cstdlib' // it.headers 'stdlib.h' f.write("headers = stdlib.h") it.defFile f } createInterop("cstdio") { it.defFile 'interop/basics/cstdio.def' } createInterop("sockets") { it.defFile 'interop/basics/sockets.def' } createInterop("bitfields") { it.defFile 'interop/basics/bitfields.def' } createInterop("cglobals") { it.defFile 'interop/basics/cglobals.def' } createInterop("cfunptr") { it.defFile 'interop/basics/cfunptr.def' } createInterop("cmacros") { it.defFile 'interop/basics/cmacros.def' } createInterop("cunsupported") { it.defFile 'interop/basics/cunsupported.def' } createInterop("ctoKString") { it.defFile 'interop/basics/ctoKString.def' } createInterop("ctypes") { it.defFile 'interop/basics/ctypes.def' } createInterop("structAnonym") { it.defFile 'interop/basics/structAnonym.def' } createInterop("cvalues") { it.defFile 'interop/basics/cvalues.def' } createInterop("cvectors") { it.defFile 'interop/basics/cvectors.def' } createInterop("cstructs") { it.defFile 'interop/basics/cstructs.def' } createInterop("ccallbacksAndVarargs") { it.defFile 'interop/basics/ccallbacksAndVarargs.def' } createInterop("cmangling") { it.defFile 'interop/basics/mangling.def' } createInterop("cmangling2") { it.defFile 'interop/basics/mangling2.def' } createInterop("cmangling_keywords") { it.defFile 'interop/basics/mangling_keywords.def' } createInterop("cmangling_keywords2") { it.defFile 'interop/basics/mangling_keywords2.def' } createInterop("cunion") { it.defFile 'interop/basics/cunion.def' } createInterop("cenums") { it.defFile 'interop/basics/cenums.def' } createInterop("carrayPointers") { it.defFile 'interop/basics/carrayPointers.def' } createInterop("auxiliaryCppSources") { // We need to provide empty def file to create correct `KonanInteropTask`. it.defFile 'interop/auxiliary_sources/auxiliaryCppSources.def' it.headers "$projectDir/interop/auxiliary_sources/name.h" it.extraOpts "-Xcompile-source", "$projectDir/interop/auxiliary_sources/name.cpp" it.extraOpts "-Xsource-compiler-option", "-std=c++17" } createInterop("concurrentTerminate") { it.defFile 'interop/concurrentTerminate/concurrentTerminate.def' it.headers "$projectDir/interop/concurrentTerminate/async.h" // TODO: Using `-Xcompile-source` does not imply dependency on that source, so the task will no re-run when the source is updated. it.extraOpts "-Xcompile-source", "$projectDir/interop/concurrentTerminate/async.cpp" it.extraOpts "-Xsource-compiler-option", "-std=c++17" } createInterop("incomplete_types") { it.defFile 'interop/incomplete_types/library.def' it.headers "$projectDir/interop/incomplete_types/library.h" it.extraOpts "-Xcompile-source", "$projectDir/interop/incomplete_types/library.cpp" } createInterop("embedStaticLibraries") { it.defFile 'interop/embedStaticLibraries/embedStaticLibraries.def' it.headers "$projectDir/interop/embedStaticLibraries/embedStaticLibraries.h" // Note: also hardcoded in def file. final String libDir = "$buildDir/embedStaticLibraries/" it.getByTarget(target.name).configure { doFirst { 1.upto(4) { UtilsKt.buildStaticLibrary( project, [file("$projectDir/interop/embedStaticLibraries/${it}.c")], file("$libDir/${it}.a"), file("$libDir/${it}.objs"), ) } } } it.extraOpts '-staticLibrary', "1.a" it.extraOpts '-staticLibrary', "2.a" } createInterop("kt43265") { it.defFile 'interop/kt43265/kt43265.def' } createInterop("kt44283") { it.defFile 'interop/kt44283/kt44283.def' } createInterop("kt43502") { it.defFile 'interop/kt43502/kt43502.def' it.headers "$projectDir/interop/kt43502/kt43502.h" // Note: also hardcoded in def file. final String libDir = "$buildDir/kt43502/" // Construct library that contains actual symbol definition. it.getByTarget(target.name).configure { doFirst { UtilsKt.buildStaticLibrary( project, [file("$projectDir/interop/kt43502/kt43502.c")], file("$libDir/kt43502.a"), file("$libDir/kt43502.objs"), ) } } } createInterop("leakMemoryWithRunningThread") { it.defFile 'interop/leakMemoryWithRunningThread/leakMemory.def' it.headers "$projectDir/interop/leakMemoryWithRunningThread/leakMemory.h" it.extraOpts "-Xcompile-source", "$projectDir/interop/leakMemoryWithRunningThread/leakMemory.cpp" } createInterop("cppClass") { it.defFile 'interop/cpp/cppClass.def' } createInterop("cppTypes") { it.defFile 'interop/cpp/types.def' } createInterop("cppSkia") { it.defFile 'interop/cpp/skia.def' } createInterop("cppSkiaSignature") { it.defFile 'interop/cpp/skiaSignature.def' } createInterop("threadStates") { it.defFile "interop/threadStates/threadStates.def" it.extraOpts "-Xcompile-source", "$projectDir/interop/threadStates/threadStates.cpp" } 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("objcKt34467") { it.defFile 'interop/objc/kt34467/module_library.def' def moduleMap = file("interop/objc/kt34467/module_library.modulemap").absolutePath def includePath = file("interop/objc/kt34467").absolutePath it.compilerOpts "-fmodule-map-file=$moduleMap", "-I$includePath" } createInterop("objcGh3343") { it.defFile 'framework/gh3343/objclib.def' it.headers "$projectDir/framework/gh3343/objclib.h" it.linkerOpts "-lobjcgh3343" } createInterop("objc_illegal_sharing_with_weak") { it.defFile 'interop/objc/illegal_sharing_with_weak/objclib.def' it.headers "$projectDir/interop/objc/illegal_sharing_with_weak/objclib.h" } 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_kt48816") { it.defFile 'interop/objc/kt48816/objclib.def' it.headers "$projectDir/interop/objc/kt48816/objclib.h" } } createInterop("withSpaces") { it.defFile generateWithSpaceDefFile() } createInterop("exceptions_throwThroughBridge") { it.defFile "interop/exceptions/throwThroughBridge.def" it.extraOpts "-Xcompile-source", "$projectDir/interop/exceptions/throwThroughBridgeInterop.cpp" } createInterop("exceptions_cCallback") { it.defFile "interop/exceptions/cCallback.def" it.extraOpts "-Xcompile-source", "$projectDir/interop/exceptions/cCallback.cpp" } /** * Creates a task for the interop test. Configures runner and adds library and test build tasks. */ Task interopTestBase(String name, boolean multiFile, Closure configureClosure) { return KotlinNativeTestKt.createTest(project, name, KonanInteropTest) { task -> task.configure(configureClosure) if (task.enabled) { konanArtifacts { def lib = task.interop UtilsKt.dependsOnKonanBuildingTask(task, lib, target) program(name, targets: [target.name]) { libraries { artifact lib } srcFiles multiFile ? fileTree(task.source) { include '**/*.kt' } : task.getSources() baseDir "$testOutputLocal/$name" linkerOpts "-L$buildDir" extraOpts task.flags extraOpts project.globalTestArgs } } } } } Task interopTest(String name, Closure configureClosure) { return interopTestBase(name, false, configureClosure) } Task interopTestMultifile(String name, Closure configureClosure) { return interopTestBase(name, true, configureClosure) } standaloneTest("interop_objc_allocException") { disabled = !isAppleTarget(project) expectedExitStatus = 0 source = "interop/objc/allocException.kt" UtilsKt.dependsOnPlatformLibs(it) } interopTest("interop0") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. (project.testTarget == 'linux_mips32') || // st_uid of '/' is not equal to 0 when using qemu (project.testTarget == 'linux_mipsel32') || (project.testTarget == 'linux_arm32_hfp') || (project.testTarget == 'linux_arm64') useGoldenData = true source = "interop/basics/0.kt" interop = 'sysstat' } interopTest("interop1") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/1.kt" interop = 'cstdlib' } interopTest("interop2") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/2.kt" interop = 'cstdio' } interopTest("interop3") { // We disable this test on Raspberry Pi because // qsort accepts size_t args. So the .kt file // should be different depending on the bitness of the target. // There are plans to provide a solution and turn this // test back on. disabled = (project.testTarget == 'raspberrypi') || (project.testTarget == 'linux_mips32') || (project.testTarget == 'linux_mipsel32') || (project.testTarget == 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/3.kt" interop = 'cstdlib' } interopTest("interop4") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/4.kt" interop = 'cstdio' } standaloneTest("interop5") { enabled = (project.testTarget != 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/5.kt" UtilsKt.dependsOnPlatformLibs(it) } interopTest("interop_bitfields") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. expectedFail = (project.testTarget == 'linux_mips32') // fails because of big-endiannes source = "interop/basics/bf.kt" interop = 'bitfields' } interopTest("interop_funptr") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. useGoldenData = true source = "interop/basics/funptr.kt" interop = 'cfunptr' } interopTest("interop_globals") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/globals.kt" interop = 'cglobals' } interopTest("interop_macros") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/macros.kt" interop = 'cmacros' } interopTest("interop_unsupported") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/unsupported.kt" interop = 'cunsupported' } interopTest("interop_toKString") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/toKString.kt" interop = 'ctoKString' } interopTest("interop_types") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/types.kt" interop = 'ctypes' } interopTest("interop_structAnonym") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. (project.testTarget == 'mingw_x86') source = "interop/basics/structAnonym.kt" interop = 'structAnonym' } interopTest("interop_vectors") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/vectors.kt" interop = 'cvectors' } interopTest("interop_vectors_mimalloc") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/vectors.kt" interop = 'cvectors' flags = [ "-Xallocator=mimalloc" ] arguments = [ "mimalloc" ] } interopTest("interop_mangling") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/mangling.kt" interop = 'cmangling' } interopTest("interop_mangling2") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/mangling2.kt" interop = 'cmangling2' } interopTest("interop_mangling_keywords") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/mangling_keywords.kt" interop = 'cmangling_keywords' } interopTest("interop_mangling_keywords2") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/mangling_keywords2.kt" interop = 'cmangling_keywords2' } interopTest("interop_auxiliarySources") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/auxiliary_sources/main.kt" interop = 'auxiliaryCppSources' } interopTest("interop_concurrentTerminate") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/concurrentTerminate/main.kt" interop = 'concurrentTerminate' outputChecker = { str -> str.endsWith("Reporting error!\n") } expectedExitStatus = 99 } interopTest("interop_incompleteTypes") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/incomplete_types/main.kt" interop = 'incomplete_types' } interopTest("interop_embedStaticLibraries") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/embedStaticLibraries/main.kt" interop = 'embedStaticLibraries' } interopTest("interop_values") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/values.kt" interop = 'cvalues' } interopTest("interop_structs") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/structs.kt" interop = 'cstructs' } interopTest("interop_callbacksAndVarargs") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/basics/callbacksAndVarargs.kt" interop = 'ccallbacksAndVarargs' } interopTest("interop_threadStates") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. !isExperimentalMM // No thread state switching in the legacy MM. source = "interop/threadStates/threadStates.kt" interop = "threadStates" } interopTest("interop_threadStates_callbacksWithExceptions") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. !isExperimentalMM // No thread state switching in the legacy MM. source = "interop/threadStates/callbacksWithExceptions.kt" interop = "threadStates" } interopTest("interop_threadStates_unhandledException") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. !isExperimentalMM // No thread state switching in the legacy MM. source = "interop/threadStates/unhandledException.kt" interop = "threadStates" outputChecker = { it.contains("Error. Runnable state: true") } expectedExitStatusChecker = { it != 0 } } interopTest("interop_threadStates_unhandledExceptionInForeignThread") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. !isExperimentalMM // No thread state switching in the legacy MM. source = "interop/threadStates/unhandledExceptionInForeignThread.kt" interop = "threadStates" outputChecker = { it.contains("Error. Runnable state: true") } expectedExitStatusChecker = { it != 0 } } interopTest("interop_withSpaces") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop ='withSpaces' source = "interop/basics/withSpaces.kt" doLast { assert file("${buildDir}/cutom map.map").exists() } } interopTest("interop_union") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'cunion' source = "interop/basics/union.kt" } interopTest("interop_enums") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'cenums' source = "interop/basics/enums.kt" } interopTest("interop_array_pointers") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'carrayPointers' source = "interop/basics/arrayPointers.kt" } interopTest("interop_kt43265") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'kt43265' source = "interop/kt43265/usage.kt" } interopTest("interop_kt44283") { disabled = (project.testTarget == 'wasm32') || // No interop for wasm yet. project.globalTestArgs.contains('-opt') // Incompatible with -g. flags = ['-g'] interop = 'kt44283' source = "interop/kt44283/main.kt" } dynamicTest("interop_kt43502") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic interop = "kt43502" source = "interop/kt43502/main.kt" cSource = "$projectDir/interop/kt43502/main.c" useGoldenData = true } interopTest("interop_leakMemoryWithRunningThreadUnchecked") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'leakMemoryWithRunningThread' source = "interop/leakMemoryWithRunningThread/unchecked.kt" } interopTest("interop_leakMemoryWithRunningThreadChecked") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. interop = 'leakMemoryWithRunningThread' source = "interop/leakMemoryWithRunningThread/checked.kt" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Cannot run checkers when there are 1 alive runtimes at the shutdown") } } standaloneTest("interop_pinning") { disabled = (project.testTarget == 'wasm32') // Uses exceptions. source = "interop/basics/pinning.kt" flags = [ "-tr" ] } task interop_convert(type: KonanLocalTest) { source = "codegen/intrinsics/interop_convert.kt" } task interop_sourceCodeStruct(type: KonanLocalTest) { source = "codegen/intrinsics/interop_sourceCodeStruct.kt" } standaloneTest("isExperimentalMM") { source = "codegen/intrinsics/isExperimentalMM.kt" flags = [ "-tr" ] } interopTest("interop_cppClass") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/cpp/cppClass.kt" interop = 'cppClass' } interopTest("interop_cppTypes") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/cpp/types.kt" interop = 'cppTypes' } interopTest("interop_cppSkia") { disabled = (project.testTarget == 'wasm32' || // No interop for wasm yet. isExperimentalMM) source = "interop/cpp/skia.kt" interop = 'cppSkia' useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) } interopTest("interop_cppSkiaSignature") { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. source = "interop/cpp/skiaSignature.kt" interop = "cppSkiaSignature" useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) } /* TODO: This test isn't run automatically task interop_echo_server(type: RunInteropKonanTest) { disabled = isWasmTarget(project) || isWindowsTarget(project) run = false source = "interop/basics/echo_server.kt" interop = 'sockets' } */ /* TODO: This test isn't run automatically standaloneTest("interop_opengl_teapot") { enabled = isAppleTarget(project) && project.testTarget != 'ios_x64' // No GLUT in iOS dependsOnPlatformLibs(it as Task) run = false source = "interop/basics/opengl_teapot.kt" } */ if (PlatformInfo.isAppleTarget(project)) { interopTest("interop_objc_smoke") { enabled = !isNoopGC source = "interop/objc/smoke.kt" interop = 'objcSmoke' doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/smoke.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcsmoke.dylib" // Enable ARC optimizations to prevent some objects from leaking in Obj-C code due to exceptions: args '-O2' } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcsmoke.dylib") } copy { from("interop/objc/Localizable.stringsdict") into("$testOutputLocal/$name/$target/en.lproj/") } } useGoldenData = true } interopTest("interop_objc_smoke_noopgc") { enabled = isNoopGC source = "interop/objc/smoke_noopgc.kt" interop = 'objcSmoke' doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/smoke.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcsmoke.dylib" // Enable ARC optimizations to prevent some objects from leaking in Obj-C code due to exceptions: args '-O2' } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcsmoke.dylib") } copy { from("interop/objc/Localizable.stringsdict") into("$testOutputLocal/$name/$target/en.lproj/") } } // No deallocations for the no-op GC. useGoldenData = true } interopTestMultifile("interop_objc_tests") { source = "interop/objc/tests/" interop = 'objcTests' flags = ['-tr', '-e', 'main'] if (isNoopGC) { def exclude = [ "Kt41811Kt.*", "CustomStringKt.testCustomString", "Kt42482Kt.testKT42482", "ObjcWeakRefsKt.testObjCWeakRef", "WeakRefsKt.testWeakRefs" ] arguments += ["--ktest_filter=*-${exclude.join(":")}"] } doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args fileTree("$projectDir/interop/objc/tests/") { include '**/*.m' } args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjctests.dylib" // Enable ARC optimizations to prevent some objects from leaking in Obj-C code due to exceptions: args '-O2' } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjctests.dylib") } } } interopTest("interop_objc_global_initializer") { useGoldenData = true source = "interop/objc_with_initializer/objc_test.kt" interop = 'objcMisc' doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc_with_initializer/objc_misc.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcmisc.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcmisc.dylib") } } } interopTest("interop_objc_msg_send") { source = "interop/objc/msg_send/main.kt" interop = 'objcMessaging' doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/msg_send/messaging.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcmessaging.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcmessaging.dylib") } } } interopTest("interop_objc_foreignException") { source = "interop/objc/foreignException/objc_wrap.kt" interop = 'foreignException' UtilsKt.dependsOnPlatformLibs(it) doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcexception.dylib") } } } interopTest("interop_objc_foreignExceptionMode_wrap") { source = "interop/objc/foreignException/objcExceptionMode_wrap.kt" interop = 'foreignExceptionMode_wrap' useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcexception.dylib") } } } interopTest("interop_objc_foreignExceptionMode_default") { source = "interop/objc/foreignException/objcExceptionMode_default.kt" interop = 'foreignExceptionMode_default' useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) doBeforeBuild { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjcexception.dylib") } } } interopTest("interop_objc_kt34467") { source = "interop/objc/kt34467/foo.kt" interop = 'objcKt34467' useGoldenData = true } interopTest("interop_objc_illegal_sharing_with_weak") { source = "interop/objc/illegal_sharing_with_weak/main.kt" interop = 'objc_illegal_sharing_with_weak' if (isExperimentalMM) { // Experimental MM supports arbitrary object sharing. outputChecker = { it == "Before\nAfter true\n" } } else { expectedExitStatusChecker = { it != 0 } outputChecker = { it.startsWith("Before") && // Should crash after "Before" !it.contains("After") && // But before "After" it.contains("isObjectAliveShouldCrash") // And should contain stack trace. } } } 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 { mkdir(buildDir) project.extensions.execClang.execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/kt42172/objclib.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjc_kt42172.dylib" } if (UtilsKt.isSimulatorTarget(project, project.target)) { UtilsKt.codesign(project, "$buildDir/libobjc_kt42172.dylib") } } } interopTest("interop_objc_kt48816_without_lazy_ir_for_caches") { // Without a fix, fails in two-stage mode. source = "interop/objc/kt48816/main.kt" interop = "objc_kt48816" // The bug was accidentally fixed with lazy IR for caches, so testing it with this feature disabled: flags = ["-Xlazy-ir-for-caches=disable"] } interopTest("interop_objc_kt48816_with_lazy_ir_for_caches") { source = "interop/objc/kt48816/main.kt" interop = "objc_kt48816" flags = ["-Xlazy-ir-for-caches=enable"] } standaloneTest("objc_arc_contract") { doBeforeBuild { mkdir(buildDir) ExecLlvmKt.execLlvmUtility(project, "llvm-as") { args "$projectDir/interop/objc_arc_contract/main.ll" args "-o", "$buildDir/objc_arc_contract.bc" } } source = "interop/objc_arc_contract/main.kt" useGoldenData = true flags = ["-native-library", "$buildDir/objc_arc_contract.bc"] } } standaloneTest("jsinterop_math") { doBeforeBuild { def jsinteropScript = isWindows() ? "jsinterop.bat" : "jsinterop" def jsinterop = "$kotlinNativeDist/bin/$jsinteropScript" // TODO: We probably need a NativeInteropPlugin for jsinterop? exec { commandLine jsinterop, "-pkg", "kotlinx.interop.wasm.math", "-o", "$buildDir/jsmath", "-target", "wasm32" } } dependsOn ':kotlin-native:wasm32PlatformLibs' enabled = (project.testTarget == 'wasm32') useGoldenData = true source = "jsinterop/math.kt" flags = ["-r", "$buildDir", "-l", "jsmath"] } standaloneTest("interop_libiconv") { enabled = (project.testTarget == null) source = "interop/libiconv.kt" useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) } standaloneTest("interop_zlib") { enabled = (project.testTarget == null) source = "interop/platform_zlib.kt" useGoldenData = true UtilsKt.dependsOnPlatformLibs(it) } standaloneTest("interop_objc_illegal_sharing") { disabled = !isAppleTarget(project) source = "interop/objc/illegal_sharing.kt" UtilsKt.dependsOnPlatformLibs(it) if (isExperimentalMM) { outputChecker = { it.startsWith("Before") && it.contains("After") } } else { expectedExitStatusChecker = { it != 0 } outputChecker = { it.startsWith("Before") && !it.contains("After") } } } dynamicTest("produce_dynamic") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "produce_dynamic/simple/hello.kt" cSource = "$projectDir/produce_dynamic/simple/main.c" useGoldenData = true } dynamicTest("kt36639") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "produce_dynamic/kt-36639/main.kt" cSource = "$projectDir/produce_dynamic/kt-36639/main.c" useGoldenData = true } for (i in 0..2) { dynamicTest("kt42796_$i") { clangTool = "clang++" disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "produce_dynamic/kt-42796/main-${i}.kt" cSource = "$projectDir/produce_dynamic/kt-42796/main.cpp" useGoldenData = true clangFlags = ["-DTEST=$i", "-Werror"] } } dynamicTest("produce_dynamic_unhandledException") { disabled = (project.testTarget == 'wasm32') || // Uses exceptions + dynamic is unsupported for wasm. (cacheTesting != null) // Disabled due to KT-47828. source = "produce_dynamic/unhandledException/unhandled.kt" cSource = "$projectDir/produce_dynamic/unhandledException/main.cpp" clangTool = "clang++" expectedExitStatusChecker = { it != 0 } outputChecker = { str -> str.startsWith("Kotlin hook: Exception. Runnable state: true") } } dynamicTest("interop_concurrentRuntime") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic disabled = true // KT-43180 source = "interop/concurrentTerminate/reverseInterop.kt" cSource = "$projectDir/interop/concurrentTerminate/main.cpp" clangTool = "clang++" outputChecker = { str -> str.startsWith("Uncaught Kotlin exception: kotlin.RuntimeException: Example") } expectedExitStatus = 99 } dynamicTest("interop_kt42397") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "interop/kt42397/knlibrary.kt" cSource = "$projectDir/interop/kt42397/test.cpp" clangTool = "clang++" } dynamicTest("interop_cleaners_main_thread") { disabled = (project.testTarget == 'wasm32') || isNoopGC // wasm doesn't support -produce dynamic source = "interop/cleaners/cleaners.kt" cSource = "$projectDir/interop/cleaners/main_thread.cpp" clangTool = "clang++" useGoldenData = true flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative'] } dynamicTest("interop_cleaners_second_thread") { disabled = (project.testTarget == 'wasm32') || isNoopGC // wasm doesn't support -produce dynamic source = "interop/cleaners/cleaners.kt" cSource = "$projectDir/interop/cleaners/second_thread.cpp" clangTool = "clang++" useGoldenData = true flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative'] } dynamicTest("interop_cleaners_leak") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "interop/cleaners/cleaners.kt" cSource = "$projectDir/interop/cleaners/leak.cpp" clangTool = "clang++" useGoldenData = true flags = ['-opt-in=kotlin.native.internal.InternalForKotlinNative'] } dynamicTest("interop_migrating_main_thread_legacy") { disabled = (project.testTarget == 'wasm32') || // wasm doesn't support -produce dynamic isExperimentalMM // Experimental MM will not support legacy destroy runtime mode. source = "interop/migrating_main_thread/lib.kt" flags = ['-Xdestroy-runtime-mode=legacy'] clangFlags = ['-DIS_LEGACY'] cSource = "$projectDir/interop/migrating_main_thread/main.cpp" clangTool = "clang++" } dynamicTest("interop_migrating_main_thread") { disabled = (project.testTarget == 'wasm32') // wasm doesn't support -produce dynamic source = "interop/migrating_main_thread/lib.kt" flags = ['-Xdestroy-runtime-mode=on-shutdown'] if (isExperimentalMM) { clangFlags = ['-DEXPERIMENTAL_MM'] } cSource = "$projectDir/interop/migrating_main_thread/main.cpp" clangTool = "clang++" } dynamicTest("interop_memory_leaks") { disabled = (project.testTarget == 'wasm32') || // wasm doesn't support -produce dynamic isExperimentalMM // Experimental MM will not support legacy destroy runtime mode. source = "interop/memory_leaks/lib.kt" cSource = "$projectDir/interop/memory_leaks/main.cpp" clangTool = "clang++" flags = ['-Xdestroy-runtime-mode=legacy'] // Runtime cannot be destroyed with interop with on-shutdown. expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("Memory leaks detected, 1 objects leaked!") } } dynamicTest("interop_exceptions_throwThroughBridge") { disabled = (project.testTarget == 'wasm32') // Uses exceptions + dynamic is unsupported for wasm. source = "interop/exceptions/throwThroughBridge.kt" cSource = "$projectDir/interop/exceptions/throwThroughBridge.cpp" clangTool = "clang++" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> !s.contains("Should not happen") } interop = "exceptions_throwThroughBridge" } dynamicTest("interop_kotlin_exception_hook") { disabled = (project.testTarget == 'wasm32') // Uses exceptions + dynamic is unsupported for wasm. source = "interop/exceptions/exceptionHook.kt" cSource = "$projectDir/interop/exceptions/exceptionHook.cpp" clangTool = "clang++" expectedExitStatusChecker = { it != 0 } outputChecker = { s -> s.contains("OK. Kotlin unhandled exception hook") } } interopTest("interop_exceptions_cCallback") { disabled = (project.testTarget == 'wasm32') // Uses exceptions source = "interop/exceptions/cCallback.kt" outputChecker = { s -> s.contains("CATCH IN C++") } interop = "exceptions_cCallback" } tasks.register("library_ir_provider_mismatch", KonanDriverTest) { def dir = buildDir.absolutePath def lib = "$projectDir/link/ir_providers/library/empty.kt" def invalidManifest = "$projectDir/link/ir_providers/library/manifest.properties" def currentTarget = project.target.name doBeforeBuild { konanc("$lib -p library -o $dir/supported_ir_provider/empty -target $currentTarget") konanc("$lib -p library -o $dir/unsupported_ir_provider/empty -manifest $invalidManifest -target $currentTarget") } source = "link/ir_providers/hello.kt" flags = ['-target', currentTarget, '-l', 'empty', '-r', "$dir/unsupported_ir_provider", '-r', "$dir/supported_ir_provider"] compilerMessages = true def messages = "warning: skipping $dir/unsupported_ir_provider/empty.klib. The library requires unknown IR provider UNSUPPORTED.\nhello\n" messages = PlatformInfo.isWindows() ? messages.replaceAll('\\/', '\\\\') : messages outputChecker = { out -> messages.split("\n") .collect { line -> out.contains(line) } .every { it == true } } } standaloneTest("fake_override_0") { def sources = "$projectDir/link/fake_overrides" def dir = buildDir.absolutePath doBeforeBuild { konanc("$sources/base.kt -p library -target ${target.name} -o $dir/base") konanc("$sources/move.kt -p library -target ${target.name} -o $dir/move -r $dir -l base") konanc("$sources/use.kt -p library -target ${target.name} -o $dir/use -r $dir -l move") konanc("$sources/move2.kt -p library -target ${target.name} -o $dir/move -r $dir -l base") } source = "$sources/main.kt" flags = ["-l", "use", "-r", "$dir"] useGoldenData = true } linkTest("private_fake_overrides_0") { source = "link/private_fake_overrides/inherit_main.kt" lib = "link/private_fake_overrides/inherit_lib.kt" useGoldenData = true } linkTest("private_fake_overrides_1") { source = "link/private_fake_overrides/override_main.kt" lib = "link/private_fake_overrides/override_lib.kt" useGoldenData = true } linkTest("remap_expect_property_refs") { source = "codegen/mpp/remap_expect_property_ref_main.kt" lib = "codegen/mpp/remap_expect_property_ref_lib.kt" flags = ["-Xmulti-platform"] useGoldenData = true } Task frameworkTest(String name, Closure configurator) { return KotlinNativeTestKt.createTest(project, name, FrameworkTest) { task -> configurator.delegate = task UtilsKt.dependsOnDist(task) configurator() if (task.enabled) { konanArtifacts { task.frameworks.forEach { fr -> framework(fr.name, targets: [target.name]) { fr.sources.forEach { src -> srcFiles src } baseDir "$testOutputFramework/${task.name}" if (fr.library != null) { dependsOn konanArtifacts[fr.library].getByTarget(target.name) libraries { file konanArtifacts[fr.library].getArtifactByTarget(target.name) } linkerOpts "-L$buildDir" UtilsKt.dependsOnKonanBuildingTask(task, fr.library, target) } extraOpts fr.bitcode ? "-Xembed-bitcode" : "-Xembed-bitcode-marker" if (fr.isStatic) extraOpts "-Xstatic-framework" extraOpts fr.opts extraOpts project.globalTestArgs artifactName fr.artifact } UtilsKt.dependsOnDist(project.tasks.findByName("compileKonan${fr.name.capitalize()}${UtilsKt.getTestTargetSuffix(project)}")) } } } } } if (isAppleTarget(project)) { frameworkTest('testObjCExport') { final String frameworkName = 'Kt' final String dir = "$testOutputFramework/testObjCExport" final File lazyHeader = file("$dir/$target-lazy.h") doLast { // Check lazy header. final String expectedLazyHeaderName = "expectedLazy.h" final String expectedLazyHeaderDir = file("objcexport/") final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { exec { commandLine 'diff', '-u', expectedLazyHeader, lazyHeader ignoreExitValue = true } copy { from(lazyHeader) into(expectedLazyHeaderDir) rename { expectedLazyHeaderName } } throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") } // Check bundle ID. final String frameworkPath = "$dir/$target/${frameworkName}.framework" final Pattern pattern = ~"CFBundleIdentifier\n\\s*foo.bar" final String plistPath = (target.family == Family.OSX) ? "$frameworkPath/Resources/Info.plist" : "$frameworkPath/Info.plist" final String plistContent = file(plistPath).text if (!pattern.matcher(plistContent).find()) { throw new Error("Unexpected Info.plist content:\n$plistContent") } } def libraryName = frameworkName + "Library" konanArtifacts { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" artifactName "test-library" delegate.getByTarget(target.name).configure{ UtilsKt.dependsOnDist(it) } extraOpts "-Xshort-module-name=MyLibrary" extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" } } framework(frameworkName) { sources = ['objcexport'] library = libraryName opts = ["-Xemit-lazy-objc-header=$lazyHeader", "-Xexport-kdoc", "-Xbundle-id=foo.bar", "-Xbinary=unitSuspendFunctionObjCExport=proper"] } swiftSources = ['objcexport'] if (isNoopGC) { swiftExtraOpts += ["-D", "NOOP_GC"] } } frameworkTest('testObjCExportNoGenerics') { final String frameworkName = 'KtNoGenerics' final String frameworkArtifactName = 'Kt' final String dir = "$testOutputFramework/testObjCExportNoGenerics" final File lazyHeader = file("$dir/$target-lazy.h") doLast { final String expectedLazyHeaderName = "expectedLazyNoGenerics.h" final String expectedLazyHeaderDir = file("objcexport/") final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { exec { commandLine 'diff', '-u', expectedLazyHeader, lazyHeader ignoreExitValue = true } copy { from(lazyHeader) into(expectedLazyHeaderDir) rename { expectedLazyHeaderName } } throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") } } def libraryName = frameworkName + "Library" konanArtifacts { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" artifactName "test-library" if (!useCustomDist) { dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' } extraOpts "-Xshort-module-name=MyLibrary" extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" } } framework(frameworkName) { sources = ['objcexport'] artifact = frameworkArtifactName library = libraryName opts = ["-Xemit-lazy-objc-header=$lazyHeader", "-Xno-objc-generics", "-Xbinary=unitSuspendFunctionObjCExport=proper"] } swiftSources = ['objcexport'] swiftExtraOpts = [ '-D', 'NO_GENERICS' ] if (isNoopGC) { swiftExtraOpts += ["-D", "NOOP_GC"] } } frameworkTest('testObjCExportLegacySuspendUnit') { final String frameworkName = 'KtLegacySuspendUnit' final String frameworkArtifactName = 'Kt' final String dir = "$testOutputFramework/testObjCExportLegacySuspendUnit" final File lazyHeader = file("$dir/$target-lazy.h") doLast { final String expectedLazyHeaderName = "expectedLazyLegacySuspendUnit.h" final String expectedLazyHeaderDir = file("objcexport/") final File expectedLazyHeader = new File(expectedLazyHeaderDir, expectedLazyHeaderName) if (expectedLazyHeader.readLines() != lazyHeader.readLines()) { exec { commandLine 'diff', '-u', expectedLazyHeader, lazyHeader ignoreExitValue = true } copy { from(lazyHeader) into(expectedLazyHeaderDir) rename { expectedLazyHeaderName } } throw new Error("$expectedLazyHeader file patched;\nre-run the test and don't forget to commit the patch") } } def libraryName = frameworkName + "Library" konanArtifacts { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" artifactName "test-library" if (!useCustomDist) { dependsOn ":${target.name}CrossDistRuntime", ':distCompiler' } extraOpts "-Xshort-module-name=MyLibrary" extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" } } framework(frameworkName) { sources = ['objcexport'] artifact = frameworkArtifactName library = libraryName opts = ["-Xemit-lazy-objc-header=$lazyHeader"] } swiftSources = ['objcexport'] swiftExtraOpts = [ '-D', 'LEGACY_SUSPEND_UNIT_FUNCTION_EXPORT' ] if (isNoopGC) { swiftExtraOpts += ["-D", "NOOP_GC"] } } frameworkTest('testObjCExportStatic') { final String frameworkName = 'KtStatic' final String frameworkArtifactName = 'Kt' final String libraryName = frameworkName + "Library" konanArtifacts { library(libraryName, targets: [target.name]) { srcDir "objcexport/library" artifactName "test-library" delegate.getByTarget(target.name).configure{ UtilsKt.dependsOnDist(it) } extraOpts "-Xshort-module-name=MyLibrary" extraOpts "-module-name", "org.jetbrains.kotlin.native.test-library" } } codesign = false framework(frameworkName) { sources = ['objcexport'] bitcode = false artifact = frameworkArtifactName library = libraryName isStatic = true opts = ["-Xbinary=unitSuspendFunctionObjCExport=proper"] } swiftSources = ['objcexport'] if (isNoopGC) { swiftExtraOpts += ["-D", "NOOP_GC"] } } frameworkTest('testValuesGenericsFramework') { framework('ValuesGenerics') { sources = ['objcexport/values.kt', 'framework/values_generics'] } swiftSources = ['framework/values_generics/'] } frameworkTest("testStdlibFramework") { framework('Stdlib') { sources = ['framework/stdlib'] bitcode = true } if (cacheTesting == null) fullBitcode = true swiftSources = ['framework/stdlib/'] } if (cacheTesting != null && cacheTesting.isDynamic) { // testMultipleFrameworks disabled until https://youtrack.jetbrains.com/issue/KT-34262 is fixed. } else frameworkTest("testMultipleFrameworks") { framework('First') { sources = ['framework/multiple/framework1', 'framework/multiple/shared'] bitcode = true } framework('Second') { sources = ['framework/multiple/framework2', 'framework/multiple/shared'] bitcode = true } swiftSources = ['framework/multiple'] } frameworkTest("testMultipleFrameworksStatic") { if (cacheTesting != null) { // See https://youtrack.jetbrains.com/issue/KT-34261. expectedExitStatus = 134 } framework('FirstStatic') { artifact = 'First' sources = ['framework/multiple/framework1', 'framework/multiple/shared'] bitcode = true isStatic = true opts = ['-Xstatic-framework', "-Xpre-link-caches=enable"] } framework('SecondStatic') { artifact = 'Second' sources = ['framework/multiple/framework2', 'framework/multiple/shared'] bitcode = true isStatic = true opts = ['-Xstatic-framework', "-Xpre-link-caches=enable"] } codesign = false swiftSources = ['framework/multiple'] } frameworkTest("testGh3343Framework") { framework('Gh3343') { sources = ['framework/gh3343'] library = 'objcGh3343' } swiftSources = ['framework/gh3343/'] } frameworkTest("testKt42397Framework") { enabled = !project.globalTestArgs.contains('-opt') framework("Kt42397") { sources = ['framework/kt42397'] } swiftSources = ['framework/kt42397'] } frameworkTest("testKt43517Framework") { framework('Kt43517') { sources = ['framework/kt43517'] library = 'objcKt43517' } swiftSources = ['framework/kt43517/'] } frameworkTest("testStackTraceFramework") { enabled = !project.globalTestArgs.contains('-opt') framework('Stacktrace') { sources = ['framework/stacktrace'] opts = ['-g'] } swiftSources = ['framework/stacktrace/'] } frameworkTest("testStackTraceByLibbacktraceFramework") { enabled = !project.globalTestArgs.contains('-opt') framework('StacktraceByLibbacktrace') { sources = ['framework/stacktraceByLibbacktrace'] opts = ['-g', '-Xbinary=sourceInfoType=libbacktrace'] } swiftSources = ['framework/stacktraceByLibbacktrace/'] } frameworkTest("testAbstractInstantiationFramework") { framework('AbstractInstantiation') { sources = ['framework/abstractInstantiation'] } swiftSources = ['framework/abstractInstantiation/'] expectedExitStatus = 134 } frameworkTest("testFrameworkBundleId") { def currentTarget = project.target.name enabled = currentTarget.startsWith("mac") framework("Foo") { sources = ["framework/bundle_id/main.kt", "framework/bundle_id/lib.kt"] } swiftSources = [] doLast { def frameworkPath = "$testOutputFramework/testFrameworkBundleId/$target/Foo.framework" def pattern = ~"CFBundleIdentifier\n\\s*Foo" def plistContent = file("$frameworkPath/Resources/Info.plist").text if (!pattern.matcher(plistContent).find()) { throw new Error("Unexpected Info.plist content:\n$plistContent") } } } } /** * Creates tasks to build and execute Harmony regex tests with GTEST logger. */ KotlinNativeTestKt.createTest(project, 'harmonyRegexTest', KonanGTest) { task -> task.enabled = (project.testTarget != 'wasm32') // Uses exceptions. task.useFilter = false task.testLogger = KonanTest.Logger.GTEST def sources = UtilsKt.getFilesToCompile(project, ["../../../libraries/stdlib/native-wasm/test/harmony_regex"], []) konanArtifacts { program('harmonyRegexTest', targets: [target.name]) { srcFiles sources baseDir "$testOutputStdlib/harmonyRegexTest" extraOpts '-tr' extraOpts project.globalTestArgs } } task.finalizedBy("resultsTask") } if (UtilsKt.getTestTargetSupportsCodeCoverage(project)) { task coverage_basic_program(type: CoverageTest) { binaryName = "CoverageBasic" numberOfCoveredFunctions = 1 numberOfCoveredLines = 3 konanArtifacts { program(binaryName, targets: [ target ]) { srcDir 'coverage/basic/program' baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.program.main" extraOpts "-Xcoverage", "-Xcoverage-file=$profrawFile" extraOpts project.globalTestArgs } } } task coverage_basic_library(type: CoverageTest) { binaryName = "CoverageBasicLibrary" numberOfCoveredFunctions = 1 numberOfCoveredLines = 1 konanArtifacts { library("lib_to_cover", targets: [target.name]) { srcFiles 'coverage/basic/library/library.kt' } program(binaryName, targets: [ target ]) { srcFiles 'coverage/basic/library/main.kt' libraries { artifact konanArtifacts.lib_to_cover } baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.library.main" extraOpts "-Xcoverage-file=$profrawFile", "-Xlibrary-to-cover=${konanArtifacts.lib_to_cover.getArtifactByTarget(target.name)}" extraOpts project.globalTestArgs } } } task coverage_controlflow(type: CoverageTest) { binaryName = "CoverageControlFlow" numberOfCoveredFunctions = 1 numberOfCoveredLines = 102 konanArtifacts { program(binaryName, targets: [ target ]) { srcDir 'coverage/basic/controlflow' baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.controlflow.main" extraOpts "-Xcoverage", "-Xcoverage-file=$profrawFile" extraOpts project.globalTestArgs } } } task coverage_jumps(type: CoverageTest) { binaryName = "CoverageJumps" numberOfCoveredFunctions = 8 numberOfCoveredLines = 74 konanArtifacts { program(binaryName, targets: [ target ]) { srcDir 'coverage/basic/jumps' baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.jumps.main" extraOpts "-Xcoverage", "-Xcoverage-file=$profrawFile" extraOpts project.globalTestArgs } } } task coverage_smoke0(type: CoverageTest) { binaryName = "CoverageSmoke0" numberOfCoveredFunctions = 2 numberOfCoveredLines = 5 konanArtifacts { program(binaryName, targets: [ target ]) { srcDir 'coverage/basic/smoke0' baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.smoke0.main" extraOpts "-Xcoverage", "-Xcoverage-file=$profrawFile" extraOpts project.globalTestArgs } } } task coverage_smoke1(type: CoverageTest) { binaryName = "CoverageSmoke1" numberOfCoveredFunctions = 9 numberOfCoveredLines = 33 konanArtifacts { program(binaryName, targets: [ target ]) { srcDir 'coverage/basic/smoke1' baseDir "$testOutputCoverage/$binaryName" entryPoint "coverage.basic.smoke1.main" extraOpts "-Xcoverage", "-Xcoverage-file=$profrawFile" extraOpts project.globalTestArgs } } } } tasks.register("metadata_compare_typedefs", MetadataComparisonTest) { UtilsKt.dependsOnDist(it) enabled = (project.testTarget != 'wasm32') defFile = "interop/basics/typedefs.def" } tasks.register("metadata_compare_unable_to_import", MetadataComparisonTest) { UtilsKt.dependsOnDist(it) enabled = (project.testTarget != 'wasm32') defFile = "interop/basics/unable_to_import.def" } standaloneTest("local_ea_arraysfieldwrite") { disabled = (cacheTesting != null) // Cache is not compatible with -opt. useGoldenData = true flags = ["-opt"] source = "codegen/localEscapeAnalysis/arraysFieldWrite.kt" } tasks.register("override_konan_properties0", KonanDriverTest) { def overrides = PlatformInfo.isWindows() ? '-Xoverride-konan-properties="llvmInlineThreshold=76"' : '-Xoverride-konan-properties=llvmInlineThreshold=76' flags = [ "-opt", "-Xverbose-phases=BitcodeOptimization", overrides ] compilerMessages = true source = "link/ir_providers/hello.kt" def messages = "inline_threshold: 76\nhello\n" outputChecker = { out -> messages.split("\n") .collect { line -> out.contains(line) } .every { it == true } } } tasks.register("llvm_variant_dev", KonanDriverTest) { // We use clang from Xcode on macOS for apple targets, // so it is hard to reliably detect LLVM variant for these targets. disabled = isAppleTarget(project) flags = [ "-Xllvm-variant=dev", "-Xverbose-phases=ObjectFiles" ] compilerMessages = true source = "link/ir_providers/hello.kt" // User LLVM variant has "essentials" suffix. def message = "-essentials" outputChecker = { out -> !out.contains(message) } } createStdlibTest('stdlibTest', /* inWorker = */ false) createStdlibTest('stdlibTestInWorker', /*inWorker = */ true) /** * Creates tasks to build and execute stdlib tests. */ private void createStdlibTest(String name, boolean inWorker) { KotlinNativeTestKt.createTest(project, name, KonanGTest) { task -> configureStdlibTest(task, inWorker) } } /** * Configures tasks to build and execute stdlib tests. */ private void configureStdlibTest(KonanGTest task, boolean inWorker) { def sources = UtilsKt.getFilesToCompile(project, [ '../../../libraries/stdlib/common/test', '../../../libraries/stdlib/test', '../../../libraries/kotlin.test/common/src/test/kotlin', 'stdlib_external/utils.kt', 'stdlib_external/jsCollectionFactoriesActuals.kt', 'stdlib_external/text'], [ /*'build/stdlib_external/stdlib/test/internalAnnotations.kt'*/ ]) konanArtifacts { program(task.name, targets: [target.name]) { srcFiles sources baseDir "$testOutputStdlib/$task.name" enableMultiplatform true extraOpts inWorker ? '-trw' : '-tr', '-Xverify-ir', '-opt-in=kotlin.RequiresOptIn,kotlin.ExperimentalStdlibApi', "-friend-modules", project.rootProject.file("${UtilsKt.getKotlinNativeDist(project)}/klib/common/stdlib").absolutePath extraOpts project.globalTestArgs } } // Exclude test providing args to the test executable task.arguments = [ "--ktest_negative_regex_filter=test.collections.CollectionTest.abstractCollectionToArray" ] task.useFilter = false task.testLogger = KonanTest.Logger.GTEST task.finalizedBy("resultsTask") task.enabled = (project.testTarget != 'wasm32') // Uses exceptions } /** * Builds tests into a single binary with TestRunner */ task buildKonanTests { t -> def compileList = [ "codegen", "datagen", "lower", "runtime", "serialization", "sanity" ] // These tests should not be built into the TestRunner's test executable def excludeList = [ "codegen/inline/returnLocalClassFromBlock.kt" ] project.tasks .withType(KonanStandaloneTest.class) .each { // add library and source files if (it instanceof KonanLinkTest) { excludeList += it.lib } if (it.source != null) { excludeList += it.source } } def sources = UtilsKt.getFilesToCompile(project, compileList, excludeList) konanArtifacts { program('localTest', targets: [target.name]) { srcFiles sources baseDir testOutputLocal extraOpts '-ea' // Without this option assertions would remain inactive. extraOpts '-tr' extraOpts '-Xverify-ir' extraOpts project.globalTestArgs } } // Set build dependencies. dependsOn compileKonanLocalTest def buildTask = UtilsKt.findKonanBuildTask(project, "localTest", target) UtilsKt.dependsOnDist(buildTask) // Local tests build into a single binary should depend on this task project.tasks .withType(KonanLocalTest.class) .matching { !(it instanceof KonanStandaloneTest) } .configureEach { it.dependsOn(t) } } sourceSets { nopPlugin { kotlin { srcDir 'extensions/nop/src/main/kotlin' } } test { kotlin { srcDir 'debugger/src/test/kotlin' } } update_stdlib_tests{ kotlin { srcDir '../../../libraries/stdlib/common/test' srcDir '../../../libraries/stdlib/test' srcDir '../../../libraries/kotlin.test/common/src/test/kotlin' } } } compileNopPluginKotlin { kotlinOptions.freeCompilerArgs += ['-Xskip-prerelease-check'] } Task pluginTest(String name, String pluginName, Closure configureClosure) { def jarTask = project.tasks.register("jar-$pluginName", Jar) { it.dependsOn("compile${pluginName.capitalize()}Kotlin") from { sourceSets[pluginName].output } baseName = pluginName destinationDirectory = buildDir } def taskName = "$name-with-$pluginName" return KotlinNativeTestKt.createTest(project, taskName, KonanStandaloneTest) { task -> task.configure(configureClosure) task.dependsOn(jarTask) if (task.enabled) { konanArtifacts { program(taskName, targets: [target.name]) { baseDir "$testOutputLocal/$taskName" srcFiles task.getSources() extraOpts task.flags + "-Xplugin=$buildDir/nop-plugin.jar" extraOpts project.globalTestArgs } } } } } pluginTest("runtime_basic_init", "nopPlugin") { disabled = (project.testTarget == 'wasm32') source = "runtime/basic/runtime_basic_init.kt" flags = ["-tr"] } Task fileCheckTest(String name, Closure configureClosure) { return project.tasks.create(name, FileCheckTest) { task -> task.configure(configureClosure) task.llvmIr = project.file("$testOutputFileCheck/$name/$target/out.ll") if (task.enabled) { konanArtifacts { def lib = task.interop if (lib != null) { UtilsKt.dependsOnKonanBuildingTask(task, lib, target) } if (!task.generateFramework) { // We could use `bitcode` here to make things faster. But: // 1. `bitcode` has no other usages. // 2. Unification should help porting to the new test infra. // 3. Compiler might behave differently when outputting bitcode instead of object files. program(name, targets: [target]) { srcFiles task.annotatedSource baseDir "$testOutputFileCheck/$name" extraOpts project.globalTestArgs extraOpts "-Xtemporary-files-dir=$testOutputFileCheck/$name/$target", "-Xsave-llvm-ir" if (lib != null) { libraries { artifact lib } } } } else { // Framework support is much weakier than `frameworkTest`, but we don't need much. framework(name, targets: [target]) { srcFiles task.annotatedSource baseDir "$testOutputFileCheck/$name" extraOpts project.globalTestArgs extraOpts "-Xtemporary-files-dir=$testOutputFileCheck/$name/$target", "-Xsave-llvm-ir", "-Xmeaningful-bridge-names" if (lib != null) { libraries { artifact lib } } } } UtilsKt.dependsOnKonanBuildingTask(task, name, target) } } } } fileCheckTest("filecheck_smoke0") { annotatedSource = project.file('filecheck/smoke0.kt') } fileCheckTest("filecheck_replace_invoke_with_call") { annotatedSource = project.file('filecheck/replace_invoke_with_call.kt') } fileCheckTest("filecheck_intrinsics") { annotatedSource = project.file('filecheck/intrinsics.kt') } fileCheckTest("filecheck_escape_analysis_enabled") { annotatedSource = project.file('filecheck/escape_analysis.kt') enabled = project.globalTestArgs.contains('-opt') checkPrefix = "CHECK-OPT" } fileCheckTest("filecheck_escape_analysis_disabled") { annotatedSource = project.file('filecheck/escape_analysis.kt') enabled = project.globalTestArgs.contains('-g') checkPrefix = "CHECK-DEBUG" } fileCheckTest("filecheck_suspend_returnNothing") { annotatedSource = project.file('filecheck/suspend_returnNothing.kt') } fileCheckTest("filecheck_bce") { annotatedSource = project.file('filecheck/bce.kt') } fileCheckTest("filecheck_signext_zeroext0") { annotatedSource = project.file('filecheck/signext_zeroext0.kt') if (project.testTarget == 'mingw_x64') { checkPrefix = "CHECK-WINDOWSX64" } else if (!target.family.appleFamily && target.architecture == Architecture.ARM64) { checkPrefix = "CHECK-AAPCS" } } createInterop("filecheck_signext_zeroext_interop_input") { it.defFile 'filecheck/signext_zeroext_interop_input.def' } fileCheckTest("filecheck_signext_zeroext_interop") { annotatedSource = project.file('filecheck/signext_zeroext_interop.kt') interop = "filecheck_signext_zeroext_interop_input" if (project.testTarget == 'mingw_x64') { checkPrefix = "CHECK-WINDOWSX64" } else if (!target.family.appleFamily && target.architecture == Architecture.ARM64) { checkPrefix = "CHECK-AAPCS" } } fileCheckTest("filecheck_signext_zeroext_objc_export") { annotatedSource = project.file('filecheck/signext_zeroext_objc_export.kt') generateFramework = true enabled = target.family.appleFamily } fileCheckTest("filecheck_function_attributes_at_callsite") { enabled = (project.testTarget != 'wasm32') // KT-49739 annotatedSource = project.file('filecheck/function_attributes_at_callsite.kt') } dependencies { nopPluginApi project(kotlinCompilerModule) nopPluginApi project(":native:kotlin-native-utils") nopPluginApi project(":core:descriptors") nopPluginApi project(":compiler:ir.tree") nopPluginApi project(":compiler:ir.tree.impl") nopPluginApi project(":compiler:ir.backend.common") nopPluginApi project(":compiler:util") nopPluginApi project(":native:frontend.native") nopPluginApi project(":compiler:cli-common") nopPluginApi project(":compiler:cli") nopPluginApi project(":kotlin-util-klib") nopPluginApi project(":kotlin-util-klib-metadata") nopPluginApi project(":compiler:ir.serialization.common") api project(kotlinCompilerModule) api project(path: ':kotlin-native:backend.native', configuration: 'cli_bcApiElements') api DependenciesKt.commonDependency(project, "junit") } project.tasks.named("test").configure { // Don't run this task as it will try to execute debugger tests too // that is not desired as they are platform-specific. enabled = false } project.tasks.register("debugger_test", Test.class) { enabled = (target.family.appleFamily) // KT-30366 testLogging { exceptionFormat = 'full' } UtilsKt.dependsOnDist(it) systemProperties = ['kotlin.native.home': kotlinNativeDist, 'kotlin.native.host': HostManager.@Companion.getHost(), 'kotlin.native.test.target': target, 'kotlin.native.test.debugger.simulator.enabled': findProperty("kotlin.native.test.debugger.simulator.enabled"), 'kotlin.native.test.debugger.simulator.delay': findProperty("kotlin.native.test.debugger.simulator.delay")] outputs.upToDateWhen { false } } // Configure build for iOS device targets. if (UtilsKt.supportsRunningTestsOnDevice(target)) { project.tasks .withType(KonanTestExecutable.class) .configureEach { ExecutorServiceKt.configureXcodeBuild((KonanTestExecutable) it) } // Exclude tasks that cannot be run on device project.tasks .withType(KonanTest.class) .matching { (it instanceof KonanLocalTest && ((KonanLocalTest) it).useTestData) || // Filter out tests that depend on libs. TODO: copy them too it instanceof KonanInteropTest || it instanceof KonanDynamicTest || it instanceof KonanLinkTest } .configureEach { it.enabled = false } } project.afterEvaluate { // Don't treat any task as up-to-date, no matter what. // Note: this project should contain only test tasks, including ones that build binaries, // and ones that run binaries. // So the configuration below mostly means "tests aren't up-to-date". tasks.configureEach { outputs.upToDateWhen { false } } }