Enforce validation constraints for dynamic configuration objects.
This commit is contained in:
parent
5b0214c6f2
commit
411f7298f2
|
@ -18,8 +18,12 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
|
import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration;
|
||||||
import org.whispersystems.textsecuregcm.util.Util;
|
import org.whispersystems.textsecuregcm.util.Util;
|
||||||
|
|
||||||
|
import javax.validation.ConstraintViolation;
|
||||||
|
import javax.validation.Validation;
|
||||||
|
import javax.validation.Validator;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
@ -32,16 +36,19 @@ public class DynamicConfigurationManager {
|
||||||
private final AmazonAppConfig appConfigClient;
|
private final AmazonAppConfig appConfigClient;
|
||||||
|
|
||||||
private final AtomicReference<DynamicConfiguration> configuration = new AtomicReference<>();
|
private final AtomicReference<DynamicConfiguration> configuration = new AtomicReference<>();
|
||||||
private final Logger logger = LoggerFactory.getLogger(DynamicConfigurationManager.class);
|
|
||||||
|
|
||||||
private GetConfigurationResult lastConfigResult;
|
private GetConfigurationResult lastConfigResult;
|
||||||
|
|
||||||
private boolean initialized = false;
|
private boolean initialized = false;
|
||||||
|
|
||||||
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory())
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory())
|
||||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
||||||
.registerModule(new JavaTimeModule());
|
.registerModule(new JavaTimeModule());
|
||||||
|
|
||||||
|
private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DynamicConfigurationManager.class);
|
||||||
|
|
||||||
public DynamicConfigurationManager(String application, String environment, String configurationName) {
|
public DynamicConfigurationManager(String application, String environment, String configurationName) {
|
||||||
this(AmazonAppConfigClient.builder()
|
this(AmazonAppConfigClient.builder()
|
||||||
.withClientConfiguration(new ClientConfiguration().withClientExecutionTimeout(10000).withRequestTimeout(10000))
|
.withClientConfiguration(new ClientConfiguration().withClientExecutionTimeout(10000).withRequestTimeout(10000))
|
||||||
|
@ -104,7 +111,9 @@ public class DynamicConfigurationManager {
|
||||||
|
|
||||||
if (!StringUtils.equals(lastConfigResult.getConfigurationVersion(), previousVersion)) {
|
if (!StringUtils.equals(lastConfigResult.getConfigurationVersion(), previousVersion)) {
|
||||||
logger.info("Received new config version: {}", lastConfigResult.getConfigurationVersion());
|
logger.info("Received new config version: {}", lastConfigResult.getConfigurationVersion());
|
||||||
maybeDynamicConfiguration = Optional.of(OBJECT_MAPPER.readValue(StandardCharsets.UTF_8.decode(lastConfigResult.getContent().asReadOnlyBuffer()).toString(), DynamicConfiguration.class));
|
|
||||||
|
maybeDynamicConfiguration =
|
||||||
|
parseConfiguration(StandardCharsets.UTF_8.decode(lastConfigResult.getContent().asReadOnlyBuffer()).toString());
|
||||||
} else {
|
} else {
|
||||||
// No change since last version
|
// No change since last version
|
||||||
maybeDynamicConfiguration = Optional.empty();
|
maybeDynamicConfiguration = Optional.empty();
|
||||||
|
@ -113,6 +122,23 @@ public class DynamicConfigurationManager {
|
||||||
return maybeDynamicConfiguration;
|
return maybeDynamicConfiguration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static Optional<DynamicConfiguration> parseConfiguration(final String configurationYaml) throws JsonProcessingException {
|
||||||
|
final DynamicConfiguration configuration = OBJECT_MAPPER.readValue(configurationYaml, DynamicConfiguration.class);
|
||||||
|
final Set<ConstraintViolation<DynamicConfiguration>> violations = VALIDATOR.validate(configuration);
|
||||||
|
|
||||||
|
final Optional<DynamicConfiguration> maybeDynamicConfiguration;
|
||||||
|
|
||||||
|
if (violations.isEmpty()) {
|
||||||
|
maybeDynamicConfiguration = Optional.of(configuration);
|
||||||
|
} else {
|
||||||
|
logger.warn("Failed to validate configuration: {}", violations);
|
||||||
|
maybeDynamicConfiguration = Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
return maybeDynamicConfiguration;
|
||||||
|
}
|
||||||
|
|
||||||
private DynamicConfiguration retrieveInitialDynamicConfiguration() {
|
private DynamicConfiguration retrieveInitialDynamicConfiguration() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -31,8 +31,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseExperimentConfig() throws JsonProcessingException {
|
void testParseExperimentConfig() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(emptyConfig.getExperimentEnrollmentConfiguration("test").isPresent());
|
assertFalse(emptyConfig.getExperimentEnrollmentConfiguration("test").isPresent());
|
||||||
}
|
}
|
||||||
|
@ -51,8 +51,8 @@ class DynamicConfigurationTest {
|
||||||
" enrolledUuids:\n" +
|
" enrolledUuids:\n" +
|
||||||
" - 71618739-114c-4b1f-bb0d-6478a44eb600";
|
" - 71618739-114c-4b1f-bb0d-6478a44eb600";
|
||||||
|
|
||||||
final DynamicConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration config =
|
||||||
.readValue(experimentConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(experimentConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(config.getExperimentEnrollmentConfiguration("unconfigured").isPresent());
|
assertFalse(config.getExperimentEnrollmentConfiguration("unconfigured").isPresent());
|
||||||
|
|
||||||
|
@ -79,8 +79,8 @@ class DynamicConfigurationTest {
|
||||||
void testParsePreRegistrationExperiments() throws JsonProcessingException {
|
void testParsePreRegistrationExperiments() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(emptyConfig.getPreRegistrationEnrollmentConfiguration("test").isPresent());
|
assertFalse(emptyConfig.getPreRegistrationEnrollmentConfiguration("test").isPresent());
|
||||||
}
|
}
|
||||||
|
@ -105,8 +105,8 @@ class DynamicConfigurationTest {
|
||||||
" excludedCountryCodes:\n" +
|
" excludedCountryCodes:\n" +
|
||||||
" - 47";
|
" - 47";
|
||||||
|
|
||||||
final DynamicConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration config =
|
||||||
.readValue(experimentConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(experimentConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(config.getPreRegistrationEnrollmentConfiguration("unconfigured").isPresent());
|
assertFalse(config.getPreRegistrationEnrollmentConfiguration("unconfigured").isPresent());
|
||||||
|
|
||||||
|
@ -152,14 +152,14 @@ class DynamicConfigurationTest {
|
||||||
void testParseRemoteDeprecationConfig() throws JsonProcessingException {
|
void testParseRemoteDeprecationConfig() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertNotNull(emptyConfig.getRemoteDeprecationConfiguration());
|
assertNotNull(emptyConfig.getRemoteDeprecationConfiguration());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
final String experimentConfigYaml =
|
final String remoteDeprecationConfig =
|
||||||
"remoteDeprecation:\n" +
|
"remoteDeprecation:\n" +
|
||||||
" minimumVersions:\n" +
|
" minimumVersions:\n" +
|
||||||
" IOS: 1.2.3\n" +
|
" IOS: 1.2.3\n" +
|
||||||
|
@ -172,8 +172,9 @@ class DynamicConfigurationTest {
|
||||||
" DESKTOP:\n" +
|
" DESKTOP:\n" +
|
||||||
" - 1.4.0-beta.2";
|
" - 1.4.0-beta.2";
|
||||||
|
|
||||||
final DynamicConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration config =
|
||||||
.readValue(experimentConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(remoteDeprecationConfig).orElseThrow();
|
||||||
|
|
||||||
final DynamicRemoteDeprecationConfiguration remoteDeprecationConfiguration = config
|
final DynamicRemoteDeprecationConfiguration remoteDeprecationConfiguration = config
|
||||||
.getRemoteDeprecationConfiguration();
|
.getRemoteDeprecationConfiguration();
|
||||||
|
|
||||||
|
@ -191,8 +192,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseMessageRateConfiguration() throws JsonProcessingException {
|
void testParseMessageRateConfiguration() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(emptyConfig.getMessageRateConfiguration().isEnforceUnsealedSenderRateLimit());
|
assertFalse(emptyConfig.getMessageRateConfiguration().isEnforceUnsealedSenderRateLimit());
|
||||||
}
|
}
|
||||||
|
@ -202,8 +203,8 @@ class DynamicConfigurationTest {
|
||||||
"messageRate:\n" +
|
"messageRate:\n" +
|
||||||
" enforceUnsealedSenderRateLimit: true";
|
" enforceUnsealedSenderRateLimit: true";
|
||||||
|
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(messageRateConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(messageRateConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getMessageRateConfiguration().isEnforceUnsealedSenderRateLimit());
|
assertTrue(emptyConfig.getMessageRateConfiguration().isEnforceUnsealedSenderRateLimit());
|
||||||
}
|
}
|
||||||
|
@ -213,19 +214,19 @@ class DynamicConfigurationTest {
|
||||||
void testParseFeatureFlags() throws JsonProcessingException {
|
void testParseFeatureFlags() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getActiveFeatureFlags().isEmpty());
|
assertTrue(emptyConfig.getActiveFeatureFlags().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml =
|
final String featureFlagYaml =
|
||||||
"featureFlags:\n"
|
"featureFlags:\n"
|
||||||
+ " - testFlag";
|
+ " - testFlag";
|
||||||
|
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(featureFlagYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getActiveFeatureFlags().contains("testFlag"));
|
assertTrue(emptyConfig.getActiveFeatureFlags().contains("testFlag"));
|
||||||
}
|
}
|
||||||
|
@ -235,22 +236,22 @@ class DynamicConfigurationTest {
|
||||||
void testParseTwilioConfiguration() throws JsonProcessingException {
|
void testParseTwilioConfiguration() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getTwilioConfiguration().getNumbers().isEmpty());
|
assertTrue(emptyConfig.getTwilioConfiguration().getNumbers().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml =
|
final String twilioConfigYaml =
|
||||||
"twilio:\n"
|
"twilio:\n"
|
||||||
+ " numbers:\n"
|
+ " numbers:\n"
|
||||||
+ " - 2135551212\n"
|
+ " - 2135551212\n"
|
||||||
+ " - 2135551313";
|
+ " - 2135551313";
|
||||||
|
|
||||||
final DynamicTwilioConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicTwilioConfiguration config =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class)
|
DynamicConfigurationManager.parseConfiguration(twilioConfigYaml).orElseThrow()
|
||||||
.getTwilioConfiguration();
|
.getTwilioConfiguration();
|
||||||
|
|
||||||
assertEquals(List.of("2135551212", "2135551313"), config.getNumbers());
|
assertEquals(List.of("2135551212", "2135551313"), config.getNumbers());
|
||||||
}
|
}
|
||||||
|
@ -260,8 +261,8 @@ class DynamicConfigurationTest {
|
||||||
void testParsePaymentsConfiguration() throws JsonProcessingException {
|
void testParsePaymentsConfiguration() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getPaymentsConfiguration().getAllowedCountryCodes().isEmpty());
|
assertTrue(emptyConfig.getPaymentsConfiguration().getAllowedCountryCodes().isEmpty());
|
||||||
}
|
}
|
||||||
|
@ -272,9 +273,9 @@ class DynamicConfigurationTest {
|
||||||
+ " allowedCountryCodes:\n"
|
+ " allowedCountryCodes:\n"
|
||||||
+ " - 44";
|
+ " - 44";
|
||||||
|
|
||||||
final DynamicPaymentsConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicPaymentsConfiguration config =
|
||||||
.readValue(paymentsConfigYaml, DynamicConfiguration.class)
|
DynamicConfigurationManager.parseConfiguration(paymentsConfigYaml).orElseThrow()
|
||||||
.getPaymentsConfiguration();
|
.getPaymentsConfiguration();
|
||||||
|
|
||||||
assertEquals(Set.of("44"), config.getAllowedCountryCodes());
|
assertEquals(Set.of("44"), config.getAllowedCountryCodes());
|
||||||
}
|
}
|
||||||
|
@ -284,8 +285,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseSignupCaptchaConfiguration() throws JsonProcessingException {
|
void testParseSignupCaptchaConfiguration() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertTrue(emptyConfig.getSignupCaptchaConfiguration().getCountryCodes().isEmpty());
|
assertTrue(emptyConfig.getSignupCaptchaConfiguration().getCountryCodes().isEmpty());
|
||||||
}
|
}
|
||||||
|
@ -296,9 +297,9 @@ class DynamicConfigurationTest {
|
||||||
+ " countryCodes:\n"
|
+ " countryCodes:\n"
|
||||||
+ " - 1";
|
+ " - 1";
|
||||||
|
|
||||||
final DynamicSignupCaptchaConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicSignupCaptchaConfiguration config =
|
||||||
.readValue(signupCaptchaConfig, DynamicConfiguration.class)
|
DynamicConfigurationManager.parseConfiguration(signupCaptchaConfig).orElseThrow()
|
||||||
.getSignupCaptchaConfiguration();
|
.getSignupCaptchaConfiguration();
|
||||||
|
|
||||||
assertEquals(Set.of("1"), config.getCountryCodes());
|
assertEquals(Set.of("1"), config.getCountryCodes());
|
||||||
}
|
}
|
||||||
|
@ -308,8 +309,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseAccountsDynamoDbMigrationConfiguration() throws JsonProcessingException {
|
void testParseAccountsDynamoDbMigrationConfiguration() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicConfiguration emptyConfig =
|
||||||
.readValue(emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertFalse(emptyConfig.getAccountsDynamoDbMigrationConfiguration().isBackgroundMigrationEnabled());
|
assertFalse(emptyConfig.getAccountsDynamoDbMigrationConfiguration().isBackgroundMigrationEnabled());
|
||||||
assertFalse(emptyConfig.getAccountsDynamoDbMigrationConfiguration().isDeleteEnabled());
|
assertFalse(emptyConfig.getAccountsDynamoDbMigrationConfiguration().isDeleteEnabled());
|
||||||
|
@ -326,9 +327,9 @@ class DynamicConfigurationTest {
|
||||||
+ " readEnabled: true\n"
|
+ " readEnabled: true\n"
|
||||||
+ " writeEnabled: true";
|
+ " writeEnabled: true";
|
||||||
|
|
||||||
final DynamicAccountsDynamoDbMigrationConfiguration config = DynamicConfigurationManager.OBJECT_MAPPER
|
final DynamicAccountsDynamoDbMigrationConfiguration config =
|
||||||
.readValue(accountsDynamoDbMigrationConfig, DynamicConfiguration.class)
|
DynamicConfigurationManager.parseConfiguration(accountsDynamoDbMigrationConfig).orElseThrow()
|
||||||
.getAccountsDynamoDbMigrationConfiguration();
|
.getAccountsDynamoDbMigrationConfiguration();
|
||||||
|
|
||||||
assertTrue(config.isBackgroundMigrationEnabled());
|
assertTrue(config.isBackgroundMigrationEnabled());
|
||||||
assertEquals(100, config.getBackgroundMigrationExecutorThreads());
|
assertEquals(100, config.getBackgroundMigrationExecutorThreads());
|
||||||
|
@ -342,8 +343,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseLimits() throws JsonProcessingException {
|
void testParseLimits() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER.readValue(
|
final DynamicConfiguration emptyConfig =
|
||||||
emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getMaxCardinality()).isEqualTo(100);
|
assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getMaxCardinality()).isEqualTo(100);
|
||||||
assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getTtl()).isEqualTo(Duration.ofDays(1));
|
assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getTtl()).isEqualTo(Duration.ofDays(1));
|
||||||
|
@ -355,9 +356,10 @@ class DynamicConfigurationTest {
|
||||||
+ " unsealedSenderNumber:\n"
|
+ " unsealedSenderNumber:\n"
|
||||||
+ " maxCardinality: 99\n"
|
+ " maxCardinality: 99\n"
|
||||||
+ " ttl: PT23H";
|
+ " ttl: PT23H";
|
||||||
final CardinalityRateLimitConfiguration unsealedSenderNumber = DynamicConfigurationManager.OBJECT_MAPPER
|
|
||||||
.readValue(limitsConfig, DynamicConfiguration.class)
|
final CardinalityRateLimitConfiguration unsealedSenderNumber =
|
||||||
.getLimits().getUnsealedSenderNumber();
|
DynamicConfigurationManager.parseConfiguration(limitsConfig).orElseThrow()
|
||||||
|
.getLimits().getUnsealedSenderNumber();
|
||||||
|
|
||||||
assertThat(unsealedSenderNumber.getMaxCardinality()).isEqualTo(99);
|
assertThat(unsealedSenderNumber.getMaxCardinality()).isEqualTo(99);
|
||||||
assertThat(unsealedSenderNumber.getTtl()).isEqualTo(Duration.ofHours(23));
|
assertThat(unsealedSenderNumber.getTtl()).isEqualTo(Duration.ofHours(23));
|
||||||
|
@ -368,8 +370,8 @@ class DynamicConfigurationTest {
|
||||||
void testParseRateLimitReset() throws JsonProcessingException {
|
void testParseRateLimitReset() throws JsonProcessingException {
|
||||||
{
|
{
|
||||||
final String emptyConfigYaml = "test: true";
|
final String emptyConfigYaml = "test: true";
|
||||||
final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER.readValue(
|
final DynamicConfiguration emptyConfig =
|
||||||
emptyConfigYaml, DynamicConfiguration.class);
|
DynamicConfigurationManager.parseConfiguration(emptyConfigYaml).orElseThrow();
|
||||||
|
|
||||||
assertThat(emptyConfig.getRateLimitChallengeConfiguration().getClientSupportedVersions()).isEmpty();
|
assertThat(emptyConfig.getRateLimitChallengeConfiguration().getClientSupportedVersions()).isEmpty();
|
||||||
assertThat(emptyConfig.getRateLimitChallengeConfiguration().isPreKeyLimitEnforced()).isFalse();
|
assertThat(emptyConfig.getRateLimitChallengeConfiguration().isPreKeyLimitEnforced()).isFalse();
|
||||||
|
@ -384,9 +386,11 @@ class DynamicConfigurationTest {
|
||||||
+ " IOS: 5.1.0\n"
|
+ " IOS: 5.1.0\n"
|
||||||
+ " ANDROID: 5.2.0\n"
|
+ " ANDROID: 5.2.0\n"
|
||||||
+ " DESKTOP: 5.0.0";
|
+ " DESKTOP: 5.0.0";
|
||||||
DynamicRateLimitChallengeConfiguration rateLimitChallengeConfiguration = DynamicConfigurationManager.OBJECT_MAPPER
|
|
||||||
.readValue(rateLimitChallengeConfig, DynamicConfiguration.class)
|
DynamicRateLimitChallengeConfiguration rateLimitChallengeConfiguration =
|
||||||
.getRateLimitChallengeConfiguration();
|
DynamicConfigurationManager.parseConfiguration(rateLimitChallengeConfig).orElseThrow()
|
||||||
|
.getRateLimitChallengeConfiguration();
|
||||||
|
|
||||||
final Map<ClientPlatform, Semver> clientSupportedVersions = rateLimitChallengeConfiguration.getClientSupportedVersions();
|
final Map<ClientPlatform, Semver> clientSupportedVersions = rateLimitChallengeConfiguration.getClientSupportedVersions();
|
||||||
|
|
||||||
assertThat(clientSupportedVersions.get(ClientPlatform.IOS)).isEqualTo(new Semver("5.1.0"));
|
assertThat(clientSupportedVersions.get(ClientPlatform.IOS)).isEqualTo(new Semver("5.1.0"));
|
||||||
|
|
Loading…
Reference in New Issue