diff --git a/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/ExperimentFiltersManager.kt b/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/ExperimentFiltersManager.kt index e54a682b865e..79d0651fb076 100644 --- a/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/ExperimentFiltersManager.kt +++ b/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/ExperimentFiltersManager.kt @@ -30,7 +30,11 @@ import javax.inject.Inject import kotlinx.coroutines.runBlocking interface ExperimentFiltersManager { - fun addFilters(entity: VariantConfig): (AppBuildConfig) -> Boolean + /** + * This method computes the result of the filters + * @return returns `true` if the filters match the client state, else `false` + */ + fun computeFilters(entity: VariantConfig): (AppBuildConfig) -> Boolean } @ContributesBinding(AppScope::class) @@ -39,7 +43,7 @@ class ExperimentFiltersManagerImpl @Inject constructor( private val subscriptions: Subscriptions, private val dispatcherProvider: DispatcherProvider, ) : ExperimentFiltersManager { - override fun addFilters(entity: VariantConfig): (AppBuildConfig) -> Boolean { + override fun computeFilters(entity: VariantConfig): (AppBuildConfig) -> Boolean { if (entity.variantKey == "sc" || entity.variantKey == "se") { return { isSerpRegionToggleCountry() } } @@ -51,7 +55,7 @@ class ExperimentFiltersManagerImpl @Inject constructor( ) if (!entity.filters?.locale.isNullOrEmpty()) { - val userLocale = Locale.getDefault() + val userLocale = appBuildConfig.deviceLocale filters[LOCALE] = entity.filters!!.locale.contains(userLocale.toString()) } if (!entity.filters?.androidVersion.isNullOrEmpty()) { diff --git a/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/VariantManagerImpl.kt b/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/VariantManagerImpl.kt index c70a83928df8..0ec8e92b8e9a 100644 --- a/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/VariantManagerImpl.kt +++ b/experiments/experiments-impl/src/main/java/com/duckduckgo/experiments/impl/VariantManagerImpl.kt @@ -47,9 +47,9 @@ class VariantManagerImpl @Inject constructor( experimentVariantRepository.updateAppReferrerVariant(variant) } - override fun updateVariants(variantConfig: List) { - val activeVariants = variantConfig.toVariants() - Timber.d("Variants update $variantConfig") + override fun updateVariants(variants: List) { + val activeVariants = variants.toVariants() + Timber.d("Variants update $variants") val currentVariantKey = experimentVariantRepository.getUserVariant() updateUserVariant(activeVariants, currentVariantKey) @@ -84,14 +84,14 @@ class VariantManagerImpl @Inject constructor( Timber.i("Variant $currentVariantKey is still in use, no need to update") } - fun List.toVariants(): List { + private fun List.toVariants(): List { val activeVariants: MutableList = mutableListOf() this.map { entity -> activeVariants.add( Variant( key = entity.variantKey, weight = entity.weight ?: 0.0, - filterBy = experimentFiltersManager.addFilters(entity), + filterBy = experimentFiltersManager.computeFilters(entity), ), ) } diff --git a/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/ExperimentFiltersManagerImplTest.kt b/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/ExperimentFiltersManagerImplTest.kt index ba38aaa59ced..f8ddcee8c9a6 100644 --- a/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/ExperimentFiltersManagerImplTest.kt +++ b/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/ExperimentFiltersManagerImplTest.kt @@ -51,59 +51,59 @@ class ExperimentFiltersManagerImplTest { } @Test - fun whenVariantComplyWithLocaleFilterThenAddFiltersReturnsTrue() { + fun whenVariantComplyWithLocaleFilterThenComputeFiltersReturnsTrue() { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) val testEntity = addActiveVariant(localeFilter = listOf("en_US")) - assertTrue(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertTrue(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantDoesNotComplyWithLocaleFilterThenAddFiltersReturnsFalse() { + fun whenVariantDoesNotComplyWithLocaleFilterThenComputeFiltersReturnsFalse() { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) val testEntity = addActiveVariant(localeFilter = listOf("de_DE")) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithAndroidVersionFilterThenAddFiltersReturnsTrue() { + fun whenVariantComplyWithAndroidVersionFilterThenComputeFiltersReturnsTrue() { whenever(mockAppBuildConfig.sdkInt).thenReturn(33) val testEntity = addActiveVariant(androidVersionFilter = listOf("33", "34")) - assertTrue(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertTrue(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantDoesNotComplyWithAndroidVersionFilterThenAddFiltersReturnsFalse() { + fun whenVariantDoesNotComplyWithAndroidVersionFilterThenComputeFiltersReturnsFalse() { whenever(mockAppBuildConfig.sdkInt).thenReturn(32) val testEntity = addActiveVariant(androidVersionFilter = listOf("33", "34")) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithPrivacyProEligibleFilterThenAddFiltersReturnsTrue() = runTest { + fun whenVariantComplyWithPrivacyProEligibleFilterThenComputeFiltersReturnsTrue() = runTest { whenever(mockSubscriptions.isEligible()).thenReturn(true) val testEntity = addActiveVariant(privacyProEligible = true) - assertTrue(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertTrue(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantDoesNotComplyWithPrivacyProEligibleFilterThenAddFiltersReturnsFalse() = runTest { + fun whenVariantDoesNotComplyWithPrivacyProEligibleFilterThenComputeFiltersReturnsFalse() = runTest { whenever(mockSubscriptions.isEligible()).thenReturn(false) val testEntity = addActiveVariant(privacyProEligible = true) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithAllFiltersThenAddFiltersReturnsTrue() = runTest { + fun whenVariantComplyWithAllFiltersThenComputeFiltersReturnsTrue() = runTest { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) whenever(mockAppBuildConfig.sdkInt).thenReturn(33) whenever(mockSubscriptions.isEligible()).thenReturn(false) val testEntity = addActiveVariant( @@ -112,33 +112,33 @@ class ExperimentFiltersManagerImplTest { privacyProEligible = false, ) - assertTrue(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertTrue(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithLocaleFiltersAndDoesNotComplyWithAndroidVersionFilterThenAddFiltersReturnsFalse() { + fun whenVariantComplyWithLocaleFiltersAndDoesNotComplyWithAndroidVersionFilterThenComputeFiltersReturnsFalse() { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) whenever(mockAppBuildConfig.sdkInt).thenReturn(32) val testEntity = addActiveVariant(localeFilter = listOf("en_US"), androidVersionFilter = listOf("33", "34")) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithAndroidVersionFiltersAndDoesNotComplyWithLocaleFilterThenAddFiltersReturnsFalse() { + fun whenVariantComplyWithAndroidVersionFiltersAndDoesNotComplyWithLocaleFilterThenComputeFiltersReturnsFalse() { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) whenever(mockAppBuildConfig.sdkInt).thenReturn(33) val testEntity = addActiveVariant(localeFilter = listOf("de_DE"), androidVersionFilter = listOf("33", "34")) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } @Test - fun whenVariantComplyWithLocaleAndAndroidVersionFiltersAndDoesNotComplyWithPrivacyProEligibleThenAddFiltersReturnsFalse() = runTest { + fun whenVariantComplyWithLocaleAndAndroidVersionFiltersAndDoesNotComplyWithPrivacyProEligibleThenComputeFiltersReturnsFalse() = runTest { val locale = Locale("en", "US") - Locale.setDefault(locale) + whenever(mockAppBuildConfig.deviceLocale).thenReturn(locale) whenever(mockAppBuildConfig.sdkInt).thenReturn(33) whenever(mockSubscriptions.isEligible()).thenReturn(true) val testEntity = addActiveVariant( @@ -147,7 +147,7 @@ class ExperimentFiltersManagerImplTest { privacyProEligible = false, ) - assertFalse(testee.addFilters(testEntity).invoke(mockAppBuildConfig)) + assertFalse(testee.computeFilters(testEntity).invoke(mockAppBuildConfig)) } private fun addActiveVariant( diff --git a/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/VariantManagerImplTest.kt b/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/VariantManagerImplTest.kt index f202c98b9ec2..21097c9d045b 100644 --- a/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/VariantManagerImplTest.kt +++ b/experiments/experiments-impl/src/test/java/com/duckduckgo/experiments/impl/VariantManagerImplTest.kt @@ -43,7 +43,7 @@ class VariantManagerImplTest { fun setup() { // mock randomizer always returns the first active variant whenever(mockRandomizer.random(any())).thenReturn(0) - whenever(mockExperimentFiltersManager.addFilters(any())).thenReturn { true } + whenever(mockExperimentFiltersManager.computeFilters(any())).thenReturn { true } testee = VariantManagerImpl( mockRandomizer,