Skip to content

Commit

Permalink
Rename json keys and small cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanmos committed Feb 15, 2024
1 parent 35c1f37 commit a31af69
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ internal class NoopDataQueueHandler : DataQueueHandler {
): ResourceRecordedDataQueueItem? = null

override fun addTouchEventItem(
pointerInteractions: List<MobileSegment.MobileRecord>
pointerInteractions: List<MobileSegment.MobileRecord>
): TouchEventRecordedDataQueueItem? = null

override fun addSnapshotItem(
systemInformation: SystemInformation
systemInformation: SystemInformation
): SnapshotRecordedDataQueueItem? = null

override fun tryToConsumeItems() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ package com.datadog.android.sessionreplay.internal.net
import androidx.annotation.VisibleForTesting
import com.datadog.android.api.InternalLogger
import com.datadog.android.api.storage.RawBatchEvent
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_INTERNAL_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_OUTER_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_RESOURCE_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.FILENAME_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.ID_KEY
import com.datadog.android.sessionreplay.internal.utils.MiscUtils
import com.google.gson.JsonObject
import okhttp3.MediaType.Companion.toMediaTypeOrNull
Expand Down Expand Up @@ -126,8 +126,8 @@ internal class ResourceRequestBodyFactory(
private fun addApplicationIdSection(builder: MultipartBody.Builder, applicationId: String) {
val applicationIdOuter = JsonObject()
val applicationIdInner = JsonObject()
applicationIdInner.addProperty(APPLICATION_ID_INTERNAL_KEY, applicationId)
applicationIdOuter.add(APPLICATION_ID_OUTER_KEY, applicationIdInner)
applicationIdInner.addProperty(ID_KEY, applicationId)
applicationIdOuter.add(APPLICATION_KEY, applicationIdInner)
applicationIdOuter.addProperty(TYPE_KEY, TYPE_RESOURCE)

@Suppress("TooGenericExceptionCaught")
Expand All @@ -154,7 +154,7 @@ internal class ResourceRequestBodyFactory(

if (body != null) {
builder.addFormDataPart(
name = NAME_RESOURCE,
name = NAME_EVENT,
filename = FILENAME_BLOB,
body = body
)
Expand Down Expand Up @@ -200,7 +200,7 @@ internal class ResourceRequestBodyFactory(
internal const val TYPE_KEY = "type"
internal const val TYPE_RESOURCE = "resource"
internal const val NAME_IMAGE = "image"
internal const val NAME_RESOURCE = "event"
internal const val NAME_EVENT = "event"
internal const val FILENAME_BLOB = "blob"

internal const val MULTIPLE_APPLICATION_ID_ERROR =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ internal data class EnrichedResource(

internal companion object {
internal const val APPLICATION_ID_RESOURCE_KEY = "applicationId"
internal const val APPLICATION_ID_OUTER_KEY = "application"
internal const val APPLICATION_ID_INTERNAL_KEY = "id"
internal const val APPLICATION_KEY = "application"
internal const val ID_KEY = "id"
internal const val FILENAME_KEY = "filename"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ internal class Base64Serializer private constructor(

// resources previously sent in this session -
// optimization to avoid sending the same resource multiple times
private val previouslySentResources: MutableSet<String> =
// atm this set is unbounded but expected to use relatively little space (~80kb per 1k items)
private val resourcesSeen: MutableSet<String> =
Collections.synchronizedSet(HashSet<String>())

// region internal
Expand Down Expand Up @@ -140,8 +141,7 @@ internal class Base64Serializer private constructor(
}

val resourceId = md5HashGenerator.generate(byteArray)
var base64String = "".toByteArray(Charsets.UTF_8)
var cacheData = CacheData(base64String, resourceId?.toByteArray(Charsets.UTF_8))
var base64String = ""

if (shouldCacheBitmap) {
bitmapPool?.put(bitmap)
Expand All @@ -154,8 +154,11 @@ internal class Base64Serializer private constructor(
return
}

if (!previouslySentResources.contains(resourceId)) {
previouslySentResources.add(resourceId)
if (!resourcesSeen.contains(resourceId)) {
resourcesSeen.add(resourceId)

// We probably don't want this here. In the next pr we'll
// refactor this class and extract logic
recordedDataQueueHandler.addResourceItem(
identifier = resourceId,
resourceData = byteArray,
Expand All @@ -165,10 +168,10 @@ internal class Base64Serializer private constructor(
} else {
base64String = convertBitmapToBase64(
byteArray = byteArray
).toByteArray(Charsets.UTF_8)
cacheData = CacheData(base64String, resourceId?.toByteArray(Charsets.UTF_8))
)
}

val cacheData = CacheData(base64String.toByteArray(Charsets.UTF_8), resourceId?.toByteArray(Charsets.UTF_8))
if (base64String.isNotEmpty() || resourceId != null) {
base64LRUCache.put(drawable, cacheData)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ internal class DrawableUtils(
config: Config = Config.ARGB_8888,
bitmapCreationCallback: Base64Serializer.BitmapCreationCallback
) {
val bitmapSizeLimit = getBitmapSizeLimit(requestedSizeInBytes)
val bitmapSizeLimit = requestedSizeInBytes ?: getBitmapSizeLimit()

Runnable {
@Suppress("ThreadSafety") // this runs inside an executor
Expand Down Expand Up @@ -93,7 +93,7 @@ internal class DrawableUtils(
bitmap: Bitmap,
requestedSizeInBytes: Int? = null
): Bitmap? {
val bitmapSizeLimit = getBitmapSizeLimit(requestedSizeInBytes)
val bitmapSizeLimit = requestedSizeInBytes ?: getBitmapSizeLimit()

val (width, height) = getScaledWidthAndHeight(
bitmap.width,
Expand All @@ -109,17 +109,12 @@ internal class DrawableUtils(
}

@VisibleForTesting
internal fun getBitmapSizeLimit(requestedSizeInBytes: Int?): Int {
if (requestedSizeInBytes != null) {
return requestedSizeInBytes
}

return if (ResourcesFeature.RESOURCE_ENDPOINT_FEATURE_FLAG) {
internal fun getBitmapSizeLimit(): Int =
if (ResourcesFeature.RESOURCE_ENDPOINT_FEATURE_FLAG) {
MAX_BITMAP_SIZE_BYTES_WITH_RESOURCE_ENDPOINT
} else {
MAX_BITMAP_SIZE_IN_BYTES_WITH_BASE64
}
}

@MainThread
private fun drawOnCanvas(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@ import com.datadog.android.sessionreplay.SessionReplayRecorder
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.utils.config.ApplicationContextTestConfiguration
import com.datadog.android.sessionreplay.utils.verifyLog
Expand All @@ -37,10 +34,8 @@ 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 @@ -163,32 +158,6 @@ 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())
// always a noop, since even when the resource feature flag is enabled
// it only changes to the implementation datawriter after onInitialise
assertThat(captor.firstValue)
.isInstanceOf(NoOpResourcesWriter::class.java)
}

@Test
fun `𝕄 set the feature event receiver 𝕎 initialize()`() {
// Given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ import com.datadog.android.sessionreplay.forge.ForgeConfigurator
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.CONTENT_TYPE_IMAGE
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.FILENAME_BLOB
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.MULTIPLE_APPLICATION_ID_ERROR
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.NAME_EVENT
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.NAME_IMAGE
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.NAME_RESOURCE
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.NO_RESOURCES_TO_SEND_ERROR
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.TYPE_KEY
import com.datadog.android.sessionreplay.internal.net.ResourceRequestBodyFactory.Companion.TYPE_RESOURCE
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_INTERNAL_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_OUTER_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_ID_RESOURCE_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.APPLICATION_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.FILENAME_KEY
import com.datadog.android.sessionreplay.internal.processor.EnrichedResource.Companion.ID_KEY
import com.datadog.android.utils.verifyLog
import com.google.gson.JsonObject
import fr.xgouchet.elmyr.Forge
Expand Down Expand Up @@ -99,12 +99,12 @@ internal class ResourceRequestBodyFactoryTest {

val applicationIdOuter = JsonObject()
val applicationIdInner = JsonObject()
applicationIdInner.addProperty(APPLICATION_ID_INTERNAL_KEY, expectedApplicationId)
applicationIdOuter.add(APPLICATION_ID_OUTER_KEY, applicationIdInner)
applicationIdInner.addProperty(ID_KEY, expectedApplicationId)
applicationIdOuter.add(APPLICATION_KEY, applicationIdInner)
applicationIdOuter.addProperty(TYPE_KEY, TYPE_RESOURCE)

val applicationIdPart = MultipartBody.Part.createFormData(
NAME_RESOURCE,
NAME_EVENT,
FILENAME_BLOB,
applicationIdOuter.toString().toRequestBody(ResourceRequestBodyFactory.CONTENT_TYPE_APPLICATION)
)
Expand Down Expand Up @@ -217,12 +217,12 @@ internal class ResourceRequestBodyFactoryTest {

val applicationIdOuter = JsonObject()
val applicationIdInner = JsonObject()
applicationIdInner.addProperty(APPLICATION_ID_INTERNAL_KEY, fakeSecondApplicationId)
applicationIdOuter.add(APPLICATION_ID_OUTER_KEY, applicationIdInner)
applicationIdInner.addProperty(ID_KEY, fakeSecondApplicationId)
applicationIdOuter.add(APPLICATION_KEY, applicationIdInner)
applicationIdOuter.addProperty(TYPE_KEY, TYPE_RESOURCE)

val applicationIdPart = MultipartBody.Part.createFormData(
NAME_RESOURCE,
NAME_EVENT,
FILENAME_BLOB,
applicationIdOuter.toString().toRequestBody(ResourceRequestBodyFactory.CONTENT_TYPE_APPLICATION)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -321,20 +321,9 @@ internal class DrawableUtilsTest {
}

@Test
fun `M return input size W getBitmapSizeLimit() { got input size }`(
@IntForgery fakeSize: Int
) {
// When
val result = testedDrawableUtils.getBitmapSizeLimit(fakeSize)

// Then
assertThat(result).isEqualTo(fakeSize)
}

@Test
fun `M return relevant size W getBitmapSizeLimit() { null size }`() {
fun `M return relevant size W getBitmapSizeLimit()`() {
// When
val result = testedDrawableUtils.getBitmapSizeLimit(null)
val result = testedDrawableUtils.getBitmapSizeLimit()

// Then
if (RESOURCE_ENDPOINT_FEATURE_FLAG) {
Expand Down

0 comments on commit a31af69

Please sign in to comment.