Skip to content

Commit 0ed3955

Browse files
committed
RUM-10422: Handle the case when DatadogContext is requested when SDK is getting deinitialized
1 parent e531526 commit 0ed3955

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/SdkFeature.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ internal class SdkFeature(
177177
) {
178178
coreFeature.contextExecutorService
179179
.executeSafe("withWriteContext-${wrappedFeature.name}", internalLogger) {
180+
if (coreFeature.initialized.get() == false) return@executeSafe
180181
val context = contextProvider.getContext(withFeatureContexts)
181182
val eventBatchWriteScope = storage.getEventWriteScope(context)
182183
callback(context, eventBatchWriteScope)
@@ -189,6 +190,7 @@ internal class SdkFeature(
189190
) {
190191
coreFeature.contextExecutorService
191192
.executeSafe("withContext-${wrappedFeature.name}", internalLogger) {
193+
if (coreFeature.initialized.get() == false) return@executeSafe
192194
val context = contextProvider.getContext(withFeatureContexts)
193195
callback(context)
194196
}
@@ -203,6 +205,7 @@ internal class SdkFeature(
203205
operationName,
204206
internalLogger,
205207
Callable {
208+
if (coreFeature.initialized.get() == false) return@Callable null
206209
val context = contextProvider.getContext(withFeatureContexts)
207210
val eventBatchWriteScope = storage.getEventWriteScope(context)
208211
context to eventBatchWriteScope

dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/internal/SdkFeatureTest.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import org.mockito.kotlin.doThrow
7878
import org.mockito.kotlin.eq
7979
import org.mockito.kotlin.mock
8080
import org.mockito.kotlin.verify
81+
import org.mockito.kotlin.verifyNoInteractions
8182
import org.mockito.kotlin.whenever
8283
import org.mockito.quality.Strictness
8384
import java.util.Locale
@@ -86,6 +87,7 @@ import java.util.concurrent.CancellationException
8687
import java.util.concurrent.ExecutionException
8788
import java.util.concurrent.Future
8889
import java.util.concurrent.RejectedExecutionException
90+
import java.util.concurrent.atomic.AtomicBoolean
8991

9092
@Extensions(
9193
ExtendWith(MockitoExtension::class),
@@ -144,6 +146,7 @@ internal class SdkFeatureTest {
144146
whenever(coreFeature.mockInstance.batchProcessingLevel)
145147
.thenReturn(fakeCoreBatchProcessingLevel)
146148
whenever(coreFeature.mockTrackingConsentProvider.getConsent()) doReturn fakeConsent
149+
whenever(coreFeature.mockInstance.initialized) doReturn AtomicBoolean(true)
147150
whenever(mockWrappedFeature.name) doReturn fakeFeatureName
148151
whenever(mockWrappedFeature.requestFactory) doReturn mock()
149152
whenever(mockWrappedFeature.storageConfiguration) doReturn fakeStorageConfiguration
@@ -512,6 +515,22 @@ internal class SdkFeatureTest {
512515
)
513516
}
514517

518+
@Test
519+
fun `M not provide write context W withWriteContext(callback) { CoreFeature is not initialized }`(
520+
@StringForgery fakeWithFeatureContexts: Set<String>
521+
) {
522+
// Given
523+
testedFeature.storage = mockStorage
524+
val callback = mock<(DatadogContext, EventWriteScope) -> Unit>()
525+
whenever(coreFeature.mockInstance.initialized) doReturn AtomicBoolean(false)
526+
527+
// When
528+
testedFeature.withWriteContext(fakeWithFeatureContexts, callback = callback)
529+
530+
// Then
531+
verifyNoInteractions(callback, mockContextProvider, mockStorage)
532+
}
533+
515534
@Test
516535
fun `M provide Datadog context W withContext(callback)`(
517536
@Forgery fakeContext: DatadogContext,
@@ -529,6 +548,22 @@ internal class SdkFeatureTest {
529548
verify(callback).invoke(fakeContext)
530549
}
531550

551+
@Test
552+
fun `M not provide Datadog context W withContext(callback) { CoreFeature is not initialized }`(
553+
@StringForgery fakeWithFeatureContexts: Set<String>
554+
) {
555+
// Given
556+
testedFeature.storage = mockStorage
557+
val callback = mock<(DatadogContext) -> Unit>()
558+
whenever(coreFeature.mockInstance.initialized) doReturn AtomicBoolean(false)
559+
560+
// When
561+
testedFeature.withContext(fakeWithFeatureContexts, callback = callback)
562+
563+
// Then
564+
verifyNoInteractions(callback, mockContextProvider)
565+
}
566+
532567
@Test
533568
fun `M provide write context W getWriteContextSync()`(
534569
@Forgery fakeContext: DatadogContext,
@@ -610,6 +645,19 @@ internal class SdkFeatureTest {
610645
assertThat(writeContext).isNull()
611646
}
612647

648+
@Test
649+
fun `M provide null write context W getWriteContextSync() { CoreFeature is not initialized }`() {
650+
// Given
651+
whenever(coreFeature.mockInstance.initialized) doReturn AtomicBoolean(false)
652+
653+
// When
654+
val writeContext = testedFeature.getWriteContextSync()
655+
656+
// Then
657+
assertThat(writeContext).isNull()
658+
verifyNoInteractions(mockContextProvider, mockStorage)
659+
}
660+
613661
@Test
614662
fun `M send event W sendEvent(event)`() {
615663
// Given

0 commit comments

Comments
 (0)