11package io.sentry.android.core.anr
22
3- import android.os.SystemClock
43import androidx.test.ext.junit.runners.AndroidJUnit4
54import io.sentry.ILogger
65import io.sentry.IScopes
@@ -9,6 +8,8 @@ import io.sentry.SentryOptions
98import io.sentry.android.core.AppState
109import io.sentry.android.core.SentryAndroidOptions
1110import io.sentry.test.getProperty
11+ import io.sentry.time.TestTicker
12+ import java.util.concurrent.TimeUnit.MILLISECONDS
1213import kotlin.test.AfterTest
1314import kotlin.test.BeforeTest
1415import kotlin.test.Test
@@ -30,9 +31,11 @@ class AnrProfilingIntegrationTest {
3031 private lateinit var mockScopes: IScopes
3132 private lateinit var mockLogger: ILogger
3233 private lateinit var options: SentryAndroidOptions
34+ private lateinit var clock: TestTicker
3335
3436 @BeforeTest
3537 fun setup () {
38+ clock = TestTicker ()
3639 mockScopes = mock()
3740 mockLogger = mock()
3841 options =
@@ -163,7 +166,6 @@ class AnrProfilingIntegrationTest {
163166 @Test
164167 fun `properly walks through state transitions and collects stack traces` () {
165168 val mainThread = Thread .currentThread()
166- SystemClock .setCurrentTimeMillis(1_00 )
167169
168170 val androidOptions =
169171 SentryAndroidOptions ().apply {
@@ -172,20 +174,20 @@ class AnrProfilingIntegrationTest {
172174 anrProfilingSampleRate = 1.0
173175 }
174176
175- val integration = AnrProfilingIntegration ()
177+ val integration = AnrProfilingIntegration (clock )
176178 integration.register(mockScopes, androidOptions)
177179 // Drive the state machine synchronously to avoid racing the background polling thread.
178180
179- SystemClock .setCurrentTimeMillis( 1_000 )
181+ clock.advance( 900 , MILLISECONDS )
180182 integration.checkMainThread(mainThread)
181183 assertEquals(AnrProfilingIntegration .MainThreadState .IDLE , integration.state)
182184 assertTrue(integration.profileManager.load().stacks.isEmpty())
183185
184- SystemClock .setCurrentTimeMillis( 3_000 )
186+ clock.advance( 2_000 , MILLISECONDS )
185187 integration.checkMainThread(mainThread)
186188 assertEquals(AnrProfilingIntegration .MainThreadState .SUSPICIOUS , integration.state)
187189
188- SystemClock .setCurrentTimeMillis( 6_000 )
190+ clock.advance( 3_000 , MILLISECONDS )
189191 integration.checkMainThread(mainThread)
190192 assertEquals(AnrProfilingIntegration .MainThreadState .ANR_DETECTED , integration.state)
191193 assertEquals(2 , integration.profileManager.load().stacks.size)
@@ -199,7 +201,6 @@ class AnrProfilingIntegrationTest {
199201 @Test
200202 fun `background foreground transitions don't trigger an ANR` () {
201203 val mainThread = Thread .currentThread()
202- SystemClock .setCurrentTimeMillis(1_000 )
203204
204205 val androidOptions =
205206 SentryAndroidOptions ().apply {
@@ -208,11 +209,11 @@ class AnrProfilingIntegrationTest {
208209 anrProfilingSampleRate = 1.0
209210 }
210211
211- val integration = AnrProfilingIntegration ()
212+ val integration = AnrProfilingIntegration (clock )
212213 integration.register(mockScopes, androidOptions)
213214 integration.onBackground()
214215
215- SystemClock .setCurrentTimeMillis( 20_000 )
216+ clock.advance( 19_000 , MILLISECONDS )
216217 integration.onForeground()
217218
218219 Thread .sleep(100 )
@@ -266,7 +267,6 @@ class AnrProfilingIntegrationTest {
266267 @Test
267268 fun `does not collect stacks when sample rate is zero` () {
268269 val mainThread = Thread .currentThread()
269- SystemClock .setCurrentTimeMillis(1_00 )
270270
271271 val androidOptions =
272272 SentryAndroidOptions ().apply {
@@ -275,17 +275,17 @@ class AnrProfilingIntegrationTest {
275275 anrProfilingSampleRate = 0.0
276276 }
277277
278- val integration = AnrProfilingIntegration ()
278+ val integration = AnrProfilingIntegration (clock )
279279 integration.register(mockScopes, androidOptions)
280280 integration.onForeground()
281281
282282 // Transition to suspicious
283- SystemClock .setCurrentTimeMillis( 3_000 )
283+ clock.advance( 2_900 , MILLISECONDS )
284284 integration.checkMainThread(mainThread)
285285 assertEquals(AnrProfilingIntegration .MainThreadState .SUSPICIOUS , integration.state)
286286
287287 // Transition to ANR
288- SystemClock .setCurrentTimeMillis( 6_000 )
288+ clock.advance( 3_000 , MILLISECONDS )
289289 integration.checkMainThread(mainThread)
290290 assertEquals(AnrProfilingIntegration .MainThreadState .ANR_DETECTED , integration.state)
291291
0 commit comments