From 5a04b7935e1cf7e3d67508886db9e7ab851570c4 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Wed, 29 Jan 2020 21:34:21 +0300 Subject: [PATCH] Add workaround for obsolete inline suspend integration test Restore test data dropped in 7abd87d5, add specific output check KT-36240 --- .../obsoleteInlineSuspend/library/a.kt | 31 ++++++++++++++++ .../obsoleteInlineSuspend/output.txt | 2 ++ .../obsoleteInlineSuspend/source.kt | 36 +++++++++++++++++++ .../CompileKotlinAgainstCustomBinariesTest.kt | 13 ++++++- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/library/a.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/source.kt diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/library/a.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/library/a.kt new file mode 100644 index 00000000000..0c55e519627 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/library/a.kt @@ -0,0 +1,31 @@ +package library + +import kotlin.coroutines.experimental.* + +var continuation: Continuation? = null +val sb = java.lang.StringBuilder() + +fun append(s: String) { sb.append(s) } + +val libraryResult: String get() = sb.toString() + +// this is an inline tail-suspend function that should work properly despite being compiler by +// compiler before 1.1.4 version that did not include suspension marks into bytecode. +// In order to test that it works properly it shall actually suspend during its execution +inline suspend fun foo(block: () -> Unit) { + append("(foo)") + block() + return suspendCoroutine { continuation = it } +} + +suspend fun bar() { + append("(bar)") + return suspendCoroutine { continuation = it } +} + +fun resumeLibrary() { + continuation?.let { + continuation = null + it.resume(Unit) + } +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/output.txt new file mode 100644 index 00000000000..7d53695d487 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/output.txt @@ -0,0 +1,2 @@ +warning: language version 1.2 is deprecated and its support will be removed in a future version of Kotlin +OK diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/source.kt new file mode 100644 index 00000000000..02c640eeb76 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/obsoleteInlineSuspend/source.kt @@ -0,0 +1,36 @@ +import library.* +import kotlin.coroutines.experimental.* + +suspend fun test() { + append("[foo]") + foo { // we are inlining foo here + append("(block)") + } + append("[bar]") + bar() // and invoking suspending function bar + append("[test]") +} + +fun runBlockingLibrary(block: suspend () -> Unit): String { + var done = false + block.startCoroutine(object : Continuation { + override val context: CoroutineContext = EmptyCoroutineContext + override fun resume(value: Unit) { done = true } + override fun resumeWithException(exception: Throwable) { throw exception } + }) + var resumeCounter = 0 + while (!done) { + resumeCounter++ + resumeLibrary() + } + return "$libraryResult:resumes=$resumeCounter" +} + +// Retruns array of expected and received string +fun run(): Array { + val result = runBlockingLibrary { + test() + } + return arrayOf("[foo](foo)(block)[bar](bar)[test]:resumes=2", result) +} + diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt index dc8d2a372a5..728ed1da6d2 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt @@ -498,7 +498,18 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration val version = intArrayOf(1, 0, 1) // legacy coroutines metadata val options = listOf("-language-version", "1.2", "-Xcoroutines=enable") val library = transformJar( - compileLibrary("library", additionalOptions = options, extraClassPath = listOf(ForTestCompileRuntime.coroutinesCompatForTests())), + compileLibrary( + "library", + additionalOptions = options, + extraClassPath = listOf(ForTestCompileRuntime.coroutinesCompatForTests()), + checkKotlinOutput = { actual -> + // TODO KT-36240 + assertEquals( + "warning: language version 1.2 is deprecated and its support will be removed in a future version of Kotlin\nOK\n", + actual + ) + } + ), { _, bytes -> val (resultBytes, removedCounter) = stripSuspensionMarksToImitateLegacyCompiler( WrongBytecodeVersionTest.transformMetadataInClassFile(bytes) { name, _ ->