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