@@ -191,6 +191,9 @@ internal class RumViewScopeTest {
191
191
@Forgery
192
192
lateinit var fakeDatadogContext: DatadogContext
193
193
194
+ @Forgery
195
+ lateinit var fakeViewType: RumViewType
196
+
194
197
var fakeSourceViewEvent: ViewEvent .ViewEventSource ? = null
195
198
var fakeSourceErrorEvent: ErrorEvent .ErrorEventSource ? = null
196
199
var fakeSourceActionEvent: ActionEvent .ActionEventSource ? = null
@@ -364,12 +367,17 @@ internal class RumViewScopeTest {
364
367
val context = testedScope.getRumContext()
365
368
366
369
// Then
367
- assertThat(context.actionId).isNull()
370
+ assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
371
+ assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
368
372
assertThat(context.viewId).isEqualTo(testedScope.viewId)
369
373
assertThat(context.viewName).isEqualTo(fakeKey.name)
370
374
assertThat(context.viewUrl).isEqualTo(fakeUrl)
371
- assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
372
- assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
375
+ assertThat(context.viewType).isEqualTo(fakeViewType)
376
+ assertThat(context.viewTimestamp)
377
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
378
+ assertThat(context.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
379
+ assertThat(context.actionId).isNull()
380
+ assertThat(context.hasReplay).isEqualTo(false )
373
381
}
374
382
375
383
@Test
@@ -382,11 +390,16 @@ internal class RumViewScopeTest {
382
390
383
391
// Then
384
392
assertThat(context.actionId).isEqualTo(fakeActionId)
393
+ assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
394
+ assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
385
395
assertThat(context.viewId).isEqualTo(testedScope.viewId)
386
396
assertThat(context.viewName).isEqualTo(fakeKey.name)
387
397
assertThat(context.viewUrl).isEqualTo(fakeUrl)
388
- assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
389
- assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
398
+ assertThat(context.viewType).isEqualTo(fakeViewType)
399
+ assertThat(context.viewTimestamp)
400
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
401
+ assertThat(context.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
402
+ assertThat(context.hasReplay).isEqualTo(false )
390
403
}
391
404
392
405
@Test
@@ -403,19 +416,116 @@ internal class RumViewScopeTest {
403
416
val updatedContext = testedScope.getRumContext()
404
417
405
418
// Then
406
- assertThat(context.actionId).isNull()
419
+ assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
420
+ assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
407
421
assertThat(context.viewId).isEqualTo(initialViewId)
408
422
assertThat(context.viewName).isEqualTo(fakeKey.name)
409
423
assertThat(context.viewUrl).isEqualTo(fakeUrl)
410
- assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
411
- assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
424
+ assertThat(context.viewType).isEqualTo(fakeViewType)
425
+ assertThat(context.viewTimestamp)
426
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
427
+ assertThat(context.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
428
+ assertThat(context.actionId).isNull()
429
+ assertThat(context.hasReplay).isEqualTo(false )
412
430
413
- assertThat(updatedContext.actionId).isNull()
431
+ assertThat(updatedContext.applicationId).isEqualTo(fakeParentContext.applicationId)
432
+ assertThat(updatedContext.sessionId).isEqualTo(newSessionId.toString())
414
433
assertThat(updatedContext.viewId).isNotEqualTo(initialViewId)
415
- assertThat(context .viewName).isEqualTo(fakeKey.name)
434
+ assertThat(updatedContext .viewName).isEqualTo(fakeKey.name)
416
435
assertThat(updatedContext.viewUrl).isEqualTo(fakeUrl)
417
- assertThat(updatedContext.sessionId).isEqualTo(newSessionId.toString())
418
- assertThat(updatedContext.applicationId).isEqualTo(fakeParentContext.applicationId)
436
+ assertThat(updatedContext.viewType).isEqualTo(fakeViewType)
437
+ assertThat(updatedContext.viewTimestamp)
438
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
439
+ assertThat(updatedContext.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
440
+ assertThat(updatedContext.actionId).isNull()
441
+ assertThat(updatedContext.hasReplay).isEqualTo(false )
442
+ }
443
+
444
+ @Test
445
+ fun `M update hasReplay W getRumContext() { event processed }` (
446
+ forge : Forge
447
+ ) {
448
+ // Given
449
+ val fakeEvent = RumRawEvent .StopView (fakeKey, forge.exhaustiveAttributes())
450
+ testedScope.handleEvent(fakeEvent, fakeDatadogContext, mockEventWriteScope, mockWriter)
451
+
452
+ // When
453
+ val context = testedScope.getRumContext()
454
+
455
+ // Then
456
+ assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
457
+ assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
458
+ assertThat(context.viewId).isEqualTo(testedScope.viewId)
459
+ assertThat(context.viewName).isEqualTo(fakeKey.name)
460
+ assertThat(context.viewUrl).isEqualTo(fakeUrl)
461
+ assertThat(context.viewType).isEqualTo(fakeViewType)
462
+ assertThat(context.viewTimestamp)
463
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
464
+ assertThat(context.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
465
+ assertThat(context.actionId).isNull()
466
+ assertThat(context.hasReplay).isEqualTo(fakeHasReplay)
467
+ }
468
+
469
+ @Test
470
+ fun `M keep hasReplay=true flag if set W getRumContext() { events processed }` (
471
+ forge : Forge
472
+ ) {
473
+ // Given
474
+ val fakeEvent = forge.anElementFrom(
475
+ RumRawEvent .AddLongTask (durationNs = forge.aPositiveLong(), target = forge.aString()),
476
+ RumRawEvent .AddError (
477
+ message = forge.aString(),
478
+ sourceType = forge.getForgery(),
479
+ source = forge.getForgery(),
480
+ throwable = null ,
481
+ stacktrace = null ,
482
+ isFatal = true ,
483
+ threads = emptyList(),
484
+ attributes = forge.exhaustiveAttributes()
485
+ ),
486
+ RumRawEvent .AddCustomTiming (
487
+ name = forge.aString()
488
+ )
489
+ )
490
+ val datadogContextWithReplay = fakeDatadogContext.copy(
491
+ featuresContext = fakeDatadogContext.featuresContext +
492
+ mapOf (Feature .SESSION_REPLAY_FEATURE_NAME to mapOf (" has_replay" to fakeHasReplay))
493
+ )
494
+ whenever(
495
+ mockFeaturesContextResolver.resolveViewHasReplay(
496
+ datadogContextWithReplay,
497
+ testedScope.viewId
498
+ )
499
+ ) doReturn fakeHasReplay
500
+ testedScope.handleEvent(fakeEvent, datadogContextWithReplay, mockEventWriteScope, mockWriter)
501
+ val fakeStopEvent = RumRawEvent .StopView (fakeKey, forge.exhaustiveAttributes())
502
+ val stopViewContext = fakeDatadogContext.copy(
503
+ featuresContext = fakeDatadogContext.featuresContext +
504
+ mapOf (Feature .SESSION_REPLAY_FEATURE_NAME to mapOf (" has_replay" to false ))
505
+ )
506
+ whenever(
507
+ mockFeaturesContextResolver.resolveViewHasReplay(
508
+ stopViewContext,
509
+ testedScope.viewId
510
+ )
511
+ ) doReturn false
512
+ testedScope.handleEvent(fakeStopEvent, stopViewContext, mockEventWriteScope, mockWriter)
513
+
514
+ // When
515
+ val context = testedScope.getRumContext()
516
+
517
+ // Then
518
+ assertThat(context.applicationId).isEqualTo(fakeParentContext.applicationId)
519
+ assertThat(context.sessionId).isEqualTo(fakeParentContext.sessionId)
520
+ assertThat(context.viewId).isEqualTo(testedScope.viewId)
521
+ assertThat(context.viewName).isEqualTo(fakeKey.name)
522
+ assertThat(context.viewUrl).isEqualTo(fakeUrl)
523
+ assertThat(context.viewType).isEqualTo(fakeViewType)
524
+ assertThat(context.viewTimestamp)
525
+ .isEqualTo(fakeEventTime.timestamp + fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
526
+ assertThat(context.viewTimestampOffset).isEqualTo(fakeTimeInfoAtScopeStart.serverTimeOffsetMs)
527
+ assertThat(context.actionId).isNull()
528
+ assertThat(context.hasReplay).isEqualTo(fakeHasReplay)
419
529
}
420
530
421
531
// endregion
@@ -9741,7 +9851,7 @@ internal class RumViewScopeTest {
9741
9851
memoryVitalMonitor : VitalMonitor = mockMemoryVitalMonitor,
9742
9852
frameRateVitalMonitor : VitalMonitor = mockFrameRateVitalMonitor,
9743
9853
featuresContextResolver : FeaturesContextResolver = mockFeaturesContextResolver,
9744
- type : RumViewType = RumViewType . FOREGROUND ,
9854
+ type : RumViewType = fakeViewType ,
9745
9855
trackFrustrations : Boolean = fakeTrackFrustrations,
9746
9856
sampleRate : Float = fakeSampleRate,
9747
9857
interactionNextViewMetricResolver : InteractionToNextViewMetricResolver =
0 commit comments