@@ -37,6 +37,7 @@ import com.datadog.android.utils.verifyLog
37
37
import com.datadog.tools.unit.annotations.TestConfigurationsProvider
38
38
import com.datadog.tools.unit.extensions.TestConfigurationExtension
39
39
import com.datadog.tools.unit.extensions.config.TestConfiguration
40
+ import com.datadog.tools.unit.forge.aThrowable
40
41
import com.google.gson.JsonObject
41
42
import fr.xgouchet.elmyr.Forge
42
43
import fr.xgouchet.elmyr.annotation.AdvancedForgery
@@ -66,6 +67,7 @@ import org.mockito.kotlin.any
66
67
import org.mockito.kotlin.argumentCaptor
67
68
import org.mockito.kotlin.doAnswer
68
69
import org.mockito.kotlin.doReturn
70
+ import org.mockito.kotlin.doThrow
69
71
import org.mockito.kotlin.mock
70
72
import org.mockito.kotlin.never
71
73
import org.mockito.kotlin.reset
@@ -78,7 +80,12 @@ import org.mockito.quality.Strictness
78
80
import java.util.Collections
79
81
import java.util.Locale
80
82
import java.util.UUID
83
+ import java.util.concurrent.Callable
84
+ import java.util.concurrent.CancellationException
81
85
import java.util.concurrent.CountDownLatch
86
+ import java.util.concurrent.ExecutionException
87
+ import java.util.concurrent.Future
88
+ import java.util.concurrent.LinkedBlockingQueue
82
89
import java.util.concurrent.ThreadPoolExecutor
83
90
import java.util.concurrent.TimeUnit
84
91
import java.util.concurrent.atomic.AtomicBoolean
@@ -104,6 +111,9 @@ internal class DatadogCoreTest {
104
111
@Mock
105
112
lateinit var mockPersistenceExecutorService: FlushableExecutorService
106
113
114
+ @Mock
115
+ lateinit var mockContextExecutorService: ThreadPoolExecutor
116
+
107
117
@Mock
108
118
lateinit var mockBuildSdkVersionProvider: BuildSdkVersionProvider
109
119
@@ -122,6 +132,9 @@ internal class DatadogCoreTest {
122
132
whenever(mockPersistenceExecutorService.execute(any())) doAnswer {
123
133
it.getArgument<Runnable >(0 ).run ()
124
134
}
135
+ whenever(mockContextExecutorService.execute(any())) doAnswer {
136
+ it.getArgument<Runnable >(0 ).run ()
137
+ }
125
138
126
139
testedCore = DatadogCore (
127
140
appContext.mockInstance,
@@ -133,6 +146,7 @@ internal class DatadogCoreTest {
133
146
).apply {
134
147
initialize(fakeConfiguration)
135
148
}
149
+ testedCore.coreFeature.contextExecutorService = mockContextExecutorService
136
150
}
137
151
138
152
@AfterEach
@@ -262,9 +276,10 @@ internal class DatadogCoreTest {
262
276
) {
263
277
// Given
264
278
testedCore.coreFeature = mock()
265
- whenever(testedCore.coreFeature.initialized).thenReturn(AtomicBoolean ())
279
+ whenever(testedCore.coreFeature.initialized).thenReturn(AtomicBoolean (true ))
266
280
val mockUserInfoProvider = mock<MutableUserInfoProvider >()
267
281
whenever(testedCore.coreFeature.userInfoProvider) doReturn mockUserInfoProvider
282
+ whenever(testedCore.coreFeature.contextExecutorService) doReturn mockContextExecutorService
268
283
269
284
// When
270
285
testedCore.setUserInfo(id, name, email)
@@ -630,10 +645,11 @@ internal class DatadogCoreTest {
630
645
@Forgery fakeTrackingConsent : TrackingConsent
631
646
) {
632
647
// Given
633
- testedCore.coreFeature = mock()
634
- val mockConsentProvider = mock<ConsentProvider >()
635
- whenever(mockConsentProvider.getConsent()) doReturn fakeTrackingConsent
636
- whenever(testedCore.coreFeature.trackingConsentProvider) doReturn mockConsentProvider
648
+ val mockFuture = mock<Future <TrackingConsent >>()
649
+ whenever(mockFuture.get()) doReturn fakeTrackingConsent
650
+ whenever(
651
+ testedCore.coreFeature.contextExecutorService.submit(any<Callable <TrackingConsent >>())
652
+ ) doReturn mockFuture
637
653
638
654
// When
639
655
val trackingConsent = testedCore.trackingConsent
@@ -642,6 +658,35 @@ internal class DatadogCoreTest {
642
658
assertThat(trackingConsent).isEqualTo(fakeTrackingConsent)
643
659
}
644
660
661
+ @Test
662
+ fun `M return default tracking consent W trackingConsent() { failed to get tracking consent }` (
663
+ forge : Forge
664
+ ) {
665
+ // Given
666
+ val mockFuture = mock<Future <TrackingConsent >>()
667
+ val fakeThrowable = forge.anElementFrom(
668
+ ExecutionException (forge.aThrowable()),
669
+ CancellationException (),
670
+ InterruptedException ()
671
+ )
672
+ whenever(mockFuture.get()) doThrow fakeThrowable
673
+ whenever(
674
+ testedCore.coreFeature.contextExecutorService.submit(any<Callable <TrackingConsent >>())
675
+ ) doReturn mockFuture
676
+
677
+ // When
678
+ val trackingConsent = testedCore.trackingConsent
679
+
680
+ // When + Then
681
+ assertThat(trackingConsent).isEqualTo(TrackingConsent .NOT_GRANTED )
682
+ mockInternalLogger.verifyLog(
683
+ InternalLogger .Level .ERROR ,
684
+ listOf (InternalLogger .Target .USER , InternalLogger .Target .TELEMETRY ),
685
+ DatadogCore .UNABLE_TO_GET_TRACKING_CONSENT ,
686
+ fakeThrowable
687
+ )
688
+ }
689
+
645
690
@Test
646
691
fun `M return root storage dir W rootStorageDir()` () {
647
692
// When + Then
@@ -747,16 +792,8 @@ internal class DatadogCoreTest {
747
792
)
748
793
val mockCoreFeature = mock<CoreFeature >()
749
794
testedCore.coreFeature = mockCoreFeature
750
- val mockPersistenceExecutor = mock<FlushableExecutorService >()
751
- val mockContextExecutor = mock<ThreadPoolExecutor >()
752
- whenever(mockCoreFeature.persistenceExecutorService) doReturn mockPersistenceExecutor
753
- whenever(mockCoreFeature.contextExecutorService) doReturn mockContextExecutor
754
- whenever(mockPersistenceExecutor.execute(any())) doAnswer {
755
- it.getArgument<Runnable >(0 ).run ()
756
- }
757
- whenever(mockContextExecutor.execute(any())) doAnswer {
758
- it.getArgument<Runnable >(0 ).run ()
759
- }
795
+ whenever(mockCoreFeature.persistenceExecutorService) doReturn mockPersistenceExecutorService
796
+ whenever(mockCoreFeature.contextExecutorService) doReturn mockContextExecutorService
760
797
761
798
// When
762
799
testedCore.clearAllData()
@@ -782,6 +819,7 @@ internal class DatadogCoreTest {
782
819
anAlphaNumericalString() to mock()
783
820
}
784
821
)
822
+ whenever(mockContextExecutorService.queue) doReturn LinkedBlockingQueue ()
785
823
786
824
// When
787
825
testedCore.flushStoredData()
0 commit comments