mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-20 09:47:58 +01:00
Add isEnrolled(e164, experiment) for pre-registration experiments
This commit is contained in:
@@ -5,13 +5,12 @@
|
||||
|
||||
package org.whispersystems.textsecuregcm.experiment;
|
||||
|
||||
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicExperimentEnrollmentConfiguration;
|
||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicExperimentEnrollmentConfiguration;
|
||||
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicPreRegistrationExperimentEnrollmentConfiguration;
|
||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||
import org.whispersystems.textsecuregcm.util.Util;
|
||||
|
||||
public class ExperimentEnrollmentManager {
|
||||
|
||||
@@ -22,24 +21,52 @@ public class ExperimentEnrollmentManager {
|
||||
}
|
||||
|
||||
public boolean isEnrolled(final UUID accountUuid, final String experimentName) {
|
||||
|
||||
final Optional<DynamicExperimentEnrollmentConfiguration> maybeConfiguration = dynamicConfigurationManager
|
||||
.getConfiguration().getExperimentEnrollmentConfiguration(experimentName);
|
||||
|
||||
final Set<UUID> enrolledUuids = maybeConfiguration.map(DynamicExperimentEnrollmentConfiguration::getEnrolledUuids)
|
||||
.orElse(Collections.emptySet());
|
||||
return maybeConfiguration.map(config -> {
|
||||
|
||||
final boolean enrolled;
|
||||
if (config.getEnrolledUuids().contains(accountUuid)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (enrolledUuids.contains(accountUuid)) {
|
||||
enrolled = true;
|
||||
} else {
|
||||
final int threshold = maybeConfiguration.map(DynamicExperimentEnrollmentConfiguration::getEnrollmentPercentage)
|
||||
.orElse(0);
|
||||
final int enrollmentHash = ((accountUuid.hashCode() ^ experimentName.hashCode()) & Integer.MAX_VALUE) % 100;
|
||||
return isEnrolled(accountUuid, config.getEnrollmentPercentage(), experimentName);
|
||||
|
||||
enrolled = enrollmentHash < threshold;
|
||||
}
|
||||
}).orElse(false);
|
||||
}
|
||||
|
||||
return enrolled;
|
||||
public boolean isEnrolled(final String e164, final String experimentName) {
|
||||
|
||||
final Optional<DynamicPreRegistrationExperimentEnrollmentConfiguration> maybeConfiguration = dynamicConfigurationManager
|
||||
.getConfiguration().getPreRegistrationEnrollmentConfiguration(experimentName);
|
||||
|
||||
return maybeConfiguration.map(config -> {
|
||||
|
||||
if (config.getEnrolledE164s().contains(e164)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
{
|
||||
final String countryCode = Util.getCountryCode(e164);
|
||||
|
||||
if (config.getIncludedCountryCodes().contains(countryCode)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (config.getExcludedCountryCodes().contains(countryCode)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return isEnrolled(e164, config.getEnrollmentPercentage(), experimentName);
|
||||
|
||||
}).orElse(false);
|
||||
}
|
||||
|
||||
private boolean isEnrolled(final Object entity, final int enrollmentPercentage, final String experimentName) {
|
||||
final int enrollmentHash = ((entity.hashCode() ^ experimentName.hashCode()) & Integer.MAX_VALUE) % 100;
|
||||
|
||||
return enrollmentHash < enrollmentPercentage;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user