1 package leakcanary
2 
3 import androidx.lifecycle.LifecycleObserver
4 import leakcanary.TestUtils.detectLeaks
5 import org.assertj.core.api.Assertions.assertThat
6 import org.junit.After
7 import org.junit.Before
8 import org.junit.Rule
9 import org.junit.Test
10 
11 class ObjectInspectorTest : HasActivityTestRule<TestActivity> {
12 
13   @get:Rule
14   override val activityRule = activityTestRule<TestActivity>(launchActivity = false)
15 
setUpnull16   @Before fun setUp() {
17     AppWatcher.objectWatcher.clearWatchedObjects()
18   }
19 
tearDownnull20   @After fun tearDown() {
21     AppWatcher.objectWatcher.clearWatchedObjects()
22   }
23 
LifecycleRegistry_LeakingStatus_Is_Reportednull24   @Test fun LifecycleRegistry_LeakingStatus_Is_Reported() {
25     triggersOnActivityCreated {
26       activityRule.launchActivity(null)
27     }
28     activity.lifecycle retained {
29       runOnMainSync {
30         val observer = object : LifecycleObserver {}
31         activity.lifecycle.addObserver(observer)
32         AppWatcher.objectWatcher.expectWeaklyReachable(observer, "observer")
33       }
34       triggersOnActivityDestroyed {
35         activityRule.finishActivity()
36       }
37       Thread.sleep(AppWatcher.retainedDelayMillis)
38 
39       val heapAnalysis = detectLeaks()
40 
41       val leaktrace = heapAnalysis.allLeaks.single().leakTraces.single()
42       val ref = leaktrace.referencePath.single { it.owningClassSimpleName == "LifecycleRegistry" }
43       val lifecycleRegistry = ref.originObject
44       assertThat(lifecycleRegistry.labels.single()).isEqualTo("state = DESTROYED")
45     }
46   }
47 }
48