Merge "Make thread leak error message more readable" into main

This commit is contained in:
Junyu Lai 2023-11-17 08:34:42 +00:00 • committed by Gerrit Code Review
commit e9a5de9fba

View file

@ -17,9 +17,9 @@
package com.android.testutils
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.net.module.util.LinkPropertiesUtils.CompareOrUpdateResult
import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
import java.lang.IllegalStateException
import java.lang.reflect.Modifier
import org.junit.runner.Description
import org.junit.runner.Runner
@ -110,10 +110,19 @@ class DevSdkIgnoreRunner(private val klass: Class<*>) : Runner(), Filterable, So
notifier.fireTestStarted(leakMonitorDesc)
val threadCountsAfterTest = getAllThreadNameCounts()
if (threadCountsBeforeTest != threadCountsAfterTest) {
// TODO : move CompareOrUpdateResult to its own util instead of LinkProperties.
val threadsDiff = CompareOrUpdateResult(
threadCountsBeforeTest.entries,
threadCountsAfterTest.entries
) { it.key }
// Ignore removed threads, which typically are generated by previous tests.
// Because this is in the threadsDiff.updated member, for sure there is a
// corresponding key in threadCountsBeforeTest.
val increasedThreads = threadsDiff.updated
.filter { threadCountsBeforeTest[it.key]!! < it.value }
if (threadsDiff.added.isNotEmpty() || increasedThreads.isNotEmpty()) {
notifier.fireTestFailure(Failure(leakMonitorDesc,
IllegalStateException("Expected threads: $threadCountsBeforeTest " +
"but got: $threadCountsAfterTest")))
IllegalStateException("Unexpected thread changes: $threadsDiff")))
}
notifier.fireTestFinished(leakMonitorDesc)
}
@ -121,9 +130,13 @@ class DevSdkIgnoreRunner(private val klass: Class<*>) : Runner(), Filterable, So
private fun getAllThreadNameCounts(): Map<String, Int> {
// Get the counts of threads in the group per name.
// Filter system thread groups.
// Also ignore threads with 1 count, this effectively filtered out threads created by the
// test runner or other system components. e.g. hwuiTask*, queued-work-looper,
// SurfaceSyncGroupTimer, RenderThread, Time-limited test, etc.
return Thread.getAllStackTraces().keys
.filter { it.threadGroup?.name != "system" }
.groupingBy { it.name }.eachCount()
.filter { it.value != 1 }
}
override fun getDescription(): Description {