diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java index 542ba7384..537d5c461 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/DynamicConfigurationManager.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.common.annotations.VisibleForTesting; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -37,7 +38,9 @@ public class DynamicConfigurationManager { private boolean initialized = false; - public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .registerModule(new JavaTimeModule()); public DynamicConfigurationManager(String application, String environment, String configurationName) { this(AmazonAppConfigClient.builder() diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfigurationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfigurationTest.java index 9091f5cbe..a1e5adbfa 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfigurationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfigurationTest.java @@ -5,6 +5,7 @@ package org.whispersystems.textsecuregcm.configuration.dynamic; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -12,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.core.JsonProcessingException; import com.vdurmont.semver4j.Semver; +import java.time.Duration; import java.util.Collections; import java.util.List; import java.util.Map; @@ -19,6 +21,7 @@ import java.util.Optional; import java.util.Set; import java.util.UUID; import org.junit.jupiter.api.Test; +import org.whispersystems.textsecuregcm.configuration.RateLimitsConfiguration.CardinalityRateLimitConfiguration; import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager; import org.whispersystems.textsecuregcm.util.ua.ClientPlatform; @@ -334,4 +337,33 @@ class DynamicConfigurationTest { assertTrue(config.isReadEnabled()); } } + + @Test + void testParseLimits() throws JsonProcessingException { + { + final String emptyConfigYaml = "test: true"; + final DynamicConfiguration emptyConfig = DynamicConfigurationManager.OBJECT_MAPPER.readValue( + emptyConfigYaml, DynamicConfiguration.class); + + assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getMaxCardinality()).isEqualTo(100); + assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getTtl()).isEqualTo(Duration.ofDays(1)); + assertThat(emptyConfig.getLimits().getUnsealedSenderNumber().getTtlJitter()).isEqualTo(Duration.ofDays(1)); + } + + { + final String limitsConfig = + "limits:\n" + + " unsealedSenderNumber:\n" + + " maxCardinality: 99\n" + + " ttl: PT23H\n" + + " ttlJitter: PT22H"; + final CardinalityRateLimitConfiguration unsealedSenderNumber = DynamicConfigurationManager.OBJECT_MAPPER + .readValue(limitsConfig, DynamicConfiguration.class) + .getLimits().getUnsealedSenderNumber(); + + assertThat(unsealedSenderNumber.getMaxCardinality()).isEqualTo(99); + assertThat(unsealedSenderNumber.getTtl()).isEqualTo(Duration.ofHours(23)); + assertThat(unsealedSenderNumber.getTtlJitter()).isEqualTo(Duration.ofHours(22)); + } + } }