diff --git a/pom.xml b/pom.xml index 384157aed5..9000aff89a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-redis - 3.2.0-SNAPSHOT + 3.2.0-GH-2628-SNAPSHOT Spring Data Redis Spring Data module for Redis diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java index ccacdb5667..bb661aa345 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java @@ -326,6 +326,26 @@ public SerializationPair getValueSerializationPair() { return this.valueSerializationPair; } + /** + * Returns a computed {@link Duration TTL expiration timeout} based on cache entry key/value + * if a {@link TtlFunction} was confiugred using {@link #entryTtl(TtlFunction)}. + *

+ * Otherwise, returns the user-provided, fixed {@link Duration} if {@link #entryTtl(Duration)} + * was called during cache configuration. + * + * @return the configured {@link Duration TTL expiration}. + * @deprecated use {@link #getTtlFunction()} instead. + */ + @Deprecated + @SuppressWarnings("all") + public Duration getTtl() { + + TtlFunction ttlFunction = getTtlFunction(); + + return ttlFunction instanceof FixedDurationTtlFunction it ? it.duration() + : ttlFunction.getTimeToLive(null, null); + } + /** * Gets the {@link TtlFunction} used to compute a cache key {@literal time-to-live (TTL) expiration}. * diff --git a/src/test/java/org/springframework/data/redis/cache/RedisCacheConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/cache/RedisCacheConfigurationUnitTests.java index a86c9b23fb..a919e49010 100644 --- a/src/test/java/org/springframework/data/redis/cache/RedisCacheConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/cache/RedisCacheConfigurationUnitTests.java @@ -15,9 +15,18 @@ */ package org.springframework.data.redis.cache; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; + +import java.time.Duration; -import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.core.convert.converter.Converter; @@ -28,6 +37,7 @@ * Unit tests for {@link RedisCacheConfiguration}. * * @author Mark Paluch + * @author John Blum */ class RedisCacheConfigurationUnitTests { @@ -56,6 +66,42 @@ void shouldAllowConverterRegistration() { assertThat(config.getConversionService().canConvert(DomainType.class, String.class)).isTrue(); } + @Test // GH-2628 + @SuppressWarnings("deprecation") + void getTtlReturnsFixedDuration() { + + Duration sixtySeconds = Duration.ofSeconds(60); + + RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(sixtySeconds); + + + assertThat(cacheConfiguration).isNotNull(); + assertThat(cacheConfiguration.getTtl()).isEqualByComparingTo(sixtySeconds); + assertThat(cacheConfiguration.getTtl()).isEqualByComparingTo(sixtySeconds); // does not change! + } + + @Test // GH-2628 + @SuppressWarnings("deprecation") + public void getTtlCanReturnDynamicDuration() { + + Duration thirtyMinutes = Duration.ofMinutes(30); + Duration twoHours = Duration.ofHours(2); + + RedisCacheWriter.TtlFunction mockTtlFunction = mock(RedisCacheWriter.TtlFunction.class); + + doReturn(thirtyMinutes).doReturn(twoHours).when(mockTtlFunction).getTimeToLive(any(), any()); + + RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(mockTtlFunction); + + assertThat(cacheConfiguration.getTtl()).isEqualTo(thirtyMinutes); + assertThat(cacheConfiguration.getTtl()).isEqualTo(twoHours); + + verify(mockTtlFunction, times(2)).getTimeToLive(isNull(), isNull()); + verifyNoMoreInteractions(mockTtlFunction); + } + private static class DomainType { }