@@ -54,7 +54,6 @@ import org.robolectric.shadow.api.Shadow
5454import org.robolectric.shadows.ShadowActivityManager
5555import java.util.Date
5656import java.util.concurrent.Future
57- import java.util.concurrent.TimeUnit
5857import kotlin.test.AfterTest
5958import kotlin.test.BeforeTest
6059import kotlin.test.Test
@@ -94,7 +93,10 @@ class ActivityLifecycleIntegrationTest {
9493
9594 whenever(hub.options).thenReturn(options)
9695
97- AppStartMetrics .getInstance().isAppLaunchedInForeground = true
96+ val metrics = AppStartMetrics .getInstance()
97+ metrics.isAppLaunchedInForeground = true
98+ metrics.appStartTimeSpan.start()
99+
98100 // We let the ActivityLifecycleIntegration create the proper transaction here
99101 val optionCaptor = argumentCaptor<TransactionOptions >()
100102 val contextCaptor = argumentCaptor<TransactionContext >()
@@ -594,45 +596,6 @@ class ActivityLifecycleIntegrationTest {
594596 verify(ttfdReporter, never()).registerFullyDrawnListener(any())
595597 }
596598
597- @Test
598- fun `App start is Cold when savedInstanceState is null` () {
599- val sut = fixture.getSut()
600- fixture.options.tracesSampleRate = 1.0
601- sut.register(fixture.hub, fixture.options)
602-
603- val activity = mock<Activity >()
604- sut.onActivityCreated(activity, null )
605-
606- assertEquals(AppStartType .COLD , AppStartMetrics .getInstance().appStartType)
607- }
608-
609- @Test
610- fun `App start is Warm when savedInstanceState is not null` () {
611- val sut = fixture.getSut()
612- fixture.options.tracesSampleRate = 1.0
613- sut.register(fixture.hub, fixture.options)
614-
615- val activity = mock<Activity >()
616- val bundle = Bundle ()
617- sut.onActivityCreated(activity, bundle)
618-
619- assertEquals(AppStartType .WARM , AppStartMetrics .getInstance().appStartType)
620- }
621-
622- @Test
623- fun `Do not overwrite App start type after set` () {
624- val sut = fixture.getSut()
625- fixture.options.tracesSampleRate = 1.0
626- sut.register(fixture.hub, fixture.options)
627-
628- val activity = mock<Activity >()
629- val bundle = Bundle ()
630- sut.onActivityCreated(activity, bundle)
631- sut.onActivityCreated(activity, null )
632-
633- assertEquals(AppStartType .WARM , AppStartMetrics .getInstance().appStartType)
634- }
635-
636599 @Test
637600 fun `When firstActivityCreated is false, start transaction with given appStartTime` () {
638601 val sut = fixture.getSut()
@@ -883,86 +846,6 @@ class ActivityLifecycleIntegrationTest {
883846 )
884847 }
885848
886- @Test
887- fun `When firstActivityCreated is false and bundle is not null, start app start warm span with given appStartTime` () {
888- val sut = fixture.getSut()
889- fixture.options.tracesSampleRate = 1.0
890- sut.register(fixture.hub, fixture.options)
891- sut.setFirstActivityCreated(false )
892-
893- val date = SentryNanotimeDate (Date (1 ), 0 )
894- setAppStartTime(date)
895-
896- val activity = mock<Activity >()
897- sut.onActivityCreated(activity, fixture.bundle)
898-
899- val span = fixture.transaction.children.first()
900- assertEquals(span.operation, " app.start.warm" )
901- assertEquals(span.description, " Warm Start" )
902- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
903- }
904-
905- @Test
906- fun `When firstActivityCreated is false and bundle is not null, start app start cold span with given appStartTime` () {
907- val sut = fixture.getSut()
908- fixture.options.tracesSampleRate = 1.0
909- sut.register(fixture.hub, fixture.options)
910- sut.setFirstActivityCreated(false )
911-
912- val date = SentryNanotimeDate (Date (1 ), 0 )
913- setAppStartTime(date)
914-
915- val activity = mock<Activity >()
916- sut.onActivityCreated(activity, null )
917-
918- val span = fixture.transaction.children.first()
919- assertEquals(span.operation, " app.start.cold" )
920- assertEquals(span.description, " Cold Start" )
921- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
922- }
923-
924- @Test
925- fun `When firstActivityCreated is false and app started more than 1 minute ago, start app with Warm start` () {
926- val sut = fixture.getSut()
927- fixture.options.tracesSampleRate = 1.0
928- sut.register(fixture.hub, fixture.options)
929- sut.setFirstActivityCreated(false )
930-
931- val date = SentryNanotimeDate (Date (1 ), 0 )
932- val duration = TimeUnit .MINUTES .toMillis(1 ) + 2
933- val durationNanos = TimeUnit .MILLISECONDS .toNanos(duration)
934- val stopDate = SentryNanotimeDate (Date (duration), durationNanos)
935- setAppStartTime(date, stopDate)
936-
937- val activity = mock<Activity >()
938- sut.onActivityCreated(activity, null )
939-
940- val span = fixture.transaction.children.first()
941- assertEquals(span.operation, " app.start.warm" )
942- assertEquals(span.description, " Warm Start" )
943- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
944- }
945-
946- @Test
947- fun `When firstActivityCreated is false and app started in background, start app with Warm start` () {
948- val sut = fixture.getSut()
949- AppStartMetrics .getInstance().isAppLaunchedInForeground = false
950- fixture.options.tracesSampleRate = 1.0
951- sut.register(fixture.hub, fixture.options)
952- sut.setFirstActivityCreated(false )
953-
954- val date = SentryNanotimeDate (Date (1 ), 0 )
955- setAppStartTime(date)
956-
957- val activity = mock<Activity >()
958- sut.onActivityCreated(activity, null )
959-
960- val span = fixture.transaction.children.first()
961- assertEquals(span.operation, " app.start.warm" )
962- assertEquals(span.description, " Warm Start" )
963- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
964- }
965-
966849 @Test
967850 fun `When firstActivityCreated is true, start transaction but not with given appStartTime` () {
968851 val sut = fixture.getSut()
@@ -1467,7 +1350,6 @@ class ActivityLifecycleIntegrationTest {
14671350 assertEquals(startDate.nanoTimestamp(), sut.getProperty<SentryDate >(" lastPausedTime" ).nanoTimestamp())
14681351
14691352 sut.onActivityCreated(activity, null )
1470- assertNotNull(sut.appStartSpan)
14711353
14721354 sut.onActivityPostCreated(activity, null )
14731355 assertTrue(activityLifecycleSpan.onCreate.hasStopped())
@@ -1556,15 +1438,6 @@ class ActivityLifecycleIntegrationTest {
15561438 // lastPausedUptimeMillis is set to current SystemClock.uptimeMillis()
15571439 val lastUptimeMillis = sut.getProperty<Long >(" lastPausedUptimeMillis" )
15581440 assertNotEquals(0 , lastUptimeMillis)
1559-
1560- sut.onActivityCreated(activity, null )
1561- // AppStartMetrics app start time is set to Activity preCreated timestamp
1562- assertEquals(lastUptimeMillis, appStartMetrics.appStartTimeSpan.startUptimeMs)
1563- // AppStart type is considered warm
1564- assertEquals(AppStartType .WARM , appStartMetrics.appStartType)
1565-
1566- // Activity appStart span timestamp is the same of AppStartMetrics.appStart timestamp
1567- assertEquals(sut.appStartSpan!! .startDate.nanoTimestamp(), appStartMetrics.getAppStartTimeSpanWithFallback(fixture.options).startTimestamp!! .nanoTimestamp())
15681441 }
15691442
15701443 private fun SentryTracer.isFinishing () = getProperty<Any >(" finishStatus" ).getProperty<Boolean >(" isFinishing" )
@@ -1578,6 +1451,9 @@ class ActivityLifecycleIntegrationTest {
15781451
15791452 private fun setAppStartTime (date : SentryDate = SentryNanotimeDate (Date (1), 0), stopDate : SentryDate ? = null) {
15801453 // set by SentryPerformanceProvider so forcing it here
1454+ AppStartMetrics .getInstance().appStartType = AppStartType .COLD
1455+ AppStartMetrics .getInstance().isAppLaunchedInForeground = true
1456+
15811457 val sdkAppStartTimeSpan = AppStartMetrics .getInstance().sdkInitTimeSpan
15821458 val appStartTimeSpan = AppStartMetrics .getInstance().appStartTimeSpan
15831459 val millis = DateUtils .nanosToMillis(date.nanoTimestamp().toDouble()).toLong()
0 commit comments