Merge "Make thread leak error message more readable" into main
This commit is contained in:
commit
e9a5de9fba
1 changed files with 17 additions and 4 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue