@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") package kotlinx.coroutines.debug import kotlinx.coroutines.testing.* import com.google.gson.* import kotlinx.coroutines.* import kotlinx.coroutines.debug.internal.* import org.junit.Test import kotlin.test.* class EnhanceStackTraceWithTreadDumpAsJsonTest : DebugTestBase() { private data class StackTraceElementInfoFromJson( val declaringClass: String, val methodName: String, val fileName: String?, val lineNumber: Int ) @Test fun testEnhancedStackTraceFormatWithDeferred() = runTest { val deferred = async { suspendingMethod() assertTrue(true) } yield() val coroutineInfo = DebugProbesImpl.dumpCoroutinesInfo() assertEquals(coroutineInfo.size, 2) val info = coroutineInfo[1] val enhancedStackTraceAsJsonString = DebugProbesImpl.enhanceStackTraceWithThreadDumpAsJson(info) val enhancedStackTraceFromJson = Gson().fromJson(enhancedStackTraceAsJsonString, Array::class.java) val enhancedStackTrace = DebugProbesImpl.enhanceStackTraceWithThreadDump(info, info.lastObservedStackTrace) assertEquals(enhancedStackTrace.size, enhancedStackTraceFromJson.size) for ((frame, frameFromJson) in enhancedStackTrace.zip(enhancedStackTraceFromJson)) { assertEquals(frame.className, frameFromJson.declaringClass) assertEquals(frame.methodName, frameFromJson.methodName) assertEquals(frame.fileName, frameFromJson.fileName) assertEquals(frame.lineNumber, frameFromJson.lineNumber) } deferred.cancelAndJoin() } private suspend fun suspendingMethod() { delay(Long.MAX_VALUE) } }