1 package kotlinx.coroutines.debug
2 
3 import kotlinx.coroutines.*
4 import org.junit.*
5 import org.junit.Test
6 import kotlin.test.*
7 
8 class DumpWithCreationStackTraceTest : DebugTestBase() {
9     @Before
setUpnull10     override fun setUp() {
11         super.setUp()
12         DebugProbes.enableCreationStackTraces = true
13     }
14 
15     @Test
<lambda>null16     fun testCoroutinesDump() = runTest {
17         val deferred = createActiveDeferred()
18         yield()
19         verifyDump(
20             "Coroutine \"coroutine#1\":BlockingCoroutine{Active}@70d1cb56, state: RUNNING\n" +
21                 "\tat java.lang.Thread.getStackTrace(Thread.java)\n" +
22                 "\tat kotlinx.coroutines.debug.internal.DebugProbesImpl.enhanceStackTraceWithThreadDumpImpl(DebugProbesImpl.kt)\n" +
23                 "\tat kotlinx.coroutines.debug.internal.DebugProbesImpl.dumpCoroutinesSynchronized(DebugProbesImpl.kt)\n" +
24                 "\tat kotlinx.coroutines.debug.internal.DebugProbesImpl.dumpCoroutines(DebugProbesImpl.kt)\n" +
25                 "\tat kotlinx.coroutines.debug.DebugProbes.dumpCoroutines(DebugProbes.kt:182)\n" +
26                 "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump(StacktraceUtils.kt)\n" +
27                 "\tat kotlinx.coroutines.debug.StacktraceUtilsKt.verifyDump\$default(StacktraceUtils.kt)\n" +
28                 "\tat kotlinx.coroutines.debug.DumpWithCreationStackTraceTest\$testCoroutinesDump\$1.invokeSuspend(DumpWithCreationStackTraceTest.kt)\n" +
29                 "\tat _COROUTINE._CREATION._(CoroutineDebugging.kt)\n" +
30                 "\tat kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt.createCoroutineUnintercepted(IntrinsicsJvm.kt)",
31 
32             "Coroutine \"coroutine#2\":DeferredCoroutine{Active}@383fa309, state: SUSPENDED\n" +
33                 "\tat kotlinx.coroutines.debug.DumpWithCreationStackTraceTest\$createActiveDeferred\$1.invokeSuspend(DumpWithCreationStackTraceTest.kt)"
34         )
35         deferred.cancelAndJoin()
36     }
37 
38 
<lambda>null39     private fun CoroutineScope.createActiveDeferred(): Deferred<*> = async {
40         suspendingMethod()
41         assertTrue(true)
42     }
43 
suspendingMethodnull44     private suspend fun suspendingMethod() {
45         delay(Long.MAX_VALUE)
46     }
47 }
48