Add DynamicPreRegistrationExperimentEnrollmentConfiguration
This commit is contained in:
		
							parent
							
								
									152c927929
								
							
						
					
					
						commit
						25f603efc9
					
				| 
						 | 
					@ -14,6 +14,10 @@ public class DynamicConfiguration {
 | 
				
			||||||
  @Valid
 | 
					  @Valid
 | 
				
			||||||
  private Map<String, DynamicExperimentEnrollmentConfiguration> experiments = Collections.emptyMap();
 | 
					  private Map<String, DynamicExperimentEnrollmentConfiguration> experiments = Collections.emptyMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @JsonProperty
 | 
				
			||||||
 | 
					  @Valid
 | 
				
			||||||
 | 
					  private Map<String, DynamicPreRegistrationExperimentEnrollmentConfiguration> preRegistrationExperiments = Collections.emptyMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @JsonProperty
 | 
					  @JsonProperty
 | 
				
			||||||
  @Valid
 | 
					  @Valid
 | 
				
			||||||
  private DynamicRateLimitsConfiguration limits = new DynamicRateLimitsConfiguration();
 | 
					  private DynamicRateLimitsConfiguration limits = new DynamicRateLimitsConfiguration();
 | 
				
			||||||
| 
						 | 
					@ -38,6 +42,11 @@ public class DynamicConfiguration {
 | 
				
			||||||
    return Optional.ofNullable(experiments.get(experimentName));
 | 
					    return Optional.ofNullable(experiments.get(experimentName));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public Optional<DynamicPreRegistrationExperimentEnrollmentConfiguration> getPreRegistrationEnrollmentConfiguration(
 | 
				
			||||||
 | 
					      final String experimentName) {
 | 
				
			||||||
 | 
					    return Optional.ofNullable(preRegistrationExperiments.get(experimentName));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public DynamicRateLimitsConfiguration getLimits() {
 | 
					  public DynamicRateLimitsConfiguration getLimits() {
 | 
				
			||||||
    return limits;
 | 
					    return limits;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2021 Signal Messenger, LLC
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package org.whispersystems.textsecuregcm.configuration.dynamic;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					import javax.validation.Valid;
 | 
				
			||||||
 | 
					import javax.validation.constraints.Max;
 | 
				
			||||||
 | 
					import javax.validation.constraints.Min;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class DynamicPreRegistrationExperimentEnrollmentConfiguration {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @JsonProperty
 | 
				
			||||||
 | 
					  @Valid
 | 
				
			||||||
 | 
					  private Set<String> enrolledE164s = Collections.emptySet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @JsonProperty
 | 
				
			||||||
 | 
					  @Valid
 | 
				
			||||||
 | 
					  private Set<String> excludedCountryCodes = Collections.emptySet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @JsonProperty
 | 
				
			||||||
 | 
					  @Valid
 | 
				
			||||||
 | 
					  private Set<String> includedCountryCodes = Collections.emptySet();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @JsonProperty
 | 
				
			||||||
 | 
					  @Valid
 | 
				
			||||||
 | 
					  @Min(0)
 | 
				
			||||||
 | 
					  @Max(100)
 | 
				
			||||||
 | 
					  private int enrollmentPercentage = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public Set<String> getEnrolledE164s() {
 | 
				
			||||||
 | 
					    return enrolledE164s;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public Set<String> getExcludedCountryCodes() {
 | 
				
			||||||
 | 
					    return excludedCountryCodes;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public Set<String> getIncludedCountryCodes() {
 | 
				
			||||||
 | 
					    return includedCountryCodes;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public int getEnrollmentPercentage() {
 | 
				
			||||||
 | 
					    return enrollmentPercentage;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,7 @@ import com.vdurmont.semver4j.Semver;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Optional;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
| 
						 | 
					@ -71,6 +72,79 @@ class DynamicConfigurationTest {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  void testParsePreRegistrationExperiments() throws JsonProcessingException {
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      final String emptyConfigYaml = "test: true";
 | 
				
			||||||
 | 
					      final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
 | 
				
			||||||
 | 
					          .readValue(emptyConfigYaml, DynamicConfiguration.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      assertFalse(emptyConfig.getPreRegistrationEnrollmentConfiguration("test").isPresent());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      final String experimentConfigYaml =
 | 
				
			||||||
 | 
					          "preRegistrationExperiments:\n" +
 | 
				
			||||||
 | 
					              "  percentageOnly:\n" +
 | 
				
			||||||
 | 
					              "    enrollmentPercentage: 17\n" +
 | 
				
			||||||
 | 
					              "  e164sCountryCodesAndPercentage:\n" +
 | 
				
			||||||
 | 
					              "    enrolledE164s:\n" +
 | 
				
			||||||
 | 
					              "      - +120255551212\n" +
 | 
				
			||||||
 | 
					              "      - +3655323174\n" +
 | 
				
			||||||
 | 
					              "    enrollmentPercentage: 46\n" +
 | 
				
			||||||
 | 
					              "    excludedCountryCodes:\n" +
 | 
				
			||||||
 | 
					              "      - 47\n" +
 | 
				
			||||||
 | 
					              "    includedCountryCodes:\n" +
 | 
				
			||||||
 | 
					              "      - 56\n" +
 | 
				
			||||||
 | 
					              "  e164sAndExcludedCodes:\n" +
 | 
				
			||||||
 | 
					              "    enrolledE164s:\n" +
 | 
				
			||||||
 | 
					              "      - +120255551212\n" +
 | 
				
			||||||
 | 
					              "    excludedCountryCodes:\n" +
 | 
				
			||||||
 | 
					              "      - 47";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      final DynamicConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
 | 
				
			||||||
 | 
					          .readValue(experimentConfigYaml, DynamicConfiguration.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      assertFalse(config.getPreRegistrationEnrollmentConfiguration("unconfigured").isPresent());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        final Optional<DynamicPreRegistrationExperimentEnrollmentConfiguration> percentageOnly = config
 | 
				
			||||||
 | 
					            .getPreRegistrationEnrollmentConfiguration("percentageOnly");
 | 
				
			||||||
 | 
					        assertTrue(percentageOnly.isPresent());
 | 
				
			||||||
 | 
					        assertEquals(17,
 | 
				
			||||||
 | 
					            percentageOnly.get().getEnrollmentPercentage());
 | 
				
			||||||
 | 
					        assertEquals(Collections.emptySet(),
 | 
				
			||||||
 | 
					            percentageOnly.get().getEnrolledE164s());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        final Optional<DynamicPreRegistrationExperimentEnrollmentConfiguration> e164sCountryCodesAndPercentage = config
 | 
				
			||||||
 | 
					            .getPreRegistrationEnrollmentConfiguration("e164sCountryCodesAndPercentage");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assertTrue(e164sCountryCodesAndPercentage.isPresent());
 | 
				
			||||||
 | 
					        assertEquals(46,
 | 
				
			||||||
 | 
					            e164sCountryCodesAndPercentage.get().getEnrollmentPercentage());
 | 
				
			||||||
 | 
					        assertEquals(Set.of("+120255551212", "+3655323174"),
 | 
				
			||||||
 | 
					            e164sCountryCodesAndPercentage.get().getEnrolledE164s());
 | 
				
			||||||
 | 
					        assertEquals(Set.of("47"),
 | 
				
			||||||
 | 
					            e164sCountryCodesAndPercentage.get().getExcludedCountryCodes());
 | 
				
			||||||
 | 
					        assertEquals(Set.of("56"),
 | 
				
			||||||
 | 
					            e164sCountryCodesAndPercentage.get().getIncludedCountryCodes());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        final Optional<DynamicPreRegistrationExperimentEnrollmentConfiguration> e164sAndExcludedCodes = config
 | 
				
			||||||
 | 
					            .getPreRegistrationEnrollmentConfiguration("e164sAndExcludedCodes");
 | 
				
			||||||
 | 
					        assertTrue(e164sAndExcludedCodes.isPresent());
 | 
				
			||||||
 | 
					        assertEquals(0, e164sAndExcludedCodes.get().getEnrollmentPercentage());
 | 
				
			||||||
 | 
					        assertEquals(Set.of("+120255551212"),
 | 
				
			||||||
 | 
					            e164sAndExcludedCodes.get().getEnrolledE164s());
 | 
				
			||||||
 | 
					        assertEquals(Set.of("47"),
 | 
				
			||||||
 | 
					            e164sAndExcludedCodes.get().getExcludedCountryCodes());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Test
 | 
					  @Test
 | 
				
			||||||
  void testParseRemoteDeprecationConfig() throws JsonProcessingException {
 | 
					  void testParseRemoteDeprecationConfig() throws JsonProcessingException {
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue