@@ -2800,6 +2800,68 @@ class SentryClientTest {
28002800 assertFalse(called)
28012801 }
28022802
2803+ @Test
2804+ fun `when beforeSendReplay is set, callback is invoked` () {
2805+ var invoked = false
2806+ fixture.sentryOptions.setBeforeSendReplay { replay: SentryReplayEvent , _: Hint -> invoked = true ; replay }
2807+
2808+ fixture.getSut().captureReplayEvent(SentryReplayEvent (), Scope (fixture.sentryOptions), Hint ())
2809+
2810+ assertTrue(invoked)
2811+ }
2812+
2813+ @Test
2814+ fun `when beforeSendReplay returns null, event is dropped` () {
2815+ fixture.sentryOptions.setBeforeSendReplay { replay: SentryReplayEvent , _: Hint -> null }
2816+
2817+ fixture.getSut().captureReplayEvent(SentryReplayEvent (), Scope (fixture.sentryOptions), Hint ())
2818+
2819+ verify(fixture.transport, never()).send(any(), anyOrNull())
2820+
2821+ assertClientReport(
2822+ fixture.sentryOptions.clientReportRecorder,
2823+ listOf (
2824+ DiscardedEvent (DiscardReason .BEFORE_SEND .reason, DataCategory .Replay .category, 1 )
2825+ )
2826+ )
2827+ }
2828+
2829+ @Test
2830+ fun `when beforeSendReplay returns new instance, new instance is sent` () {
2831+ val expected = SentryReplayEvent ().apply { tags = mapOf (" test" to " test" ) }
2832+ fixture.sentryOptions.setBeforeSendReplay { _, _ -> expected }
2833+
2834+ fixture.getSut().captureReplayEvent(SentryReplayEvent (), Scope (fixture.sentryOptions), Hint ())
2835+
2836+ verify(fixture.transport).send(
2837+ check {
2838+ val replay = getReplayFromData(it.items.first().data)
2839+ assertEquals(" test" , replay!! .tags!! [" test" ])
2840+ },
2841+ anyOrNull()
2842+ )
2843+ verifyNoMoreInteractions(fixture.transport)
2844+ }
2845+
2846+ @Test
2847+ fun `when beforeSendReplay throws an exception, replay is dropped` () {
2848+ val exception = Exception (" test" )
2849+
2850+ exception.stackTrace.toString()
2851+ fixture.sentryOptions.setBeforeSendReplay { _, _ -> throw exception }
2852+
2853+ val id = fixture.getSut().captureReplayEvent(SentryReplayEvent (), Scope (fixture.sentryOptions), Hint ())
2854+
2855+ assertEquals(SentryId .EMPTY_ID , id)
2856+
2857+ assertClientReport(
2858+ fixture.sentryOptions.clientReportRecorder,
2859+ listOf (
2860+ DiscardedEvent (DiscardReason .BEFORE_SEND .reason, DataCategory .Replay .category, 1 )
2861+ )
2862+ )
2863+ }
2864+
28032865 private fun givenScopeWithStartedSession (errored : Boolean = false, crashed : Boolean = false): IScope {
28042866 val scope = createScope(fixture.sentryOptions)
28052867 scope.startSession()
@@ -2977,6 +3039,25 @@ class SentryClientTest {
29773039 )!!
29783040 }
29793041
3042+ private fun getReplayFromData (data : ByteArray ): SentryReplayEvent ? {
3043+ val unpacker = MessagePack .newDefaultUnpacker(data)
3044+ val mapSize = unpacker.unpackMapHeader()
3045+ for (i in 0 until mapSize) {
3046+ val key = unpacker.unpackString()
3047+ when (key) {
3048+ SentryItemType .ReplayEvent .itemType -> {
3049+ val replayEventLength = unpacker.unpackBinaryHeader()
3050+ val replayEventBytes = unpacker.readPayload(replayEventLength)
3051+ return fixture.sentryOptions.serializer.deserialize(
3052+ InputStreamReader (replayEventBytes.inputStream()),
3053+ SentryReplayEvent ::class .java
3054+ )!!
3055+ }
3056+ }
3057+ }
3058+ return null
3059+ }
3060+
29803061 private fun verifyAttachmentsInEnvelope (eventId : SentryId ? ) {
29813062 verify(fixture.transport).send(
29823063 check { actual ->
0 commit comments