1 @file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
2 package kotlinx.coroutines.debug
3 
4 import kotlinx.coroutines.testing.*
5 import com.google.gson.*
6 import kotlinx.coroutines.*
7 import kotlinx.coroutines.debug.internal.*
8 import org.junit.Test
9 import kotlin.test.*
10 
11 class EnhanceStackTraceWithTreadDumpAsJsonTest : DebugTestBase() {
12     private data class StackTraceElementInfoFromJson(
13         val declaringClass: String,
14         val methodName: String,
15         val fileName: String?,
16         val lineNumber: Int
17     )
18 
19     @Test
<lambda>null20     fun testEnhancedStackTraceFormatWithDeferred() = runTest {
21         val deferred = async {
22             suspendingMethod()
23             assertTrue(true)
24         }
25         yield()
26 
27         val coroutineInfo = DebugProbesImpl.dumpCoroutinesInfo()
28         assertEquals(coroutineInfo.size, 2)
29         val info = coroutineInfo[1]
30         val enhancedStackTraceAsJsonString = DebugProbesImpl.enhanceStackTraceWithThreadDumpAsJson(info)
31         val enhancedStackTraceFromJson = Gson().fromJson(enhancedStackTraceAsJsonString, Array<StackTraceElementInfoFromJson>::class.java)
32         val enhancedStackTrace = DebugProbesImpl.enhanceStackTraceWithThreadDump(info, info.lastObservedStackTrace)
33         assertEquals(enhancedStackTrace.size, enhancedStackTraceFromJson.size)
34         for ((frame, frameFromJson) in enhancedStackTrace.zip(enhancedStackTraceFromJson)) {
35             assertEquals(frame.className, frameFromJson.declaringClass)
36             assertEquals(frame.methodName, frameFromJson.methodName)
37             assertEquals(frame.fileName, frameFromJson.fileName)
38             assertEquals(frame.lineNumber, frameFromJson.lineNumber)
39         }
40 
41         deferred.cancelAndJoin()
42     }
43 
suspendingMethodnull44     private suspend fun suspendingMethod() {
45         delay(Long.MAX_VALUE)
46     }
47 }
48