88package io.bitdrift.capture.reports.exitinfo
99
1010import android.app.ActivityManager
11+ import android.app.ApplicationExitInfo
1112import com.nhaarman.mockitokotlin2.any
1213import com.nhaarman.mockitokotlin2.eq
1314import com.nhaarman.mockitokotlin2.mock
1415import com.nhaarman.mockitokotlin2.never
1516import com.nhaarman.mockitokotlin2.verify
17+ import com.nhaarman.mockitokotlin2.whenever
1618import io.bitdrift.capture.IInternalLogger
1719import org.assertj.core.api.Assertions.assertThat
1820import org.junit.Before
@@ -31,18 +33,18 @@ class PreviousRunInfoResolverTest {
3133
3234 private val internalLogger: IInternalLogger = mock()
3335 private val activityManager: ActivityManager = mock()
34- private lateinit var resolver : PreviousRunInfoResolver
36+ private lateinit var previousRunInfoResolver : PreviousRunInfoResolver
3537
3638 @Before
3739 fun setUp () {
38- resolver = PreviousRunInfoResolver (internalLogger)
40+ previousRunInfoResolver = PreviousRunInfoResolver (internalLogger)
3941 }
4042
4143 @Test
4244 fun initLegacyWatcher_whenNoStateFile_returnsNoCrash () {
43- resolver .initLegacyWatcher(tempFolder.root.absolutePath)
45+ previousRunInfoResolver .initLegacyWatcher(tempFolder.root.absolutePath)
4446
45- val result = resolver .get(activityManager)
47+ val result = previousRunInfoResolver .get(activityManager)
4648
4749 assertThat(result).isNull()
4850 }
@@ -51,8 +53,8 @@ class PreviousRunInfoResolverTest {
5153 fun get_afterPersistJvmCrashState_returnsCrashOnNextInit () {
5254 val sdkDir = tempFolder.root.absolutePath
5355
54- resolver .initLegacyWatcher(sdkDir)
55- resolver .persistJvmCrashState()
56+ previousRunInfoResolver .initLegacyWatcher(sdkDir)
57+ previousRunInfoResolver .persistJvmCrashState()
5658
5759 val nextRunResolver = PreviousRunInfoResolver (internalLogger)
5860 nextRunResolver.initLegacyWatcher(sdkDir)
@@ -67,8 +69,8 @@ class PreviousRunInfoResolverTest {
6769 fun initLegacyWatcher_resetsStateForCurrentRun () {
6870 val sdkDir = tempFolder.root.absolutePath
6971
70- resolver .initLegacyWatcher(sdkDir)
71- resolver .persistJvmCrashState()
72+ previousRunInfoResolver .initLegacyWatcher(sdkDir)
73+ previousRunInfoResolver .persistJvmCrashState()
7274
7375 val secondResolver = PreviousRunInfoResolver (internalLogger)
7476 secondResolver.initLegacyWatcher(sdkDir)
@@ -84,14 +86,14 @@ class PreviousRunInfoResolverTest {
8486
8587 @Test
8688 fun get_beforeInitLegacyWatcher_returnsNull () {
87- val result = resolver .get(activityManager)
89+ val result = previousRunInfoResolver .get(activityManager)
8890
8991 assertThat(result).isNull()
9092 }
9193
9294 @Test
9395 fun persistJvmCrashState_beforeInit_logsInternalError () {
94- resolver .persistJvmCrashState()
96+ previousRunInfoResolver .persistJvmCrashState()
9597
9698 verify(internalLogger).logInternalError(
9799 eq(null ),
@@ -102,21 +104,51 @@ class PreviousRunInfoResolverTest {
102104
103105 @Test
104106 @Config(sdk = [30 ])
105- fun initLegacyWatcher_isNoopOnApi30 () {
107+ fun initLegacyWatcher_whenApi30_shouldBeNoop () {
106108 val sdkDir = tempFolder.root.absolutePath
107- resolver .initLegacyWatcher(sdkDir)
109+ previousRunInfoResolver .initLegacyWatcher(sdkDir)
108110
109111 assertThat(tempFolder.root.resolve(" reports/previous_run_info.state" ).exists()).isFalse()
110112 }
111113
112114 @Test
113115 @Config(sdk = [30 ])
114- fun persistJvmCrashState_isNoopOnApi30 () {
116+ fun persistJvmCrashState_whenApi30_shouldBeNoop () {
115117 val sdkDir = tempFolder.root.absolutePath
116- resolver .initLegacyWatcher(sdkDir)
117- resolver .persistJvmCrashState()
118+ previousRunInfoResolver .initLegacyWatcher(sdkDir)
119+ previousRunInfoResolver .persistJvmCrashState()
118120
119121 assertThat(tempFolder.root.resolve(" reports/previous_run_info.state" ).exists()).isFalse()
120122 verify(internalLogger, never()).logInternalError(any(), any(), any())
121123 }
124+
125+ @Test
126+ @Config(sdk = [30 ])
127+ fun get_onApi30_returnsFatalForCrashReason () {
128+ val appExitInfo: ApplicationExitInfo = mock()
129+ whenever(appExitInfo.reason).thenReturn(ApplicationExitInfo .REASON_CRASH )
130+ val provider = ILatestAppExitInfoProvider { LatestAppExitReasonResult .Valid (appExitInfo) }
131+ val api30Resolver = PreviousRunInfoResolver (internalLogger, provider)
132+
133+ val result = api30Resolver.get(activityManager)
134+
135+ assertThat(result).isEqualTo(
136+ PreviousRunInfo (hasFatallyTerminated = true , reason = ExitReason .JvmCrash ),
137+ )
138+ }
139+
140+ @Test
141+ @Config(sdk = [30 ])
142+ fun get_onApi30_returnsNonFatalForUserRequested () {
143+ val appExitInfo: ApplicationExitInfo = mock()
144+ whenever(appExitInfo.reason).thenReturn(ApplicationExitInfo .REASON_USER_REQUESTED )
145+ val provider = ILatestAppExitInfoProvider { LatestAppExitReasonResult .Valid (appExitInfo) }
146+ val api30Resolver = PreviousRunInfoResolver (internalLogger, provider)
147+
148+ val result = api30Resolver.get(activityManager)
149+
150+ assertThat(result).isEqualTo(
151+ PreviousRunInfo (hasFatallyTerminated = false , reason = ExitReason .UserRequested ),
152+ )
153+ }
122154}
0 commit comments