aboutsummaryrefslogtreecommitdiffstats
path: root/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt')
-rw-r--r--kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt53
1 files changed, 53 insertions, 0 deletions
diff --git a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt
index 70336659..dba738a8 100644
--- a/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt
+++ b/kotlinx-coroutines-core/jvm/test/exceptions/StackTraceRecoveryCustomExceptionsTest.kt
@@ -5,6 +5,7 @@
package kotlinx.coroutines.exceptions
import kotlinx.coroutines.*
+import kotlinx.coroutines.channels.*
import org.junit.Test
import kotlin.test.*
@@ -71,4 +72,56 @@ class StackTraceRecoveryCustomExceptionsTest : TestBase() {
assertEquals("custom", cause.message)
}
}
+
+ class WrongMessageException(token: String) : RuntimeException("Token $token")
+
+ @Test
+ fun testWrongMessageException() = runTest {
+ val result = runCatching {
+ coroutineScope<Unit> {
+ throw WrongMessageException("OK")
+ }
+ }
+ val ex = result.exceptionOrNull() ?: error("Expected to fail")
+ assertTrue(ex is WrongMessageException)
+ assertEquals("Token OK", ex.message)
+ }
+
+ @Test
+ fun testWrongMessageExceptionInChannel() = runTest {
+ val result = produce<Unit>(SupervisorJob() + Dispatchers.Unconfined) {
+ throw WrongMessageException("OK")
+ }
+ val ex = runCatching {
+ @Suppress("ControlFlowWithEmptyBody")
+ for (unit in result) {
+ // Iterator has a special code path
+ }
+ }.exceptionOrNull() ?: error("Expected to fail")
+ assertTrue(ex is WrongMessageException)
+ assertEquals("Token OK", ex.message)
+ }
+
+ class CopyableWithCustomMessage(
+ message: String?,
+ cause: Throwable? = null
+ ) : RuntimeException(message, cause),
+ CopyableThrowable<CopyableWithCustomMessage> {
+
+ override fun createCopy(): CopyableWithCustomMessage {
+ return CopyableWithCustomMessage("Recovered: [$message]", cause)
+ }
+ }
+
+ @Test
+ fun testCustomCopyableMessage() = runTest {
+ val result = runCatching {
+ coroutineScope<Unit> {
+ throw CopyableWithCustomMessage("OK")
+ }
+ }
+ val ex = result.exceptionOrNull() ?: error("Expected to fail")
+ assertTrue(ex is CopyableWithCustomMessage)
+ assertEquals("Recovered: [OK]", ex.message)
+ }
}