@@ -4,16 +4,20 @@ import io.sentry.SentryEnvelope
44import io.sentry.SentryOptions
55import io.sentry.SentryOptionsManipulator
66import io.sentry.Session
7+ import io.sentry.cache.IEnvelopeCache
78import io.sentry.clientreport.ClientReportTestHelper.Companion.retryableHint
89import io.sentry.clientreport.ClientReportTestHelper.Companion.retryableUncaughtExceptionHint
910import io.sentry.clientreport.ClientReportTestHelper.Companion.uncaughtExceptionHint
1011import io.sentry.clientreport.DiscardReason
1112import io.sentry.clientreport.IClientReportRecorder
1213import io.sentry.dsnString
14+ import io.sentry.hints.Retryable
1315import io.sentry.protocol.User
16+ import io.sentry.util.HintUtils
1417import java.io.IOException
1518import kotlin.test.Test
1619import kotlin.test.assertFailsWith
20+ import kotlin.test.assertFalse
1721import org.mockito.kotlin.any
1822import org.mockito.kotlin.anyOrNull
1923import org.mockito.kotlin.eq
@@ -31,11 +35,12 @@ class AsyncHttpTransportClientReportTest {
3135 var transportGate = mock<ITransportGate >()
3236 var executor = mock<QueuedThreadPoolExecutor >()
3337 var rateLimiter = mock<RateLimiter >()
38+ var envelopeCache = mock<IEnvelopeCache >()
3439 var sentryOptions: SentryOptions =
3540 SentryOptions ().apply {
3641 dsn = dsnString
3742 setSerializer(mock())
38- setEnvelopeDiskCache(mock() )
43+ setEnvelopeDiskCache(envelopeCache )
3944 }
4045 var clientReportRecorder = mock<IClientReportRecorder >()
4146 val envelopeBeforeAttachingClientReport =
@@ -66,23 +71,36 @@ class AsyncHttpTransportClientReportTest {
6671 .attachReportToEnvelope(same(fixture.envelopeBeforeAttachingClientReport))
6772 verify(fixture.clientReportRecorder, never()).recordLostEnvelope(any(), any())
6873 verifyNoMoreInteractions(fixture.clientReportRecorder)
74+ verify(fixture.envelopeCache).discard(fixture.envelopeBeforeAttachingClientReport)
6975 }
7076
7177 @Test
72- fun `does not record lost envelope on 500 error for retryable` () {
78+ fun `records lost envelope on 500 error for retryable` () {
7379 // given
7480 givenSetup(TransportResult .error(500 ))
81+ whenever(
82+ fixture.envelopeCache.storeEnvelope(eq(fixture.envelopeBeforeAttachingClientReport), any())
83+ )
84+ .thenReturn(true )
7585
7686 // when
87+ val retryableHint = retryableHint()
7788 assertFailsWith(java.lang.IllegalStateException ::class ) {
78- fixture.getSUT().send(fixture.envelopeBeforeAttachingClientReport, retryableHint() )
89+ fixture.getSUT().send(fixture.envelopeBeforeAttachingClientReport, retryableHint)
7990 }
8091
8192 // then
8293 verify(fixture.clientReportRecorder, times(1 ))
8394 .attachReportToEnvelope(same(fixture.envelopeBeforeAttachingClientReport))
84- verify(fixture.clientReportRecorder, never()).recordLostEnvelope(any(), any())
95+ verify(fixture.clientReportRecorder, times(1 ))
96+ .recordLostEnvelope(
97+ eq(DiscardReason .NETWORK_ERROR ),
98+ same(fixture.envelopeAfterAttachingClientReport),
99+ )
85100 verifyNoMoreInteractions(fixture.clientReportRecorder)
101+ val sentrySdkHint = HintUtils .getSentrySdkHint(retryableHint)
102+ assertFalse((sentrySdkHint as Retryable ).isRetry)
103+ verify(fixture.envelopeCache).discard(fixture.envelopeBeforeAttachingClientReport)
86104 }
87105
88106 @Test
@@ -104,23 +122,36 @@ class AsyncHttpTransportClientReportTest {
104122 same(fixture.envelopeAfterAttachingClientReport),
105123 )
106124 verifyNoMoreInteractions(fixture.clientReportRecorder)
125+ verify(fixture.envelopeCache).discard(fixture.envelopeBeforeAttachingClientReport)
107126 }
108127
109128 @Test
110- fun `does not record lost envelope on 400 error for retryable` () {
129+ fun `records lost envelope on 400 error for retryable` () {
111130 // given
112131 givenSetup(TransportResult .error(400 ))
132+ whenever(
133+ fixture.envelopeCache.storeEnvelope(eq(fixture.envelopeBeforeAttachingClientReport), any())
134+ )
135+ .thenReturn(true )
113136
114137 // when
138+ val retryableHint = retryableHint()
115139 assertFailsWith(java.lang.IllegalStateException ::class ) {
116- fixture.getSUT().send(fixture.envelopeBeforeAttachingClientReport, retryableHint() )
140+ fixture.getSUT().send(fixture.envelopeBeforeAttachingClientReport, retryableHint)
117141 }
118142
119143 // then
120144 verify(fixture.clientReportRecorder, times(1 ))
121145 .attachReportToEnvelope(same(fixture.envelopeBeforeAttachingClientReport))
122- verify(fixture.clientReportRecorder, never()).recordLostEnvelope(any(), any())
146+ verify(fixture.clientReportRecorder, times(1 ))
147+ .recordLostEnvelope(
148+ eq(DiscardReason .NETWORK_ERROR ),
149+ same(fixture.envelopeAfterAttachingClientReport),
150+ )
123151 verifyNoMoreInteractions(fixture.clientReportRecorder)
152+ val sentrySdkHint = HintUtils .getSentrySdkHint(retryableHint)
153+ assertFalse((sentrySdkHint as Retryable ).isRetry)
154+ verify(fixture.envelopeCache).discard(fixture.envelopeBeforeAttachingClientReport)
124155 }
125156
126157 @Test
0 commit comments