Dump threads for troubleshooting when catalyst test timeout
Bug: 370394101
Flag: EXEMPT test only
Test: Manual
Change-Id: Ib361e621d6b34db987205c14343d6f27231072bb
diff --git a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
index e27838c..1412c84 100644
--- a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
+++ b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt
@@ -27,6 +27,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.atomic.AtomicBoolean
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -53,7 +54,7 @@
enableCatalystScreen()
assertThat(preferenceScreenCreator.isFlagEnabled(context)).isTrue()
val catalystScreen = dumpPreferenceScreen()
- Log.i("Catalyst", catalystScreen)
+ Log.i(TAG, catalystScreen)
disableCatalystScreen()
assertThat(preferenceScreenCreator.isFlagEnabled(context)).isFalse()
@@ -83,11 +84,26 @@
}
private fun dumpPreferenceScreen(): String {
+ // Dump threads for troubleshooting when the test thread is stuck.
+ // Latest junit Timeout rule supports similar feature but it is not yet available on AOSP.
+ val taskFinished = AtomicBoolean()
+ Thread {
+ Thread.sleep(20000)
+ if (!taskFinished.get()) dumpThreads()
+ }
+ .apply {
+ isDaemon = true
+ start()
+ }
+
@Suppress("UNCHECKED_CAST")
val clazz = preferenceScreenCreator.fragmentClass() as Class<PreferenceFragmentCompat>
val builder = StringBuilder()
FragmentScenario.launch(clazz).use {
- it.onFragment { fragment -> fragment.preferenceScreen.toString(builder) }
+ it.onFragment { fragment ->
+ taskFinished.set(true)
+ fragment.preferenceScreen.toString(builder)
+ }
}
return builder.toString()
}
@@ -120,4 +136,16 @@
}
builder.append(indent).append("}\n")
}
+
+ companion object {
+ const val TAG = "CatalystScreenTestCase"
+
+ fun dumpThreads() {
+ for ((thread, stack) in Thread.getAllStackTraces()) {
+ Log.i(TAG, "$thread")
+ for (frame in stack) Log.i(TAG, " $frame")
+ Log.i(TAG, "")
+ }
+ }
+ }
}