Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54a36368 authored by Jacky Wang's avatar Jacky Wang
Browse files

Dump threads for troubleshooting when catalyst test timeout

Bug: 370394101
Flag: EXEMPT test only
Test: Manual
Change-Id: Ib361e621d6b34db987205c14343d6f27231072bb
parent 29809687
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -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, "")
            }
        }
    }
}