summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-10-16 10:07:23 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-10-16 10:07:23 +0000
commita28b2a713465af4a024d34240c0ca378a4783e0c (patch)
tree7dc04ea770f6dac7e44f24f12c2142ed30a0f765
parentd10c7b32066b353ae6fed58c38c602a79f194dcd (diff)
parent54a36368fabd563e2a3052094ef970ab8bbc8ff1 (diff)
Merge "Dump threads for troubleshooting when catalyst test timeout" into main
-rw-r--r--packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt32
1 files changed, 30 insertions, 2 deletions
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 e27838c4ef4d..1412c84c137b 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.preference.PreferenceScreen
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 @@ abstract class CatalystScreenTestCase {
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 @@ abstract class CatalystScreenTestCase {
}
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 @@ abstract class CatalystScreenTestCase {
}
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, "")
+ }
+ }
+ }
}