Skip to content

Commit

Permalink
Improve tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanmos committed Feb 13, 2024
1 parent 4272037 commit 604b282
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ internal class SessionReplayFeature(
private lateinit var appContext: Context
private var isRecording = AtomicBoolean(false)
internal var sessionReplayRecorder: Recorder = NoOpRecorder()
internal var resourcesWriter: ResourcesWriter = NoOpResourcesWriter()
internal var dataWriter: RecordWriter = NoOpRecordWriter()
internal val initialized = AtomicBoolean(false)

Expand All @@ -100,9 +99,14 @@ internal class SessionReplayFeature(

this.appContext = appContext
sdkCore.setEventReceiver(SESSION_REPLAY_FEATURE_NAME, this)
if (RESOURCES_ENDPOINT_ENABLED) {
registerResourceFeature(sdkCore)

val resourcesWriter = if (RESOURCES_ENDPOINT_ENABLED) {
val resourcesFeature = registerResourceFeature(sdkCore)
resourcesFeature.dataWriter
} else {
NoOpResourcesWriter()
}

dataWriter = createDataWriter()
sessionReplayRecorder = sessionReplayRecorderProvider(resourcesWriter, dataWriter, appContext)
@Suppress("ThreadSafety") // TODO REPLAY-1861 can be called from any thread
Expand Down Expand Up @@ -131,7 +135,6 @@ internal class SessionReplayFeature(
stopRecording()
sessionReplayRecorder.unregisterCallbacks()
sessionReplayRecorder.stopProcessingRecords()
resourcesWriter = NoOpResourcesWriter()
dataWriter = NoOpRecordWriter()
sessionReplayRecorder = NoOpRecorder()
initialized.set(false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ internal data class EnrichedResource(
}
}

internal fun EnrichedResource.asJsonByteArray(): ByteArray {
internal fun EnrichedResource.asBinaryMetadata(): ByteArray {
val applicationId = this.applicationId
val filename = this.filename
val jsonObject = JsonObject()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.api.storage.RawBatchEvent
import com.datadog.android.sessionreplay.internal.ResourcesFeature.Companion.SESSION_REPLAY_RESOURCES_FEATURE_NAME
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource
import com.datadog.android.sessionreplay.internal.processor.asJsonByteArray
import com.datadog.android.sessionreplay.internal.processor.asBinaryMetadata

internal class SessionReplayResourcesWriter(
private val sdkCore: FeatureSdkCore
) : ResourcesWriter {
override fun write(enrichedResource: EnrichedResource) {
sdkCore.getFeature(SESSION_REPLAY_RESOURCES_FEATURE_NAME)?.withWriteContext() { _, eventBatchWriter ->
synchronized(this) {
val serializedMetadata = enrichedResource.asJsonByteArray()
val serializedMetadata = enrichedResource.asBinaryMetadata()
@Suppress("ThreadSafety") // called from the worker thread
eventBatchWriter.write(
event = RawBatchEvent(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal class ResourceRecordedDataQueueItemForgeryFactory : ForgeryFactory<Reso
recordedQueuedItemContext = forge.getForgery(),
applicationId = forge.getForgery<UUID>().toString(),
identifier = forge.getForgery<UUID>().toString(),
resourceData = forge.getForgery<UUID>().toString().toByteArray()
resourceData = forge.aString().toByteArray()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import android.content.Context
import com.datadog.android.api.InternalLogger
import com.datadog.android.api.feature.FeatureSdkCore
import com.datadog.android.sessionreplay.forge.ForgeConfigurator
import com.datadog.android.sessionreplay.internal.net.ResourceRequestFactory
import com.datadog.android.sessionreplay.internal.storage.NoOpResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.tools.unit.extensions.TestConfigurationExtension
import fr.xgouchet.elmyr.annotation.Forgery
import fr.xgouchet.elmyr.junit5.ForgeConfiguration
import fr.xgouchet.elmyr.junit5.ForgeExtension
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -25,6 +27,7 @@ import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.junit.jupiter.MockitoSettings
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
import java.net.URL

@Extensions(
ExtendWith(MockitoExtension::class),
Expand Down Expand Up @@ -56,6 +59,21 @@ internal class ResourcesFeatureTest {
)
}

@Test
fun `M use customEndpointUrl W provided`(
@Forgery fakeCustomUrl: URL
) {
// When
testedFeature = ResourcesFeature(
sdkCore = mockSdkCore,
customEndpointUrl = fakeCustomUrl.host
)

// Then
val requestFactory = testedFeature.requestFactory as ResourceRequestFactory
assertThat(requestFactory.customEndpointUrl).isEqualTo(fakeCustomUrl.host)
}

@Test
fun `M clean up W onStop()`() {
// When
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ import com.datadog.android.sessionreplay.forge.ForgeConfigurator
import com.datadog.android.sessionreplay.internal.net.SegmentRequestFactory
import com.datadog.android.sessionreplay.internal.storage.NoOpRecordWriter
import com.datadog.android.sessionreplay.internal.storage.NoOpResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.RecordWriter
import com.datadog.android.sessionreplay.internal.storage.ResourcesWriter
import com.datadog.android.sessionreplay.internal.storage.SessionReplayRecordWriter
import com.datadog.android.sessionreplay.internal.storage.SessionReplayResourcesWriter
import com.datadog.android.sessionreplay.utils.config.ApplicationContextTestConfiguration
import com.datadog.android.sessionreplay.utils.verifyLog
import com.datadog.tools.unit.annotations.TestConfigurationsProvider
Expand All @@ -36,8 +38,10 @@ import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.api.extension.Extensions
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.junit.jupiter.MockitoSettings
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
Expand Down Expand Up @@ -106,8 +110,6 @@ internal class SessionReplayFeatureTest {
// Then
assertThat(testedFeature.dataWriter)
.isInstanceOf(SessionReplayRecordWriter::class.java)
assertThat(testedFeature.resourcesWriter)
.isInstanceOf(ResourcesWriter::class.java)
}

@Test
Expand Down Expand Up @@ -162,6 +164,35 @@ internal class SessionReplayFeatureTest {
}
}

@Test
fun `𝕄 use NoopResourcesWriter 𝕎 initialize() { feature flag disabled }`() {
// Given
val captor = argumentCaptor<ResourcesWriter>()
val lambda: (ResourcesWriter, RecordWriter, Application) -> Recorder = mock()
`when`(lambda.invoke(any(), any(), any())).thenReturn(mockRecorder)

testedFeature = SessionReplayFeature(
sdkCore = mockSdkCore,
customEndpointUrl = fakeConfiguration.customEndpointUrl,
privacy = fakeConfiguration.privacy,
rateBasedSampler = mockSampler,
sessionReplayRecorderProvider = lambda
)

// When
testedFeature.onInitialize(appContext.mockInstance)

// Then
verify(lambda).invoke(captor.capture(), any(), any())
if (ResourcesFeature.RESOURCES_ENDPOINT_ENABLED) {
assertThat(captor.firstValue)
.isInstanceOf(SessionReplayResourcesWriter::class.java)
} else {
assertThat(captor.firstValue)
.isInstanceOf(NoOpResourcesWriter::class.java)
}
}

@Test
fun `𝕄 set the feature event receiver 𝕎 initialize()`() {
// Given
Expand Down Expand Up @@ -224,7 +255,6 @@ internal class SessionReplayFeatureTest {
testedFeature.onStop()

// Then
assertThat(testedFeature.resourcesWriter).isInstanceOf(NoOpResourcesWriter::class.java)
assertThat(testedFeature.dataWriter).isInstanceOf(NoOpRecordWriter::class.java)
assertThat(testedFeature.sessionReplayRecorder).isInstanceOf(NoOpRecorder::class.java)
assertThat(testedFeature.initialized.get()).isFalse
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1228,7 +1228,7 @@ internal class RecordedDataProcessorTest {
val capturedResource = captor.allValues[0]

assertThat(capturedResource.resource).isEqualTo(fakeByteArray)
val jsonString = capturedResource.asJsonByteArray().toString(Charsets.UTF_8)
val jsonString = capturedResource.asBinaryMetadata().toString(Charsets.UTF_8)
val metadataJson = JsonParser.parseString(jsonString).asJsonObject
val itemApplicationId = metadataJson.get(EnrichedResource.APPLICATION_ID_KEY).asString
val itemFilename = metadataJson.get(EnrichedResource.FILENAME_KEY).asString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.datadog.android.api.storage.RawBatchEvent
import com.datadog.android.sessionreplay.forge.ForgeConfigurator
import com.datadog.android.sessionreplay.internal.ResourcesFeature
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource
import com.datadog.android.sessionreplay.internal.processor.asJsonByteArray
import com.datadog.android.sessionreplay.internal.processor.asBinaryMetadata
import fr.xgouchet.elmyr.annotation.Forgery
import fr.xgouchet.elmyr.junit5.ForgeConfiguration
import fr.xgouchet.elmyr.junit5.ForgeExtension
Expand Down Expand Up @@ -80,7 +80,7 @@ internal class SessionReplayResourcesWriterTest {
testedWriter.write(fakeEnrichedResource)

// Then
val metadataBytearray = fakeEnrichedResource.asJsonByteArray()
val metadataBytearray = fakeEnrichedResource.asBinaryMetadata()
verify(mockEventBatchWriter).write(
RawBatchEvent(data = fakeEnrichedResource.resource, metadata = metadataBytearray),
batchMetadata = null
Expand Down

0 comments on commit 604b282

Please sign in to comment.