From 128721c385dbc8a8469bfccbdfcd5bbc3f9ec7b0 Mon Sep 17 00:00:00 2001 From: "Xavier F. Gouchet" Date: Fri, 30 Aug 2024 11:35:50 +0200 Subject: [PATCH] RUM-5977 add configuration to set uploadSchedulerStrategy --- dd-sdk-android-core/api/apiSurface | 1 + .../api/dd-sdk-android-core.api | 1 + .../core/configuration/Configuration.kt | 16 ++++++++++++++-- .../android/core/internal/CoreFeature.kt | 3 +++ .../android/core/internal/SdkFeature.kt | 3 ++- .../configuration/ConfigurationBuilderTest.kt | 18 ++++++++++++++++++ .../forge/ConfigurationCoreForgeryFactory.kt | 3 ++- 7 files changed, 41 insertions(+), 4 deletions(-) diff --git a/dd-sdk-android-core/api/apiSurface b/dd-sdk-android-core/api/apiSurface index a8918cf8b5..fa1c9f1256 100644 --- a/dd-sdk-android-core/api/apiSurface +++ b/dd-sdk-android-core/api/apiSurface @@ -216,6 +216,7 @@ data class com.datadog.android.core.configuration.Configuration fun setPersistenceStrategyFactory(com.datadog.android.core.persistence.PersistenceStrategy.Factory?): Builder fun setCrashReportsEnabled(Boolean): Builder fun setBackpressureStrategy(BackPressureStrategy): Builder + fun setUploadSchedulerStrategy(UploadSchedulerStrategy?): Builder companion object class com.datadog.android.core.configuration.HostsSanitizer fun sanitizeHosts(List, String): List diff --git a/dd-sdk-android-core/api/dd-sdk-android-core.api b/dd-sdk-android-core/api/dd-sdk-android-core.api index 68aca1315e..c4959aa531 100644 --- a/dd-sdk-android-core/api/dd-sdk-android-core.api +++ b/dd-sdk-android-core/api/dd-sdk-android-core.api @@ -588,6 +588,7 @@ public final class com/datadog/android/core/configuration/Configuration$Builder public final fun setPersistenceStrategyFactory (Lcom/datadog/android/core/persistence/PersistenceStrategy$Factory;)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun setProxy (Ljava/net/Proxy;Lokhttp3/Authenticator;)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun setUploadFrequency (Lcom/datadog/android/core/configuration/UploadFrequency;)Lcom/datadog/android/core/configuration/Configuration$Builder; + public final fun setUploadSchedulerStrategy (Lcom/datadog/android/core/configuration/UploadSchedulerStrategy;)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun setUseDeveloperModeWhenDebuggable (Z)Lcom/datadog/android/core/configuration/Configuration$Builder; public final fun useSite (Lcom/datadog/android/DatadogSite;)Lcom/datadog/android/core/configuration/Configuration$Builder; } diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt index 91f0e044e9..d64a434c75 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/configuration/Configuration.kt @@ -42,7 +42,8 @@ internal constructor( val site: DatadogSite, val batchProcessingLevel: BatchProcessingLevel, val persistenceStrategyFactory: PersistenceStrategy.Factory?, - val backpressureStrategy: BackPressureStrategy + val backpressureStrategy: BackPressureStrategy, + val uploadSchedulerStrategy: UploadSchedulerStrategy? ) // region Builder @@ -259,6 +260,16 @@ internal constructor( return this } + /** + * Sets the strategy to schedule data uploads. + * @param uploadSchedulerStrategy the upload scheduler strategy, + * or null to use the default strategy (default: null) + */ + fun setUploadSchedulerStrategy(uploadSchedulerStrategy: UploadSchedulerStrategy?): Builder { + coreConfig = coreConfig.copy(uploadSchedulerStrategy = uploadSchedulerStrategy) + return this + } + internal fun allowClearTextHttp(): Builder { coreConfig = coreConfig.copy( needsClearTextHttp = true @@ -297,7 +308,8 @@ internal constructor( site = DatadogSite.US1, batchProcessingLevel = BatchProcessingLevel.MEDIUM, persistenceStrategyFactory = null, - backpressureStrategy = DEFAULT_BACKPRESSURE_STRATEGY + backpressureStrategy = DEFAULT_BACKPRESSURE_STRATEGY, + uploadSchedulerStrategy = null ) internal const val NETWORK_REQUESTS_TRACKING_FEATURE_NAME = "Network requests" diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt index 7eccf027a2..646e673723 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/CoreFeature.kt @@ -25,6 +25,7 @@ import com.datadog.android.core.configuration.BatchProcessingLevel import com.datadog.android.core.configuration.BatchSize import com.datadog.android.core.configuration.Configuration import com.datadog.android.core.configuration.UploadFrequency +import com.datadog.android.core.configuration.UploadSchedulerStrategy import com.datadog.android.core.internal.data.upload.CurlInterceptor import com.datadog.android.core.internal.data.upload.GzipRequestInterceptor import com.datadog.android.core.internal.data.upload.RotatingDnsResolver @@ -139,6 +140,7 @@ internal class CoreFeature( internal var ndkCrashHandler: NdkCrashHandler = NoOpNdkCrashHandler() internal var site: DatadogSite = DatadogSite.US1 internal var appBuildId: String? = null + internal var customUploadSchedulerStrategy: UploadSchedulerStrategy? = null internal lateinit var uploadExecutorService: ScheduledThreadPoolExecutor internal lateinit var persistenceExecutorService: FlushableExecutorService @@ -504,6 +506,7 @@ internal class CoreFeature( persistenceStrategyFactory = configuration.persistenceStrategyFactory site = configuration.site backpressureStrategy = configuration.backpressureStrategy + customUploadSchedulerStrategy = configuration.uploadSchedulerStrategy } private fun setupInfoProviders( diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/SdkFeature.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/SdkFeature.kt index 20959bd28b..ca7212e207 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/SdkFeature.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/SdkFeature.kt @@ -98,7 +98,8 @@ internal class SdkFeature( uploadFrequency, batchProcessingLevel.maxBatchesPerUploadJob ) - val uploadSchedulerStrategy = DefaultUploadSchedulerStrategy(dataUploadConfiguration) + val uploadSchedulerStrategy = coreFeature.customUploadSchedulerStrategy + ?: DefaultUploadSchedulerStrategy(dataUploadConfiguration) storage = prepareStorage( dataUploadConfiguration, wrappedFeature, diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt index 076148040e..007eb15baf 100644 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/core/configuration/ConfigurationBuilderTest.kt @@ -416,6 +416,24 @@ internal class ConfigurationBuilderTest { ) } + @Test + fun `M build config with UploadScheduler strategy W setUploadSchedulerStrategy() and build()`() { + // Given + val mockUploadSchedulerStrategy: UploadSchedulerStrategy = mock() + + // When + val config = testedBuilder + .setUploadSchedulerStrategy(mockUploadSchedulerStrategy) + .build() + + // Then + assertThat(config.coreConfig).isEqualTo( + Configuration.DEFAULT_CORE_CONFIG.copy( + uploadSchedulerStrategy = mockUploadSchedulerStrategy + ) + ) + } + companion object { val logger = InternalLoggerTestConfiguration() diff --git a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt index be22a5f796..54708b6bef 100644 --- a/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt +++ b/dd-sdk-android-core/src/test/kotlin/com/datadog/android/utils/forge/ConfigurationCoreForgeryFactory.kt @@ -59,7 +59,8 @@ internal class ConfigurationCoreForgeryFactory : mock(), mock(), forge.aValueFrom(BackPressureMitigation::class.java) - ) + ), + uploadSchedulerStrategy = forge.aNullable { mock() } ) } }