diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManager.java index cfecdc8e8..08bebc2b6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManager.java @@ -41,12 +41,11 @@ public class ExperimentEnrollmentManager { .getConfiguration().getExperimentEnrollmentConfiguration(experimentName); return maybeConfiguration - .map(config -> isAccountEnrolled(accountUuid, config) - .orElse(isEnrolled(accountUuid, config.getEnrollmentPercentage(), experimentName)) - ).orElse(false); + .map(config -> isAccountEnrolled(accountUuid, config, experimentName).orElse(false)) + .orElse(false); } - Optional isAccountEnrolled(final UUID accountUuid, DynamicExperimentEnrollmentConfiguration config) { + private Optional isAccountEnrolled(final UUID accountUuid, DynamicExperimentEnrollmentConfiguration config, String experimentName) { if (config.getExcludedUuids().contains(accountUuid)) { return Optional.of(false); } @@ -55,6 +54,10 @@ public class ExperimentEnrollmentManager { return Optional.of(r < config.getUuidSelector().getUuidEnrollmentPercentage()); } + if (isEnrolled(accountUuid, config.getEnrollmentPercentage(), experimentName)) { + return Optional.of(true); + } + return Optional.empty(); } @@ -64,7 +67,7 @@ public class ExperimentEnrollmentManager { .getConfiguration().getExperimentEnrollmentConfiguration(experimentName); return maybeConfiguration - .flatMap(config -> isAccountEnrolled(accountUuid, config)) + .flatMap(config -> isAccountEnrolled(accountUuid, config, experimentName)) .orElse(isEnrolled(e164, experimentName)); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManagerTest.java index c3352a166..ff3010107 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManagerTest.java @@ -133,6 +133,7 @@ class ExperimentEnrollmentManagerTest { when(preRegistrationExperimentEnrollmentConfiguration.getExcludedE164s()).thenReturn(Collections.emptySet()); when(preRegistrationExperimentEnrollmentConfiguration.getExcludedCountryCodes()).thenReturn(Collections.emptySet()); + // test UUID enrollment is prioritized when(uuidSelector.getUuids()).thenReturn(Set.of(ACCOUNT_UUID)); when(uuidSelector.getUuidEnrollmentPercentage()).thenReturn(100); assertTrue(experimentEnrollmentManager.isEnrolled(NOT_ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); @@ -140,7 +141,14 @@ class ExperimentEnrollmentManagerTest { assertFalse(experimentEnrollmentManager.isEnrolled(NOT_ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); assertFalse(experimentEnrollmentManager.isEnrolled(ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); + // test fallback from UUID enrollment to general enrollment percentage when(uuidSelector.getUuids()).thenReturn(Collections.emptySet()); + when(experimentEnrollmentConfiguration.getEnrollmentPercentage()).thenReturn(100); + assertTrue(experimentEnrollmentManager.isEnrolled(NOT_ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); + assertTrue(experimentEnrollmentManager.isEnrolled(ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); + + // test fallback from UUID/general enrollment to e164 enrollment + when(experimentEnrollmentConfiguration.getEnrollmentPercentage()).thenReturn(0); assertTrue(experimentEnrollmentManager.isEnrolled(ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); assertFalse(experimentEnrollmentManager.isEnrolled(NOT_ENROLLED_164, account.getUuid(), E164_AND_UUID_EXPERIMENT_NAME)); when(preRegistrationExperimentEnrollmentConfiguration.getEnrollmentPercentage()).thenReturn(100);