From 2511aa18c01a6e12df022e227a20aef234ef9b26 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 19 Oct 2020 09:58:32 +0200 Subject: [PATCH] DATAREDIS-1233 - Add JUnit 5 extensions. --- .../data/redis/ConnectionFactoryTracker.java | 14 + .../data/redis/PropertyEditorsTest.java | 18 +- .../data/redis/SettingsUtils.java | 51 +++ .../data/redis/cache/CacheTestParams.java | 31 +- .../cache/DefaultRedisCacheWriterTests.java | 16 +- .../redis/cache/LegacyRedisCacheTests.java | 6 - .../RedisCacheConfigurationUnitTests.java | 9 +- .../data/redis/cache/RedisCacheTests.java | 5 - ...st.java => NamespaceIntegrationTests.java} | 17 +- .../AbstractConnectionIntegrationTests.java | 197 ++--------- .../BitFieldSubCommandsUnitTests.java | 9 +- .../ClusterCommandExecutorUnitTests.java | 125 ++++--- .../connection/ClusterSlotHashUtilsTests.java | 119 +++---- .../connection/RedisConnectionUnitTests.java | 21 +- ...edisElastiCacheConfigurationUnitTests.java | 12 +- .../connection/RedisPasswordUnitTests.java | 15 +- .../RedisSentinelConfigurationUnitTests.java | 47 +-- .../connection/RedisServerUnitTests.java | 6 +- .../connection/StreamRecordsUnitTests.java | 36 +- .../redis/connection/WeightsUnitTests.java | 17 +- .../convert/ConvertersUnitTests.java | 14 +- .../jedis/JedisAclIntegrationTests.java | 30 +- .../JedisClientConfigurationUnitTests.java | 8 +- .../jedis/JedisClusterConnectionTests.java | 162 +++++---- .../JedisClusterConnectionUnitTests.java | 110 +++--- ...edisConnectionFactoryIntegrationTests.java | 19 +- ...ectionFactorySentinelIntegrationTests.java | 28 +- .../JedisConnectionFactoryUnitTests.java | 70 ++-- ...ite.java => JedisConnectionUnitTests.java} | 47 ++- .../jedis/JedisConvertersUnitTests.java | 57 ++-- .../JedisExceptionConverterUnitTests.java | 18 +- .../JedisSentinelConnectionUnitTests.java | 48 +-- .../jedis/JedisSentinelIntegrationTests.java | 21 +- ...s.java => JedisSubscriptionUnitTests.java} | 133 ++++---- .../redis/connection/jedis/ScanTests.java | 25 +- .../JedisConnectionFactoryExtension.java | 216 ++++++++++++ .../lettuce/DefaultLettucePoolTests.java | 1 + .../lettuce/LettuceAclIntegrationTests.java | 1 + .../LettuceClientConfigurationUnitTests.java | 2 + .../LettuceClusterConnectionTests.java | 235 ++++++------- ...tuceClusterKeyspaceNotificationsTests.java | 1 + .../LettuceConnectionFactoryTests.java | 1 + .../LettuceConnectionFactoryUnitTests.java | 3 +- .../LettuceConnectionIntegrationTests.java | 1 + ...uceConnectionPipelineIntegrationTests.java | 2 +- ...eConnectionPipelineTxIntegrationTests.java | 6 - ...ConnectionTransactionIntegrationTests.java | 1 + ...e.java => LettuceConnectionUnitTests.java} | 45 ++- ...cePoolingClientConfigurationUnitTests.java | 2 + ...activeRedisClusterConnectionUnitTests.java | 17 +- ...LettuceReactiveScriptingCommandsTests.java | 4 +- .../LettuceSentinelIntegrationTests.java | 24 +- .../LettuceTestClientConfiguration.java | 1 + .../lettuce/TestEventLoopGroupProvider.java | 46 --- .../TransactionalLettuceIntegrationTests.java | 1 + .../LettuceConnectionFactoryExtension.java | 279 ++++++++++++++++ .../stream/StreamReadOptionsUnitTests.java | 14 +- .../core/AbstractOperationsTestParams.java | 12 +- ...nnectionSplittingInterceptorUnitTests.java | 48 +-- .../DefaultBoundValueOperationsUnitTests.java | 43 +-- .../DefaultClusterOperationsUnitTests.java | 85 ++--- .../redis/core/DefaultGeoOperationsTests.java | 7 - .../core/DefaultHashOperationsTests.java | 15 +- .../DefaultHyperLogLogOperationsTests.java | 2 - .../core/DefaultListOperationsTests.java | 2 - ...ReactiveGeoOperationsIntegrationTests.java | 7 - ...eactiveHashOperationsIntegrationTests.java | 2 +- ...HyperLogLogOperationsIntegrationTests.java | 7 - ...eactiveListOperationsIntegrationTests.java | 7 - ...ReactiveSetOperationsIntegrationTests.java | 7 - ...activeValueOperationsIntegrationTests.java | 7 - ...eactiveZSetOperationsIntegrationTests.java | 7 - .../redis/core/DefaultSetOperationsTests.java | 7 - .../core/DefaultStreamOperationsTests.java | 7 - .../core/DefaultTypedTupleUnitTests.java | 25 +- .../core/DefaultValueOperationsTests.java | 7 - .../core/DefaultValueOperationsUnitTests.java | 28 +- .../core/DefaultZSetOperationsTests.java | 7 - .../data/redis/core/IndexWriterUnitTests.java | 47 +-- .../core/MultithreadedRedisTemplateTests.java | 20 +- .../core/ReactiveOperationsTestParams.java | 49 +-- ...ReactiveRedisTemplateIntegrationTests.java | 10 +- .../core/ReactiveRedisTemplateUnitTests.java | 13 +- ...veStringRedisTemplateIntegrationTests.java | 32 +- .../redis/core/RedisClusterTemplateTests.java | 30 +- .../redis/core/RedisCommandUnitTests.java | 60 ++-- .../core/RedisConnectionUtilsUnitTests.java | 6 +- .../core/RedisKeyExpiredEventUnitTests.java | 21 +- .../redis/core/RedisKeyValueAdapterTests.java | 122 +++---- .../core/RedisKeyValueAdapterUnitTests.java | 43 +-- .../core/RedisKeyValueTemplateTests.java | 20 +- .../data/redis/core/RedisTemplateTests.java | 4 +- .../redis/core/RedisTemplateUnitTests.java | 29 +- .../data/redis/core/ScanCursorUnitTests.java | 49 +-- ...SessionTest.java => SessionUnitTests.java} | 15 +- .../data/redis/core/SortTest.java | 34 -- ...sTests.java => TimeoutUtilsUnitTests.java} | 34 +- .../AbstractDefaultScriptExecutorTests.java | 38 +-- .../DefaultReactiveScriptExecutorTests.java | 48 ++- .../JedisDefaultScriptExecutorTests.java | 38 +-- .../LettuceDefaultScriptExecutorTests.java | 31 +- ...EventMessageListenerIntegrationTests.java} | 43 ++- ...pirationEventMessageListenerUnitTests.java | 22 +- .../listener/PubSubResubscribeTests.java | 3 +- .../data/redis/listener/PubSubTestParams.java | 17 +- .../data/redis/listener/PubSubTests.java | 5 - .../ReactiveOperationsTestParams.java | 38 +-- ...sageListenerContainerIntegrationTests.java | 7 - ...edisMessageListenerContainerUnitTests.java | 46 +-- ...ageListenerContainerIntegrationTests.java} | 18 +- .../listener/SubscriptionConnectionTests.java | 25 +- .../adapter/ContainerXmlSetupTest.java | 27 +- ...est.java => MessageListenerUnitTests.java} | 48 +-- ...Test.java => AbstractHashMapperTests.java} | 4 +- ...est.java => BeanUtilsHashMapperTests.java} | 5 +- .../mapping/Jackson2HashMapperTests.java | 20 +- .../mapping/Jackson2HashMapperUnitTests.java | 48 +-- .../redis/mapping/ObjectHashMapperTests.java | 2 +- ...edisRepositoryClusterIntegrationTests.java | 4 +- .../RedisRepositoryIntegrationTestBase.java | 58 ++-- .../RedisRepositoryIntegrationTests.java | 8 +- .../cdi/CdiExtensionIntegrationTests.java | 26 +- .../cdi/RedisCdiDependenciesProducer.java | 18 +- ...sitoryConfigurationExtensionUnitTests.java | 46 ++- ...RedisRepositoryConfigurationUnitTests.java | 25 +- ...appingRedisEntityInformationUnitTests.java | 19 +- .../query/ExampleQueryMapperUnitTests.java | 27 +- .../query/RedisQueryCreatorUnitTests.java | 51 ++- ...ExampleRedisExecutorIntegrationTests.java} | 55 +-- .../DefaultRedisElementReaderUnitTests.java | 8 +- .../DefaultRedisElementWriterUnitTests.java | 16 +- ...cJackson2JsonRedisSerializerUnitTests.java | 50 +-- .../Jackson2JsonRedisSerializerTests.java | 26 +- .../RedisSerializationContextUnitTests.java | 24 +- .../SimpleRedisSerializerTests.java | 86 +---- .../StringRedisSerializerUnitTests.java | 16 +- .../stream/ReadOffsetStrategyUnitTests.java | 21 +- ...sageListenerContainerIntegrationTests.java | 79 ++--- .../StreamReceiverIntegrationTests.java | 83 ++--- .../redis/support/BoundKeyOperationsTest.java | 6 - .../data/redis/support/BoundKeyParams.java | 18 +- .../support/atomic/AtomicCountersParam.java | 15 +- .../atomic/CompareAndSetIntegrationTests.java | 7 - .../atomic/RedisAtomicDoubleTests.java | 19 +- .../atomic/RedisAtomicIntegerTests.java | 19 +- .../support/atomic/RedisAtomicLongTests.java | 19 +- .../AbstractRedisCollectionTests.java | 6 - .../collections/AbstractRedisMapTests.java | 24 +- .../collections/CollectionTestParams.java | 21 +- .../RedisCollectionFactoryBeanTests.java | 18 +- .../support/collections/RedisMapTests.java | 20 +- .../collections/RedisPropertiesTests.java | 54 +-- .../test/condition/EnabledOnCommand.java | 46 +++ .../condition/EnabledOnCommandCondition.java | 68 ++++ .../condition/EnabledOnRedisAvailable.java | 46 +++ .../EnabledOnRedisAvailableCondition.java | 68 ++++ .../EnabledOnRedisClusterAvailable.java | 42 +++ .../EnabledOnRedisClusterCondition.java | 65 ++++ .../EnabledOnRedisSentinelAvailable.java | 46 +++ .../EnabledOnRedisSentinelCondition.java | 67 ++++ .../test/condition/EnabledOnRedisVersion.java | 46 +++ .../EnabledOnRedisVersionCondition.java | 72 ++++ .../redis/test/condition/RedisConditions.java | 131 ++++++++ .../redis/test/extension/JedisExtension.java | 187 +++++++++++ .../test/extension/LettuceExtension.java | 316 ++++++++++++++++++ .../LettuceTestClientResources.java | 25 +- .../redis/test/extension/RedisCluster.java | 38 +++ .../redis/test/extension/RedisSentinel.java | 38 +++ .../redis/test/extension/RedisStanalone.java | 38 +++ .../redis/test/extension/ShutdownQueue.java | 66 ++++ .../test/util/LettuceRedisClientProvider.java | 2 +- .../LettuceRedisClusterClientProvider.java | 2 +- ...eactiveGeoOperationsExtensionsUnitTests.kt | 13 +- ...activeHashOperationsExtensionsUnitTests.kt | 2 +- ...yperLogLogOperationsExtensionsUnitTests.kt | 2 +- ...activeListOperationsExtensionsUnitTests.kt | 2 +- ...ctiveRedisOperationsExtensionsUnitTests.kt | 2 +- ...eactiveSetOperationsExtensionsUnitTests.kt | 2 +- ...tiveStreamOperationsExtensionsUnitTests.kt | 2 +- ...ctiveValueOperationsExtensionsUnitTests.kt | 2 +- ...activeZSetOperationsExtensionsUnitTests.kt | 2 +- ...tuceConnectionIntegrationTests-context.xml | 6 +- ...lineFlushOnEndIntegrationTests-context.xml | 2 +- .../data/redis/test.properties | 2 + 184 files changed, 3758 insertions(+), 2656 deletions(-) rename src/test/java/org/springframework/data/redis/config/{NamespaceTest.java => NamespaceIntegrationTests.java} (71%) rename src/test/java/org/springframework/data/redis/connection/jedis/{JedisConnectionUnitTestSuite.java => JedisConnectionUnitTests.java} (88%) rename src/test/java/org/springframework/data/redis/connection/jedis/{JedisSubscriptionTests.java => JedisSubscriptionUnitTests.java} (73%) create mode 100644 src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java rename src/test/java/org/springframework/data/redis/connection/lettuce/{LettuceConnectionUnitTestSuite.java => LettuceConnectionUnitTests.java} (86%) create mode 100644 src/test/java/org/springframework/data/redis/connection/lettuce/extension/LettuceConnectionFactoryExtension.java rename src/test/java/org/springframework/data/redis/core/{SessionTest.java => SessionUnitTests.java} (80%) delete mode 100644 src/test/java/org/springframework/data/redis/core/SortTest.java rename src/test/java/org/springframework/data/redis/core/{TimeoutUtilsTests.java => TimeoutUtilsUnitTests.java} (73%) rename src/test/java/org/springframework/data/redis/listener/{KeyExpirationEventMessageListenerTests.java => KeyExpirationEventMessageListenerIntegrationTests.java} (75%) rename src/test/java/org/springframework/data/redis/listener/{RedisMessageListenerContainerTests.java => RedisMessageListenerContainerIntegrationTests.java} (91%) rename src/test/java/org/springframework/data/redis/listener/adapter/{MessageListenerTest.java => MessageListenerUnitTests.java} (86%) rename src/test/java/org/springframework/data/redis/mapping/{AbstractHashMapperTest.java => AbstractHashMapperTests.java} (95%) rename src/test/java/org/springframework/data/redis/mapping/{BeanUtilsHashMapperTest.java => BeanUtilsHashMapperTests.java} (90%) rename src/test/java/org/springframework/data/redis/repository/support/{QueryByExampleRedisExecutorTests.java => QueryByExampleRedisExecutorIntegrationTests.java} (85%) create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommand.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommandCondition.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailable.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailableCondition.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterAvailable.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterCondition.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelAvailable.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelCondition.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersion.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersionCondition.java create mode 100644 src/test/java/org/springframework/data/redis/test/condition/RedisConditions.java create mode 100644 src/test/java/org/springframework/data/redis/test/extension/JedisExtension.java create mode 100644 src/test/java/org/springframework/data/redis/test/extension/LettuceExtension.java rename src/test/java/org/springframework/data/redis/{connection/lettuce => test/extension}/LettuceTestClientResources.java (60%) create mode 100644 src/test/java/org/springframework/data/redis/test/extension/RedisCluster.java create mode 100644 src/test/java/org/springframework/data/redis/test/extension/RedisSentinel.java create mode 100644 src/test/java/org/springframework/data/redis/test/extension/RedisStanalone.java create mode 100644 src/test/java/org/springframework/data/redis/test/extension/ShutdownQueue.java diff --git a/src/test/java/org/springframework/data/redis/ConnectionFactoryTracker.java b/src/test/java/org/springframework/data/redis/ConnectionFactoryTracker.java index 8ec7ce3b9..bdf484025 100644 --- a/src/test/java/org/springframework/data/redis/ConnectionFactoryTracker.java +++ b/src/test/java/org/springframework/data/redis/ConnectionFactoryTracker.java @@ -35,10 +35,20 @@ public abstract class ConnectionFactoryTracker { private static Set connFactories = new LinkedHashSet<>(); public static void add(RedisConnectionFactory factory) { + + if (factory instanceof Managed) { + throw new UnsupportedOperationException("Cannot track managed resource"); + } + connFactories.add(factory); } public static void add(Object factory) { + + if (factory instanceof Managed) { + throw new UnsupportedOperationException("Cannot track managed resource"); + } + connFactories.add(factory); } @@ -57,4 +67,8 @@ public abstract class ConnectionFactoryTracker { } } } + + public interface Managed { + + } } diff --git a/src/test/java/org/springframework/data/redis/PropertyEditorsTest.java b/src/test/java/org/springframework/data/redis/PropertyEditorsTest.java index bc025ef84..e672e22ea 100644 --- a/src/test/java/org/springframework/data/redis/PropertyEditorsTest.java +++ b/src/test/java/org/springframework/data/redis/PropertyEditorsTest.java @@ -17,9 +17,9 @@ package org.springframework.data.redis; import static org.assertj.core.api.Assertions.*; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.data.redis.core.RedisOperations; @@ -27,23 +27,23 @@ import org.springframework.data.redis.core.RedisOperations; /** * @author Costin Leau */ -public class PropertyEditorsTest { +class PropertyEditorsTest { private GenericXmlApplicationContext ctx; - @Before - public void setUp() { + @BeforeEach + void setUp() { ctx = new GenericXmlApplicationContext("/org/springframework/data/redis/pe.xml"); } - @After - public void tearDown() { + @AfterEach + void tearDown() { if (ctx != null) ctx.destroy(); } @Test - public void testInjection() throws Exception { + void testInjection() throws Exception { RedisViewPE bean = ctx.getBean(RedisViewPE.class); RedisOperations ops = ctx.getBean(RedisOperations.class); diff --git a/src/test/java/org/springframework/data/redis/SettingsUtils.java b/src/test/java/org/springframework/data/redis/SettingsUtils.java index bc61eeeba..19396400a 100644 --- a/src/test/java/org/springframework/data/redis/SettingsUtils.java +++ b/src/test/java/org/springframework/data/redis/SettingsUtils.java @@ -15,8 +15,13 @@ */ package org.springframework.data.redis; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.Properties; +import org.springframework.data.redis.connection.RedisClusterConfiguration; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSocketConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; @@ -35,6 +40,8 @@ public abstract class SettingsUtils { static { DEFAULTS.put("host", "127.0.0.1"); DEFAULTS.put("port", "6379"); + DEFAULTS.put("clusterPort", "7379"); + DEFAULTS.put("sentinelPort", "26379"); DEFAULTS.put("socket", "work/redis-6379.sock"); SETTINGS = new Properties(DEFAULTS); @@ -62,6 +69,28 @@ public abstract class SettingsUtils { return Integer.valueOf(SETTINGS.getProperty("port")); } + /** + * @return the Redis Cluster port. + */ + public static int getSentinelPort() { + return Integer.valueOf(SETTINGS.getProperty("sentinelPort")); + } + + /** + * @return the Redis Sentinel Master Id. + */ + public static String getSentinelMaster() { + return "mymaster"; + } + + /** + * @return the Redis Cluster port. + */ + public static int getClusterPort() { + return Integer.valueOf(SETTINGS.getProperty("clusterPort")); + } + + /** * @return path to the unix domain socket. */ @@ -78,6 +107,27 @@ public abstract class SettingsUtils { return new RedisStandaloneConfiguration(getHost(), getPort()); } + /** + * Construct a new {@link RedisSentinelConfiguration} initialized with test endpoint settings. + * + * @return a new {@link RedisSentinelConfiguration} initialized with test endpoint settings. + */ + public static RedisSentinelConfiguration sentinelConfiguration() { + return new RedisSentinelConfiguration(getSentinelMaster(), + new HashSet<>(Arrays.asList(String.format("%s:%d", getHost(), getSentinelPort()), + String.format("%s:%d", getHost(), getSentinelPort() + 1)))); + } + + /** + * Construct a new {@link RedisClusterConfiguration} initialized with test endpoint settings. + * + * @return a new {@link RedisClusterConfiguration} initialized with test endpoint settings. + */ + public static RedisClusterConfiguration clusterConfiguration() { + return new RedisClusterConfiguration( + Collections.singletonList(String.format("%s:%d", getHost(), getClusterPort()))); + } + /** * Construct a new {@link RedisSocketConfiguration} initialized with test endpoint settings. * @@ -86,4 +136,5 @@ public abstract class SettingsUtils { public static RedisSocketConfiguration socketConfiguration() { return new RedisSocketConfiguration(getSocket()); } + } diff --git a/src/test/java/org/springframework/data/redis/cache/CacheTestParams.java b/src/test/java/org/springframework/data/redis/cache/CacheTestParams.java index 863c6c426..7d3ea8d93 100644 --- a/src/test/java/org/springframework/data/redis/cache/CacheTestParams.java +++ b/src/test/java/org/springframework/data/redis/cache/CacheTestParams.java @@ -15,8 +15,6 @@ */ package org.springframework.data.redis.cache; -import static org.springframework.data.redis.connection.ClusterTestVariables.*; - import lombok.RequiredArgsConstructor; import lombok.experimental.Delegate; @@ -27,18 +25,20 @@ import java.util.List; import java.util.stream.Collectors; import org.junit.runners.model.Statement; + import org.springframework.data.redis.SettingsUtils; -import org.springframework.data.redis.connection.RedisClusterConfiguration; -import org.springframework.data.redis.connection.RedisClusterNode; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.test.extension.RedisCluster; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.oxm.xstream.XStreamMarshaller; import org.springframework.util.StringUtils; @@ -57,32 +57,27 @@ class CacheTestParams { List factoryList = new ArrayList<>(3); // Jedis Standalone - JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(config); - jedisConnectionFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnectionFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); factoryList.add(new FixDamnedJunitParameterizedNameForConnectionFactory(jedisConnectionFactory, "")); // Lettuce Standalone - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(config); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); factoryList.add(new FixDamnedJunitParameterizedNameForConnectionFactory(lettuceConnectionFactory, "")); if (clusterAvailable()) { - RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); - clusterConfiguration.addClusterNode(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)); // Jedis Cluster - JedisConnectionFactory jedisClusterConnectionFactory = new JedisConnectionFactory(clusterConfiguration); - jedisClusterConnectionFactory.afterPropertiesSet(); + JedisConnectionFactory jedisClusterConnectionFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); factoryList .add(new FixDamnedJunitParameterizedNameForConnectionFactory(jedisClusterConnectionFactory, "cluster")); // Lettuce Cluster - LettuceConnectionFactory lettuceClusterConnectionFactory = new LettuceConnectionFactory(clusterConfiguration); - lettuceClusterConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceClusterConnectionFactory.afterPropertiesSet(); - + LettuceConnectionFactory lettuceClusterConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); factoryList .add(new FixDamnedJunitParameterizedNameForConnectionFactory(lettuceClusterConnectionFactory, "cluster")); } diff --git a/src/test/java/org/springframework/data/redis/cache/DefaultRedisCacheWriterTests.java b/src/test/java/org/springframework/data/redis/cache/DefaultRedisCacheWriterTests.java index c8b8da833..b6a7027e5 100644 --- a/src/test/java/org/springframework/data/redis/cache/DefaultRedisCacheWriterTests.java +++ b/src/test/java/org/springframework/data/redis/cache/DefaultRedisCacheWriterTests.java @@ -27,18 +27,19 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; -import org.springframework.data.redis.ConnectionFactoryTracker; + import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.core.types.Expiration; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration tests for {@link DefaultRedisCacheWriter}. @@ -60,10 +61,7 @@ public class DefaultRedisCacheWriterTests { RedisConnectionFactory connectionFactory; public DefaultRedisCacheWriterTests(RedisConnectionFactory connectionFactory) { - this.connectionFactory = connectionFactory; - - ConnectionFactoryTracker.add(connectionFactory); } @Parameters(name = "{index}: {0}") @@ -71,16 +69,10 @@ public class DefaultRedisCacheWriterTests { return CacheTestParams.justConnectionFactories(); } - @AfterClass - public static void cleanUpResources() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { - JedisConnectionFactory cf = new JedisConnectionFactory(); - cf.afterPropertiesSet(); + JedisConnectionFactory cf = JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); connectionFactory = cf; diff --git a/src/test/java/org/springframework/data/redis/cache/LegacyRedisCacheTests.java b/src/test/java/org/springframework/data/redis/cache/LegacyRedisCacheTests.java index 589e95c2e..5cbd45d49 100644 --- a/src/test/java/org/springframework/data/redis/cache/LegacyRedisCacheTests.java +++ b/src/test/java/org/springframework/data/redis/cache/LegacyRedisCacheTests.java @@ -72,7 +72,6 @@ public class LegacyRedisCacheTests { this.keyFactory = keyFactory; this.valueFactory = valueFactory; this.allowCacheNullValues = allowCacheNullValues; - ConnectionFactoryTracker.add(connectionFactory); cache = createCache(); } @@ -98,11 +97,6 @@ public class LegacyRedisCacheTests { return target; } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @SuppressWarnings("unchecked") private RedisCache createCache() { 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 c6f935482..4a82b7d75 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,10 @@ */ package org.springframework.data.redis.cache; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.core.convert.converter.Converter; import org.springframework.instrument.classloading.ShadowingClassLoader; @@ -28,10 +29,10 @@ import org.springframework.lang.Nullable; * * @author Mark Paluch */ -public class RedisCacheConfigurationUnitTests { +class RedisCacheConfigurationUnitTests { @Test // DATAREDIS-763 - public void shouldSetClassLoader() { + void shouldSetClassLoader() { ShadowingClassLoader classLoader = new ShadowingClassLoader(getClass().getClassLoader()); @@ -47,7 +48,7 @@ public class RedisCacheConfigurationUnitTests { } @Test // DATAREDIS-1032 - public void shouldAllowConverterRegistration() { + void shouldAllowConverterRegistration() { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); config.configureKeyConverters(registry -> registry.addConverter(new DomainTypeConverter())); diff --git a/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java b/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java index 156137835..0d617d516 100644 --- a/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java +++ b/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java @@ -83,11 +83,6 @@ public class RedisCacheTests { return CacheTestParams.connectionFactoriesAndSerializers(); } - @AfterClass - public static void cleanUpResources() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { diff --git a/src/test/java/org/springframework/data/redis/config/NamespaceTest.java b/src/test/java/org/springframework/data/redis/config/NamespaceIntegrationTests.java similarity index 71% rename from src/test/java/org/springframework/data/redis/config/NamespaceTest.java rename to src/test/java/org/springframework/data/redis/config/NamespaceIntegrationTests.java index bedfedde7..b49a25134 100644 --- a/src/test/java/org/springframework/data/redis/config/NamespaceTest.java +++ b/src/test/java/org/springframework/data/redis/config/NamespaceIntegrationTests.java @@ -17,24 +17,19 @@ package org.springframework.data.redis.config; import static org.assertj.core.api.Assertions.*; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; -import org.springframework.test.annotation.ProfileValueSourceConfiguration; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; /** * @author Costin Leau * @author Mark Paluch */ -@RunWith(RelaxedJUnit4ClassRunner.class) -@ContextConfiguration("namespace.xml") -@ProfileValueSourceConfiguration -public class NamespaceTest { +@SpringJUnitConfig(locations = "namespace.xml") +class NamespaceIntegrationTests { @Autowired private RedisMessageListenerContainer container; @@ -43,12 +38,12 @@ public class NamespaceTest { @Autowired private StubErrorHandler handler; @Test - public void testSanityTest() throws Exception { + void testSanityTest() throws Exception { assertThat(container.isRunning()).isTrue(); } @Test - public void testWithMessages() throws Exception { + void testWithMessages() throws Exception { template.convertAndSend("x1", "[X]test"); template.convertAndSend("z1", "[Z]test"); } diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 76751eb6a..9f42341de 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -36,13 +36,14 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.assertj.core.data.Offset; import org.awaitility.Awaitility; -import org.junit.After; import org.junit.AfterClass; import org.junit.AssumptionViolatedException; -import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Range.Bound; @@ -53,7 +54,6 @@ import org.springframework.data.geo.Metrics; import org.springframework.data.geo.Point; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.RedisSystemException; -import org.springframework.data.redis.RedisTestProfileValueSource; import org.springframework.data.redis.RedisVersionUtils; import org.springframework.data.redis.TestCondition; import org.springframework.data.redis.connection.RedisGeoCommands.GeoLocation; @@ -84,12 +84,13 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.types.Expiration; import org.springframework.data.redis.core.types.RedisClientInfo; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.test.condition.EnabledOnCommand; +import org.springframework.data.redis.test.condition.EnabledOnRedisVersion; import org.springframework.data.redis.test.util.HexStringUtils; import org.springframework.data.redis.test.util.RedisClientRule; import org.springframework.data.redis.test.util.RedisDriver; import org.springframework.data.redis.test.util.WithRedisDriver; import org.springframework.test.annotation.IfProfileValue; -import org.springframework.test.annotation.ProfileValueSourceConfiguration; /** * Base test class for AbstractConnection integration tests @@ -103,7 +104,6 @@ import org.springframework.test.annotation.ProfileValueSourceConfiguration; * @author Dejan Jankov * @author Andrey Shlykov */ -@ProfileValueSourceConfiguration(RedisTestProfileValueSource.class) public abstract class AbstractConnectionIntegrationTests { private static final Point POINT_ARIGENTO = new Point(13.583333, 37.316667); @@ -132,7 +132,7 @@ public abstract class AbstractConnectionIntegrationTests { } }; - @Before + @BeforeEach public void setUp() { ConnectionFactoryTracker.add(connectionFactory); @@ -143,7 +143,7 @@ public abstract class AbstractConnectionIntegrationTests { initConnection(); } - @After + @AfterEach public void tearDown() { try { @@ -204,7 +204,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPExpire() { actual.add(connection.set("exp", "true")); @@ -214,14 +213,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPExpireKeyNotExists() { actual.add(connection.pExpire("nonexistent", 100)); verifyResults(Arrays.asList(new Object[] { false })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPExpireAt() { actual.add(connection.set("exp2", "true")); @@ -231,14 +228,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPExpireAtKeyNotExists() { actual.add(connection.pExpireAt("nonexistent", System.currentTimeMillis() + 200)); verifyResults(Arrays.asList(new Object[] { false })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testScriptLoadEvalSha() { getResults(); String sha1 = connection.scriptLoad("return KEYS[1]"); @@ -249,7 +244,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("unchecked") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayStrings() { getResults(); String sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}"); @@ -263,7 +257,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("unchecked") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayBytes() { getResults(); byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); @@ -276,21 +269,18 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayError() { connection.evalSha("notasha", ReturnType.MULTI, 1, "key1", "arg1"); getResults(); } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaNotFound() { connection.evalSha("somefakesha", ReturnType.VALUE, 2, "key1", "key2"); getResults(); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnString() { actual.add(connection.eval("return KEYS[1]", ReturnType.VALUE, 1, "foo")); byte[] result = (byte[]) getResults().get(0); @@ -298,35 +288,30 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnNumber() { actual.add(connection.eval("return 10", ReturnType.INTEGER, 0)); verifyResults(Arrays.asList(new Object[] { 10l })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnSingleOK() { actual.add(connection.eval("return redis.call('set','abc','ghk')", ReturnType.STATUS, 0)); assertThat(getResults()).isEqualTo(Arrays.asList(new Object[] { "OK" })); } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnSingleError() { connection.eval("return redis.call('expire','foo')", ReturnType.BOOLEAN, 0); getResults(); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnFalse() { actual.add(connection.eval("return false", ReturnType.BOOLEAN, 0)); verifyResults(Arrays.asList(new Object[] { false })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnTrue() { actual.add(connection.eval("return true", ReturnType.BOOLEAN, 0)); verifyResults(Arrays.asList(new Object[] { true })); @@ -334,7 +319,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("unchecked") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnArrayStrings() { actual.add(connection.eval("return {KEYS[1],ARGV[1]}", ReturnType.MULTI, 1, "foo", "bar")); List result = (List) getResults().get(0); @@ -343,14 +327,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnArrayNumbers() { actual.add(connection.eval("return {1,2}", ReturnType.MULTI, 1, "foo", "bar")); verifyResults(Arrays.asList(new Object[] { Arrays.asList(new Object[] { 1l, 2l }) })); } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalArrayScriptError() { // Syntax error connection.eval("return {1,2", ReturnType.MULTI, 1, "foo", "bar"); @@ -359,7 +341,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("unchecked") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnArrayOKs() { actual.add(connection.eval("return { redis.call('set','abc','ghk'), redis.call('set','abc','lfdf')}", ReturnType.MULTI, 0)); @@ -369,21 +350,18 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnArrayFalses() { actual.add(connection.eval("return { false, false}", ReturnType.MULTI, 0)); verifyResults(Arrays.asList(new Object[] { Arrays.asList(new Object[] { null, null }) })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnArrayTrues() { actual.add(connection.eval("return { true, true}", ReturnType.MULTI, 0)); verifyResults(Arrays.asList(new Object[] { Arrays.asList(new Object[] { 1l, 1l }) })); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testScriptExists() { getResults(); String sha1 = connection.scriptLoad("return 'foo'"); @@ -420,7 +398,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testScriptFlush() { getResults(); String sha1 = connection.scriptLoad("return KEYS[1]"); @@ -513,7 +490,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitCount() { String key = "bitset-test"; actual.add(connection.setBit(key, 0, false)); @@ -524,7 +500,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitCountInterval() { actual.add(connection.set("mykey", "foobar")); @@ -533,14 +508,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitCountNonExistentKey() { actual.add(connection.bitCount("mykey")); verifyResults(new ArrayList<>(Collections.singletonList(0l))); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitOpAnd() { actual.add(connection.set("key1", "foo")); @@ -551,7 +524,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitOpOr() { actual.add(connection.set("key1", "foo")); @@ -562,7 +534,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitOpXOr() { actual.add(connection.set("key1", "abcd")); @@ -572,7 +543,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitOpNot() { actual.add(connection.set("key1", "abcd")); @@ -581,7 +551,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = UnsupportedOperationException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testBitOpNotMultipleSources() { actual.add(connection.set("key1", "abcd")); @@ -602,7 +571,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testInfoBySection() throws Exception { actual.add(connection.info("server")); List results = getResults(); @@ -1051,7 +1019,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPTtlNoExpire() { actual.add(connection.set("whatup", "yo")); @@ -1060,7 +1027,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPTtl() { actual.add(connection.set("whatup", "yo")); @@ -1073,7 +1039,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-526 - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testPTtlWithTimeUnit() { actual.add(connection.set("whatup", "yo")); @@ -1087,7 +1052,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testDumpAndRestore() { connection.set("testing", "12"); @@ -1104,14 +1068,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testDumpNonExistentKey() { actual.add(connection.dump("fakey".getBytes())); verifyResults(Arrays.asList(new Object[] { null })); } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreBadData() { // Use something other than dump-specific serialization connection.restore("testing".getBytes(), 0, "foo".getBytes()); @@ -1119,7 +1081,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = RedisSystemException.class) - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreExistingKey() { actual.add(connection.set("testing", "12")); @@ -1131,7 +1092,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-696 - @IfProfileValue(name = "redisVersion", value = "3.0+") public void testRestoreExistingKeyWithReplaceOption() { actual.add(connection.set("testing", "12")); @@ -1145,7 +1105,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreTtl() { actual.add(connection.set("testing", "12")); @@ -1170,7 +1129,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-693 - @IfProfileValue(name = "redisVersion", value = "4.0+") public void unlinkReturnsNrOfKeysRemoved() { actual.add(connection.set("unlink.this", "Can't track this!")); @@ -1181,7 +1139,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-693 - @IfProfileValue(name = "redisVersion", value = "4.0+") public void testUnlinkBatch() { actual.add(connection.set("testing", "123")); @@ -1193,7 +1150,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-693 - @IfProfileValue(name = "redisVersion", value = "4.0+") public void unlinkReturnsZeroIfNoKeysRemoved() { actual.add(connection.unlink("unlink.this")); @@ -1278,7 +1234,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testIncrByDouble() { actual.add(connection.set("tdb", "4.5")); @@ -1496,7 +1451,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPos() { @@ -1507,7 +1462,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPosRank() { @@ -1518,7 +1473,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPosNegativeRank() { @@ -1529,7 +1484,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPosCount() { @@ -1540,7 +1495,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPosRankCount() { @@ -1551,7 +1506,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1196 - @IfProfileValue(name = "redisVersion", value = "6.0.6+") + @EnabledOnCommand("LPOS") @WithRedisDriver({ RedisDriver.LETTUCE }) public void lPosCountZero() { @@ -1680,7 +1635,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("rawtypes") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testSRandMemberCount() { actual.add(connection.sAdd("myset", "foo")); actual.add(connection.sAdd("myset", "bar")); @@ -1691,7 +1645,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("rawtypes") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testSRandMemberCountNegative() { actual.add(connection.sAdd("myset", "foo")); actual.add(connection.sRandMember("myset", -2)); @@ -1700,7 +1653,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("rawtypes") @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testSRandMemberCountKeyNotExists() { actual.add(connection.sRandMember("notexist", 2)); assertThat(((Collection) getResults().get(0)).isEmpty()).isTrue(); @@ -1792,8 +1744,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-729 - @IfProfileValue(name = "redisVersion", value = "2.9.0+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void zLexCountTest() { actual.add(connection.zAdd("myzset", 0, "a")); @@ -2112,7 +2062,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testHIncrByDouble() { actual.add(connection.hSet("test", "key", "2.9")); actual.add(connection.hIncrBy("test", "key", 3.5)); @@ -2212,7 +2161,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-290 - @IfProfileValue(name = "redisVersion", value = "2.8+") public void scanShouldReadEntireValueRange() { if (!ConnectionUtils.isJedis(connectionFactory) && !ConnectionUtils.isLettuce(connectionFactory)) { @@ -2243,8 +2191,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-417 - @IfProfileValue(name = "redisVersion", value = "2.8+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void scanShouldReadEntireValueRangeWhenIdividualScanIterationsReturnEmptyCollection() { connection.execute("DEBUG", "POPULATE".getBytes(), "100".getBytes()); @@ -2261,7 +2207,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-306 - @IfProfileValue(name = "redisVersion", value = "2.8+") public void zScanShouldReadEntireValueRange() { if (!ConnectionUtils.isJedis(connectionFactory) && !ConnectionUtils.isLettuce(connectionFactory)) { @@ -2293,7 +2238,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-304 - @IfProfileValue(name = "redisVersion", value = "2.8+") public void sScanShouldReadEntireValueRange() { if (!ConnectionUtils.isJedis(connectionFactory) && !ConnectionUtils.isLettuce(connectionFactory)) { @@ -2319,7 +2263,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-305 - @IfProfileValue(name = "redisVersion", value = "2.8+") public void hScanShouldReadEntireValueRange() { if (!ConnectionUtils.isJedis(connectionFactory) && !ConnectionUtils.isLettuce(connectionFactory)) { @@ -2354,8 +2297,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-308 - @IfProfileValue(name = "redisVersion", value = "2.8.9+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void pfAddShouldAddToNonExistingKeyCorrectly() { actual.add(connection.pfAdd("hll", "a", "b", "c")); @@ -2365,8 +2306,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-308 - @IfProfileValue(name = "redisVersion", value = "2.8.9+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void pfAddShouldReturnZeroWhenValueAlreadyExists() { actual.add(connection.pfAdd("hll", "a", "b", "c")); @@ -2380,8 +2319,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-308 - @IfProfileValue(name = "redisVersion", value = "2.8.9+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void pfCountShouldReturnCorrectly() { actual.add(connection.pfAdd("hll", "a", "b", "c")); @@ -2393,8 +2330,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-308 - @IfProfileValue(name = "redisVersion", value = "2.8.9+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void pfCountWithMultipleKeysShouldReturnCorrectly() { actual.add(connection.pfAdd("hll", "a", "b", "c")); @@ -2408,16 +2343,12 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-308 - @IfProfileValue(name = "redisVersion", value = "2.8.9+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void pfCountWithNullKeysShouldThrowIllegalArgumentException() { assertThatIllegalArgumentException().isThrownBy(() -> actual.add(connection.pfCount((String[]) null))); } @SuppressWarnings("unchecked") @Test // DATAREDIS-378, DATAREDIS-1222 - @IfProfileValue(name = "redisVersion", value = "2.9.0+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void zRangeByLexTest() { actual.add(connection.zAdd("myzset", 0, "a")); @@ -2450,8 +2381,6 @@ public abstract class AbstractConnectionIntegrationTests { @SuppressWarnings("unchecked") @Test // DATAREDIS-729 - @IfProfileValue(name = "redisVersion", value = "2.9.0+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void zRevRangeByLexTest() { actual.add(connection.zAdd("myzset", 0, "a")); @@ -2483,7 +2412,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = IllegalArgumentException.class) // DATAREDIS-316, DATAREDIS-692 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndNullOpionShouldThrowException() { String key = "exp-" + UUID.randomUUID(); @@ -2491,7 +2419,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndUpsertOpionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2507,7 +2434,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndUpsertOpionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2527,7 +2453,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndAbsentOptionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2547,7 +2472,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndAbsentOptionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2565,7 +2489,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndPresentOptionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2585,7 +2508,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithExpirationAndPresentOptionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2602,7 +2524,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = IllegalArgumentException.class) // DATAREDIS-316, DATAREDIS-692 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithNullExpirationAndUpsertOpionShouldThrowException() { String key = "exp-" + UUID.randomUUID(); @@ -2610,7 +2531,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndUpsertOpionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2626,7 +2546,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndUpsertOpionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2647,7 +2566,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndAbsentOptionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2667,7 +2585,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndAbsentOptionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2685,7 +2602,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndPresentOptionShouldSetTtlWhenKeyDoesExist() { String key = "exp-" + UUID.randomUUID(); @@ -2705,7 +2621,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-316 - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void setWithoutExpirationAndPresentOptionShouldSetTtlWhenKeyDoesNotExist() { String key = "exp-" + UUID.randomUUID(); @@ -2722,8 +2637,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoAddSingleGeoLocation() { String key = "geo-" + UUID.randomUUID(); @@ -2734,8 +2647,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoAddMultipleGeoLocations() { String key = "geo-" + UUID.randomUUID(); @@ -2746,8 +2657,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoDist() { String key = "geo-" + UUID.randomUUID(); @@ -2760,8 +2669,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1214 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoDistNotExisting() { String key = "geo-" + UUID.randomUUID(); @@ -2773,8 +2680,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoDistWithMetric() { String key = "geo-" + UUID.randomUUID(); @@ -2787,7 +2692,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") @WithRedisDriver({ RedisDriver.JEDIS }) public void geoHash() { @@ -2801,7 +2705,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") @WithRedisDriver({ RedisDriver.JEDIS }) public void geoHashNonExisting() { @@ -2816,8 +2719,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoPosition() { String key = "geo-" + UUID.randomUUID(); @@ -2834,8 +2735,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoPositionNonExisting() { String key = "geo-" + UUID.randomUUID(); @@ -2854,8 +2753,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusShouldReturnMembersCorrectly() { String key = "geo-" + UUID.randomUUID(); @@ -2870,8 +2767,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusShouldReturnDistanceCorrectly() { String key = "geo-" + UUID.randomUUID(); @@ -2889,8 +2784,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusShouldApplyLimit() { String key = "geo-" + UUID.randomUUID(); @@ -2904,8 +2797,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusByMemberShouldReturnMembersCorrectly() { String key = "geo-" + UUID.randomUUID(); @@ -2922,8 +2813,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusByMemberShouldReturnDistanceCorrectly() { String key = "geo-" + UUID.randomUUID(); @@ -2941,8 +2830,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-438 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void geoRadiusByMemberShouldApplyLimit() { String key = "geo-" + UUID.randomUUID(); @@ -3000,7 +2887,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-697 - @IfProfileValue(name = "redisVersion", value = "2.8.7+") public void bitPosShouldReturnPositionCorrectly() { actual.add(connection.set("bitpos-1".getBytes(), HexStringUtils.hexToBytes("fff000"))); @@ -3010,7 +2896,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-697 - @IfProfileValue(name = "redisVersion", value = "2.8.7+") public void bitPosShouldReturnPositionInRangeCorrectly() { actual.add(connection.set("bitpos-1".getBytes(), HexStringUtils.hexToBytes("fff0f0"))); @@ -3076,8 +2961,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitFieldSetShouldWorkCorrectly() { actual.add(connection.bitfield(KEY_1, create().set(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)).to(10L))); @@ -3089,8 +2972,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitFieldGetShouldWorkCorrectly() { actual.add(connection.bitfield(KEY_1, create().get(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)))); @@ -3100,8 +2981,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitFieldIncrByShouldWorkCorrectly() { actual @@ -3112,8 +2991,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitFieldIncrByWithOverflowShouldWorkCorrectly() { actual.add(connection.bitfield(KEY_1, @@ -3133,8 +3010,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitfieldShouldAllowMultipleSubcommands() { actual.add(connection.bitfield(KEY_1, @@ -3144,8 +3019,6 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-562 - @IfProfileValue(name = "redisVersion", value = "3.2+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void bitfieldShouldWorkUsingNonZeroBasedOffset() { actual.add(connection.bitfield(KEY_1, @@ -3161,7 +3034,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xAddShouldCreateStream() { @@ -3175,7 +3048,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xReadShouldReadMessage() { @@ -3191,7 +3064,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xReadGroupShouldReadMessage() { @@ -3213,7 +3086,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xGroupCreateShouldWorkWithAndWithoutExistingStream() { @@ -3236,7 +3109,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xRangeShouldReportMessages() { @@ -3257,7 +3130,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-864 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xRevRangeShouldReportMessages() { @@ -3279,7 +3152,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1207 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xRevRangeShouldWorkWithBoundedRange() { @@ -3301,7 +3174,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadOverviewCorrectly() { @@ -3323,7 +3196,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadEmptyOverviewCorrectly() { @@ -3342,7 +3215,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadPendingMessages() { @@ -3365,7 +3238,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1207 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldWorkWithBoundedRange() { @@ -3388,7 +3261,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadPendingMessagesForConsumer() { @@ -3412,7 +3285,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadPendingMessagesForNonExistingConsumer() { @@ -3432,7 +3305,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xPendingShouldLoadEmptyPendingMessages() { @@ -3449,7 +3322,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1084 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xClaim() throws InterruptedException { @@ -3470,7 +3343,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfo() { @@ -3499,7 +3372,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoNoGroup() { @@ -3524,7 +3397,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoGroups() { @@ -3549,7 +3422,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoGroupsNoGroup() { @@ -3566,7 +3439,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoGroupsNoConsumer() { @@ -3589,7 +3462,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoConsumers() { @@ -3613,7 +3486,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test // DATAREDIS-1119 - @IfProfileValue(name = "redisVersion", value = "5.0") + @EnabledOnCommand("XADD") @WithRedisDriver({ RedisDriver.LETTUCE }) public void xinfoConsumersNoConsumer() { diff --git a/src/test/java/org/springframework/data/redis/connection/BitFieldSubCommandsUnitTests.java b/src/test/java/org/springframework/data/redis/connection/BitFieldSubCommandsUnitTests.java index 288fd2e47..31bddaf42 100644 --- a/src/test/java/org/springframework/data/redis/connection/BitFieldSubCommandsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/BitFieldSubCommandsUnitTests.java @@ -15,9 +15,10 @@ */ package org.springframework.data.redis.connection; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; import org.springframework.data.redis.connection.BitFieldSubCommands.BitFieldType; @@ -26,10 +27,10 @@ import org.springframework.data.redis.connection.BitFieldSubCommands.BitFieldTyp * * @author Mark Paluch */ -public class BitFieldSubCommandsUnitTests { +class BitFieldSubCommandsUnitTests { @Test // DATAREDIS-971 - public void shouldCreateSignedBitFieldType() { + void shouldCreateSignedBitFieldType() { BitFieldType type = BitFieldType.signed(10); @@ -38,7 +39,7 @@ public class BitFieldSubCommandsUnitTests { } @Test // DATAREDIS-971 - public void shouldCreateUnsignedBitFieldType() { + void shouldCreateUnsignedBitFieldType() { BitFieldType type = BitFieldType.unsigned(10); diff --git a/src/test/java/org/springframework/data/redis/connection/ClusterCommandExecutorUnitTests.java b/src/test/java/org/springframework/data/redis/connection/ClusterCommandExecutorUnitTests.java index afa2dd630..16e831d49 100644 --- a/src/test/java/org/springframework/data/redis/connection/ClusterCommandExecutorUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/ClusterCommandExecutorUnitTests.java @@ -22,16 +22,20 @@ import static org.springframework.data.redis.test.util.MockitoUtils.*; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.core.convert.converter.Converter; +import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -50,33 +54,33 @@ import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) -public class ClusterCommandExecutorUnitTests { +@ExtendWith(MockitoExtension.class) +class ClusterCommandExecutorUnitTests { - static final String CLUSTER_NODE_1_HOST = "127.0.0.1"; - static final String CLUSTER_NODE_2_HOST = "127.0.0.1"; - static final String CLUSTER_NODE_3_HOST = "127.0.0.1"; + private static final String CLUSTER_NODE_1_HOST = "127.0.0.1"; + private static final String CLUSTER_NODE_2_HOST = "127.0.0.1"; + private static final String CLUSTER_NODE_3_HOST = "127.0.0.1"; - static final int CLUSTER_NODE_1_PORT = 7379; - static final int CLUSTER_NODE_2_PORT = 7380; - static final int CLUSTER_NODE_3_PORT = 7381; + private static final int CLUSTER_NODE_1_PORT = 7379; + private static final int CLUSTER_NODE_2_PORT = 7380; + private static final int CLUSTER_NODE_3_PORT = 7381; - static final RedisClusterNode CLUSTER_NODE_1 = RedisClusterNode.newRedisClusterNode() + private static final RedisClusterNode CLUSTER_NODE_1 = RedisClusterNode.newRedisClusterNode() .listeningAt(CLUSTER_NODE_1_HOST, CLUSTER_NODE_1_PORT).serving(new SlotRange(0, 5460)) .withId("ef570f86c7b1a953846668debc177a3a16733420").promotedAs(NodeType.MASTER).linkState(LinkState.CONNECTED) .build(); - static final RedisClusterNode CLUSTER_NODE_2 = RedisClusterNode.newRedisClusterNode() + private static final RedisClusterNode CLUSTER_NODE_2 = RedisClusterNode.newRedisClusterNode() .listeningAt(CLUSTER_NODE_2_HOST, CLUSTER_NODE_2_PORT).serving(new SlotRange(5461, 10922)) .withId("0f2ee5df45d18c50aca07228cc18b1da96fd5e84").promotedAs(NodeType.MASTER).linkState(LinkState.CONNECTED) .build(); - static final RedisClusterNode CLUSTER_NODE_3 = RedisClusterNode.newRedisClusterNode() + private static final RedisClusterNode CLUSTER_NODE_3 = RedisClusterNode.newRedisClusterNode() .listeningAt(CLUSTER_NODE_3_HOST, CLUSTER_NODE_3_PORT).serving(new SlotRange(10923, 16383)) .withId("3b9b8192a874fa8f1f09dbc0ee20afab5738eee7").promotedAs(NodeType.MASTER).linkState(LinkState.CONNECTED) .build(); - static final RedisClusterNode CLUSTER_NODE_2_LOOKUP = RedisClusterNode.newRedisClusterNode() + private static final RedisClusterNode CLUSTER_NODE_2_LOOKUP = RedisClusterNode.newRedisClusterNode() .withId("0f2ee5df45d18c50aca07228cc18b1da96fd5e84").build(); - static final RedisClusterNode UNKNOWN_CLUSTER_NODE = new RedisClusterNode("8.8.8.8", 7379, SlotRange.empty()); + private static final RedisClusterNode UNKNOWN_CLUSTER_NODE = new RedisClusterNode("8.8.8.8", 7379, SlotRange.empty()); private ClusterCommandExecutor executor; @@ -97,20 +101,20 @@ public class ClusterCommandExecutorUnitTests { @Mock Connection con2; @Mock Connection con3; - @Before - public void setUp() { + @BeforeEach + void setUp() { this.executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), - new PassThroughExceptionTranslationStrategy(exceptionConverter)); + new PassThroughExceptionTranslationStrategy(exceptionConverter), new ImmediateExecutor()); } - @After - public void tearDown() throws Exception { + @AfterEach + void tearDown() throws Exception { this.executor.destroy(); } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeShouldBeExecutedCorrectly() { + void executeCommandOnSingleNodeShouldBeExecutedCorrectly() { executor.executeCommandOnSingleNode(COMMAND_CALLBACK, CLUSTER_NODE_2); @@ -118,7 +122,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeByHostAndPortShouldBeExecutedCorrectly() { + void executeCommandOnSingleNodeByHostAndPortShouldBeExecutedCorrectly() { executor.executeCommandOnSingleNode(COMMAND_CALLBACK, new RedisClusterNode(CLUSTER_NODE_2_HOST, CLUSTER_NODE_2_PORT)); @@ -127,7 +131,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeByNodeIdShouldBeExecutedCorrectly() { + void executeCommandOnSingleNodeByNodeIdShouldBeExecutedCorrectly() { executor.executeCommandOnSingleNode(COMMAND_CALLBACK, new RedisClusterNode(CLUSTER_NODE_2.id)); @@ -135,23 +139,23 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeShouldThrowExceptionWhenNodeIsNull() { + void executeCommandOnSingleNodeShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> executor.executeCommandOnSingleNode(COMMAND_CALLBACK, null)); } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeShouldThrowExceptionWhenCommandCallbackIsNull() { + void executeCommandOnSingleNodeShouldThrowExceptionWhenCommandCallbackIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> executor.executeCommandOnSingleNode(null, CLUSTER_NODE_1)); } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeShouldThrowExceptionWhenNodeIsUnknown() { + void executeCommandOnSingleNodeShouldThrowExceptionWhenNodeIsUnknown() { assertThatIllegalArgumentException() .isThrownBy(() -> executor.executeCommandOnSingleNode(COMMAND_CALLBACK, UNKNOWN_CLUSTER_NODE)); } @Test // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodes() { + void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodes() { ClusterCommandExecutor executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), new PassThroughExceptionTranslationStrategy(exceptionConverter), @@ -165,7 +169,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodesByHostAndPort() { + void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodesByHostAndPort() { ClusterCommandExecutor executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), new PassThroughExceptionTranslationStrategy(exceptionConverter), @@ -181,7 +185,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodesByNodeId() { + void executeCommandAsyncOnNodesShouldExecuteCommandOnGivenNodesByNodeId() { ClusterCommandExecutor executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), new PassThroughExceptionTranslationStrategy(exceptionConverter), @@ -195,19 +199,19 @@ public class ClusterCommandExecutorUnitTests { verify(con3, never()).theWheelWeavesAsTheWheelWills(); } - @Test(expected = IllegalArgumentException.class) // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldFailOnGivenUnknownNodes() { + @Test // DATAREDIS-315 + void executeCommandAsyncOnNodesShouldFailOnGivenUnknownNodes() { ClusterCommandExecutor executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), new PassThroughExceptionTranslationStrategy(exceptionConverter), new ConcurrentTaskExecutor(new SyncTaskExecutor())); - executor.executeCommandAsyncOnNodes(COMMAND_CALLBACK, - Arrays.asList(new RedisClusterNode("unknown"), CLUSTER_NODE_2_LOOKUP)); + assertThatIllegalArgumentException().isThrownBy(() -> executor.executeCommandAsyncOnNodes(COMMAND_CALLBACK, + Arrays.asList(new RedisClusterNode("unknown"), CLUSTER_NODE_2_LOOKUP))); } @Test // DATAREDIS-315 - public void executeCommandOnAllNodesShouldExecuteCommandOnEveryKnownClusterNode() { + void executeCommandOnAllNodesShouldExecuteCommandOnEveryKnownClusterNode() { ClusterCommandExecutor executor = new ClusterCommandExecutor(new MockClusterNodeProvider(), new MockClusterResourceProvider(), new PassThroughExceptionTranslationStrategy(exceptionConverter), @@ -221,7 +225,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldCompleteAndCollectErrorsOfAllNodes() { + void executeCommandAsyncOnNodesShouldCompleteAndCollectErrorsOfAllNodes() { when(con1.theWheelWeavesAsTheWheelWills()).thenReturn("rand"); when(con2.theWheelWeavesAsTheWheelWills()).thenThrow(new IllegalStateException("(error) mat lost the dagger...")); @@ -241,7 +245,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandAsyncOnNodesShouldCollectResultsCorrectly() { + void executeCommandAsyncOnNodesShouldCollectResultsCorrectly() { when(con1.theWheelWeavesAsTheWheelWills()).thenReturn("rand"); when(con2.theWheelWeavesAsTheWheelWills()).thenReturn("mat"); @@ -253,7 +257,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315, DATAREDIS-467 - public void executeMultikeyCommandShouldRunCommandAcrossCluster() { + void executeMultikeyCommandShouldRunCommandAcrossCluster() { // key-1 and key-9 map both to node1 ArgumentCaptor captor = ArgumentCaptor.forClass(byte[].class); @@ -273,7 +277,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeAndFollowRedirect() { + void executeCommandOnSingleNodeAndFollowRedirect() { when(con1.theWheelWeavesAsTheWheelWills()).thenThrow(new MovedException(CLUSTER_NODE_3_HOST, CLUSTER_NODE_3_PORT)); @@ -285,7 +289,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnSingleNodeAndFollowRedirectButStopsAfterMaxRedirects() { + void executeCommandOnSingleNodeAndFollowRedirectButStopsAfterMaxRedirects() { when(con1.theWheelWeavesAsTheWheelWills()).thenThrow(new MovedException(CLUSTER_NODE_3_HOST, CLUSTER_NODE_3_PORT)); when(con3.theWheelWeavesAsTheWheelWills()).thenThrow(new MovedException(CLUSTER_NODE_2_HOST, CLUSTER_NODE_2_PORT)); @@ -304,7 +308,7 @@ public class ClusterCommandExecutorUnitTests { } @Test // DATAREDIS-315 - public void executeCommandOnArbitraryNodeShouldPickARandomNode() { + void executeCommandOnArbitraryNodeShouldPickARandomNode() { executor.executeCommandOnArbitraryNode(COMMAND_CALLBACK); @@ -366,11 +370,44 @@ public class ClusterCommandExecutorUnitTests { String host; int port; - public MovedException(String host, int port) { + MovedException(String host, int port) { this.host = host; this.port = port; } } + static class ImmediateExecutor implements AsyncTaskExecutor { + + @Override + public void execute(Runnable runnable, long l) { + runnable.run(); + } + + @Override + public Future submit(Runnable runnable) { + return submit(() -> { + runnable.run(); + + return null; + }); + } + + @Override + public Future submit(Callable callable) { + try { + return CompletableFuture.completedFuture(callable.call()); + } catch (Exception e) { + + CompletableFuture future = new CompletableFuture<>(); + future.completeExceptionally(e); + return future; + } + } + + @Override + public void execute(Runnable runnable) { + runnable.run(); + } + } } diff --git a/src/test/java/org/springframework/data/redis/connection/ClusterSlotHashUtilsTests.java b/src/test/java/org/springframework/data/redis/connection/ClusterSlotHashUtilsTests.java index 535f629f8..60d49e41e 100644 --- a/src/test/java/org/springframework/data/redis/connection/ClusterSlotHashUtilsTests.java +++ b/src/test/java/org/springframework/data/redis/connection/ClusterSlotHashUtilsTests.java @@ -17,97 +17,82 @@ package org.springframework.data.redis.connection; import static org.assertj.core.api.Assertions.*; -import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; -import java.io.IOException; -import java.util.Collections; import java.util.Random; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.data.redis.test.util.RedisClusterRule; +import org.springframework.data.redis.test.condition.EnabledOnRedisClusterAvailable; +import org.springframework.data.redis.test.extension.JedisExtension; import org.springframework.util.StringUtils; /** * @author Christoph Strobl * @author Mark Paluch */ +@EnabledOnRedisClusterAvailable +@ExtendWith(JedisExtension.class) public class ClusterSlotHashUtilsTests { - public static @ClassRule RedisClusterRule requiresCluster = new RedisClusterRule(); - - @Test - public void localCalculationShoudMatchServers() throws IOException { - - JedisCluster cluster = null; - try { - cluster = new JedisCluster(Collections.singleton(new HostAndPort("127.0.0.1", 7379))); - - JedisPool pool = cluster.getClusterNodes().values().iterator().next(); - Jedis jedis = pool.getResource(); - for (int i = 0; i < 10000; i++) { - - String key = randomString(); - int slot = ClusterSlotHashUtil.calculateSlot(key); - Long serverSlot = jedis.clusterKeySlot(key); - - assertThat(slot) - .as(String.format("Expected slot for key '%s' to be %s but server calculated %s.", key, slot, serverSlot)) - .isEqualTo(serverSlot.intValue()); - - } - jedis.close(); - } finally { - if (cluster != null) { - cluster.close(); - } - } + private final JedisCluster cluster; + public ClusterSlotHashUtilsTests(JedisCluster cluster) { + this.cluster = cluster; } @Test - public void localCalculationShoudMatchServersForPrefixedKeys() throws IOException { + void localCalculationShouldMatchServers() { - JedisCluster cluster = null; - try { - cluster = new JedisCluster(Collections.singleton(new HostAndPort("127.0.0.1", 7379))); + JedisPool pool = cluster.getClusterNodes().values().iterator().next(); + Jedis jedis = pool.getResource(); + for (int i = 0; i < 100; i++) { - JedisPool pool = cluster.getClusterNodes().values().iterator().next(); - Jedis jedis = pool.getResource(); - for (int i = 0; i < 10000; i++) { + String key = randomString(); + int slot = ClusterSlotHashUtil.calculateSlot(key); + Long serverSlot = jedis.clusterKeySlot(key); - String slotPrefix = "{" + randomString() + "}"; + assertThat(slot) + .as(String.format("Expected slot for key '%s' to be %s but server calculated %s.", key, slot, serverSlot)) + .isEqualTo(serverSlot.intValue()); - String key1 = slotPrefix + "." + randomString(); - String key2 = slotPrefix + "." + randomString(); - - int slot1 = ClusterSlotHashUtil.calculateSlot(key1); - int slot2 = ClusterSlotHashUtil.calculateSlot(key2); - - assertThat(slot2).as(String.format("Expected slot for prefixed keys '%s' and '%s' to be %s but was %s.", key1, - key2, slot1, slot2)).isEqualTo(slot1); - - Long serverSlot1 = jedis.clusterKeySlot(key1); - Long serverSlot2 = jedis.clusterKeySlot(key2); - - assertThat(slot1).as( - String.format("Expected slot for key '%s' to be %s but server calculated %s.", key1, slot1, serverSlot1)) - .isEqualTo(serverSlot1.intValue()); - assertThat(slot1).as( - String.format("Expected slot for key '%s' to be %s but server calculated %s.", key2, slot2, serverSlot2)) - .isEqualTo(serverSlot1.intValue()); - - } - jedis.close(); - } finally { - if (cluster != null) { - cluster.close(); - } } + jedis.close(); + } + + @Test + void localCalculationShoudMatchServersForPrefixedKeys() { + + JedisPool pool = cluster.getClusterNodes().values().iterator().next(); + Jedis jedis = pool.getResource(); + for (int i = 0; i < 100; i++) { + + String slotPrefix = "{" + randomString() + "}"; + + String key1 = slotPrefix + "." + randomString(); + String key2 = slotPrefix + "." + randomString(); + + int slot1 = ClusterSlotHashUtil.calculateSlot(key1); + int slot2 = ClusterSlotHashUtil.calculateSlot(key2); + + assertThat(slot2).as(String.format("Expected slot for prefixed keys '%s' and '%s' to be %s but was %s.", key1, + key2, slot1, slot2)).isEqualTo(slot1); + + Long serverSlot1 = jedis.clusterKeySlot(key1); + Long serverSlot2 = jedis.clusterKeySlot(key2); + + assertThat(slot1) + .as(String.format("Expected slot for key '%s' to be %s but server calculated %s.", key1, slot1, serverSlot1)) + .isEqualTo(serverSlot1.intValue()); + assertThat(slot1) + .as(String.format("Expected slot for key '%s' to be %s but server calculated %s.", key2, slot2, serverSlot2)) + .isEqualTo(serverSlot1.intValue()); + + } + jedis.close(); } /** diff --git a/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java index 7827c2dbf..72c84365d 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java @@ -25,8 +25,9 @@ import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import org.springframework.dao.DataAccessException; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Distance; @@ -47,14 +48,14 @@ import org.springframework.util.ObjectUtils; * @author Ninad Divadkar * @author Mark Paluch */ -public class RedisConnectionUnitTests { +class RedisConnectionUnitTests { private final RedisNode SENTINEL_1 = new RedisNodeBuilder().listeningAt("localhost", 23679).build(); private AbstractDelegatingRedisConnectionStub connection; private RedisSentinelConnection sentinelConnectionMock; - @Before - public void setUp() { + @BeforeEach + void setUp() { sentinelConnectionMock = mock(RedisSentinelConnection.class); connection = new AbstractDelegatingRedisConnectionStub(mock(AbstractRedisConnection.class, CALLS_REAL_METHODS)); @@ -63,7 +64,7 @@ public class RedisConnectionUnitTests { } @Test // DATAREDIS-330 - public void shouldCloseSentinelConnectionAlongWithRedisConnection() throws IOException { + void shouldCloseSentinelConnectionAlongWithRedisConnection() throws IOException { when(sentinelConnectionMock.isOpen()).thenReturn(true).thenReturn(false); @@ -75,7 +76,7 @@ public class RedisConnectionUnitTests { } @Test // DATAREDIS-330 - public void shouldNotTryToCloseSentinelConnectionsWhenAlreadyClosed() throws IOException { + void shouldNotTryToCloseSentinelConnectionsWhenAlreadyClosed() throws IOException { when(sentinelConnectionMock.isOpen()).thenReturn(true); when(sentinelConnectionMock.isOpen()).thenReturn(false); @@ -93,7 +94,7 @@ public class RedisConnectionUnitTests { RedisNode activeNode; RedisSentinelConnection sentinelConnection; - public AbstractDelegatingRedisConnectionStub(RedisConnection delegate) { + AbstractDelegatingRedisConnectionStub(RedisConnection delegate) { this.delegate = delegate; } @@ -102,11 +103,11 @@ public class RedisConnectionUnitTests { return ObjectUtils.nullSafeEquals(activeNode, node); } - public void setActiveNode(RedisNode activeNode) { + void setActiveNode(RedisNode activeNode) { this.activeNode = activeNode; } - public void setSentinelConnection(RedisSentinelConnection sentinelConnection) { + void setSentinelConnection(RedisSentinelConnection sentinelConnection) { this.sentinelConnection = sentinelConnection; } diff --git a/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java index 2efa3d7d4..7d94939ba 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java @@ -17,17 +17,17 @@ package org.springframework.data.redis.connection; import static org.assertj.core.api.Assertions.*; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link RedisStaticMasterReplicaConfiguration}. * * @author Mark Paluch */ -public class RedisElastiCacheConfigurationUnitTests { +class RedisElastiCacheConfigurationUnitTests { @Test // DATAREDIS-762 - public void shouldCreateSingleHostConfiguration() { + void shouldCreateSingleHostConfiguration() { RedisStaticMasterReplicaConfiguration singleHost = new RedisStaticMasterReplicaConfiguration("localhost"); @@ -40,7 +40,7 @@ public class RedisElastiCacheConfigurationUnitTests { } @Test // DATAREDIS-762 - public void shouldCreateMultiHostConfiguration() { + void shouldCreateMultiHostConfiguration() { RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost"); multiHost.node("other-host", 6479); @@ -59,7 +59,7 @@ public class RedisElastiCacheConfigurationUnitTests { } @Test // DATAREDIS-762 - public void shouldApplyPasswordToNodes() { + void shouldApplyPasswordToNodes() { RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost").node("other-host", 6479); @@ -71,7 +71,7 @@ public class RedisElastiCacheConfigurationUnitTests { } @Test // DATAREDIS-762 - public void shouldApplyDatabaseToNodes() { + void shouldApplyDatabaseToNodes() { RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost").node("other-host", 6479); diff --git a/src/test/java/org/springframework/data/redis/connection/RedisPasswordUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisPasswordUnitTests.java index 6729d940d..9d4d5cadd 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisPasswordUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisPasswordUnitTests.java @@ -15,9 +15,10 @@ */ package org.springframework.data.redis.connection; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; /** * Unit tests for {@link RedisPassword}. @@ -25,30 +26,30 @@ import org.junit.Test; * @author Mark Paluch * @author Christoph Strobl */ -public class RedisPasswordUnitTests { +class RedisPasswordUnitTests { @Test // DATAREDIS-574 - public void shouldCreateFromEmptyString() { + void shouldCreateFromEmptyString() { assertThat(RedisPassword.of("").toOptional()).isEmpty(); } @Test // DATAREDIS-574 - public void shouldCreateFromExistingString() { + void shouldCreateFromExistingString() { assertThat(RedisPassword.of("foo").map(String::new)).contains("foo"); } @Test // DATAREDIS-574 - public void shouldCreateFromEmptyCharArray() { + void shouldCreateFromEmptyCharArray() { assertThat(RedisPassword.of("".toCharArray()).toOptional()).isEmpty(); } @Test // DATAREDIS-574 - public void shouldCreateFromExistingCharArray() { + void shouldCreateFromExistingCharArray() { assertThat(RedisPassword.of("foo".toCharArray()).map(String::new)).contains("foo"); } @Test // DATAREDIS-574 - public void toStringShouldHideValue() { + void toStringShouldHideValue() { assertThat(RedisPassword.of("foo".toCharArray()).toString()).startsWith("RedisPassword[**").doesNotContain("foo"); } } diff --git a/src/test/java/org/springframework/data/redis/connection/RedisSentinelConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisSentinelConfigurationUnitTests.java index 4cb693401..c041ed0f1 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisSentinelConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisSentinelConfigurationUnitTests.java @@ -21,7 +21,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import org.springframework.core.env.PropertySource; import org.springframework.mock.env.MockPropertySource; import org.springframework.util.StringUtils; @@ -29,70 +30,70 @@ import org.springframework.util.StringUtils; /** * @author Christoph Strobl */ -public class RedisSentinelConfigurationUnitTests { +class RedisSentinelConfigurationUnitTests { - static final String HOST_AND_PORT_1 = "127.0.0.1:123"; - static final String HOST_AND_PORT_2 = "localhost:456"; - static final String HOST_AND_PORT_3 = "localhost:789"; - static final String HOST_AND_NO_PORT = "localhost"; + private static final String HOST_AND_PORT_1 = "127.0.0.1:123"; + private static final String HOST_AND_PORT_2 = "localhost:456"; + private static final String HOST_AND_PORT_3 = "localhost:789"; + private static final String HOST_AND_NO_PORT = "localhost"; @Test // DATAREDIS-372 - public void shouldCreateRedisSentinelConfigurationCorrectlyGivenMasterAndSingleHostAndPortString() { + void shouldCreateRedisSentinelConfigurationCorrectlyGivenMasterAndSingleHostAndPortString() { RedisSentinelConfiguration config = new RedisSentinelConfiguration("mymaster", Collections.singleton(HOST_AND_PORT_1)); - assertThat(config.getSentinels().size()).isEqualTo(1); + assertThat(config.getSentinels()).hasSize(1); assertThat(config.getSentinels()).contains(new RedisNode("127.0.0.1", 123)); } @Test // DATAREDIS-372 - public void shouldCreateRedisSentinelConfigurationCorrectlyGivenMasterAndMultipleHostAndPortStrings() { + void shouldCreateRedisSentinelConfigurationCorrectlyGivenMasterAndMultipleHostAndPortStrings() { RedisSentinelConfiguration config = new RedisSentinelConfiguration("mymaster", new HashSet<>(Arrays.asList(HOST_AND_PORT_1, HOST_AND_PORT_2, HOST_AND_PORT_3))); - assertThat(config.getSentinels().size()).isEqualTo(3); + assertThat(config.getSentinels()).hasSize(3); assertThat(config.getSentinels()).contains(new RedisNode("127.0.0.1", 123), new RedisNode("localhost", 456), new RedisNode("localhost", 789)); } @Test // DATAREDIS-372 - public void shouldThrowExecptionOnInvalidHostAndPortString() { + void shouldThrowExecptionOnInvalidHostAndPortString() { assertThatIllegalArgumentException() .isThrownBy(() -> new RedisSentinelConfiguration("mymaster", Collections.singleton(HOST_AND_NO_PORT))); } @Test // DATAREDIS-372 - public void shouldThrowExceptionWhenListOfHostAndPortIsNull() { + void shouldThrowExceptionWhenListOfHostAndPortIsNull() { assertThatIllegalArgumentException() .isThrownBy(() -> new RedisSentinelConfiguration("mymaster", Collections. singleton(null))); } @Test // DATAREDIS-372 - public void shouldNotFailWhenListOfHostAndPortIsEmpty() { + void shouldNotFailWhenListOfHostAndPortIsEmpty() { RedisSentinelConfiguration config = new RedisSentinelConfiguration("mymaster", Collections. emptySet()); - assertThat(config.getSentinels().size()).isEqualTo(0); + assertThat(config.getSentinels()).isEmpty(); } @Test // DATAREDIS-372 - public void shouldThrowExceptionGivenNullPropertySource() { + void shouldThrowExceptionGivenNullPropertySource() { assertThatIllegalArgumentException().isThrownBy(() -> new RedisSentinelConfiguration((PropertySource) null)); } @Test // DATAREDIS-372 - public void shouldNotFailWhenGivenPropertySourceNotContainingRelevantProperties() { + void shouldNotFailWhenGivenPropertySourceNotContainingRelevantProperties() { RedisSentinelConfiguration config = new RedisSentinelConfiguration(new MockPropertySource()); assertThat(config.getMaster()).isNull(); - assertThat(config.getSentinels().size()).isEqualTo(0); + assertThat(config.getSentinels()).isEmpty(); } @Test // DATAREDIS-372 - public void shouldBeCreatedCorrecltyGivenValidPropertySourceWithMasterAndSingleHostPort() { + void shouldBeCreatedCorrecltyGivenValidPropertySourceWithMasterAndSingleHostPort() { MockPropertySource propertySource = new MockPropertySource(); propertySource.setProperty("spring.redis.sentinel.master", "myMaster"); @@ -101,12 +102,12 @@ public class RedisSentinelConfigurationUnitTests { RedisSentinelConfiguration config = new RedisSentinelConfiguration(propertySource); assertThat(config.getMaster().getName()).isEqualTo("myMaster"); - assertThat(config.getSentinels().size()).isEqualTo(1); + assertThat(config.getSentinels()).hasSize(1); assertThat(config.getSentinels()).contains(new RedisNode("127.0.0.1", 123)); } @Test // DATAREDIS-372 - public void shouldBeCreatedCorrecltyGivenValidPropertySourceWithMasterAndMultipleHostPort() { + void shouldBeCreatedCorrecltyGivenValidPropertySourceWithMasterAndMultipleHostPort() { MockPropertySource propertySource = new MockPropertySource(); propertySource.setProperty("spring.redis.sentinel.master", "myMaster"); @@ -115,13 +116,13 @@ public class RedisSentinelConfigurationUnitTests { RedisSentinelConfiguration config = new RedisSentinelConfiguration(propertySource); - assertThat(config.getSentinels().size()).isEqualTo(3); + assertThat(config.getSentinels()).hasSize(3); assertThat(config.getSentinels()).contains(new RedisNode("127.0.0.1", 123), new RedisNode("localhost", 456), new RedisNode("localhost", 789)); } @Test // DATAREDIS-1060 - public void dataNodePasswordDoesNotAffectSentinelPassword() { + void dataNodePasswordDoesNotAffectSentinelPassword() { RedisPassword password = RedisPassword.of("88888888-8x8-getting-creative-now"); RedisSentinelConfiguration configuration = new RedisSentinelConfiguration("myMaster", @@ -132,7 +133,7 @@ public class RedisSentinelConfigurationUnitTests { } @Test // DATAREDIS-1060 - public void readSentinelPasswordFromConfigProperty() { + void readSentinelPasswordFromConfigProperty() { MockPropertySource propertySource = new MockPropertySource(); propertySource.setProperty("spring.redis.sentinel.master", "myMaster"); diff --git a/src/test/java/org/springframework/data/redis/connection/RedisServerUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisServerUnitTests.java index 45e1242b4..3ea32c552 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisServerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisServerUnitTests.java @@ -19,17 +19,17 @@ import static org.assertj.core.api.Assertions.*; import java.util.Properties; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link RedisServer}. * * @author Mark Paluch */ -public class RedisServerUnitTests { +class RedisServerUnitTests { @Test // DATAREDIS-618 - public void shouldReadNumberOfOtherSentinelsCorrectly() { + void shouldReadNumberOfOtherSentinelsCorrectly() { RedisServer redisServer = RedisServer.newServerFrom(createProperties()); diff --git a/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java b/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java index 7c35bb49e..3efdd4f84 100644 --- a/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java @@ -21,7 +21,7 @@ import java.io.Serializable; import java.util.Collections; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.connection.stream.ByteRecord; import org.springframework.data.redis.connection.stream.MapRecord; @@ -39,21 +39,21 @@ import org.springframework.data.redis.serializer.RedisSerializer; * @author Christoph Strobl * @author Romain Beghi */ -public class StreamRecordsUnitTests { +class StreamRecordsUnitTests { - static final String STRING_STREAM_KEY = "stream-key"; - static final RecordId RECORD_ID = RecordId.of("1-0"); - static final String STRING_MAP_KEY = "string-key"; - static final String STRING_VAL = "string-val"; - static final DummyObject OBJECT_VAL = new DummyObject(); + private static final String STRING_STREAM_KEY = "stream-key"; + private static final RecordId RECORD_ID = RecordId.of("1-0"); + private static final String STRING_MAP_KEY = "string-key"; + private static final String STRING_VAL = "string-val"; + private static final DummyObject OBJECT_VAL = new DummyObject(); - static final Jackson2JsonRedisSerializer JSON_REDIS_SERIALIZER = new Jackson2JsonRedisSerializer<>( + private static final Jackson2JsonRedisSerializer JSON_REDIS_SERIALIZER = new Jackson2JsonRedisSerializer<>( DummyObject.class); - static final byte[] SERIALIZED_STRING_VAL = RedisSerializer.string().serialize(STRING_VAL); - static final byte[] SERIALIZED_STRING_MAP_KEY = RedisSerializer.string().serialize(STRING_MAP_KEY); - static final byte[] SERIALIZED_STRING_STREAM_KEY = RedisSerializer.string().serialize(STRING_STREAM_KEY); - static final byte[] SERIALIZED_JSON_OBJECT_VAL = JSON_REDIS_SERIALIZER.serialize(OBJECT_VAL); + private static final byte[] SERIALIZED_STRING_VAL = RedisSerializer.string().serialize(STRING_VAL); + private static final byte[] SERIALIZED_STRING_MAP_KEY = RedisSerializer.string().serialize(STRING_MAP_KEY); + private static final byte[] SERIALIZED_STRING_STREAM_KEY = RedisSerializer.string().serialize(STRING_STREAM_KEY); + private static final byte[] SERIALIZED_JSON_OBJECT_VAL = JSON_REDIS_SERIALIZER.serialize(OBJECT_VAL); private static class DummyObject implements Serializable { private final Integer dummyId = 1; @@ -64,7 +64,7 @@ public class StreamRecordsUnitTests { } @Test // DATAREDIS-864 - public void objectRecordToMapRecordViaHashMapper() { + void objectRecordToMapRecordViaHashMapper() { ObjectRecord source = Record.of("some-string").withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); @@ -77,7 +77,7 @@ public class StreamRecordsUnitTests { } @Test // DATAREDIS-864 - public void mapRecordToObjectRecordViaHashMapper() { + void mapRecordToObjectRecordViaHashMapper() { MapRecord source = Record.of(Collections.singletonMap(STRING_MAP_KEY, "some-string")) .withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); @@ -90,7 +90,7 @@ public class StreamRecordsUnitTests { } @Test // DATAREDIS-864 - public void serializeMapRecordStringAsHashValue() { + void serializeMapRecordStringAsHashValue() { MapRecord source = Record.of(Collections.singletonMap(STRING_MAP_KEY, STRING_VAL)) .withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); @@ -104,7 +104,7 @@ public class StreamRecordsUnitTests { } @Test // DATAREDIS-993 - public void serializeMapRecordObjectAsHashValue() { + void serializeMapRecordObjectAsHashValue() { MapRecord source = Record.of(Collections.singletonMap(STRING_MAP_KEY, OBJECT_VAL)) .withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); @@ -118,7 +118,7 @@ public class StreamRecordsUnitTests { } @Test // DATAREDIS-864 - public void deserializeByteMapRecord() { + void deserializeByteMapRecord() { ByteRecord source = StreamRecords.newRecord().in(SERIALIZED_STRING_STREAM_KEY).withId(RECORD_ID) .ofBytes(Collections.singletonMap(SERIALIZED_STRING_MAP_KEY, SERIALIZED_STRING_VAL)); @@ -144,7 +144,7 @@ public class StreamRecordsUnitTests { this(Collections.emptyMap(), from); } - public StubValueReturningHashMapper(Map to, T from) { + StubValueReturningHashMapper(Map to, T from) { this.to = to; this.from = from; } diff --git a/src/test/java/org/springframework/data/redis/connection/WeightsUnitTests.java b/src/test/java/org/springframework/data/redis/connection/WeightsUnitTests.java index 0a828d636..66986f0e4 100644 --- a/src/test/java/org/springframework/data/redis/connection/WeightsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/WeightsUnitTests.java @@ -15,9 +15,10 @@ */ package org.springframework.data.redis.connection; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; import org.springframework.data.redis.connection.RedisZSetCommands.Weights; /** @@ -25,24 +26,24 @@ import org.springframework.data.redis.connection.RedisZSetCommands.Weights; * * @author Mark Paluch */ -public class WeightsUnitTests { +class WeightsUnitTests { @Test // DATAREDIS-746 - public void shouldCreateWeights() { + void shouldCreateWeights() { assertThat(Weights.of(1, 2, 3).toArray()).contains(1, 2, 3); assertThat(Weights.of(1, 2d, 3).toArray()).contains(1d, 2d, 3d); } @Test // DATAREDIS-746 - public void shouldRejectCreationWithNull() { + void shouldRejectCreationWithNull() { assertThatThrownBy(() -> Weights.of((int[]) null)).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> Weights.of((double[]) null)).isInstanceOf(IllegalArgumentException.class); } @Test // DATAREDIS-746 - public void shouldCreateEqualWeights() { + void shouldCreateEqualWeights() { Weights weights = Weights.fromSetCount(3); assertThat(weights.getWeight(0)).isOne(); @@ -51,14 +52,14 @@ public class WeightsUnitTests { } @Test // DATAREDIS-746 - public void getShouldThrowIndexOutOfBoundsException() { + void getShouldThrowIndexOutOfBoundsException() { assertThatThrownBy(() -> Weights.fromSetCount(1).getWeight(1)).isInstanceOf(IndexOutOfBoundsException.class); assertThatThrownBy(() -> Weights.fromSetCount(1).getWeight(-1)).isInstanceOf(IndexOutOfBoundsException.class); } @Test // DATAREDIS-746 - public void shouldMultiplyDouble() { + void shouldMultiplyDouble() { Weights weights = Weights.of(1, 2, 3).multiply(2.5); assertThat(weights.getWeight(0)).isEqualTo(2.5); @@ -66,7 +67,7 @@ public class WeightsUnitTests { } @Test // DATAREDIS-746 - public void shouldMultiplyInt() { + void shouldMultiplyInt() { Weights weights = Weights.of(1, 2, 3).multiply(2); assertThat(weights.getWeight(0)).isEqualTo(2); diff --git a/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java b/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java index 094b3adc2..08f5f2f5d 100644 --- a/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/convert/ConvertersUnitTests.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*; import java.util.Iterator; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.connection.RedisClusterNode; import org.springframework.data.redis.connection.RedisClusterNode.Flag; @@ -30,7 +30,7 @@ import org.springframework.data.redis.connection.RedisNode.NodeType; * @author Christoph Strobl * @author Mark Paluch */ -public class ConvertersUnitTests { +class ConvertersUnitTests { private static final String REDIS_3_0_CLUSTER_NODES_RESPONSE = "" // + "ef570f86c7b1a953846668debc177a3a16733420 127.0.0.1:6379@16379 myself,master - 0 0 1 connected 0-5460 5602" @@ -57,7 +57,7 @@ public class ConvertersUnitTests { private static final String CLUSTER_NODE_IMPORTING_SLOT = "ef570f86c7b1a953846668debc177a3a16733420 127.0.0.1:6379 myself,master - 0 0 1 connected [5461-<-0f2ee5df45d18c50aca07228cc18b1da96fd5e84]"; @Test // DATAREDIS-315 - public void toSetOfRedis30ClusterNodesShouldConvertSingleStringNodesResponseCorrectly() { + void toSetOfRedis30ClusterNodesShouldConvertSingleStringNodesResponseCorrectly() { Iterator nodes = Converters.toSetOfRedisClusterNodes(REDIS_3_0_CLUSTER_NODES_RESPONSE).iterator(); @@ -107,7 +107,7 @@ public class ConvertersUnitTests { } @Test // DATAREDIS-315 - public void toSetOfRedis32ClusterNodesShouldConvertSingleStringNodesResponseCorrectly() { + void toSetOfRedis32ClusterNodesShouldConvertSingleStringNodesResponseCorrectly() { Iterator nodes = Converters.toSetOfRedisClusterNodes(REDIS_3_2_CLUSTER_NODES_RESPONSE).iterator(); @@ -157,7 +157,7 @@ public class ConvertersUnitTests { } @Test // DATAREDIS-315 - public void toSetOfRedisClusterNodesShouldConvertNodesWithSingleSlotCorrectly() { + void toSetOfRedisClusterNodesShouldConvertNodesWithSingleSlotCorrectly() { Iterator nodes = Converters.toSetOfRedisClusterNodes(CLUSTER_NODE_WITH_SINGLE_SLOT_RESPONSE) .iterator(); @@ -171,7 +171,7 @@ public class ConvertersUnitTests { } @Test // DATAREDIS-315 - public void toSetOfRedisClusterNodesShouldParseLinkStateAndDisconnectedCorrectly() { + void toSetOfRedisClusterNodesShouldParseLinkStateAndDisconnectedCorrectly() { Iterator nodes = Converters.toSetOfRedisClusterNodes( CLUSTER_NODE_WITH_FAIL_FLAG_AND_DISCONNECTED_LINK_STATE).iterator(); @@ -187,7 +187,7 @@ public class ConvertersUnitTests { } @Test // DATAREDIS-315 - public void toSetOfRedisClusterNodesShouldIgnoreImportingSlot() { + void toSetOfRedisClusterNodesShouldIgnoreImportingSlot() { Iterator nodes = Converters.toSetOfRedisClusterNodes(CLUSTER_NODE_IMPORTING_SLOT).iterator(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisAclIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisAclIntegrationTests.java index 9ddb8d476..0a9e9cd61 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisAclIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisAclIntegrationTests.java @@ -20,31 +20,25 @@ import static org.assertj.core.api.Assertions.*; import java.io.IOException; import java.util.Collections; -import org.junit.Assume; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.rules.RuleChain; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSentinelConnection; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.test.util.MinimumRedisVersionRule; -import org.springframework.data.redis.test.util.ServerAvailable; -import org.springframework.test.annotation.IfProfileValue; +import org.springframework.data.redis.test.condition.EnabledOnRedisSentinelAvailable; +import org.springframework.data.redis.test.condition.EnabledOnRedisVersion; /** * Integration tests for Redis 6 ACL. * * @author Mark Paluch */ -@IfProfileValue(name = "redisVersion", value = "6.0+") -public class JedisAclIntegrationTests { - - @ClassRule public static RuleChain requirements = RuleChain.outerRule(ServerAvailable.runningAtLocalhost(6382)) - .around(new MinimumRedisVersionRule()); +@EnabledOnRedisVersion("6.0") +class JedisAclIntegrationTests { @Test - public void shouldConnectWithDefaultAuthentication() { + void shouldConnectWithDefaultAuthentication() { RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6382); standaloneConfiguration.setPassword("foobared"); @@ -61,7 +55,7 @@ public class JedisAclIntegrationTests { } @Test // DATAREDIS-1046 - public void shouldConnectStandaloneWithAclAuthentication() { + void shouldConnectStandaloneWithAclAuthentication() { RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6382); standaloneConfiguration.setUsername("spring"); @@ -79,10 +73,8 @@ public class JedisAclIntegrationTests { } @Test // DATAREDIS-1145 - public void shouldConnectSentinelWithAclAuthentication() throws IOException { - - Assume.assumeTrue("Redis Sentinel at localhost:26382 did not answer.", - ServerAvailable.runningAtLocalhost(26382).isAvailable()); + @EnabledOnRedisSentinelAvailable(26382) + void shouldConnectSentinelWithAclAuthentication() throws IOException { // Note: As per https://github.com/redis/redis/issues/7708, Sentinel does not support ACL authentication yet. @@ -102,7 +94,7 @@ public class JedisAclIntegrationTests { } @Test // DATAREDIS-1046 - public void shouldConnectStandaloneWithAclAuthenticationAndPooling() { + void shouldConnectStandaloneWithAclAuthenticationAndPooling() { RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6382); standaloneConfiguration.setUsername("spring"); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java index 04d579eed..95a2911fe 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java @@ -28,17 +28,17 @@ import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link JedisClientConfiguration}. * * @author Mark Paluch */ -public class JedisClientConfigurationUnitTests { +class JedisClientConfigurationUnitTests { @Test // DATAREDIS-574 - public void shouldCreateEmptyConfiguration() { + void shouldCreateEmptyConfiguration() { JedisClientConfiguration configuration = JedisClientConfiguration.defaultConfiguration(); @@ -52,7 +52,7 @@ public class JedisClientConfigurationUnitTests { } @Test // DATAREDIS-574 - public void shouldConfigureAllProperties() throws NoSuchAlgorithmException { + void shouldConfigureAllProperties() throws NoSuchAlgorithmException { SSLParameters sslParameters = new SSLParameters(); SSLContext context = SSLContext.getDefault(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java index 4ac0e6d47..c998a60b0 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java @@ -25,7 +25,9 @@ import static org.springframework.data.redis.connection.RedisGeoCommands.Distanc import static org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs.*; import static org.springframework.data.redis.core.ScanOptions.*; +import org.junit.jupiter.api.TestInstance; import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; @@ -35,11 +37,9 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.TimeUnit; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -69,9 +69,9 @@ import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.script.DigestUtils; import org.springframework.data.redis.core.types.Expiration; +import org.springframework.data.redis.test.condition.EnabledOnRedisClusterAvailable; +import org.springframework.data.redis.test.extension.JedisExtension; import org.springframework.data.redis.test.util.HexStringUtils; -import org.springframework.data.redis.test.util.MinimumRedisVersionRule; -import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.test.annotation.IfProfileValue; /** @@ -79,61 +79,51 @@ import org.springframework.test.annotation.IfProfileValue; * @author Mark Paluch * @author Pavel Khokhlov */ +@EnabledOnRedisClusterAvailable +@ExtendWith(JedisExtension.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class JedisClusterConnectionTests implements ClusterConnectionTests { static final List CLUSTER_NODES = Arrays.asList(new HostAndPort(CLUSTER_HOST, MASTER_NODE_1_PORT), new HostAndPort(CLUSTER_HOST, MASTER_NODE_2_PORT), new HostAndPort(CLUSTER_HOST, MASTER_NODE_3_PORT)); - static final byte[] KEY_1_BYTES = JedisConverters.toBytes(KEY_1); - static final byte[] KEY_2_BYTES = JedisConverters.toBytes(KEY_2); - static final byte[] KEY_3_BYTES = JedisConverters.toBytes(KEY_3); + private static final byte[] KEY_1_BYTES = JedisConverters.toBytes(KEY_1); + private static final byte[] KEY_2_BYTES = JedisConverters.toBytes(KEY_2); + private static final byte[] KEY_3_BYTES = JedisConverters.toBytes(KEY_3); - static final byte[] SAME_SLOT_KEY_1_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_1); - static final byte[] SAME_SLOT_KEY_2_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_2); - static final byte[] SAME_SLOT_KEY_3_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_3); + private static final byte[] SAME_SLOT_KEY_1_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_1); + private static final byte[] SAME_SLOT_KEY_2_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_2); + private static final byte[] SAME_SLOT_KEY_3_BYTES = JedisConverters.toBytes(SAME_SLOT_KEY_3); - static final byte[] VALUE_1_BYTES = JedisConverters.toBytes(VALUE_1); - static final byte[] VALUE_2_BYTES = JedisConverters.toBytes(VALUE_2); - static final byte[] VALUE_3_BYTES = JedisConverters.toBytes(VALUE_3); + private static final byte[] VALUE_1_BYTES = JedisConverters.toBytes(VALUE_1); + private static final byte[] VALUE_2_BYTES = JedisConverters.toBytes(VALUE_2); + private static final byte[] VALUE_3_BYTES = JedisConverters.toBytes(VALUE_3); - static final GeoLocation ARIGENTO = new GeoLocation<>("arigento".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation ARIGENTO = new GeoLocation<>("arigento".getBytes(Charset.forName("UTF-8")), POINT_ARIGENTO); - static final GeoLocation CATANIA = new GeoLocation<>("catania".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation CATANIA = new GeoLocation<>("catania".getBytes(Charset.forName("UTF-8")), POINT_CATANIA); - static final GeoLocation PALERMO = new GeoLocation<>("palermo".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation PALERMO = new GeoLocation<>("palermo".getBytes(Charset.forName("UTF-8")), POINT_PALERMO); - JedisCluster nativeConnection; - JedisClusterConnection clusterConnection; + private final JedisCluster nativeConnection; + private final JedisClusterConnection clusterConnection; - /** - * ONLY RUN WHEN CLUSTER AVAILABLE - */ - public static @ClassRule RedisClusterRule clusterRule = new RedisClusterRule(); - - /** - * Check for specific Redis Versions - */ - public @Rule MinimumRedisVersionRule version = new MinimumRedisVersionRule(); - - @Before - public void setUp() throws IOException { - - nativeConnection = new JedisCluster(new HashSet<>(CLUSTER_NODES)); + public JedisClusterConnectionTests(JedisCluster nativeConnection) { + this.nativeConnection = nativeConnection; clusterConnection = new JedisClusterConnection(this.nativeConnection); } - @After - public void tearDown() throws IOException { + @BeforeEach + void tearDown() throws IOException { for (JedisPool pool : nativeConnection.getClusterNodes().values()) { - try { - pool.getResource().flushDB(); + try (Jedis jedis = pool.getResource()) { + jedis.flushAll(); } catch (Exception e) { // ignore this one since we cannot remove data from slaves } } - nativeConnection.close(); } @Test // DATAREDIS-315 @@ -191,7 +181,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-315 - public void bitOpShouldWorkCorrectly() { + void bitOpShouldWorkCorrectly() { nativeConnection.set(SAME_SLOT_KEY_1, "foo"); nativeConnection.set(SAME_SLOT_KEY_2, "bar"); @@ -347,7 +337,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void discardShouldThrowException() { - assertThatExceptionOfType(DataAccessException.class).isThrownBy(() -> clusterConnection.discard()); + assertThatExceptionOfType(DataAccessException.class).isThrownBy(clusterConnection::discard); } @Test // DATAREDIS-315 @@ -382,11 +372,11 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void execShouldThrowException() { - assertThatExceptionOfType(DataAccessException.class).isThrownBy(() -> clusterConnection.exec()); + assertThatExceptionOfType(DataAccessException.class).isThrownBy(clusterConnection::exec); } @Test // DATAREDIS-689 - public void executeWithArgs() { + void executeWithArgs() { assertThat(clusterConnection.execute("SET", KEY_1_BYTES, VALUE_1_BYTES)).isEqualTo("OK".getBytes()); @@ -394,7 +384,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-689 - public void executeWithKeyAndArgs() { + void executeWithKeyAndArgs() { Object result = clusterConnection.execute("SET", KEY_1_BYTES, Collections.singletonList(VALUE_1_BYTES)); assertThat(result).isEqualTo("OK".getBytes()); @@ -403,7 +393,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-689 - public void executeWithNoKeyAndArgsThrowsException() { + void executeWithNoKeyAndArgsThrowsException() { assertThatIllegalArgumentException() .isThrownBy(() -> clusterConnection.execute("KEYS", (byte[]) null, Collections.singletonList("*".getBytes()))); } @@ -440,7 +430,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.expireAt(KEY_1_BYTES, System.currentTimeMillis() / 1000 + 5000); - assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -450,7 +440,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.expire(KEY_1_BYTES, 5); - assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -994,13 +984,14 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { assertThat(keysOnNode).contains(KEY_2_BYTES).doesNotContain(KEY_1_BYTES); } - @Test(expected = InvalidDataAccessApiUsageException.class) // DATAREDIS-635 + @Test // DATAREDIS-635 public void scanShouldReturnAllKeys() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_2); - clusterConnection.scan(ScanOptions.NONE); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class) + .isThrownBy(() -> clusterConnection.scan(ScanOptions.NONE)); } @Override // DATAREDIS-635 @@ -1219,7 +1210,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void multiShouldThrowException() { - assertThatExceptionOfType(DataAccessException.class).isThrownBy(() -> clusterConnection.multi()); + assertThatExceptionOfType(DataAccessException.class).isThrownBy(clusterConnection::multi); } @Test // DATAREDIS-315 @@ -1229,7 +1220,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pExpireAt(KEY_1_BYTES, System.currentTimeMillis() + 5000); - assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1239,7 +1230,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pExpire(KEY_1_BYTES, 5000); - assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(JedisConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1248,7 +1239,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pSetEx(KEY_1_BYTES, 5000, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1)).isEqualTo(VALUE_1); - assertThat(nativeConnection.ttl(KEY_1) > 1).isTrue(); + assertThat(nativeConnection.ttl(KEY_1)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1257,7 +1248,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); - assertThat(clusterConnection.pTtl(KEY_1_BYTES) > 1).isTrue(); + assertThat(clusterConnection.pTtl(KEY_1_BYTES)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1312,13 +1303,14 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { assertThat(clusterConnection.pfCount(KEY_1_BYTES)).isEqualTo(3L); } - @Test(expected = DataAccessException.class) // DATAREDIS-315 + @Test // DATAREDIS-315 public void pfCountShouldThrowErrorCountingOnDifferentSlotKeys() { nativeConnection.pfadd(KEY_1, VALUE_1, VALUE_2); nativeConnection.pfadd(KEY_2, VALUE_2, VALUE_3); - clusterConnection.pfCount(KEY_1_BYTES, KEY_2_BYTES); + assertThatExceptionOfType(DataAccessException.class) + .isThrownBy(() -> clusterConnection.pfCount(KEY_1_BYTES, KEY_2_BYTES)); } @Test // DATAREDIS-315 @@ -1633,7 +1625,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-668 - public void sPopWithCountShouldPopValueFromSetCorrectly() { + void sPopWithCountShouldPopValueFromSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2, VALUE_3); @@ -1735,7 +1727,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { clusterConnection.setEx(KEY_1_BYTES, 5, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1)).isEqualTo(VALUE_1); - assertThat(nativeConnection.ttl(KEY_1) > 1).isTrue(); + assertThat(nativeConnection.ttl(KEY_1)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1927,7 +1919,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); - assertThat(clusterConnection.ttl(KEY_1_BYTES) > 1).isTrue(); + assertThat(clusterConnection.ttl(KEY_1_BYTES)).isGreaterThan(1); } @Test // DATAREDIS-526 @@ -1949,16 +1941,16 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void unwatchShouldThrowException() { - assertThatExceptionOfType(DataAccessException.class).isThrownBy(() -> clusterConnection.unwatch()); + assertThatExceptionOfType(DataAccessException.class).isThrownBy(clusterConnection::unwatch); } @Test // DATAREDIS-315 public void watchShouldThrowException() { - assertThatExceptionOfType(DataAccessException.class).isThrownBy(() -> clusterConnection.watch()); + assertThatExceptionOfType(DataAccessException.class).isThrownBy(clusterConnection::watch); } @Test // DATAREDIS-674 - public void zAddShouldAddMultipleValuesWithScoreCorrectly() { + void zAddShouldAddMultipleValuesWithScoreCorrectly() { Set tuples = new HashSet<>(); tuples.add(new DefaultTuple(VALUE_1_BYTES, 10D)); @@ -2293,7 +2285,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-694 - public void touchReturnsNrOfKeysTouched() { + void touchReturnsNrOfKeysTouched() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_1); @@ -2302,12 +2294,12 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-694 - public void touchReturnsZeroIfNoKeysTouched() { + void touchReturnsZeroIfNoKeysTouched() { assertThat(clusterConnection.keyCommands().touch(KEY_1_BYTES)).isEqualTo(0L); } @Test // DATAREDIS-693 - public void unlinkReturnsNrOfKeysTouched() { + void unlinkReturnsNrOfKeysTouched() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_1); @@ -2316,13 +2308,13 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-693 - public void unlinkReturnsZeroIfNoKeysTouched() { + void unlinkReturnsZeroIfNoKeysTouched() { assertThat(clusterConnection.keyCommands().unlink(KEY_1_BYTES)).isEqualTo(0L); } @Test // DATAREDIS-697 @IfProfileValue(name = "redisVersion", value = "2.8.7+") - public void bitPosShouldReturnPositionCorrectly() { + void bitPosShouldReturnPositionCorrectly() { nativeConnection.set(KEY_1_BYTES, HexStringUtils.hexToBytes("fff000")); @@ -2331,7 +2323,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-697 @IfProfileValue(name = "redisVersion", value = "2.8.7+") - public void bitPosShouldReturnPositionInRangeCorrectly() { + void bitPosShouldReturnPositionInRangeCorrectly() { nativeConnection.set(KEY_1_BYTES, HexStringUtils.hexToBytes("fff0f0")); @@ -2340,7 +2332,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void encodingReturnsCorrectly() { + void encodingReturnsCorrectly() { nativeConnection.set(KEY_1_BYTES, "1000".getBytes()); @@ -2348,12 +2340,12 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void encodingReturnsVacantWhenKeyDoesNotExist() { + void encodingReturnsVacantWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().encodingOf(KEY_2_BYTES)).isEqualTo(RedisValueEncoding.VACANT); } @Test // DATAREDIS-716 - public void idletimeReturnsCorrectly() { + void idletimeReturnsCorrectly() { nativeConnection.set(KEY_1_BYTES, VALUE_1_BYTES); nativeConnection.get(KEY_1_BYTES); @@ -2362,12 +2354,12 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void idldetimeReturnsNullWhenKeyDoesNotExist() { + void idldetimeReturnsNullWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().idletime(KEY_3_BYTES)).isNull(); } @Test // DATAREDIS-716 - public void refcountReturnsCorrectly() { + void refcountReturnsCorrectly() { nativeConnection.lpush(KEY_1_BYTES, VALUE_1_BYTES); @@ -2375,13 +2367,13 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void refcountReturnsNullWhenKeyDoesNotExist() { + void refcountReturnsNullWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().refcount(KEY_3_BYTES)).isNull(); } @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldSetShouldWorkCorrectly() { + void bitFieldSetShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().set(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)).to(10L))).containsExactly(0L); @@ -2391,7 +2383,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldGetShouldWorkCorrectly() { + void bitFieldGetShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().get(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)))).containsExactly(0L); @@ -2399,7 +2391,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldIncrByShouldWorkCorrectly() { + void bitFieldIncrByShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(INT_8).valueAt(BitFieldSubCommands.Offset.offset(100L)).by(1L))).containsExactly(1L); @@ -2407,7 +2399,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldIncrByWithOverflowShouldWorkCorrectly() { + void bitFieldIncrByWithOverflowShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(unsigned(2)).valueAt(BitFieldSubCommands.Offset.offset(102L)).overflow(FAIL).by(1L))) @@ -2426,7 +2418,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitfieldShouldAllowMultipleSubcommands() { + void bitfieldShouldAllowMultipleSubcommands() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(signed(5)).valueAt(BitFieldSubCommands.Offset.offset(100L)).by(1L).get(unsigned(4)).valueAt(0L))) @@ -2435,7 +2427,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitfieldShouldWorkUsingNonZeroBasedOffset() { + void bitfieldShouldWorkUsingNonZeroBasedOffset() { assertThat( clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), @@ -2452,7 +2444,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-1005 @IfProfileValue(name = "redisVersion", value = "2.6+") - public void evalShouldRunScript() { + void evalShouldRunScript() { byte[] keyAndArgs = JedisConverters.toBytes("FOO"); String luaScript = "return redis.call(\"INCR\", KEYS[1])"; @@ -2465,7 +2457,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-1005 @IfProfileValue(name = "redisVersion", value = "2.6+") - public void scriptLoadShouldLoadScript() { + void scriptLoadShouldLoadScript() { String luaScript = "return redis.call(\"INCR\", KEYS[1])"; String digest = DigestUtils.sha1DigestAsHex(luaScript); @@ -2478,7 +2470,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-1005 @IfProfileValue(name = "redisVersion", value = "2.6+") - public void scriptFlushShouldRemoveScripts() { + void scriptFlushShouldRemoveScripts() { byte[] keyAndArgs = JedisConverters.toBytes("FOO"); String luaScript = "return redis.call(\"GET\", KEYS[1])"; @@ -2497,7 +2489,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-1005 @IfProfileValue(name = "redisVersion", value = "2.6+") - public void evelShaShouldRunScript() { + void evelShaShouldRunScript() { byte[] keyAndArgs = JedisConverters.toBytes("FOO"); String luaScript = "return redis.call(\"INCR\", KEYS[1])"; diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionUnitTests.java index c13205d4e..d7dcb4810 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionUnitTests.java @@ -35,16 +35,17 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.mockito.stubbing.Answer; + import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.data.redis.ClusterStateFailureException; import org.springframework.data.redis.RedisSystemException; @@ -58,8 +59,9 @@ import org.springframework.data.redis.connection.jedis.JedisClusterConnection.Je * @author Mark Paluch * @author Chen Guanqun */ -@RunWith(MockitoJUnitRunner.Silent.class) -public class JedisClusterConnectionUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class JedisClusterConnectionUnitTests { private static final String CLUSTER_NODES_RESPONSE = "" // + MASTER_NODE_1_ID + " " + CLUSTER_HOST + ":" + MASTER_NODE_1_PORT + " myself,master - 0 0 1 connected 0-5460" @@ -67,13 +69,13 @@ public class JedisClusterConnectionUnitTests { + " master - 0 1427718161587 2 connected 5461-10922" + "\n" + MASTER_NODE_2_ID + " " + CLUSTER_HOST + ":" + MASTER_NODE_3_PORT + " master - 0 1427718161587 3 connected 10923-16383"; - static final String CLUSTER_INFO_RESPONSE = "cluster_state:ok" + "\n" + "cluster_slots_assigned:16384" + "\n" + private static final String CLUSTER_INFO_RESPONSE = "cluster_state:ok" + "\n" + "cluster_slots_assigned:16384" + "\n" + "cluster_slots_ok:16384" + "\n" + "cluster_slots_pfail:0" + "\n" + "cluster_slots_fail:0" + "\n" + "cluster_known_nodes:4" + "\n" + "cluster_size:3" + "\n" + "cluster_current_epoch:30" + "\n" + "cluster_my_epoch:2" + "\n" + "cluster_stats_messages_sent:2560260" + "\n" + "cluster_stats_messages_received:2560086"; - JedisClusterConnection connection; + private JedisClusterConnection connection; @Spy StubJedisCluster clusterMock; @Mock JedisClusterConnectionHandler connectionHandlerMock; @@ -86,12 +88,10 @@ public class JedisClusterConnectionUnitTests { @Mock Jedis con2Mock; @Mock Jedis con3Mock; - Map nodes = new LinkedHashMap<>(); + private Map nodes = new LinkedHashMap<>(); - public @Rule ExpectedException expectedException = ExpectedException.none(); - - @Before - public void setUp() { + @BeforeEach + void setUp() { nodes.put(CLUSTER_HOST + ":" + MASTER_NODE_1_PORT, node1PoolMock); nodes.put(CLUSTER_HOST + ":" + MASTER_NODE_2_PORT, node2PoolMock); @@ -111,15 +111,12 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void throwsExceptionWhenClusterCommandExecutorIsNull() { - - expectedException.expect(IllegalArgumentException.class); - - new JedisClusterConnection(clusterMock, null); + void throwsExceptionWhenClusterCommandExecutorIsNull() { + assertThatIllegalArgumentException().isThrownBy(() -> new JedisClusterConnection(clusterMock, null)); } @Test // DATAREDIS-315 - public void clusterMeetShouldSendCommandsToExistingNodesCorrectly() { + void clusterMeetShouldSendCommandsToExistingNodesCorrectly() { connection.clusterMeet(UNKNOWN_CLUSTER_NODE); @@ -129,15 +126,12 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterMeetShouldThrowExceptionWhenNodeIsNull() { - - expectedException.expect(IllegalArgumentException.class); - - connection.clusterMeet(null); + void clusterMeetShouldThrowExceptionWhenNodeIsNull() { + assertThatIllegalArgumentException().isThrownBy(() -> connection.clusterMeet(null)); } @Test // DATAREDIS-315, DATAREDIS-890 - public void clusterForgetShouldSendCommandsToRemainingNodesCorrectly() { + void clusterForgetShouldSendCommandsToRemainingNodesCorrectly() { connection.clusterForget(CLUSTER_NODE_2); @@ -146,7 +140,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315, DATAREDIS-890 - public void clusterReplicateShouldSendCommandsCorrectly() { + void clusterReplicateShouldSendCommandsCorrectly() { connection.clusterReplicate(CLUSTER_NODE_1, CLUSTER_NODE_2); @@ -157,7 +151,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void closeShouldNotCloseUnderlyingClusterPool() throws IOException { + void closeShouldNotCloseUnderlyingClusterPool() throws IOException { connection.close(); @@ -165,7 +159,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void isClosedShouldReturnConnectionStateCorrectly() { + void isClosedShouldReturnConnectionStateCorrectly() { assertThat(connection.isClosed()).isFalse(); @@ -175,7 +169,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterInfoShouldBeReturnedCorrectly() { + void clusterInfoShouldBeReturnedCorrectly() { when(con1Mock.clusterInfo()).thenReturn(CLUSTER_INFO_RESPONSE); when(con2Mock.clusterInfo()).thenReturn(CLUSTER_INFO_RESPONSE); @@ -188,7 +182,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotImportingShouldBeExecutedCorrectly() { + void clusterSetSlotImportingShouldBeExecutedCorrectly() { connection.clusterSetSlot(CLUSTER_NODE_1, 100, AddSlots.IMPORTING); @@ -196,7 +190,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotMigratingShouldBeExecutedCorrectly() { + void clusterSetSlotMigratingShouldBeExecutedCorrectly() { connection.clusterSetSlot(CLUSTER_NODE_1, 100, AddSlots.MIGRATING); @@ -204,7 +198,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotStableShouldBeExecutedCorrectly() { + void clusterSetSlotStableShouldBeExecutedCorrectly() { connection.clusterSetSlot(CLUSTER_NODE_1, 100, AddSlots.STABLE); @@ -212,7 +206,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotNodeShouldBeExecutedCorrectly() { + void clusterSetSlotNodeShouldBeExecutedCorrectly() { connection.clusterSetSlot(CLUSTER_NODE_1, 100, AddSlots.NODE); @@ -220,7 +214,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotShouldBeExecutedOnTargetNodeWhenNodeIdNotSet() { + void clusterSetSlotShouldBeExecutedOnTargetNodeWhenNodeIdNotSet() { connection.clusterSetSlot(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_2_PORT), 100, AddSlots.IMPORTING); @@ -228,12 +222,12 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterSetSlotShouldThrowExceptionWhenModeIsNull() { + void clusterSetSlotShouldThrowExceptionWhenModeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> connection.clusterSetSlot(CLUSTER_NODE_1, 100, null)); } @Test // DATAREDIS-315 - public void clusterDeleteSlotsShouldBeExecutedCorrectly() { + void clusterDeleteSlotsShouldBeExecutedCorrectly() { int[] slots = new int[] { 9000, 10000 }; connection.clusterDeleteSlots(CLUSTER_NODE_2, slots); @@ -242,12 +236,12 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterDeleteSlotShouldThrowExceptionWhenNodeIsNull() { + void clusterDeleteSlotShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> connection.clusterDeleteSlots(null, new int[] { 1 })); } @Test // DATAREDIS-315 - public void timeShouldBeExecutedOnArbitraryNode() { + void timeShouldBeExecutedOnArbitraryNode() { List values = Arrays.asList("1449655759", "92217"); when(con1Mock.time()).thenReturn(values); @@ -260,7 +254,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-679 - public void shouldFailWithUnknownNode() { + void shouldFailWithUnknownNode() { try { connection.serverCommands().dbSize(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT)); @@ -271,18 +265,17 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-679 - public void shouldFailWithAbsentConnection() { + void shouldFailWithAbsentConnection() { nodes.remove(CLUSTER_HOST + ":" + MASTER_NODE_3_PORT); - expectedException.expect(DataAccessResourceFailureException.class); - expectedException.expectMessage("Node " + CLUSTER_HOST + ":" + MASTER_NODE_3_PORT + " is unknown to cluster"); - - connection.serverCommands().dbSize(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_3_PORT)); + assertThatExceptionOfType(DataAccessResourceFailureException.class) + .isThrownBy(() -> connection.serverCommands().dbSize(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_3_PORT))) + .withMessageContaining("Node " + CLUSTER_HOST + ":" + MASTER_NODE_3_PORT + " is unknown to cluster"); } @Test // DATAREDIS-679 - public void shouldReconfigureJedisWithDiscoveredNode() { + void shouldReconfigureJedisWithDiscoveredNode() { nodes.remove(CLUSTER_HOST + ":" + MASTER_NODE_3_PORT); @@ -306,7 +299,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315, DATAREDIS-890 - public void timeShouldBeExecutedOnSingleNode() { + void timeShouldBeExecutedOnSingleNode() { when(con2Mock.time()).thenReturn(Arrays.asList("1449655759", "92217")); @@ -320,7 +313,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void resetConfigStatsShouldBeExecutedOnAllNodes() { + void resetConfigStatsShouldBeExecutedOnAllNodes() { connection.resetConfigStats(); @@ -330,7 +323,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315, DATAREDIS-890 - public void resetConfigStatsShouldBeExecutedOnSingleNodeCorrectly() { + void resetConfigStatsShouldBeExecutedOnSingleNodeCorrectly() { connection.resetConfigStats(CLUSTER_NODE_2); @@ -341,22 +334,19 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-315 - public void clusterTopologyProviderShouldCollectErrorsWhenLoadingNodes() { - - expectedException.expect(ClusterStateFailureException.class); - expectedException.expectMessage("127.0.0.1:7379 failed: o.O"); - expectedException.expectMessage("127.0.0.1:7380 failed: o.1"); - expectedException.expectMessage("127.0.0.1:7381 failed: o.2"); + void clusterTopologyProviderShouldCollectErrorsWhenLoadingNodes() { when(con1Mock.clusterNodes()).thenThrow(new JedisConnectionException("o.O")); when(con2Mock.clusterNodes()).thenThrow(new JedisConnectionException("o.1")); when(con3Mock.clusterNodes()).thenThrow(new JedisConnectionException("o.2")); - new JedisClusterTopologyProvider(clusterMock).getTopology(); + assertThatExceptionOfType(ClusterStateFailureException.class) + .isThrownBy(() -> new JedisClusterTopologyProvider(clusterMock).getTopology()) + .withMessageContaining("127.0.0.1:7379 failed: o.O").withMessageContaining("127.0.0.1:7380 failed: o.1"); } @Test // DATAREDIS-603 - public void translatesUnknownExceptions() { + void translatesUnknownExceptions() { IllegalArgumentException exception = new IllegalArgumentException("Aw, snap!"); @@ -368,7 +358,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-794 - public void clusterTopologyProviderShouldUseCachedTopology() { + void clusterTopologyProviderShouldUseCachedTopology() { when(clusterMock.getClusterNodes()).thenReturn(Collections.singletonMap("mock", node1PoolMock)); when(con1Mock.clusterNodes()).thenReturn(CLUSTER_NODES_RESPONSE); @@ -381,7 +371,7 @@ public class JedisClusterConnectionUnitTests { } @Test // DATAREDIS-794 - public void clusterTopologyProviderShouldRequestTopology() { + void clusterTopologyProviderShouldRequestTopology() { when(clusterMock.getClusterNodes()).thenReturn(Collections.singletonMap("mock", node1PoolMock)); when(con1Mock.clusterNodes()).thenReturn(CLUSTER_NODES_RESPONSE); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryIntegrationTests.java index 6ebaeb653..8829c8148 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryIntegrationTests.java @@ -19,24 +19,25 @@ import static org.assertj.core.api.Assertions.*; import redis.clients.jedis.JedisShardInfo; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.lang.Nullable; /** * Integration tests for {@link JedisConnectionFactory}. * * @author Mark Paluch */ -public class JedisConnectionFactoryIntegrationTests { +class JedisConnectionFactoryIntegrationTests { - private JedisConnectionFactory factory; + private @Nullable JedisConnectionFactory factory; - @After - public void tearDown() { + @AfterEach + void tearDown() { if (factory != null) { factory.destroy(); @@ -44,7 +45,7 @@ public class JedisConnectionFactoryIntegrationTests { } @Test // DATAREDIS-574 - public void shardInfoShouldOverrideFactorySettings() { + void shardInfoShouldOverrideFactorySettings() { factory = new JedisConnectionFactory(new JedisShardInfo(SettingsUtils.getHost(), SettingsUtils.getPort())); factory.setUsePool(false); @@ -57,7 +58,7 @@ public class JedisConnectionFactoryIntegrationTests { } @Test // DATAREDIS-574 - public void shouldInitializeWithStandaloneConfiguration() { + void shouldInitializeWithStandaloneConfiguration() { factory = new JedisConnectionFactory( new RedisStandaloneConfiguration(SettingsUtils.getHost(), SettingsUtils.getPort()), @@ -68,7 +69,7 @@ public class JedisConnectionFactoryIntegrationTests { } @Test // DATAREDIS-575 - public void connectionAppliesClientName() { + void connectionAppliesClientName() { factory = new JedisConnectionFactory( new RedisStandaloneConfiguration(SettingsUtils.getHost(), SettingsUtils.getPort()), diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java index ddd50bf88..28ffc3e8d 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java @@ -17,12 +17,13 @@ package org.springframework.data.redis.connection.jedis; import static org.assertj.core.api.Assertions.*; -import org.junit.After; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisSentinelConfiguration; -import org.springframework.data.redis.test.util.RedisSentinelRule; +import org.springframework.data.redis.test.condition.EnabledOnRedisSentinelAvailable; +import org.springframework.lang.Nullable; /** * Sentinel integration tests for {@link JedisConnectionFactory}. @@ -32,16 +33,15 @@ import org.springframework.data.redis.test.util.RedisSentinelRule; * @author Mark Paluch * @author Ajith Kumar */ -public class JedisConnectionFactorySentinelIntegrationTests { +@EnabledOnRedisSentinelAvailable +class JedisConnectionFactorySentinelIntegrationTests { private static final RedisSentinelConfiguration SENTINEL_CONFIG = new RedisSentinelConfiguration().master("mymaster") .sentinel("127.0.0.1", 26379).sentinel("127.0.0.1", 26380); - private JedisConnectionFactory factory; + private @Nullable JedisConnectionFactory factory; - public @Rule RedisSentinelRule sentinelRule = RedisSentinelRule.forConfig(SENTINEL_CONFIG).oneActive(); - - @After - public void tearDown() { + @AfterEach + void tearDown() { if (factory != null) { factory.destroy(); @@ -49,7 +49,7 @@ public class JedisConnectionFactorySentinelIntegrationTests { } @Test // DATAREDIS-574, DATAREDIS-765 - public void shouldInitializeWithSentinelConfiguration() { + void shouldInitializeWithSentinelConfiguration() { JedisClientConfiguration clientConfiguration = JedisClientConfiguration.builder() // .clientName("clientName") // @@ -65,7 +65,7 @@ public class JedisConnectionFactorySentinelIntegrationTests { } @Test // DATAREDIS-324 - public void shouldSendCommandCorrectlyViaConnectionFactoryUsingSentinel() { + void shouldSendCommandCorrectlyViaConnectionFactoryUsingSentinel() { factory = new JedisConnectionFactory(SENTINEL_CONFIG); factory.afterPropertiesSet(); @@ -74,7 +74,7 @@ public class JedisConnectionFactorySentinelIntegrationTests { } @Test // DATAREDIS-552 - public void getClientNameShouldEqualWithFactorySetting() { + void getClientNameShouldEqualWithFactorySetting() { factory = new JedisConnectionFactory(SENTINEL_CONFIG); factory.setClientName("clientName"); @@ -84,7 +84,7 @@ public class JedisConnectionFactorySentinelIntegrationTests { } @Test // DATAREDIS-1127 - public void shouldNotFailOnFirstSentinelDown() { + void shouldNotFailOnFirstSentinelDown() { RedisSentinelConfiguration oneDownSentinelConfig = new RedisSentinelConfiguration().master("mymaster") .sentinel("any.unavailable.host", 26379).sentinel("127.0.0.1", 26379); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryUnitTests.java index 88d8bf858..1bfb49fb6 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactoryUnitTests.java @@ -18,6 +18,11 @@ package org.springframework.data.redis.connection.jedis; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisClusterConnectionHandler; +import redis.clients.jedis.JedisClusterInfoCache; +import redis.clients.jedis.JedisPoolConfig; + import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.time.Duration; @@ -30,16 +35,15 @@ import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocketFactory; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import org.junit.Test; -import redis.clients.jedis.JedisCluster; -import redis.clients.jedis.JedisClusterConnectionHandler; -import redis.clients.jedis.JedisClusterInfoCache; -import redis.clients.jedis.JedisPoolConfig; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisClusterConnection; import org.springframework.data.redis.connection.RedisPassword; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.test.util.ReflectionTestUtils; /** @@ -48,7 +52,7 @@ import org.springframework.test.util.ReflectionTestUtils; * @author Christoph Strobl * @author Mark Paluch */ -public class JedisConnectionFactoryUnitTests { +class JedisConnectionFactoryUnitTests { private JedisConnectionFactory connectionFactory; @@ -59,7 +63,7 @@ public class JedisConnectionFactoryUnitTests { .clusterNode("127.0.0.1", 6379).clusterNode("127.0.0.1", 6380); @Test // DATAREDIS-324 - public void shouldInitSentinelPoolWhenSentinelConfigPresent() { + void shouldInitSentinelPoolWhenSentinelConfigPresent() { connectionFactory = initSpyedConnectionFactory(SINGLE_SENTINEL_CONFIG, new JedisPoolConfig()); connectionFactory.afterPropertiesSet(); @@ -69,7 +73,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-324 - public void shouldInitJedisPoolWhenNoSentinelConfigPresent() { + void shouldInitJedisPoolWhenNoSentinelConfigPresent() { connectionFactory = initSpyedConnectionFactory((RedisSentinelConfiguration) null, new JedisPoolConfig()); connectionFactory.afterPropertiesSet(); @@ -78,16 +82,16 @@ public class JedisConnectionFactoryUnitTests { verify(connectionFactory, never()).createRedisSentinelPool(any(RedisSentinelConfiguration.class)); } - @Test(expected = IllegalStateException.class) // DATAREDIS-765 - public void shouldRejectPoolDisablingWhenSentinelConfigPresent() { + @Test // DATAREDIS-765 + void shouldRejectPoolDisablingWhenSentinelConfigPresent() { connectionFactory = new JedisConnectionFactory(new RedisSentinelConfiguration()); - connectionFactory.setUsePool(false); + assertThatIllegalStateException().isThrownBy(() -> connectionFactory.setUsePool(false)); } @Test // DATAREDIS-315 - public void shouldInitConnectionCorrectlyWhenClusterConfigPresent() { + void shouldInitConnectionCorrectlyWhenClusterConfigPresent() { connectionFactory = initSpyedConnectionFactory(CLUSTER_CONFIG, new JedisPoolConfig()); connectionFactory.afterPropertiesSet(); @@ -98,19 +102,17 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-315 - public void shouldCloseClusterCorrectlyOnFactoryDestruction() throws IOException { + void shouldCloseClusterCorrectlyOnFactoryDestruction() throws IOException { JedisCluster clusterMock = mock(JedisCluster.class); JedisConnectionFactory factory = new JedisConnectionFactory(); ReflectionTestUtils.setField(factory, "cluster", clusterMock); - factory.destroy(); - verify(clusterMock, times(1)).close(); } @Test // DATAREDIS-574 - public void shouldReadStandalonePassword() { + void shouldReadStandalonePassword() { RedisStandaloneConfiguration envConfig = new RedisStandaloneConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -121,7 +123,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldWriteStandalonePassword() { + void shouldWriteStandalonePassword() { RedisStandaloneConfiguration envConfig = new RedisStandaloneConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -134,7 +136,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReadSentinelPassword() { + void shouldReadSentinelPassword() { RedisSentinelConfiguration envConfig = new RedisSentinelConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -145,7 +147,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldWriteSentinelPassword() { + void shouldWriteSentinelPassword() { RedisSentinelConfiguration envConfig = new RedisSentinelConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -158,7 +160,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReadClusterPassword() { + void shouldReadClusterPassword() { RedisClusterConfiguration envConfig = new RedisClusterConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -169,7 +171,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldWriteClusterPassword() { + void shouldWriteClusterPassword() { RedisClusterConfiguration envConfig = new RedisClusterConfiguration(); envConfig.setPassword(RedisPassword.of("foo")); @@ -182,7 +184,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReadStandaloneDatabaseIndex() { + void shouldReadStandaloneDatabaseIndex() { RedisStandaloneConfiguration envConfig = new RedisStandaloneConfiguration(); envConfig.setDatabase(2); @@ -193,7 +195,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldWriteStandaloneDatabaseIndex() { + void shouldWriteStandaloneDatabaseIndex() { RedisStandaloneConfiguration envConfig = new RedisStandaloneConfiguration(); envConfig.setDatabase(2); @@ -206,7 +208,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReadSentinelDatabaseIndex() { + void shouldReadSentinelDatabaseIndex() { RedisSentinelConfiguration envConfig = new RedisSentinelConfiguration(); envConfig.setDatabase(2); @@ -217,7 +219,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldWriteSentinelDatabaseIndex() { + void shouldWriteSentinelDatabaseIndex() { RedisSentinelConfiguration envConfig = new RedisSentinelConfiguration(); envConfig.setDatabase(2); @@ -230,13 +232,13 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldApplyClientConfiguration() throws NoSuchAlgorithmException { + void shouldApplyClientConfiguration() throws NoSuchAlgorithmException { SSLParameters sslParameters = new SSLParameters(); SSLContext context = SSLContext.getDefault(); SSLSocketFactory socketFactory = context.getSocketFactory(); JedisPoolConfig poolConfig = new JedisPoolConfig(); - + JedisClientConfiguration configuration = JedisClientConfiguration.builder().useSsl() // .hostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier()) // .sslParameters(sslParameters) // @@ -258,7 +260,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReturnStandaloneConfiguration() { + void shouldReturnStandaloneConfiguration() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); connectionFactory = new JedisConnectionFactory(configuration, JedisClientConfiguration.defaultConfiguration()); @@ -269,7 +271,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReturnSentinelConfiguration() { + void shouldReturnSentinelConfiguration() { RedisSentinelConfiguration configuration = new RedisSentinelConfiguration(); connectionFactory = new JedisConnectionFactory(configuration, JedisClientConfiguration.defaultConfiguration()); @@ -280,7 +282,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-574 - public void shouldReturnClusterConfiguration() { + void shouldReturnClusterConfiguration() { RedisClusterConfiguration configuration = new RedisClusterConfiguration(); connectionFactory = new JedisConnectionFactory(configuration, JedisClientConfiguration.defaultConfiguration()); @@ -291,7 +293,7 @@ public class JedisConnectionFactoryUnitTests { } @Test // DATAREDIS-974 - public void shouldApplySslConfigWhenCreatingClusterClient() throws NoSuchAlgorithmException { + void shouldApplySslConfigWhenCreatingClusterClient() throws NoSuchAlgorithmException { SSLParameters sslParameters = new SSLParameters(); SSLContext context = SSLContext.getDefault(); @@ -333,13 +335,13 @@ public class JedisConnectionFactoryUnitTests { assertThat(ReflectionTestUtils.getField(cache, "hostAndPortMap")).isNull(); } - @Test(expected = IllegalStateException.class) // DATAREDIS-574 - public void shouldDenyChangesToImmutableClientConfiguration() throws NoSuchAlgorithmException { + @Test // DATAREDIS-574 + void shouldDenyChangesToImmutableClientConfiguration() throws NoSuchAlgorithmException { connectionFactory = new JedisConnectionFactory(new RedisStandaloneConfiguration(), JedisClientConfiguration.defaultConfiguration()); - connectionFactory.setClientName("foo"); + assertThatIllegalStateException().isThrownBy(() -> connectionFactory.setClientName("foo")); } private JedisConnectionFactory initSpyedConnectionFactory(RedisSentinelConfiguration sentinelConfig, diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTests.java similarity index 88% rename from src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java rename to src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTests.java index ae5267523..6ae8f01bf 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTestSuite.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionUnitTests.java @@ -27,34 +27,30 @@ import java.io.IOException; import java.util.Collections; import java.util.Map.Entry; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; + import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.data.redis.connection.AbstractConnectionUnitTestBase; import org.springframework.data.redis.connection.RedisServerCommands.ShutdownOption; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; -import org.springframework.data.redis.connection.jedis.JedisConnectionUnitTestSuite.JedisConnectionPipelineUnitTests; -import org.springframework.data.redis.connection.jedis.JedisConnectionUnitTestSuite.JedisConnectionUnitTests; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; /** * @author Christoph Strobl */ -@RunWith(Suite.class) -@SuiteClasses({ JedisConnectionUnitTests.class, JedisConnectionPipelineUnitTests.class }) -public class JedisConnectionUnitTestSuite { +class JedisConnectionUnitTests { - public static class JedisConnectionUnitTests extends AbstractConnectionUnitTestBase { + @Nested + public class BasicUnitTests extends AbstractConnectionUnitTestBase { protected JedisConnection connection; private Jedis jedisSpy; - @Before + @BeforeEach public void setUp() { jedisSpy = spy(new MockedClientJedis("http://localhost:1234", getNativeRedisConnectionMock())); @@ -62,7 +58,7 @@ public class JedisConnectionUnitTestSuite { } @Test // DATAREDIS-184 - public void shutdownWithNullShouldDelegateCommandCorrectly() { + void shutdownWithNullShouldDelegateCommandCorrectly() { connection.shutdown(null); @@ -106,7 +102,7 @@ public class JedisConnectionUnitTestSuite { } @Test // DATAREDIS-277 - public void slaveOfShouldThrowExectpionWhenCalledForNullHost() { + void slaveOfShouldThrowExectpionWhenCalledForNullHost() { assertThatIllegalArgumentException().isThrownBy(() -> connection.slaveOf(null, 0)); } @@ -125,37 +121,37 @@ public class JedisConnectionUnitTestSuite { } @Test // DATAREDIS-330 - public void shouldThrowExceptionWhenAccessingRedisSentinelsCommandsWhenNoSentinelsConfigured() { + void shouldThrowExceptionWhenAccessingRedisSentinelsCommandsWhenNoSentinelsConfigured() { assertThatExceptionOfType(InvalidDataAccessResourceUsageException.class) .isThrownBy(() -> connection.getSentinelConnection()); } @Test // DATAREDIS-472 - public void restoreShouldThrowExceptionWhenTtlInMillisExceedsIntegerRange() { + void restoreShouldThrowExceptionWhenTtlInMillisExceedsIntegerRange() { assertThatIllegalArgumentException() .isThrownBy(() -> connection.restore("foo".getBytes(), (long) Integer.MAX_VALUE + 1L, "bar".getBytes())); } @Test // DATAREDIS-472 - public void setExShouldThrowExceptionWhenTimeExceedsIntegerRange() { + void setExShouldThrowExceptionWhenTimeExceedsIntegerRange() { assertThatIllegalArgumentException() .isThrownBy(() -> connection.setEx("foo".getBytes(), (long) Integer.MAX_VALUE + 1L, "bar".getBytes())); } @Test // DATAREDIS-472 - public void sRandMemberShouldThrowExceptionWhenCountExceedsIntegerRange() { + void sRandMemberShouldThrowExceptionWhenCountExceedsIntegerRange() { assertThatIllegalArgumentException() .isThrownBy(() -> connection.sRandMember("foo".getBytes(), (long) Integer.MAX_VALUE + 1L)); } @Test // DATAREDIS-472 - public void zRangeByScoreShouldThrowExceptionWhenOffsetExceedsIntegerRange() { + void zRangeByScoreShouldThrowExceptionWhenOffsetExceedsIntegerRange() { assertThatIllegalArgumentException().isThrownBy(() -> connection.zRangeByScore("foo".getBytes(), "foo", "bar", (long) Integer.MAX_VALUE + 1L, Integer.MAX_VALUE)); } @Test // DATAREDIS-472 - public void zRangeByScoreShouldThrowExceptionWhenCountExceedsIntegerRange() { + void zRangeByScoreShouldThrowExceptionWhenCountExceedsIntegerRange() { assertThatIllegalArgumentException().isThrownBy(() -> connection.zRangeByScore("foo".getBytes(), "foo", "bar", Integer.MAX_VALUE, (long) Integer.MAX_VALUE + 1L)); } @@ -253,7 +249,7 @@ public class JedisConnectionUnitTestSuite { } @Test // DATAREDIS-714 - public void doesNotSelectDbWhenCurrentDbMatchesDesiredOne() { + void doesNotSelectDbWhenCurrentDbMatchesDesiredOne() { Jedis jedisSpy = spy(new MockedClientJedis("http://localhost:1234", getNativeRedisConnectionMock())); new JedisConnection(jedisSpy); @@ -262,7 +258,7 @@ public class JedisConnectionUnitTestSuite { } @Test // DATAREDIS-714 - public void doesNotSelectDbWhenCurrentDbDoesNotMatchDesiredOne() { + void doesNotSelectDbWhenCurrentDbDoesNotMatchDesiredOne() { Jedis jedisSpy = spy(new MockedClientJedis("http://localhost:1234", getNativeRedisConnectionMock())); when(jedisSpy.getDB()).thenReturn(3); @@ -273,9 +269,10 @@ public class JedisConnectionUnitTestSuite { } } - public static class JedisConnectionPipelineUnitTests extends JedisConnectionUnitTests { + @Nested + public class JedisConnectionPipelineUnitTests extends BasicUnitTests { - @Before + @BeforeEach public void setUp() { super.setUp(); connection.openPipeline(); @@ -380,7 +377,7 @@ public class JedisConnectionUnitTestSuite { */ private static class MockedClientJedis extends Jedis { - public MockedClientJedis(String host, Client client) { + MockedClientJedis(String host, Client client) { super(host); this.client = client; } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java index 59631a875..84a3d0303 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConvertersUnitTests.java @@ -17,6 +17,7 @@ package org.springframework.data.redis.connection.jedis; import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.Test; import redis.clients.jedis.params.SetParams; import java.util.Arrays; @@ -26,8 +27,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.Test; - import org.springframework.data.redis.connection.RedisServer; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.RedisZSetCommands.Range; @@ -37,23 +36,23 @@ import org.springframework.data.redis.core.types.RedisClientInfo; /** * @author Christoph Strobl */ -public class JedisConvertersUnitTests { +class JedisConvertersUnitTests { private static final String CLIENT_ALL_SINGLE_LINE_RESPONSE = "addr=127.0.0.1:60311 fd=6 name= age=4059 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client"; @Test // DATAREDIS-268 - public void convertingEmptyStringToListOfRedisClientInfoShouldReturnEmptyList() { + void convertingEmptyStringToListOfRedisClientInfoShouldReturnEmptyList() { assertThat(JedisConverters.toListOfRedisClientInformation("")).isEqualTo(Collections. emptyList()); } @Test // DATAREDIS-268 - public void convertingNullToListOfRedisClientInfoShouldReturnEmptyList() { + void convertingNullToListOfRedisClientInfoShouldReturnEmptyList() { assertThat(JedisConverters.toListOfRedisClientInformation(null)) .isEqualTo(Collections. emptyList()); } @Test // DATAREDIS-268 - public void convertingMultipleLiesToListOfRedisClientInfoReturnsListCorrectly() { + void convertingMultipleLiesToListOfRedisClientInfoReturnsListCorrectly() { StringBuilder sb = new StringBuilder(); sb.append(CLIENT_ALL_SINGLE_LINE_RESPONSE); @@ -64,7 +63,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-330 - public void convertsSingleMapToRedisServerReturnsCollectionCorrectly() { + void convertsSingleMapToRedisServerReturnsCollectionCorrectly() { Map values = getRedisServerInfoMap("mymaster", 23697); List servers = JedisConverters.toListOfRedisServer(Collections.singletonList(values)); @@ -74,7 +73,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-330 - public void convertsMultipleMapsToRedisServerReturnsCollectionCorrectly() { + void convertsMultipleMapsToRedisServerReturnsCollectionCorrectly() { List> vals = Arrays.asList(getRedisServerInfoMap("mymaster", 23697), getRedisServerInfoMap("yourmaster", 23680)); @@ -87,19 +86,19 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-330 - public void convertsRedisServersCorrectlyWhenGivenAnEmptyList() { + void convertsRedisServersCorrectlyWhenGivenAnEmptyList() { assertThat(JedisConverters.toListOfRedisServer(Collections.> emptyList())).isNotNull(); } @Test // DATAREDIS-330 - public void convertsRedisServersCorrectlyWhenGivenNull() { + void convertsRedisServersCorrectlyWhenGivenNull() { assertThat(JedisConverters.toListOfRedisServer(null)).isNotNull(); } /** */ @Test - public void boundaryToBytesForZRangeByLexShouldReturnDefaultValueWhenBoundaryIsNull() { + void boundaryToBytesForZRangeByLexShouldReturnDefaultValueWhenBoundaryIsNull() { byte[] defaultValue = "tyrion".getBytes(); @@ -107,7 +106,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldReturnDefaultValueWhenBoundaryValueIsNull() { + void boundaryToBytesForZRangeByLexShouldReturnDefaultValueWhenBoundaryValueIsNull() { byte[] defaultValue = "tyrion".getBytes(); @@ -116,7 +115,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsIncluing() { + void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsIncluing() { assertThat( JedisConverters.boundaryToBytesForZRangeByLex(Range.range().gte(JedisConverters.toBytes("a")).getMin(), null)) @@ -124,7 +123,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsExcluding() { + void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsExcluding() { assertThat( JedisConverters.boundaryToBytesForZRangeByLex(Range.range().gt(JedisConverters.toBytes("a")).getMin(), null)) @@ -132,27 +131,27 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsAString() { + void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsAString() { assertThat(JedisConverters.boundaryToBytesForZRangeByLex(Range.range().gt("a").getMin(), null)) .isEqualTo(JedisConverters.toBytes("(a")); } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsANumber() { + void boundaryToBytesForZRangeByLexShouldReturnValueCorrectlyWhenBoundaryIsANumber() { assertThat(JedisConverters.boundaryToBytesForZRangeByLex(Range.range().gt(1L).getMin(), null)) .isEqualTo(JedisConverters.toBytes("(1")); } @Test // DATAREDIS-378 - public void boundaryToBytesForZRangeByLexShouldThrowExceptionWhenBoundaryHoldsUnknownType() { + void boundaryToBytesForZRangeByLexShouldThrowExceptionWhenBoundaryHoldsUnknownType() { assertThatIllegalArgumentException() .isThrownBy(() -> JedisConverters.boundaryToBytesForZRangeByLex(Range.range().gt(new Date()).getMin(), null)); } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnDefaultValueWhenBoundaryIsNull() { + void boundaryToBytesForZRangeByShouldReturnDefaultValueWhenBoundaryIsNull() { byte[] defaultValue = "tyrion".getBytes(); @@ -160,7 +159,7 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnDefaultValueWhenBoundaryValueIsNull() { + void boundaryToBytesForZRangeByShouldReturnDefaultValueWhenBoundaryValueIsNull() { byte[] defaultValue = "tyrion".getBytes(); @@ -169,61 +168,61 @@ public class JedisConvertersUnitTests { } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsIncluing() { + void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsIncluing() { assertThat(JedisConverters.boundaryToBytesForZRange(Range.range().gte(JedisConverters.toBytes("a")).getMin(), null)) .isEqualTo(JedisConverters.toBytes("a")); } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsExcluding() { + void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsExcluding() { assertThat(JedisConverters.boundaryToBytesForZRange(Range.range().gt(JedisConverters.toBytes("a")).getMin(), null)) .isEqualTo(JedisConverters.toBytes("(a")); } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsAString() { + void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsAString() { assertThat(JedisConverters.boundaryToBytesForZRange(Range.range().gt("a").getMin(), null)) .isEqualTo(JedisConverters.toBytes("(a")); } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsANumber() { + void boundaryToBytesForZRangeByShouldReturnValueCorrectlyWhenBoundaryIsANumber() { assertThat(JedisConverters.boundaryToBytesForZRange(Range.range().gt(1L).getMin(), null)) .isEqualTo(JedisConverters.toBytes("(1")); } @Test // DATAREDIS-352 - public void boundaryToBytesForZRangeByShouldThrowExceptionWhenBoundaryHoldsUnknownType() { + void boundaryToBytesForZRangeByShouldThrowExceptionWhenBoundaryHoldsUnknownType() { assertThatIllegalArgumentException() .isThrownBy(() -> JedisConverters.boundaryToBytesForZRange(Range.range().gt(new Date()).getMin(), null)); } @Test // DATAREDIS-316, DATAREDIS-749 - public void toSetCommandExPxOptionShouldReturnEXforSeconds() { + void toSetCommandExPxOptionShouldReturnEXforSeconds() { assertThat(toString(JedisConverters.toSetCommandExPxArgument(Expiration.seconds(100)))).isEqualTo("ex 100"); } @Test // DATAREDIS-316, DATAREDIS-749 - public void toSetCommandExPxOptionShouldReturnEXforMilliseconds() { + void toSetCommandExPxOptionShouldReturnEXforMilliseconds() { assertThat(toString(JedisConverters.toSetCommandExPxArgument(Expiration.milliseconds(100)))).isEqualTo("px 100"); } @Test // DATAREDIS-316, DATAREDIS-749 - public void toSetCommandNxXxOptionShouldReturnNXforAbsent() { + void toSetCommandNxXxOptionShouldReturnNXforAbsent() { assertThat(toString(JedisConverters.toSetCommandNxXxArgument(SetOption.ifAbsent()))).isEqualTo("nx"); } @Test // DATAREDIS-316, DATAREDIS-749 - public void toSetCommandNxXxOptionShouldReturnXXforAbsent() { + void toSetCommandNxXxOptionShouldReturnXXforAbsent() { assertThat(toString(JedisConverters.toSetCommandNxXxArgument(SetOption.ifPresent()))).isEqualTo("xx"); } @Test // DATAREDIS-316, DATAREDIS-749 - public void toSetCommandNxXxOptionShouldReturnEmptyArrayforUpsert() { + void toSetCommandNxXxOptionShouldReturnEmptyArrayforUpsert() { assertThat(toString(JedisConverters.toSetCommandNxXxArgument(SetOption.upsert()))).isEqualTo(""); } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisExceptionConverterUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisExceptionConverterUnitTests.java index 162d29725..c09e39489 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisExceptionConverterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisExceptionConverterUnitTests.java @@ -22,8 +22,7 @@ import redis.clients.jedis.exceptions.JedisAskDataException; import redis.clients.jedis.exceptions.JedisClusterMaxAttemptsException; import redis.clients.jedis.exceptions.JedisMovedDataException; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.ClusterRedirectException; @@ -32,17 +31,12 @@ import org.springframework.data.redis.TooManyClusterRedirectionsException; /** * @author Christoph Strobl */ -public class JedisExceptionConverterUnitTests { +class JedisExceptionConverterUnitTests { - JedisExceptionConverter converter; - - @Before - public void setUp() { - converter = new JedisExceptionConverter(); - } + private JedisExceptionConverter converter = new JedisExceptionConverter(); @Test // DATAREDIS-315 - public void shouldConvertMovedDataException() { + void shouldConvertMovedDataException() { DataAccessException converted = converter.convert(new JedisMovedDataException("MOVED 3999 127.0.0.1:6381", new HostAndPort("127.0.0.1", 6381), 3999)); @@ -54,7 +48,7 @@ public class JedisExceptionConverterUnitTests { } @Test // DATAREDIS-315 - public void shouldConvertAskDataException() { + void shouldConvertAskDataException() { DataAccessException converted = converter.convert(new JedisAskDataException("ASK 3999 127.0.0.1:6381", new HostAndPort("127.0.0.1", 6381), 3999)); @@ -66,7 +60,7 @@ public class JedisExceptionConverterUnitTests { } @Test // DATAREDIS-315 - public void shouldConvertMaxRedirectException() { + void shouldConvertMaxRedirectException() { DataAccessException converted = converter .convert(new JedisClusterMaxAttemptsException("Too many redirections?")); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelConnectionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelConnectionUnitTests.java index 43da6fa53..b01b1dbaf 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelConnectionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelConnectionUnitTests.java @@ -20,11 +20,11 @@ import static org.mockito.Mockito.*; import redis.clients.jedis.Jedis; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.redis.connection.RedisNode; import org.springframework.data.redis.connection.RedisNode.RedisNodeBuilder; @@ -33,26 +33,26 @@ import org.springframework.data.redis.connection.RedisServer; /** * @author Christoph Strobl */ -@RunWith(MockitoJUnitRunner.class) -public class JedisSentinelConnectionUnitTests { +@ExtendWith(MockitoExtension.class) +class JedisSentinelConnectionUnitTests { private @Mock Jedis jedisMock; private JedisSentinelConnection connection; - @Before - public void setUp() { + @BeforeEach + void setUp() { this.connection = new JedisSentinelConnection(jedisMock); } @Test // DATAREDIS-330 - public void shouldConnectAfterCreation() { + void shouldConnectAfterCreation() { verify(jedisMock, times(1)).connect(); } @SuppressWarnings("resource") @Test // DATAREDIS-330 - public void shouldNotConnectIfAlreadyConnected() { + void shouldNotConnectIfAlreadyConnected() { Jedis yetAnotherJedisMock = mock(Jedis.class); when(yetAnotherJedisMock.isConnected()).thenReturn(true); @@ -63,82 +63,82 @@ public class JedisSentinelConnectionUnitTests { } @Test // DATAREDIS-330 - public void failoverShouldBeSentCorrectly() { + void failoverShouldBeSentCorrectly() { connection.failover(new RedisNodeBuilder().withName("mymaster").build()); verify(jedisMock, times(1)).sentinelFailover(eq("mymaster")); } @Test // DATAREDIS-330 - public void failoverShouldThrowExceptionIfMasterNodeIsNull() { + void failoverShouldThrowExceptionIfMasterNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> connection.failover(null)); } @Test // DATAREDIS-330 - public void failoverShouldThrowExceptionIfMasterNodeNameIsEmpty() { + void failoverShouldThrowExceptionIfMasterNodeNameIsEmpty() { assertThatIllegalArgumentException().isThrownBy(() -> connection.failover(new RedisNodeBuilder().build())); } @Test // DATAREDIS-330 - public void mastersShouldReadMastersCorrectly() { + void mastersShouldReadMastersCorrectly() { connection.masters(); verify(jedisMock, times(1)).sentinelMasters(); } @Test // DATAREDIS-330 - public void shouldReadSlavesCorrectly() { + void shouldReadSlavesCorrectly() { connection.slaves("mymaster"); verify(jedisMock, times(1)).sentinelSlaves(eq("mymaster")); } @Test // DATAREDIS-330 - public void shouldReadSlavesCorrectlyWhenGivenNamedNode() { + void shouldReadSlavesCorrectlyWhenGivenNamedNode() { connection.slaves(new RedisNodeBuilder().withName("mymaster").build()); verify(jedisMock, times(1)).sentinelSlaves(eq("mymaster")); } @Test // DATAREDIS-330 - public void readSlavesShouldThrowExceptionWhenGivenEmptyMasterName() { + void readSlavesShouldThrowExceptionWhenGivenEmptyMasterName() { assertThatIllegalArgumentException().isThrownBy(() -> connection.slaves("")); } @Test // DATAREDIS-330 - public void readSlavesShouldThrowExceptionWhenGivenNull() { + void readSlavesShouldThrowExceptionWhenGivenNull() { assertThatIllegalArgumentException().isThrownBy(() -> connection.slaves((RedisNode) null)); } @Test // DATAREDIS-330 - public void readSlavesShouldThrowExceptionWhenNodeWithoutName() { + void readSlavesShouldThrowExceptionWhenNodeWithoutName() { assertThatIllegalArgumentException().isThrownBy(() -> connection.slaves(new RedisNodeBuilder().build())); } @Test // DATAREDIS-330 - public void shouldRemoveMasterCorrectlyWhenGivenNamedNode() { + void shouldRemoveMasterCorrectlyWhenGivenNamedNode() { connection.remove(new RedisNodeBuilder().withName("mymaster").build()); verify(jedisMock, times(1)).sentinelRemove(eq("mymaster")); } @Test // DATAREDIS-330 - public void removeShouldThrowExceptionWhenGivenEmptyMasterName() { + void removeShouldThrowExceptionWhenGivenEmptyMasterName() { assertThatIllegalArgumentException().isThrownBy(() -> connection.remove("")); } @Test // DATAREDIS-330 - public void removeShouldThrowExceptionWhenGivenNull() { + void removeShouldThrowExceptionWhenGivenNull() { assertThatIllegalArgumentException().isThrownBy(() -> connection.remove((RedisNode) null)); } @Test // DATAREDIS-330 - public void removeShouldThrowExceptionWhenNodeWithoutName() { + void removeShouldThrowExceptionWhenNodeWithoutName() { assertThatIllegalArgumentException().isThrownBy(() -> connection.remove(new RedisNodeBuilder().build())); } @Test // DATAREDIS-330 - public void monitorShouldBeSentCorrectly() { + void monitorShouldBeSentCorrectly() { RedisServer server = new RedisServer("127.0.0.1", 6382); server.setName("anothermaster"); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelIntegrationTests.java index fb03106c5..c2004083f 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSentinelIntegrationTests.java @@ -17,6 +17,7 @@ package org.springframework.data.redis.connection.jedis; import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.extension.ExtendWith; import redis.clients.jedis.Jedis; import java.util.Collection; @@ -24,11 +25,8 @@ import java.util.List; import org.junit.After; import org.junit.Before; -import org.junit.ClassRule; import org.junit.Ignore; -import org.junit.Rule; import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.redis.connection.AbstractConnectionIntegrationTests; @@ -36,11 +34,9 @@ import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSentinelConnection; import org.springframework.data.redis.connection.RedisServer; import org.springframework.data.redis.connection.ReturnType; -import org.springframework.data.redis.test.util.MinimumRedisVersionRule; -import org.springframework.data.redis.test.util.RedisSentinelRule; -import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; -import org.springframework.test.annotation.IfProfileValue; +import org.springframework.data.redis.test.condition.EnabledOnRedisSentinelAvailable; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; /** @@ -48,8 +44,9 @@ import org.springframework.test.util.ReflectionTestUtils; * @author Thomas Darimont * @author Mark Paluch */ -@RunWith(RelaxedJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration("JedisConnectionIntegrationTests-context.xml") +@EnabledOnRedisSentinelAvailable public class JedisSentinelIntegrationTests extends AbstractConnectionIntegrationTests { private static final String MASTER_NAME = "mymaster"; @@ -62,8 +59,6 @@ public class JedisSentinelIntegrationTests extends AbstractConnectionIntegration private static final RedisSentinelConfiguration SENTINEL_CONFIG = new RedisSentinelConfiguration() // .master(MASTER_NAME).sentinel(SENTINEL_0).sentinel(SENTINEL_1); - public static @ClassRule RedisSentinelRule sentinelRule = RedisSentinelRule.forConfig(SENTINEL_CONFIG).oneActive(); - public @Rule MinimumRedisVersionRule minimumVersionRule = new MinimumRedisVersionRule(); @Before public void setUp() { @@ -87,40 +82,34 @@ public class JedisSentinelIntegrationTests extends AbstractConnectionIntegration } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnSingleError() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class) .isThrownBy(() -> connection.eval("return redis.call('expire','foo')", ReturnType.BOOLEAN, 0)); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalArrayScriptError() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class) .isThrownBy(() -> super.testEvalArrayScriptError()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaNotFound() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class) .isThrownBy(() -> connection.evalSha("somefakesha", ReturnType.VALUE, 2, "key1", "key2")); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayError() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(() -> super.testEvalShaArrayError()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreBadData() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(() -> super.testRestoreBadData()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreExistingKey() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class) .isThrownBy(() -> super.testRestoreExistingKey()); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java similarity index 73% rename from src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionTests.java rename to src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java index 2ad729521..740448276 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisSubscriptionUnitTests.java @@ -22,9 +22,11 @@ import redis.clients.jedis.BinaryJedisPubSub; import java.util.Collection; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.connection.RedisInvalidSubscriptionException; @@ -34,60 +36,59 @@ import org.springframework.data.redis.connection.RedisInvalidSubscriptionExcepti * * @author Jennifer Hickey */ -public class JedisSubscriptionTests { +@ExtendWith(MockitoExtension.class) +class JedisSubscriptionUnitTests { - private JedisSubscription subscription; + @Mock BinaryJedisPubSub jedisPubSub; - private BinaryJedisPubSub jedisPubSub; + @Mock MessageListener listener; - private MessageListener listener; + JedisSubscription subscription; - @Before - public void setUp() { - jedisPubSub = Mockito.mock(BinaryJedisPubSub.class); - listener = Mockito.mock(MessageListener.class); + @BeforeEach + void setUp() { subscription = new JedisSubscription(listener, jedisPubSub, null, null); } @Test - public void testUnsubscribeAllAndClose() { + void testUnsubscribeAllAndClose() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.unsubscribe(); verify(jedisPubSub, times(1)).unsubscribe(); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isFalse(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); + assertThat(subscription.getPatterns()).isEmpty(); } @Test - public void testUnsubscribeAllChannelsWithPatterns() { + void testUnsubscribeAllChannelsWithPatterns() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.pSubscribe(new byte[][] { "s*".getBytes() }); subscription.unsubscribe(); verify(jedisPubSub, times(1)).unsubscribe(); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); Collection patterns = subscription.getPatterns(); - assertThat(patterns.size()).isEqualTo(1); + assertThat(patterns).hasSize(1); assertThat(patterns.iterator().next()).isEqualTo("s*".getBytes()); } @Test - public void testUnsubscribeChannelAndClose() { + void testUnsubscribeChannelAndClose() { byte[][] channel = new byte[][] { "a".getBytes() }; subscription.subscribe(channel); subscription.unsubscribe(channel); verify(jedisPubSub, times(1)).unsubscribe(channel); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isFalse(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); + assertThat(subscription.getPatterns()).isEmpty(); } @Test - public void testUnsubscribeChannelSomeLeft() { + void testUnsubscribeChannelSomeLeft() { byte[][] channels = new byte[][] { "a".getBytes(), "b".getBytes() }; subscription.subscribe(channels); subscription.unsubscribe(new byte[][] { "a".getBytes() }); @@ -95,13 +96,13 @@ public class JedisSubscriptionTests { verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); Collection subChannels = subscription.getChannels(); - assertThat(subChannels.size()).isEqualTo(1); + assertThat(subChannels).hasSize(1); assertThat(subChannels.iterator().next()).isEqualTo("b".getBytes()); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getPatterns()).isEmpty(); } @Test - public void testUnsubscribeChannelWithPatterns() { + void testUnsubscribeChannelWithPatterns() { byte[][] channel = new byte[][] { "a".getBytes() }; subscription.subscribe(channel); subscription.pSubscribe(new byte[][] { "s*".getBytes() }); @@ -109,14 +110,14 @@ public class JedisSubscriptionTests { verify(jedisPubSub, times(1)).unsubscribe(channel); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); Collection patterns = subscription.getPatterns(); - assertThat(patterns.size()).isEqualTo(1); + assertThat(patterns).hasSize(1); assertThat(patterns.iterator().next()).isEqualTo("s*".getBytes()); } @Test - public void testUnsubscribeChannelWithPatternsSomeLeft() { + void testUnsubscribeChannelWithPatternsSomeLeft() { byte[][] channel = new byte[][] { "a".getBytes() }; subscription.subscribe(new byte[][] { "a".getBytes(), "b".getBytes() }); subscription.pSubscribe(new byte[][] { "s*".getBytes() }); @@ -125,28 +126,28 @@ public class JedisSubscriptionTests { verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); Collection channels = subscription.getChannels(); - assertThat(channels.size()).isEqualTo(1); + assertThat(channels).hasSize(1); assertThat(channels.iterator().next()).isEqualTo("b".getBytes()); Collection patterns = subscription.getPatterns(); - assertThat(patterns.size()).isEqualTo(1); + assertThat(patterns).hasSize(1); assertThat(patterns.iterator().next()).isEqualTo("s*".getBytes()); } @Test - public void testUnsubscribeAllNoChannels() { + void testUnsubscribeAllNoChannels() { subscription.pSubscribe(new byte[][] { "s*".getBytes() }); subscription.unsubscribe(); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); Collection patterns = subscription.getPatterns(); - assertThat(patterns.size()).isEqualTo(1); + assertThat(patterns).hasSize(1); assertThat(patterns.iterator().next()).isEqualTo("s*".getBytes()); } @Test - public void testUnsubscribeNotAlive() { + void testUnsubscribeNotAlive() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.unsubscribe(); assertThat(subscription.isAlive()).isFalse(); @@ -155,53 +156,55 @@ public class JedisSubscriptionTests { verify(jedisPubSub, never()).punsubscribe(); } - @Test(expected = RedisInvalidSubscriptionException.class) - public void testSubscribeNotAlive() { + @Test + void testSubscribeNotAlive() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.unsubscribe(); assertThat(subscription.isAlive()).isFalse(); - subscription.subscribe(new byte[][] { "s".getBytes() }); + + assertThatExceptionOfType(RedisInvalidSubscriptionException.class) + .isThrownBy(() -> subscription.subscribe(new byte[][] { "s".getBytes() })); } @Test - public void testPUnsubscribeAllAndClose() { + void testPUnsubscribeAllAndClose() { subscription.pSubscribe(new byte[][] { "a*".getBytes() }); subscription.pUnsubscribe(); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, times(1)).punsubscribe(); assertThat(subscription.isAlive()).isFalse(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); + assertThat(subscription.getPatterns()).isEmpty(); } @Test - public void testPUnsubscribeAllPatternsWithChannels() { + void testPUnsubscribeAllPatternsWithChannels() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.pSubscribe(new byte[][] { "s*".getBytes() }); subscription.pUnsubscribe(); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, times(1)).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getPatterns()).isEmpty(); Collection channels = subscription.getChannels(); - assertThat(channels.size()).isEqualTo(1); + assertThat(channels).hasSize(1); assertThat(channels.iterator().next()).isEqualTo("a".getBytes()); } @Test - public void testPUnsubscribeAndClose() { + void testPUnsubscribeAndClose() { byte[][] pattern = new byte[][] { "a*".getBytes() }; subscription.pSubscribe(pattern); subscription.pUnsubscribe(pattern); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, times(1)).punsubscribe(pattern); assertThat(subscription.isAlive()).isFalse(); - assertThat(subscription.getChannels().isEmpty()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); + assertThat(subscription.getPatterns()).isEmpty(); } @Test - public void testPUnsubscribePatternSomeLeft() { + void testPUnsubscribePatternSomeLeft() { byte[][] patterns = new byte[][] { "a*".getBytes(), "b*".getBytes() }; subscription.pSubscribe(patterns); subscription.pUnsubscribe(new byte[][] { "a*".getBytes() }); @@ -209,13 +212,13 @@ public class JedisSubscriptionTests { verify(jedisPubSub, never()).unsubscribe(); assertThat(subscription.isAlive()).isTrue(); Collection subPatterns = subscription.getPatterns(); - assertThat(subPatterns.size()).isEqualTo(1); + assertThat(subPatterns).hasSize(1); assertThat(subPatterns.iterator().next()).isEqualTo("b*".getBytes()); - assertThat(subscription.getChannels().isEmpty()).isTrue(); + assertThat(subscription.getChannels()).isEmpty(); } @Test - public void testPUnsubscribePatternWithChannels() { + void testPUnsubscribePatternWithChannels() { byte[][] pattern = new byte[][] { "s*".getBytes() }; subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.pSubscribe(pattern); @@ -223,14 +226,14 @@ public class JedisSubscriptionTests { verify(jedisPubSub, times(1)).punsubscribe(pattern); verify(jedisPubSub, never()).unsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getPatterns()).isEmpty(); Collection channels = subscription.getChannels(); - assertThat(channels.size()).isEqualTo(1); + assertThat(channels).hasSize(1); assertThat(channels.iterator().next()).isEqualTo("a".getBytes()); } @Test - public void testUnsubscribePatternWithChannelsSomeLeft() { + void testUnsubscribePatternWithChannelsSomeLeft() { byte[][] pattern = new byte[][] { "a*".getBytes() }; subscription.pSubscribe(new byte[][] { "a*".getBytes(), "b*".getBytes() }); subscription.subscribe(new byte[][] { "a".getBytes() }); @@ -239,28 +242,28 @@ public class JedisSubscriptionTests { verify(jedisPubSub, times(1)).punsubscribe(pattern); assertThat(subscription.isAlive()).isTrue(); Collection channels = subscription.getChannels(); - assertThat(channels.size()).isEqualTo(1); + assertThat(channels).hasSize(1); assertThat(channels.iterator().next()).isEqualTo("a".getBytes()); Collection patterns = subscription.getPatterns(); - assertThat(patterns.size()).isEqualTo(1); + assertThat(patterns).hasSize(1); assertThat(patterns.iterator().next()).isEqualTo("b*".getBytes()); } @Test - public void testPUnsubscribeAllNoPatterns() { + void testPUnsubscribeAllNoPatterns() { subscription.subscribe(new byte[][] { "s".getBytes() }); subscription.pUnsubscribe(); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, never()).punsubscribe(); assertThat(subscription.isAlive()).isTrue(); - assertThat(subscription.getPatterns().isEmpty()).isTrue(); + assertThat(subscription.getPatterns()).isEmpty(); Collection channels = subscription.getChannels(); - assertThat(channels.size()).isEqualTo(1); + assertThat(channels).hasSize(1); assertThat(channels.iterator().next()).isEqualTo("s".getBytes()); } @Test - public void testPUnsubscribeNotAlive() { + void testPUnsubscribeNotAlive() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.unsubscribe(); assertThat(subscription.isAlive()).isFalse(); @@ -269,23 +272,25 @@ public class JedisSubscriptionTests { verify(jedisPubSub, never()).punsubscribe(); } - @Test(expected = RedisInvalidSubscriptionException.class) - public void testPSubscribeNotAlive() { + @Test + void testPSubscribeNotAlive() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.unsubscribe(); assertThat(subscription.isAlive()).isFalse(); - subscription.pSubscribe(new byte[][] { "s*".getBytes() }); + + assertThatExceptionOfType(RedisInvalidSubscriptionException.class) + .isThrownBy(() -> subscription.pSubscribe(new byte[][] { "s*".getBytes() })); } @Test - public void testDoCloseNotSubscribed() { + void testDoCloseNotSubscribed() { subscription.doClose(); verify(jedisPubSub, never()).unsubscribe(); verify(jedisPubSub, never()).punsubscribe(); } @Test - public void testDoCloseSubscribedChannels() { + void testDoCloseSubscribedChannels() { subscription.subscribe(new byte[][] { "a".getBytes() }); subscription.doClose(); verify(jedisPubSub, times(1)).unsubscribe(); @@ -293,7 +298,7 @@ public class JedisSubscriptionTests { } @Test - public void testDoCloseSubscribedPatterns() { + void testDoCloseSubscribedPatterns() { subscription.pSubscribe(new byte[][] { "a*".getBytes() }); subscription.doClose(); verify(jedisPubSub, never()).unsubscribe(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/ScanTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/ScanTests.java index 6c71c2fe2..4a3bb8f33 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/ScanTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/ScanTests.java @@ -33,15 +33,16 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.springframework.data.redis.ConnectionFactoryTracker; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Mark Paluch @@ -57,33 +58,21 @@ public class ScanTests { new LinkedBlockingDeque<>()); public ScanTests(RedisConnectionFactory factory) { - this.factory = factory; - ConnectionFactoryTracker.add(factory); } @Parameters public static List params() { - JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); - jedisConnectionFactory.setHostName(SettingsUtils.getHost()); - jedisConnectionFactory.setPort(SettingsUtils.getPort()); - jedisConnectionFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnectionFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnectionFactory.setHostName(SettingsUtils.getHost()); - lettuceConnectionFactory.setPort(SettingsUtils.getPort()); - lettuceConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); return Arrays. asList(jedisConnectionFactory, lettuceConnectionFactory); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java b/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java new file mode 100644 index 000000000..bacc938ec --- /dev/null +++ b/src/test/java/org/springframework/data/redis/connection/jedis/extension/JedisConnectionFactoryExtension.java @@ -0,0 +1,216 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.connection.jedis.extension; + +import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.JedisShardInfo; + +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +import org.springframework.data.redis.ConnectionFactoryTracker; +import org.springframework.data.redis.SettingsUtils; +import org.springframework.data.redis.connection.RedisClusterConfiguration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.test.extension.RedisCluster; +import org.springframework.data.redis.test.extension.RedisSentinel; +import org.springframework.data.redis.test.extension.RedisStanalone; +import org.springframework.data.redis.test.extension.ShutdownQueue; +import org.springframework.data.util.Lazy; + +/** + * JUnit {@link ParameterResolver} providing pre-cached {@link JedisConnectionFactory} instances. Connection factories + * can be qualified with {@code @RedisStanalone} (default), {@code @RedisSentinel} or {@code @RedisCluster} to obtain a + * specific factory instance. Instances are managed by this extension and will be shut down on JVM shutdown. + * + * @author Mark Paluch + * @see RedisStanalone + * @see RedisSentinel + * @see RedisCluster + */ +public class JedisConnectionFactoryExtension implements ParameterResolver { + + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace + .create(JedisConnectionFactoryExtension.class); + + private static final Lazy STANDALONE = Lazy.of(() -> { + + JedisClientConfiguration configuration = JedisClientConfiguration.builder().usePooling().build(); + + JedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.standaloneConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy SENTINEL = Lazy.of(() -> { + + JedisClientConfiguration configuration = JedisClientConfiguration.builder().usePooling().build(); + + JedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.sentinelConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy CLUSTER = Lazy.of(() -> { + + JedisClientConfiguration configuration = JedisClientConfiguration.builder().usePooling().build(); + + JedisConnectionFactory factory = new ManagedJedisConnectionFactory(SettingsUtils.clusterConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Map, Lazy> factories; + + static { + + factories = new HashMap<>(); + factories.put(RedisStanalone.class, STANDALONE); + factories.put(RedisSentinel.class, SENTINEL); + factories.put(RedisCluster.class, CLUSTER); + } + + /** + * Obtain a {@link JedisConnectionFactory} described by {@code qualifier}. Instances are managed by this extension and + * will be shut down on JVM shutdown. + * + * @param qualifier an be any of {@link RedisStanalone}, {@link RedisSentinel}, {@link RedisCluster}. + * @return the managed {@link JedisConnectionFactory}. + */ + public static JedisConnectionFactory getConnectionFactory(Class qualifier) { + return factories.get(qualifier).get(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return RedisConnectionFactory.class.isAssignableFrom(parameterContext.getParameter().getType()); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + + ExtensionContext.Store store = extensionContext.getStore(NAMESPACE); + + Class qualifier = getQualifier(parameterContext); + + return store.getOrComputeIfAbsent(qualifier, JedisConnectionFactoryExtension::getConnectionFactory); + } + + private static Class getQualifier(ParameterContext parameterContext) { + + if (parameterContext.isAnnotated(RedisSentinel.class)) { + return RedisSentinel.class; + } + + if (parameterContext.isAnnotated(RedisCluster.class)) { + return RedisCluster.class; + } + + return RedisStanalone.class; + } + + static class ManagedJedisConnectionFactory extends JedisConnectionFactory + implements ConnectionFactoryTracker.Managed { + + public ManagedJedisConnectionFactory() { + super(); + } + + public ManagedJedisConnectionFactory(JedisShardInfo shardInfo) { + super(shardInfo); + } + + public ManagedJedisConnectionFactory(JedisPoolConfig poolConfig) { + super(poolConfig); + } + + public ManagedJedisConnectionFactory(RedisSentinelConfiguration sentinelConfig) { + super(sentinelConfig); + } + + public ManagedJedisConnectionFactory(RedisSentinelConfiguration sentinelConfig, JedisPoolConfig poolConfig) { + super(sentinelConfig, poolConfig); + } + + public ManagedJedisConnectionFactory(RedisClusterConfiguration clusterConfig) { + super(clusterConfig); + } + + public ManagedJedisConnectionFactory(RedisClusterConfiguration clusterConfig, JedisPoolConfig poolConfig) { + super(clusterConfig, poolConfig); + } + + public ManagedJedisConnectionFactory(RedisStandaloneConfiguration standaloneConfig) { + super(standaloneConfig); + } + + public ManagedJedisConnectionFactory(RedisStandaloneConfiguration standaloneConfig, + JedisClientConfiguration clientConfig) { + super(standaloneConfig, clientConfig); + } + + public ManagedJedisConnectionFactory(RedisSentinelConfiguration sentinelConfig, + JedisClientConfiguration clientConfig) { + super(sentinelConfig, clientConfig); + } + + public ManagedJedisConnectionFactory(RedisClusterConfiguration clusterConfig, + JedisClientConfiguration clientConfig) { + super(clusterConfig, clientConfig); + } + + @Override + public String toString() { + + StringBuilder builder = new StringBuilder("Jedis"); + + if (isRedisClusterAware()) { + builder.append(" Cluster"); + } + + if (isRedisSentinelAware()) { + builder.append(" Sentinel"); + } + + if (getUsePool()) { + builder.append(" [pool]"); + } + + return builder.toString(); + } + } +} diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java index 02ad4b1ec..f4801b379 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/DefaultLettucePoolTests.java @@ -33,6 +33,7 @@ import org.junit.Test; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.PoolException; import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; /** * Unit test of {@link DefaultLettucePool} diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceAclIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceAclIntegrationTests.java index 9b2bf508f..ec6d76723 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceAclIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceAclIntegrationTests.java @@ -33,6 +33,7 @@ import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSentinelConnection; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.RedisStaticMasterReplicaConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.data.redis.test.util.ServerAvailable; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java index c10cd5e6e..1fa652205 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfigurationUnitTests.java @@ -25,6 +25,8 @@ import java.time.Duration; import org.junit.Test; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; + /** * Unit tests for {@link LettuceClientConfiguration}. * diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java index e88782d16..3ccebbb5e 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java @@ -25,8 +25,6 @@ import static org.springframework.data.redis.connection.RedisGeoCommands.Distanc import static org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs.*; import static org.springframework.data.redis.core.ScanOptions.*; -import io.lettuce.core.RedisURI.Builder; -import io.lettuce.core.api.sync.RedisHLLCommands; import io.lettuce.core.cluster.RedisClusterClient; import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; import io.lettuce.core.codec.ByteArrayCodec; @@ -37,11 +35,12 @@ import java.util.*; import java.util.concurrent.TimeUnit; import org.assertj.core.data.Offset; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Range.Bound; import org.springframework.data.geo.Circle; @@ -58,77 +57,91 @@ import org.springframework.data.redis.connection.RedisZSetCommands.Range; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.connection.ValueEncoding.RedisValueEncoding; import org.springframework.data.redis.connection.jedis.JedisConverters; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.types.Expiration; +import org.springframework.data.redis.test.condition.EnabledOnRedisClusterAvailable; +import org.springframework.data.redis.test.extension.LettuceExtension; +import org.springframework.data.redis.test.extension.RedisCluster; import org.springframework.data.redis.test.util.HexStringUtils; -import org.springframework.data.redis.test.util.MinimumRedisVersionRule; -import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.test.annotation.IfProfileValue; /** * @author Christoph Strobl * @author Mark Paluch */ +@SuppressWarnings("deprecation") +@EnabledOnRedisClusterAvailable +@ExtendWith(LettuceExtension.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class LettuceClusterConnectionTests implements ClusterConnectionTests { - static final byte[] KEY_1_BYTES = LettuceConverters.toBytes(KEY_1); - static final byte[] KEY_2_BYTES = LettuceConverters.toBytes(KEY_2); - static final byte[] KEY_3_BYTES = LettuceConverters.toBytes(KEY_3); + private static final byte[] KEY_1_BYTES = LettuceConverters.toBytes(KEY_1); + private static final byte[] KEY_2_BYTES = LettuceConverters.toBytes(KEY_2); + private static final byte[] KEY_3_BYTES = LettuceConverters.toBytes(KEY_3); - static final byte[] SAME_SLOT_KEY_1_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_1); - static final byte[] SAME_SLOT_KEY_2_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_2); - static final byte[] SAME_SLOT_KEY_3_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_3); + private static final byte[] SAME_SLOT_KEY_1_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_1); + private static final byte[] SAME_SLOT_KEY_2_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_2); + private static final byte[] SAME_SLOT_KEY_3_BYTES = LettuceConverters.toBytes(SAME_SLOT_KEY_3); - static final byte[] VALUE_1_BYTES = LettuceConverters.toBytes(VALUE_1); - static final byte[] VALUE_2_BYTES = LettuceConverters.toBytes(VALUE_2); - static final byte[] VALUE_3_BYTES = LettuceConverters.toBytes(VALUE_3); + private static final byte[] VALUE_1_BYTES = LettuceConverters.toBytes(VALUE_1); + private static final byte[] VALUE_2_BYTES = LettuceConverters.toBytes(VALUE_2); + private static final byte[] VALUE_3_BYTES = LettuceConverters.toBytes(VALUE_3); - static final GeoLocation ARIGENTO = new GeoLocation<>("arigento", POINT_ARIGENTO); - static final GeoLocation CATANIA = new GeoLocation<>("catania", POINT_CATANIA); - static final GeoLocation PALERMO = new GeoLocation<>("palermo", POINT_PALERMO); + private static final GeoLocation ARIGENTO = new GeoLocation<>("arigento", POINT_ARIGENTO); + private static final GeoLocation CATANIA = new GeoLocation<>("catania", POINT_CATANIA); + private static final GeoLocation PALERMO = new GeoLocation<>("palermo", POINT_PALERMO); - static final GeoLocation ARIGENTO_BYTES = new GeoLocation<>("arigento".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation ARIGENTO_BYTES = new GeoLocation<>( + "arigento".getBytes(Charset.forName("UTF-8")), POINT_ARIGENTO); - static final GeoLocation CATANIA_BYTES = new GeoLocation<>("catania".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation CATANIA_BYTES = new GeoLocation<>( + "catania".getBytes(Charset.forName("UTF-8")), POINT_CATANIA); - static final GeoLocation PALERMO_BYTES = new GeoLocation<>("palermo".getBytes(Charset.forName("UTF-8")), + private static final GeoLocation PALERMO_BYTES = new GeoLocation<>( + "palermo".getBytes(Charset.forName("UTF-8")), POINT_PALERMO); - RedisClusterClient client; - RedisAdvancedClusterCommands nativeConnection; - RedisAdvancedClusterCommands binaryConnection; - LettuceClusterConnection clusterConnection; + private final RedisClusterClient client; - public static @ClassRule RedisClusterRule clusterAvailable = new RedisClusterRule(); + private static RedisAdvancedClusterCommands nativeConnection; + private static RedisAdvancedClusterCommands binaryConnection; + private static LettuceClusterConnection clusterConnection; - /** - * Check for specific Redis Versions - */ - public @Rule MinimumRedisVersionRule version = new MinimumRedisVersionRule(); - - @Before - public void setUp() { - - client = RedisClusterClient.create(LettuceTestClientResources.getSharedClientResources(), - Builder.redis(CLUSTER_HOST, MASTER_NODE_1_PORT).withTimeout(Duration.ofMillis(500)).build()); + public LettuceClusterConnectionTests(RedisClusterClient client) { + this.client = client; nativeConnection = client.connect().sync(); binaryConnection = client.connect(ByteArrayCodec.INSTANCE).sync(); clusterConnection = new LettuceClusterConnection(client); } - @After - public void tearDown() throws InterruptedException { + @BeforeEach + void setUp() { + nativeConnection.getStatefulConnection().async().flushallAsync(); + } - clusterConnection.serverCommands().flushDb(); - nativeConnection.getStatefulConnection().close(); - binaryConnection.getStatefulConnection().close(); - clusterConnection.close(); - client.shutdown(0, 0, TimeUnit.MILLISECONDS); + @AfterAll + static void afterAll() { + + if (nativeConnection != null) { + nativeConnection.getStatefulConnection().closeAsync(); + nativeConnection = null; + } + + if (binaryConnection != null) { + binaryConnection.getStatefulConnection().closeAsync(); + binaryConnection = null; + } + + if (clusterConnection != null) { + clusterConnection.close(); + clusterConnection = null; + } } @Test // DATAREDIS-775 - public void shouldCreateConnectionWithPooling() { + void shouldCreateConnectionWithPooling() { LettuceConnectionFactory factory = createConnectionFactory(); factory.afterPropertiesSet(); @@ -142,7 +155,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-775 - public void shouldCreateClusterConnectionWithPooling() { + void shouldCreateClusterConnectionWithPooling() { LettuceConnectionFactory factory = createConnectionFactory(); factory.afterPropertiesSet(); @@ -156,16 +169,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } private static LettuceConnectionFactory createConnectionFactory() { - - LettucePoolingClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder() // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .shutdownTimeout(Duration.ZERO) // - .build(); - - RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); - clusterConfiguration.addClusterNode(ClusterTestVariables.CLUSTER_NODE_1); - - return new LettuceConnectionFactory(clusterConfiguration, clientConfiguration); + return LettuceConnectionFactoryExtension.getConnectionFactory(RedisCluster.class); } @Test // DATAREDIS-315 @@ -223,7 +227,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-315 - public void bitOpShouldWorkCorrectly() { + void bitOpShouldWorkCorrectly() { nativeConnection.set(SAME_SLOT_KEY_1, "foo"); nativeConnection.set(SAME_SLOT_KEY_2, "bar"); @@ -239,7 +243,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2); nativeConnection.lpush(KEY_2, VALUE_3); - assertThat(clusterConnection.bLPop(100, KEY_1_BYTES, KEY_2_BYTES).size()).isEqualTo(2); + assertThat(clusterConnection.bLPop(100, KEY_1_BYTES, KEY_2_BYTES)).hasSize(2); } @Test // DATAREDIS-315 @@ -248,7 +252,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); nativeConnection.lpush(SAME_SLOT_KEY_2, VALUE_3); - assertThat(clusterConnection.bLPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES).size()).isEqualTo(2); + assertThat(clusterConnection.bLPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES)).hasSize(2); } @Test // DATAREDIS-315 @@ -257,7 +261,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2); nativeConnection.lpush(KEY_2, VALUE_3); - assertThat(clusterConnection.bRPop(100, KEY_1_BYTES, KEY_2_BYTES).size()).isEqualTo(2); + assertThat(clusterConnection.bRPop(100, KEY_1_BYTES, KEY_2_BYTES)).hasSize(2); } @Test // DATAREDIS-315 @@ -266,7 +270,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); nativeConnection.lpush(SAME_SLOT_KEY_2, VALUE_3); - assertThat(clusterConnection.bRPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES).size()).isEqualTo(2); + assertThat(clusterConnection.bRPop(100, SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES)).hasSize(2); } @Test // DATAREDIS-315 @@ -280,7 +284,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { Map> masterSlaveMap = clusterConnection.clusterGetMasterSlaveMap(); assertThat(masterSlaveMap).isNotNull(); - assertThat(masterSlaveMap.size()).isEqualTo(3); + assertThat(masterSlaveMap).hasSize(3); assertThat(masterSlaveMap.get(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT))) .contains(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT)); assertThat(masterSlaveMap.get(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_2_PORT)).isEmpty()).isTrue(); @@ -293,7 +297,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { Set slaves = clusterConnection .clusterGetSlaves(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)); - assertThat(slaves.size()).isEqualTo(1); + assertThat(slaves).hasSize(1); assertThat(slaves).contains(new RedisClusterNode(CLUSTER_HOST, SLAVEOF_NODE_1_PORT)); } @@ -450,7 +454,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.expireAt(KEY_1_BYTES, System.currentTimeMillis() / 1000 + 5000); - assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -460,7 +464,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.expire(KEY_1_BYTES, 5); - assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -548,7 +552,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { List result = clusterConnection.geoHash(KEY_1_BYTES, PALERMO_BYTES.getName(), ARIGENTO_BYTES.getName(), CATANIA_BYTES.getName()); - assertThat(result).containsExactly("sqc8b49rny0", (String) null, "sqdtr74hyu0"); + assertThat(result).containsExactly("sqc8b49rny0", null, "sqdtr74hyu0"); } @Test // DATAREDIS-438 @@ -1245,7 +1249,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pExpireAt(KEY_1_BYTES, System.currentTimeMillis() + 5000); - assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1255,7 +1259,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pExpire(KEY_1_BYTES, 5000); - assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES)) > 1).isTrue(); + assertThat(nativeConnection.ttl(LettuceConverters.toString(KEY_1_BYTES))).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1264,7 +1268,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pSetEx(KEY_1_BYTES, 5000, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1)).isEqualTo(VALUE_1); - assertThat(nativeConnection.ttl(KEY_1) > 1).isTrue(); + assertThat(nativeConnection.ttl(KEY_1)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1273,7 +1277,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); - assertThat(clusterConnection.pTtl(KEY_1_BYTES) > 1).isTrue(); + assertThat(clusterConnection.pTtl(KEY_1_BYTES)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1308,14 +1312,14 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.pfAdd(KEY_1_BYTES, VALUE_1_BYTES, VALUE_2_BYTES, VALUE_3_BYTES); - assertThat(((RedisHLLCommands) nativeConnection).pfcount(KEY_1)).isEqualTo(3L); + assertThat(nativeConnection.pfcount(KEY_1)).isEqualTo(3L); } @Test // DATAREDIS-315 public void pfCountShouldAllowCountingOnSameSlotKeys() { - ((RedisHLLCommands) nativeConnection).pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); - ((RedisHLLCommands) nativeConnection).pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); + nativeConnection.pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); + nativeConnection.pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); assertThat(clusterConnection.pfCount(SAME_SLOT_KEY_1_BYTES, SAME_SLOT_KEY_2_BYTES)).isEqualTo(3L); } @@ -1323,18 +1327,19 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void pfCountShouldAllowCountingOnSingleKey() { - ((RedisHLLCommands) nativeConnection).pfadd(KEY_1, VALUE_1, VALUE_2, VALUE_3); + nativeConnection.pfadd(KEY_1, VALUE_1, VALUE_2, VALUE_3); assertThat(clusterConnection.pfCount(KEY_1_BYTES)).isEqualTo(3L); } - @Test(expected = DataAccessException.class) // DATAREDIS-315 + @Test // DATAREDIS-315 public void pfCountShouldThrowErrorCountingOnDifferentSlotKeys() { - ((RedisHLLCommands) nativeConnection).pfadd(KEY_1, VALUE_1, VALUE_2); - ((RedisHLLCommands) nativeConnection).pfadd(KEY_2, VALUE_2, VALUE_3); + nativeConnection.pfadd(KEY_1, VALUE_1, VALUE_2); + nativeConnection.pfadd(KEY_2, VALUE_2, VALUE_3); - clusterConnection.pfCount(KEY_1_BYTES, KEY_2_BYTES); + assertThatExceptionOfType(DataAccessException.class) + .isThrownBy(() -> clusterConnection.pfCount(KEY_1_BYTES, KEY_2_BYTES)); } @Test // DATAREDIS-315 @@ -1346,12 +1351,12 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-315 public void pfMergeShouldWorkWhenAllKeysMapToSameSlot() { - ((RedisHLLCommands) nativeConnection).pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); - ((RedisHLLCommands) nativeConnection).pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); + nativeConnection.pfadd(SAME_SLOT_KEY_1, VALUE_1, VALUE_2); + nativeConnection.pfadd(SAME_SLOT_KEY_2, VALUE_2, VALUE_3); - ((RedisHLLCommands) nativeConnection).pfmerge(SAME_SLOT_KEY_3, SAME_SLOT_KEY_1, SAME_SLOT_KEY_2); + nativeConnection.pfmerge(SAME_SLOT_KEY_3, SAME_SLOT_KEY_1, SAME_SLOT_KEY_2); - assertThat(((RedisHLLCommands) nativeConnection).pfcount(SAME_SLOT_KEY_3)).isEqualTo(3L); + assertThat(nativeConnection.pfcount(SAME_SLOT_KEY_3)).isEqualTo(3L); } @Test // DATAREDIS-315 @@ -1376,7 +1381,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(KEY_1, VALUE_1, VALUE_2); nativeConnection.lpush(KEY_2, VALUE_3); - assertThat(clusterConnection.bLPop(100, KEY_1_BYTES, KEY_2_BYTES).size()).isEqualTo(2); + assertThat(clusterConnection.bLPop(100, KEY_1_BYTES, KEY_2_BYTES)).hasSize(2); } @Test // DATAREDIS-315 @@ -1649,7 +1654,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-668 - public void sPopWithCountShouldPopValueFromSetCorrectly() { + void sPopWithCountShouldPopValueFromSetCorrectly() { nativeConnection.sadd(KEY_1, VALUE_1, VALUE_2, VALUE_3); @@ -1751,7 +1756,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { clusterConnection.setEx(KEY_1_BYTES, 5, VALUE_1_BYTES); assertThat(nativeConnection.get(KEY_1)).isEqualTo(VALUE_1); - assertThat(nativeConnection.ttl(KEY_1) > 1).isTrue(); + assertThat(nativeConnection.ttl(KEY_1)).isGreaterThan(1); } @Test // DATAREDIS-315 @@ -1941,11 +1946,11 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.expire(KEY_1, 5); - assertThat(clusterConnection.ttl(KEY_1_BYTES) > 1).isTrue(); + assertThat(clusterConnection.ttl(KEY_1_BYTES)).isGreaterThan(1); } @Test // DATAREDIS-526 - public void ttlWithTimeUnitShouldReturnMinusOneWhenKeyDoesNotHaveExpirationSet() { + void ttlWithTimeUnitShouldReturnMinusOneWhenKeyDoesNotHaveExpirationSet() { nativeConnection.set(KEY_1, VALUE_1); @@ -1980,7 +1985,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-674 - public void zAddShouldAddMultipleValuesWithScoreCorrectly() { + void zAddShouldAddMultipleValuesWithScoreCorrectly() { Set tuples = new HashSet<>(); tuples.add(new DefaultTuple(VALUE_1_BYTES, 10D)); @@ -2113,7 +2118,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRangeByScoreWithScores(KEY_1_BYTES, 10, 20)) - .contains((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D), (Tuple) new DefaultTuple(VALUE_2_BYTES, 20D)); + .contains(new DefaultTuple(VALUE_1_BYTES, 10D), new DefaultTuple(VALUE_2_BYTES, 20D)); } @Test // DATAREDIS-315 @@ -2124,7 +2129,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D, 0L, 1L)) - .contains((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D)); + .contains(new DefaultTuple(VALUE_1_BYTES, 10D)); } @Test // DATAREDIS-315 @@ -2145,7 +2150,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRangeWithScores(KEY_1_BYTES, 1, 2)) - .contains((Tuple) new DefaultTuple(VALUE_1_BYTES, 10D), (Tuple) new DefaultTuple(VALUE_2_BYTES, 20D)); + .contains(new DefaultTuple(VALUE_1_BYTES, 10D), new DefaultTuple(VALUE_2_BYTES, 20D)); } @Test // DATAREDIS-315 @@ -2231,7 +2236,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRevRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D)) - .contains((Tuple) new DefaultTuple(VALUE_2_BYTES, 20D), (Tuple) new DefaultTuple(VALUE_1_BYTES, 10D)); + .contains(new DefaultTuple(VALUE_2_BYTES, 20D), new DefaultTuple(VALUE_1_BYTES, 10D)); } @Test // DATAREDIS-315 @@ -2242,7 +2247,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRevRangeByScoreWithScores(KEY_1_BYTES, 10D, 20D, 0L, 1L)) - .contains((Tuple) new DefaultTuple(VALUE_2_BYTES, 20D)); + .contains(new DefaultTuple(VALUE_2_BYTES, 20D)); } @Test // DATAREDIS-315 @@ -2263,7 +2268,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.zadd(KEY_1, 5D, VALUE_3); assertThat(clusterConnection.zRevRangeWithScores(KEY_1_BYTES, 1, 2)) - .contains((Tuple) new DefaultTuple(VALUE_3_BYTES, 5D), (Tuple) new DefaultTuple(VALUE_1_BYTES, 10D)); + .contains(new DefaultTuple(VALUE_3_BYTES, 5D), new DefaultTuple(VALUE_1_BYTES, 10D)); } @Test @@ -2314,7 +2319,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-694 - public void touchReturnsNrOfKeysTouched() { + void touchReturnsNrOfKeysTouched() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_1); @@ -2323,12 +2328,12 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-694 - public void touchReturnsZeroIfNoKeysTouched() { + void touchReturnsZeroIfNoKeysTouched() { assertThat(clusterConnection.keyCommands().touch(KEY_1_BYTES)).isEqualTo(0L); } @Test // DATAREDIS-693 - public void unlinkReturnsNrOfKeysTouched() { + void unlinkReturnsNrOfKeysTouched() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.set(KEY_2, VALUE_1); @@ -2337,12 +2342,12 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-693 - public void unlinkReturnsZeroIfNoKeysTouched() { + void unlinkReturnsZeroIfNoKeysTouched() { assertThat(clusterConnection.keyCommands().unlink(KEY_1_BYTES)).isEqualTo(0L); } @Test // DATAREDIS-697 - public void bitPosShouldReturnPositionCorrectly() { + void bitPosShouldReturnPositionCorrectly() { binaryConnection.set(KEY_1_BYTES, HexStringUtils.hexToBytes("fff000")); @@ -2350,7 +2355,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-697 - public void bitPosShouldReturnPositionInRangeCorrectly() { + void bitPosShouldReturnPositionInRangeCorrectly() { binaryConnection.set(KEY_1_BYTES, HexStringUtils.hexToBytes("fff0f0")); @@ -2359,7 +2364,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void encodingReturnsCorrectly() { + void encodingReturnsCorrectly() { nativeConnection.set(KEY_1, "1000"); @@ -2367,12 +2372,12 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void encodingReturnsVacantWhenKeyDoesNotExist() { + void encodingReturnsVacantWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().encodingOf(KEY_2_BYTES)).isEqualTo(RedisValueEncoding.VACANT); } @Test // DATAREDIS-716 - public void idletimeReturnsCorrectly() { + void idletimeReturnsCorrectly() { nativeConnection.set(KEY_1, VALUE_1); nativeConnection.get(KEY_1); @@ -2381,12 +2386,12 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void idldetimeReturnsNullWhenKeyDoesNotExist() { + void idldetimeReturnsNullWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().idletime(KEY_3_BYTES)).isNull(); } @Test // DATAREDIS-716 - public void refcountReturnsCorrectly() { + void refcountReturnsCorrectly() { nativeConnection.lpush(KEY_1, VALUE_1); @@ -2394,13 +2399,13 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-716 - public void refcountReturnsNullWhenKeyDoesNotExist() { + void refcountReturnsNullWhenKeyDoesNotExist() { assertThat(clusterConnection.keyCommands().refcount(KEY_3_BYTES)).isNull(); } @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldSetShouldWorkCorrectly() { + void bitFieldSetShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().set(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)).to(10L))).containsExactly(0L); @@ -2410,7 +2415,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldGetShouldWorkCorrectly() { + void bitFieldGetShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().get(INT_8).valueAt(BitFieldSubCommands.Offset.offset(0L)))).containsExactly(0L); @@ -2418,7 +2423,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldIncrByShouldWorkCorrectly() { + void bitFieldIncrByShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(INT_8).valueAt(BitFieldSubCommands.Offset.offset(100L)).by(1L))).containsExactly(1L); @@ -2426,7 +2431,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitFieldIncrByWithOverflowShouldWorkCorrectly() { + void bitFieldIncrByWithOverflowShouldWorkCorrectly() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(unsigned(2)).valueAt(BitFieldSubCommands.Offset.offset(102L)).overflow(FAIL).by(1L))) @@ -2443,7 +2448,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitfieldShouldAllowMultipleSubcommands() { + void bitfieldShouldAllowMultipleSubcommands() { assertThat(clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), create().incr(signed(5)).valueAt(BitFieldSubCommands.Offset.offset(100L)).by(1L).get(unsigned(4)).valueAt(0L))) @@ -2452,7 +2457,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // DATAREDIS-562 @IfProfileValue(name = "redisVersion", value = "3.2+") - public void bitfieldShouldWorkUsingNonZeroBasedOffset() { + void bitfieldShouldWorkUsingNonZeroBasedOffset() { assertThat( clusterConnection.stringCommands().bitField(JedisConverters.toBytes(KEY_1), @@ -2468,7 +2473,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { } @Test // DATAREDIS-1103 - public void setKeepTTL() { + void setKeepTTL() { long expireSeconds = 10; nativeConnection.setex(KEY_1, expireSeconds, VALUE_1); diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyspaceNotificationsTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyspaceNotificationsTests.java index 432b63022..69ac4aff2 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyspaceNotificationsTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyspaceNotificationsTests.java @@ -43,6 +43,7 @@ import org.springframework.data.redis.connection.ClusterTopologyProvider; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.connection.RedisClusterConnection; import org.springframework.data.redis.connection.RedisConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.lang.Nullable; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java index 0c9974477..1ade22808 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java @@ -48,6 +48,7 @@ import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.RedisStaticMasterReplicaConfiguration; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; /** * Integration test of {@link LettuceConnectionFactory} diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java index a3761c81a..b73f7e95c 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import static org.springframework.data.redis.connection.ClusterTestVariables.*; import static org.springframework.data.redis.connection.RedisConfiguration.*; -import static org.springframework.data.redis.connection.lettuce.LettuceTestClientResources.*; +import static org.springframework.data.redis.test.extension.LettuceTestClientResources.*; import static org.springframework.test.util.ReflectionTestUtils.*; import io.lettuce.core.AbstractRedisClient; @@ -59,6 +59,7 @@ import org.springframework.data.redis.connection.RedisPassword; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSocketConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.test.util.ReflectionTestUtils; /** diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java index 78f9822bd..d5635eecf 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java @@ -41,6 +41,7 @@ import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.ReturnType; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.test.util.RedisSentinelRule; import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; import org.springframework.data.redis.test.util.RequiresRedisSentinel; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineIntegrationTests.java index 0f6bd59f8..4afc92f1a 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineIntegrationTests.java @@ -17,7 +17,6 @@ package org.springframework.data.redis.connection.lettuce; import static org.assertj.core.api.Assertions.*; import static org.junit.Assume.*; -import static org.springframework.data.redis.SpinBarrier.*; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; @@ -33,6 +32,7 @@ import org.springframework.data.redis.connection.AbstractConnectionPipelineInteg import org.springframework.data.redis.connection.DefaultStringRedisConnection; import org.springframework.data.redis.connection.ReturnType; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; import org.springframework.test.annotation.IfProfileValue; import org.springframework.test.context.ContextConfiguration; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java index ead817d6f..5e57811c4 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java @@ -33,37 +33,31 @@ import org.springframework.test.annotation.IfProfileValue; public class LettuceConnectionPipelineTxIntegrationTests extends LettuceConnectionTransactionIntegrationTests { @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaNotFound() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testEvalShaNotFound()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalReturnSingleError() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testEvalReturnSingleError()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreBadData() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testRestoreBadData()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testRestoreExistingKey() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testRestoreExistingKey()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalArrayScriptError() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testEvalArrayScriptError()); } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayError() { assertThatExceptionOfType(RedisPipelineException.class).isThrownBy(() -> super.testEvalShaArrayError()); } diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionTransactionIntegrationTests.java index c6980ec71..3e314fe58 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionTransactionIntegrationTests.java @@ -25,6 +25,7 @@ import org.junit.runner.RunWith; import org.springframework.data.redis.connection.AbstractConnectionTransactionIntegrationTests; import org.springframework.data.redis.connection.DefaultStringRedisConnection; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTestSuite.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTests.java similarity index 86% rename from src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTestSuite.java rename to src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTests.java index 0f3c7f59d..b1ae60b9f 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTestSuite.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionUnitTests.java @@ -30,18 +30,14 @@ import java.lang.reflect.InvocationTargetException; import java.time.Duration; import java.util.Collections; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.data.redis.connection.AbstractConnectionUnitTestBase; import org.springframework.data.redis.connection.RedisServerCommands.ShutdownOption; import org.springframework.data.redis.connection.RedisStreamCommands.XAddOptions; import org.springframework.data.redis.connection.RedisStreamCommands.XClaimOptions; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionUnitTestSuite.LettuceConnectionUnitTests; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionUnitTestSuite.LettucePipelineConnectionUnitTests; import org.springframework.data.redis.connection.stream.MapRecord; import org.springframework.test.util.ReflectionTestUtils; @@ -49,21 +45,19 @@ import org.springframework.test.util.ReflectionTestUtils; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(Suite.class) -@Suite.SuiteClasses({ LettuceConnectionUnitTests.class, LettucePipelineConnectionUnitTests.class }) -public class LettuceConnectionUnitTestSuite { +public class LettuceConnectionUnitTests { @SuppressWarnings("rawtypes") - public static class LettuceConnectionUnitTests extends AbstractConnectionUnitTestBase { + public static class BasicUnitTests extends AbstractConnectionUnitTestBase { protected LettuceConnection connection; private RedisClient clientMock; - protected StatefulRedisConnection statefulConnectionMock; - protected RedisAsyncCommands asyncCommandsMock; - protected RedisCommands syncCommandsMock; + StatefulRedisConnection statefulConnectionMock; + RedisAsyncCommands asyncCommandsMock; + RedisCommands syncCommandsMock; @SuppressWarnings({ "unchecked" }) - @Before + @BeforeEach public void setUp() throws InvocationTargetException, IllegalAccessException { clientMock = mock(RedisClient.class); @@ -115,7 +109,7 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-277 - public void slaveOfShouldThrowExectpionWhenCalledForNullHost() { + void slaveOfShouldThrowExectpionWhenCalledForNullHost() { assertThatIllegalArgumentException().isThrownBy(() -> connection.slaveOf(null, 0)); } @@ -134,22 +128,23 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-348 - public void shouldThrowExceptionWhenAccessingRedisSentinelsCommandsWhenNoSentinelsConfigured() { + void shouldThrowExceptionWhenAccessingRedisSentinelsCommandsWhenNoSentinelsConfigured() { assertThatExceptionOfType(InvalidDataAccessResourceUsageException.class) .isThrownBy(() -> connection.getSentinelConnection()); } @Test // DATAREDIS-431 - public void dbIndexShouldBeSetWhenObtainingConnection() { + void dbIndexShouldBeSetWhenObtainingConnection() { - connection = new LettuceConnection(null, 0, clientMock, null, 1); + connection = new LettuceConnection(null, 0, clientMock, null, 0); + connection.select(1); connection.getNativeConnection(); verify(syncCommandsMock, times(1)).select(1); } @Test // DATAREDIS-603 - public void translatesUnknownExceptions() { + void translatesUnknownExceptions() { IllegalArgumentException exception = new IllegalArgumentException("Aw, snap!"); @@ -161,7 +156,7 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-603 - public void translatesPipelineUnknownExceptions() throws Exception { + void translatesPipelineUnknownExceptions() throws Exception { IllegalArgumentException exception = new IllegalArgumentException("Aw, snap!"); @@ -174,7 +169,7 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-1122 - public void xaddShouldHonorMaxlen() { + void xaddShouldHonorMaxlen() { MapRecord record = MapRecord.create("key".getBytes(), Collections.emptyMap()); @@ -190,7 +185,7 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-1226 - public void xClaimShouldNotAddJustIdFlagToArgs() { + void xClaimShouldNotAddJustIdFlagToArgs() { connection.streamCommands().xClaim("key".getBytes(), "group", "owner", XClaimOptions.minIdle(Duration.ofMillis(100)).ids("1-1")); @@ -207,7 +202,7 @@ public class LettuceConnectionUnitTestSuite { } @Test // DATAREDIS-1226 - public void xClaimJustIdShouldAddJustIdFlagToArgs() { + void xClaimJustIdShouldAddJustIdFlagToArgs() { connection.streamCommands().xClaimJustId("key".getBytes(), "group", "owner", XClaimOptions.minIdle(Duration.ofMillis(100)).ids("1-1")); @@ -223,10 +218,10 @@ public class LettuceConnectionUnitTestSuite { } } - public static class LettucePipelineConnectionUnitTests extends LettuceConnectionUnitTests { + public static class LettucePipelineConnectionUnitTests extends BasicUnitTests { @Override - @Before + @BeforeEach public void setUp() throws InvocationTargetException, IllegalAccessException { super.setUp(); this.connection.openPipeline(); diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingClientConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingClientConfigurationUnitTests.java index ed2440219..9c8650c84 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingClientConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettucePoolingClientConfigurationUnitTests.java @@ -27,6 +27,8 @@ import java.time.Duration; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.junit.Test; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; + /** * Unit tests for {@link LettucePoolingClientConfiguration}. * diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisClusterConnectionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisClusterConnectionUnitTests.java index a11f46a46..8caba340a 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisClusterConnectionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisClusterConnectionUnitTests.java @@ -15,13 +15,12 @@ */ package org.springframework.data.redis.connection.lettuce; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.springframework.data.redis.connection.ClusterTestVariables.*; -import io.lettuce.core.ConnectionFuture; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.reactive.RedisReactiveCommands; import io.lettuce.core.cluster.RedisClusterClient; @@ -33,11 +32,14 @@ import reactor.test.StepVerifier; import java.nio.ByteBuffer; import java.util.concurrent.CompletableFuture; -import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + import org.springframework.data.redis.connection.RedisClusterNode; import org.springframework.data.redis.connection.lettuce.LettuceConnectionProvider.TargetAware; @@ -46,7 +48,8 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionProvid * * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) public class LettuceReactiveRedisClusterConnectionUnitTests { static final RedisClusterNode NODE1 = new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT); @@ -59,7 +62,7 @@ public class LettuceReactiveRedisClusterConnectionUnitTests { @Mock RedisReactiveCommands reactiveNodeCommands; @Mock(extraInterfaces = TargetAware.class) LettuceConnectionProvider connectionProvider; - @Before + @BeforeEach public void before() { when(connectionProvider.getConnectionAsync(any())).thenReturn(CompletableFuture.completedFuture(sharedConnection)); diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveScriptingCommandsTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveScriptingCommandsTests.java index 90e999156..565edfd67 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveScriptingCommandsTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveScriptingCommandsTests.java @@ -15,12 +15,9 @@ */ package org.springframework.data.redis.connection.lettuce; -import static org.assertj.core.api.Assertions.*; import static org.junit.Assume.*; -import static org.springframework.data.redis.SpinBarrier.*; import io.lettuce.core.ScriptOutputType; -import org.awaitility.Awaitility; import reactor.test.StepVerifier; import java.nio.ByteBuffer; @@ -29,6 +26,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import org.awaitility.Awaitility; import org.junit.Test; import org.springframework.data.redis.RedisSystemException; diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java index 2ad695344..ef04db625 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceSentinelIntegrationTests.java @@ -42,6 +42,9 @@ import org.springframework.data.redis.connection.RedisSentinelConfiguration; import org.springframework.data.redis.connection.RedisSentinelConnection; import org.springframework.data.redis.connection.RedisServer; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisSentinel; import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.data.redis.test.util.RedisSentinelRule; @@ -76,7 +79,6 @@ public class LettuceSentinelIntegrationTests extends AbstractConnectionIntegrati public LettuceSentinelIntegrationTests(LettuceConnectionFactory connectionFactory, String displayName) { this.connectionFactory = connectionFactory; - ConnectionFactoryTracker.add(connectionFactory); } @Parameters(name = "{1}") @@ -84,17 +86,10 @@ public class LettuceSentinelIntegrationTests extends AbstractConnectionIntegrati List parameters = new ArrayList<>(); - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(SENTINEL_CONFIG); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnectionFactory.setShareNativeConnection(false); - lettuceConnectionFactory.setShutdownTimeout(0); - lettuceConnectionFactory.afterPropertiesSet(); - - LettuceConnectionFactory pooledConnectionFactory = new LettuceConnectionFactory(SENTINEL_CONFIG, - LettucePoolingClientConfiguration.builder() - .clientResources(LettuceTestClientResources.getSharedClientResources()).build()); - pooledConnectionFactory.setShareNativeConnection(false); - pooledConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisSentinel.class, false); + LettuceConnectionFactory pooledConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisSentinel.class, true); parameters.add(new Object[] { lettuceConnectionFactory, "Sentinel" }); parameters.add(new Object[] { pooledConnectionFactory, "Sentinel/Pooled" }); @@ -116,11 +111,6 @@ public class LettuceSentinelIntegrationTests extends AbstractConnectionIntegrati connection.close(); } - @AfterClass - public static void afterClass() { - ConnectionFactoryTracker.cleanUp(); - } - @Test // DATAREDIS-348 public void shouldReadMastersCorrectly() { diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientConfiguration.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientConfiguration.java index fee969832..2a67f16df 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientConfiguration.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientConfiguration.java @@ -20,6 +20,7 @@ import io.lettuce.core.resource.ClientResources; import java.time.Duration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; /** * Creates a specific client configuration for Lettuce tests. diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/TestEventLoopGroupProvider.java b/src/test/java/org/springframework/data/redis/connection/lettuce/TestEventLoopGroupProvider.java index 5a6721c73..8223df236 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/TestEventLoopGroupProvider.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/TestEventLoopGroupProvider.java @@ -14,49 +14,3 @@ * limitations under the License. */ package org.springframework.data.redis.connection.lettuce; - -import io.lettuce.core.resource.DefaultEventLoopGroupProvider; -import io.netty.util.concurrent.DefaultPromise; -import io.netty.util.concurrent.EventExecutorGroup; -import io.netty.util.concurrent.ImmediateEventExecutor; -import io.netty.util.concurrent.Promise; - -import java.util.concurrent.TimeUnit; - -/** - * A {@link io.lettuce.core.resource.EventLoopGroupProvider} suitable for testing. Preserves the event loop groups - * between tests. Every time a new {@link TestEventLoopGroupProvider} instance is created, a - * {@link Runtime#addShutdownHook(Thread) shutdown hook} is added to close the resources. - * - * @author Mark Paluch - * @author Christoph Strobl - */ -class TestEventLoopGroupProvider extends DefaultEventLoopGroupProvider { - - private static final int NUMBER_OF_THREADS = 10; - - public TestEventLoopGroupProvider() { - - super(NUMBER_OF_THREADS); - - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - try { - TestEventLoopGroupProvider.this.shutdown(0, 0, TimeUnit.MILLISECONDS).get(1, TimeUnit.SECONDS); - } catch (Exception o_O) { - // ignored - } - } - }); - } - - @Override - public Promise release(EventExecutorGroup eventLoopGroup, long quietPeriod, long timeout, TimeUnit unit) { - - DefaultPromise result = new DefaultPromise<>(ImmediateEventExecutor.INSTANCE); - result.setSuccess(true); - - return result; - } -} diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/TransactionalLettuceIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/TransactionalLettuceIntegrationTests.java index 2a83620c5..ac1a0a7cb 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/TransactionalLettuceIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/TransactionalLettuceIntegrationTests.java @@ -20,6 +20,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.AbstractTransactionalTestBase; import org.springframework.data.redis.connection.lettuce.TransactionalLettuceIntegrationTests.LettuceContextConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.test.context.ContextConfiguration; /** diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/extension/LettuceConnectionFactoryExtension.java b/src/test/java/org/springframework/data/redis/connection/lettuce/extension/LettuceConnectionFactoryExtension.java new file mode 100644 index 000000000..6fc68b463 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/extension/LettuceConnectionFactoryExtension.java @@ -0,0 +1,279 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.connection.lettuce.extension; + +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +import org.springframework.data.redis.ConnectionFactoryTracker; +import org.springframework.data.redis.SettingsUtils; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.connection.RedisClusterConfiguration; +import org.springframework.data.redis.connection.RedisConfiguration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisSentinelConfiguration; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettucePool; +import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisCluster; +import org.springframework.data.redis.test.extension.RedisSentinel; +import org.springframework.data.redis.test.extension.RedisStanalone; +import org.springframework.data.redis.test.extension.ShutdownQueue; +import org.springframework.data.util.Lazy; + +/** + * JUnit {@link ParameterResolver} providing pre-cached {@link LettuceConnectionFactory} instances. Connection factories + * can be qualified with {@code @RedisStanalone} (default), {@code @RedisSentinel} or {@code @RedisCluster} to obtain a + * specific factory instance. Instances are managed by this extension and will be shut down on JVM shutdown. + * + * @author Mark Paluch + * @see RedisStanalone + * @see RedisSentinel + * @see RedisCluster + */ +public class LettuceConnectionFactoryExtension implements ParameterResolver { + + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace + .create(LettuceConnectionFactoryExtension.class); + + private static final Lazy STANDALONE = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettucePoolingClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.standaloneConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy SENTINEL = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettucePoolingClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.sentinelConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy CLUSTER = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettucePoolingClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.clusterConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy STANDALONE_UNPOOLED = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettuceClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.standaloneConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy SENTINEL_UNPOOLED = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettuceClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.sentinelConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Lazy CLUSTER_UNPOOLED = Lazy.of(() -> { + + LettuceClientConfiguration configuration = LettuceClientConfiguration.builder() + .clientResources(LettuceTestClientResources.getSharedClientResources()).build(); + + LettuceConnectionFactory factory = new ManagedLettuceConnectionFactory(SettingsUtils.clusterConfiguration(), + configuration); + factory.afterPropertiesSet(); + ShutdownQueue.register(ShutdownQueue.toCloseable(factory)); + + return factory; + }); + + private static final Map, Lazy> pooledFactories; + private static final Map, Lazy> unpooledFactories; + + static { + + pooledFactories = new HashMap<>(); + pooledFactories.put(RedisStanalone.class, STANDALONE); + pooledFactories.put(RedisSentinel.class, SENTINEL); + pooledFactories.put(RedisCluster.class, CLUSTER); + + unpooledFactories = new HashMap<>(); + unpooledFactories.put(RedisStanalone.class, STANDALONE_UNPOOLED); + unpooledFactories.put(RedisSentinel.class, SENTINEL_UNPOOLED); + unpooledFactories.put(RedisCluster.class, CLUSTER_UNPOOLED); + } + + /** + * Obtain a {@link LettuceConnectionFactory} described by {@code qualifier}. Instances are managed by this extension + * and will be shut down on JVM shutdown. + * + * @param qualifier an be any of {@link RedisStanalone}, {@link RedisSentinel}, {@link RedisCluster}. + * @return the managed {@link LettuceConnectionFactory}. + */ + public static LettuceConnectionFactory getConnectionFactory(Class qualifier) { + return getConnectionFactory(qualifier, true); + } + + /** + * Obtain a {@link LettuceConnectionFactory} described by {@code qualifier}. Instances are managed by this extension + * and will be shut down on JVM shutdown. + * + * @param qualifier an be any of {@link RedisStanalone}, {@link RedisSentinel}, {@link RedisCluster}. + * @return the managed {@link LettuceConnectionFactory}. + */ + public static LettuceConnectionFactory getConnectionFactory(Class qualifier, boolean pooled) { + return pooled ? pooledFactories.get(qualifier).get() : unpooledFactories.get(qualifier).get(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return RedisConnectionFactory.class.isAssignableFrom(parameterContext.getParameter().getType()) + || ReactiveRedisConnectionFactory.class.isAssignableFrom(parameterContext.getParameter().getType()); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + + ExtensionContext.Store store = extensionContext.getStore(NAMESPACE); + + Class qualifier = getQualifier(parameterContext); + + return store.getOrComputeIfAbsent(qualifier, LettuceConnectionFactoryExtension::getConnectionFactory); + } + + private static Class getQualifier(ParameterContext parameterContext) { + + if (parameterContext.isAnnotated(RedisSentinel.class)) { + return RedisSentinel.class; + } + + if (parameterContext.isAnnotated(RedisCluster.class)) { + return RedisCluster.class; + } + + return RedisStanalone.class; + } + + static class ManagedLettuceConnectionFactory extends LettuceConnectionFactory + implements ConnectionFactoryTracker.Managed { + + public ManagedLettuceConnectionFactory() { + super(); + } + + public ManagedLettuceConnectionFactory(RedisStandaloneConfiguration configuration) { + super(configuration); + } + + public ManagedLettuceConnectionFactory(String host, int port) { + super(host, port); + } + + public ManagedLettuceConnectionFactory(RedisConfiguration redisConfiguration) { + super(redisConfiguration); + } + + public ManagedLettuceConnectionFactory(RedisSentinelConfiguration sentinelConfiguration) { + super(sentinelConfiguration); + } + + public ManagedLettuceConnectionFactory(RedisClusterConfiguration clusterConfiguration) { + super(clusterConfiguration); + } + + public ManagedLettuceConnectionFactory(LettucePool pool) { + super(pool); + } + + public ManagedLettuceConnectionFactory(RedisStandaloneConfiguration standaloneConfig, + LettuceClientConfiguration clientConfig) { + super(standaloneConfig, clientConfig); + } + + public ManagedLettuceConnectionFactory(RedisConfiguration redisConfiguration, + LettuceClientConfiguration clientConfig) { + super(redisConfiguration, clientConfig); + } + + public ManagedLettuceConnectionFactory(RedisSentinelConfiguration sentinelConfiguration, + LettuceClientConfiguration clientConfig) { + super(sentinelConfiguration, clientConfig); + } + + public ManagedLettuceConnectionFactory(RedisClusterConfiguration clusterConfiguration, + LettuceClientConfiguration clientConfig) { + super(clusterConfiguration, clientConfig); + } + + @Override + public String toString() { + + StringBuilder builder = new StringBuilder("Lettuce"); + + if (isClusterAware()) { + builder.append(" Cluster"); + } + + if (isRedisSentinelAware()) { + builder.append(" Sentinel"); + } + + if (this.getClientConfiguration() instanceof LettucePoolingClientConfiguration) { + builder.append(" [pool]"); + } + + return builder.toString(); + } + } +} diff --git a/src/test/java/org/springframework/data/redis/connection/stream/StreamReadOptionsUnitTests.java b/src/test/java/org/springframework/data/redis/connection/stream/StreamReadOptionsUnitTests.java index caa0f7e5f..744d5985a 100644 --- a/src/test/java/org/springframework/data/redis/connection/stream/StreamReadOptionsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/stream/StreamReadOptionsUnitTests.java @@ -19,18 +19,18 @@ import static org.assertj.core.api.Assertions.*; import java.time.Duration; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link StreamReadOptions}. - * + * * @author Mark Paluch * @author Kaizhou Zhang */ -public class StreamReadOptionsUnitTests { +class StreamReadOptionsUnitTests { @Test // DATAREDIS-1138 - public void shouldConsiderBlocking() { + void shouldConsiderBlocking() { assertThat(StreamReadOptions.empty().isBlocking()).isFalse(); assertThat(StreamReadOptions.empty().block(Duration.ofSeconds(1)).isBlocking()).isTrue(); @@ -38,9 +38,9 @@ public class StreamReadOptionsUnitTests { } @Test // DATAREDIS-1210 - public void testToString() { + void testToString() { - assertThat(StreamReadOptions.empty().toString()) - .isEqualTo("StreamReadOptions{block=null, count=null, noack=false, blocking=false}"); + assertThat(StreamReadOptions.empty()) + .hasToString("StreamReadOptions{block=null, count=null, noack=false, blocking=false}"); } } diff --git a/src/test/java/org/springframework/data/redis/core/AbstractOperationsTestParams.java b/src/test/java/org/springframework/data/redis/core/AbstractOperationsTestParams.java index e1cb61dca..12ec25b65 100644 --- a/src/test/java/org/springframework/data/redis/core/AbstractOperationsTestParams.java +++ b/src/test/java/org/springframework/data/redis/core/AbstractOperationsTestParams.java @@ -28,12 +28,14 @@ import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.oxm.xstream.XStreamMarshaller; /** @@ -49,9 +51,6 @@ abstract public class AbstractOperationsTestParams { // DATAREDIS-241 public static Collection testParams() { - RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration(SettingsUtils.getHost(), - SettingsUtils.getPort()); - ObjectFactory stringFactory = new StringObjectFactory(); ObjectFactory longFactory = new LongObjectFactory(); ObjectFactory doubleFactory = new DoubleObjectFactory(); @@ -66,9 +65,8 @@ abstract public class AbstractOperationsTestParams { throw new RuntimeException("Cannot init XStream", ex); } - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate stringTemplate = new StringRedisTemplate(); stringTemplate.setConnectionFactory(lettuceConnectionFactory); diff --git a/src/test/java/org/springframework/data/redis/core/ConnectionSplittingInterceptorUnitTests.java b/src/test/java/org/springframework/data/redis/core/ConnectionSplittingInterceptorUnitTests.java index 7e4e918f5..7c085b662 100644 --- a/src/test/java/org/springframework/data/redis/core/ConnectionSplittingInterceptorUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/ConnectionSplittingInterceptorUnitTests.java @@ -15,14 +15,19 @@ */ package org.springframework.data.redis.core; +import static org.mockito.Mockito.*; + import java.lang.reflect.Method; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -32,8 +37,9 @@ import org.springframework.util.ClassUtils; /** * @author Christoph Strobl */ -@RunWith(MockitoJUnitRunner.class) -public class ConnectionSplittingInterceptorUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class ConnectionSplittingInterceptorUnitTests { private static final Method WRITE_METHOD, READONLY_METHOD; @@ -54,35 +60,37 @@ public class ConnectionSplittingInterceptorUnitTests { } } - @Before - public void setUp() { + @BeforeEach + void setUp() { interceptor = new ConnectionSplittingInterceptor(connectionFactoryMock); - Mockito.when(connectionFactoryMock.getConnection()).thenReturn(freshConnectionMock); + when(connectionFactoryMock.getConnection()).thenReturn(freshConnectionMock); } @Test // DATAREDIS-73 - public void interceptorShouldRequestFreshConnectionForReadonlyCommand() throws Throwable { + void interceptorShouldRequestFreshConnectionForReadonlyCommand() throws Throwable { interceptor.intercept(boundConnectionMock, READONLY_METHOD, new Object[] { new byte[] {} }, null); - Mockito.verify(connectionFactoryMock, Mockito.times(1)).getConnection(); - Mockito.verifyZeroInteractions(boundConnectionMock); + verify(connectionFactoryMock, times(1)).getConnection(); + verifyZeroInteractions(boundConnectionMock); } @Test // DATAREDIS-73 - public void interceptorShouldUseBoundConnectionForWriteOperations() throws Throwable { + void interceptorShouldUseBoundConnectionForWriteOperations() throws Throwable { interceptor.intercept(boundConnectionMock, WRITE_METHOD, new Object[] { new byte[] {}, 0L }, null); - Mockito.verify(boundConnectionMock, Mockito.times(1)).expire(Mockito.any(byte[].class), Mockito.anyLong()); - Mockito.verifyZeroInteractions(connectionFactoryMock); + verify(boundConnectionMock, times(1)).expire(any(byte[].class), anyLong()); + verifyZeroInteractions(connectionFactoryMock); } @SuppressWarnings("unchecked") - @Test(expected = InvalidDataAccessApiUsageException.class) // DATAREDIS-73 - public void interceptorShouldNotWrapException() throws Throwable { + @Test // DATAREDIS-73 + void interceptorShouldNotWrapException() { - Mockito.when(freshConnectionMock.keys(Mockito.any(byte[].class))).thenThrow( + when(freshConnectionMock.keys(any(byte[].class))).thenThrow( InvalidDataAccessApiUsageException.class); - interceptor.intercept(boundConnectionMock, READONLY_METHOD, new Object[] { new byte[] {} }, null); + + Assertions.assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy( + () -> interceptor.intercept(boundConnectionMock, READONLY_METHOD, new Object[] { new byte[] {} }, null)); } } diff --git a/src/test/java/org/springframework/data/redis/core/DefaultBoundValueOperationsUnitTests.java b/src/test/java/org/springframework/data/redis/core/DefaultBoundValueOperationsUnitTests.java index 3afe9ab4a..abc495b59 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultBoundValueOperationsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultBoundValueOperationsUnitTests.java @@ -20,29 +20,32 @@ import static org.mockito.Mockito.*; import java.time.Duration; import java.util.concurrent.TimeUnit; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; /** * Unit tests for {@link DefaultBoundValueOperations} - * + * * @author Christoph Strobl */ -@RunWith(MockitoJUnitRunner.class) -public class DefaultBoundValueOperationsUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class DefaultBoundValueOperationsUnitTests { - DefaultBoundValueOperations boundValueOps; + private DefaultBoundValueOperations boundValueOps; @Mock ValueOperations valueOps; - static final String KEY = "key-1"; - static final Object VALUE = "value"; + private static final String KEY = "key-1"; + private static final Object VALUE = "value"; - @Before - public void setUp() { + @BeforeEach + void setUp() { RedisOperations redisOps = mock(RedisOperations.class); when(redisOps.opsForValue()).thenReturn(valueOps); @@ -51,7 +54,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-786 - public void setIfPresentShouldDelegateCorrectly() { + void setIfPresentShouldDelegateCorrectly() { boundValueOps.setIfPresent(VALUE); @@ -59,7 +62,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-786 - public void setIfPresentWithTimeoutShouldDelegateCorrectly() { + void setIfPresentWithTimeoutShouldDelegateCorrectly() { boundValueOps.setIfPresent(VALUE, 10, TimeUnit.SECONDS); @@ -67,7 +70,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setWithDurationOfSecondsShouldDelegateCorrectly() { + void setWithDurationOfSecondsShouldDelegateCorrectly() { boundValueOps.set(VALUE, Duration.ofSeconds(1)); @@ -75,7 +78,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setWithDurationOfMillisShouldDelegateCorrectly() { + void setWithDurationOfMillisShouldDelegateCorrectly() { boundValueOps.set(VALUE, Duration.ofMillis(250)); @@ -83,7 +86,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setIfAbsentWithDurationOfSecondsShouldDelegateCorrectly() { + void setIfAbsentWithDurationOfSecondsShouldDelegateCorrectly() { boundValueOps.setIfAbsent(VALUE, Duration.ofSeconds(1)); @@ -91,7 +94,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setIfAbsentWithDurationOfMillisShouldDelegateCorrectly() { + void setIfAbsentWithDurationOfMillisShouldDelegateCorrectly() { boundValueOps.setIfAbsent(VALUE, Duration.ofMillis(250)); @@ -99,7 +102,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setIfPresentWithDurationOfSecondsShouldDelegateCorrectly() { + void setIfPresentWithDurationOfSecondsShouldDelegateCorrectly() { boundValueOps.setIfPresent(VALUE, Duration.ofSeconds(1)); @@ -107,7 +110,7 @@ public class DefaultBoundValueOperationsUnitTests { } @Test // DATAREDIS-815 - public void setIfPresentWithDurationOfMillisShouldDelegateCorrectly() { + void setIfPresentWithDurationOfMillisShouldDelegateCorrectly() { boundValueOps.setIfPresent(VALUE, Duration.ofMillis(250)); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultClusterOperationsUnitTests.java b/src/test/java/org/springframework/data/redis/core/DefaultClusterOperationsUnitTests.java index 4c9f240c8..4545703e4 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultClusterOperationsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultClusterOperationsUnitTests.java @@ -23,12 +23,14 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.data.redis.connection.RedisClusterCommands.AddSlots; import org.springframework.data.redis.connection.RedisClusterConnection; @@ -43,24 +45,25 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.Silent.class) -public class DefaultClusterOperationsUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class DefaultClusterOperationsUnitTests { - static final RedisClusterNode NODE_1 = RedisClusterNode.newRedisClusterNode().listeningAt("127.0.0.1", 6379) + private static final RedisClusterNode NODE_1 = RedisClusterNode.newRedisClusterNode().listeningAt("127.0.0.1", 6379) .withId("d1861060fe6a534d42d8a19aeb36600e18785e04").build(); - static final RedisClusterNode NODE_2 = RedisClusterNode.newRedisClusterNode().listeningAt("127.0.0.1", 6380) + private static final RedisClusterNode NODE_2 = RedisClusterNode.newRedisClusterNode().listeningAt("127.0.0.1", 6380) .withId("0f2ee5df45d18c50aca07228cc18b1da96fd5e84").build(); @Mock RedisConnectionFactory connectionFactory; @Mock RedisClusterConnection connection; - RedisSerializer serializer; + private RedisSerializer serializer; - DefaultClusterOperations clusterOps; + private DefaultClusterOperations clusterOps; - @Before - public void setUp() { + @BeforeEach + void setUp() { when(connectionFactory.getConnection()).thenReturn(connection); when(connectionFactory.getClusterConnection()).thenReturn(connection); @@ -77,7 +80,7 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void keysShouldDelegateToConnectionCorrectly() { + void keysShouldDelegateToConnectionCorrectly() { Set keys = new HashSet<>(Arrays.asList(serializer.serialize("key-1"), serializer.serialize("key-2"))); when(connection.keys(any(RedisClusterNode.class), any(byte[].class))).thenReturn(keys); @@ -86,12 +89,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void keysShouldThrowExceptionWhenNodeIsNull() { + void keysShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.keys(null, "*")); } @Test // DATAREDIS-315 - public void keysShouldReturnEmptySetWhenNoKeysAvailable() { + void keysShouldReturnEmptySetWhenNoKeysAvailable() { when(connection.keys(any(RedisClusterNode.class), any(byte[].class))).thenReturn(null); @@ -99,7 +102,7 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void randomKeyShouldDelegateToConnection() { + void randomKeyShouldDelegateToConnection() { when(connection.randomKey(any(RedisClusterNode.class))).thenReturn(serializer.serialize("key-1")); @@ -107,12 +110,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void randomKeyShouldThrowExceptionWhenNodeIsNull() { + void randomKeyShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.randomKey(null)); } @Test // DATAREDIS-315 - public void randomKeyShouldReturnNullWhenNoKeyAvailable() { + void randomKeyShouldReturnNullWhenNoKeyAvailable() { when(connection.randomKey(any(RedisClusterNode.class))).thenReturn(null); @@ -120,7 +123,7 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void pingShouldDelegateToConnection() { + void pingShouldDelegateToConnection() { when(connection.ping(any(RedisClusterNode.class))).thenReturn("PONG"); @@ -128,12 +131,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void pingShouldThrowExceptionWhenNodeIsNull() { + void pingShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.ping(null)); } @Test // DATAREDIS-315 - public void addSlotsShouldDelegateToConnection() { + void addSlotsShouldDelegateToConnection() { clusterOps.addSlots(NODE_1, 1, 2, 3); @@ -141,12 +144,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void addSlotsShouldThrowExceptionWhenNodeIsNull() { + void addSlotsShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.addSlots(null)); } @Test // DATAREDIS-315 - public void addSlotsWithRangeShouldDelegateToConnection() { + void addSlotsWithRangeShouldDelegateToConnection() { clusterOps.addSlots(NODE_1, new SlotRange(1, 3)); @@ -154,12 +157,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void addSlotsWithRangeShouldThrowExceptionWhenRangeIsNull() { + void addSlotsWithRangeShouldThrowExceptionWhenRangeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.addSlots(NODE_1, (SlotRange) null)); } @Test // DATAREDIS-315 - public void bgSaveShouldDelegateToConnection() { + void bgSaveShouldDelegateToConnection() { clusterOps.bgSave(NODE_1); @@ -167,12 +170,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void bgSaveShouldThrowExceptionWhenNodeIsNull() { + void bgSaveShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.bgSave(null)); } @Test // DATAREDIS-315 - public void meetShouldDelegateToConnection() { + void meetShouldDelegateToConnection() { clusterOps.meet(NODE_1); @@ -180,12 +183,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void meetShouldThrowExceptionWhenNodeIsNull() { + void meetShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.meet(null)); } @Test // DATAREDIS-315 - public void forgetShouldDelegateToConnection() { + void forgetShouldDelegateToConnection() { clusterOps.forget(NODE_1); @@ -193,12 +196,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void forgetShouldThrowExceptionWhenNodeIsNull() { + void forgetShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.forget(null)); } @Test // DATAREDIS-315 - public void flushDbShouldDelegateToConnection() { + void flushDbShouldDelegateToConnection() { clusterOps.flushDb(NODE_1); @@ -206,12 +209,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void flushDbShouldThrowExceptionWhenNodeIsNull() { + void flushDbShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.flushDb(null)); } @Test // DATAREDIS-315 - public void getSlavesShouldDelegateToConnection() { + void getSlavesShouldDelegateToConnection() { clusterOps.getSlaves(NODE_1); @@ -219,12 +222,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void getSlavesShouldThrowExceptionWhenNodeIsNull() { + void getSlavesShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.getSlaves(null)); } @Test // DATAREDIS-315 - public void saveShouldDelegateToConnection() { + void saveShouldDelegateToConnection() { clusterOps.save(NODE_1); @@ -232,12 +235,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void saveShouldThrowExceptionWhenNodeIsNull() { + void saveShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.save(null)); } @Test // DATAREDIS-315 - public void shutdownShouldDelegateToConnection() { + void shutdownShouldDelegateToConnection() { clusterOps.shutdown(NODE_1); @@ -245,12 +248,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void shutdownShouldThrowExceptionWhenNodeIsNull() { + void shutdownShouldThrowExceptionWhenNodeIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.shutdown(null)); } @Test // DATAREDIS-315 - public void executeShouldDelegateToConnection() { + void executeShouldDelegateToConnection() { final byte[] key = serializer.serialize("foo"); clusterOps.execute(connection -> serializer.deserialize(connection.get(key))); @@ -259,12 +262,12 @@ public class DefaultClusterOperationsUnitTests { } @Test // DATAREDIS-315 - public void executeShouldThrowExceptionWhenCallbackIsNull() { + void executeShouldThrowExceptionWhenCallbackIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> clusterOps.execute(null)); } @Test // DATAREDIS-315 - public void reshardShouldExecuteCommandsCorrectly() { + void reshardShouldExecuteCommandsCorrectly() { byte[] key = "foo".getBytes(); when(connection.clusterGetKeysInSlot(eq(100), anyInt())).thenReturn(Collections.singletonList(key)); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultGeoOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultGeoOperationsTests.java index 52424e2c2..618d5e12b 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultGeoOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultGeoOperationsTests.java @@ -78,8 +78,6 @@ public class DefaultGeoOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -87,11 +85,6 @@ public class DefaultGeoOperationsTests { return AbstractOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { geoOperations = redisTemplate.opsForGeo(); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultHashOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultHashOperationsTests.java index b8bb1eea7..240b54f15 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultHashOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultHashOperationsTests.java @@ -38,6 +38,8 @@ import org.springframework.data.redis.RawObjectFactory; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.test.annotation.IfProfileValue; @@ -72,8 +74,6 @@ public class DefaultHashOperationsTests { this.keyFactory = keyFactory; this.hashKeyFactory = hashKeyFactory; this.hashValueFactory = hashValueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -81,10 +81,8 @@ public class DefaultHashOperationsTests { ObjectFactory stringFactory = new StringObjectFactory(); ObjectFactory rawFactory = new RawObjectFactory(); - JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); - jedisConnectionFactory.setPort(SettingsUtils.getPort()); - jedisConnectionFactory.setHostName(SettingsUtils.getHost()); - jedisConnectionFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnectionFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate stringTemplate = new StringRedisTemplate(); stringTemplate.setConnectionFactory(jedisConnectionFactory); @@ -99,11 +97,6 @@ public class DefaultHashOperationsTests { { rawTemplate, rawFactory, rawFactory, rawFactory } }); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { hashOps = redisTemplate.opsForHash(); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultHyperLogLogOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultHyperLogLogOperationsTests.java index b05a1fd01..a67289629 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultHyperLogLogOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultHyperLogLogOperationsTests.java @@ -57,8 +57,6 @@ public class DefaultHyperLogLogOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters diff --git a/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java index aefc4651f..f7755b206 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java @@ -68,8 +68,6 @@ public class DefaultListOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveGeoOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveGeoOperationsIntegrationTests.java index d1fa7b0db..a129d6913 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveGeoOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveGeoOperationsIntegrationTests.java @@ -78,11 +78,6 @@ public class DefaultReactiveGeoOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -96,8 +91,6 @@ public class DefaultReactiveGeoOperationsIntegrationTests { this.geoOperations = redisTemplate.opsForGeo(); this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveHashOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveHashOperationsIntegrationTests.java index 6b1ef6763..0d880fd7a 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveHashOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveHashOperationsIntegrationTests.java @@ -41,7 +41,7 @@ import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveHyperLogLogOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveHyperLogLogOperationsIntegrationTests.java index fc2f17942..7b9ab943a 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveHyperLogLogOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveHyperLogLogOperationsIntegrationTests.java @@ -55,11 +55,6 @@ public class DefaultReactiveHyperLogLogOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -73,8 +68,6 @@ public class DefaultReactiveHyperLogLogOperationsIntegrationTests { this.hyperLogLogOperations = redisTemplate.opsForHyperLogLog(); this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveListOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveListOperationsIntegrationTests.java index ef454cfc4..900e90c8e 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveListOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveListOperationsIntegrationTests.java @@ -61,11 +61,6 @@ public class DefaultReactiveListOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -79,8 +74,6 @@ public class DefaultReactiveListOperationsIntegrationTests { this.listOperations = redisTemplate.opsForList(); this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveSetOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveSetOperationsIntegrationTests.java index c416611b5..936e94d0c 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveSetOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveSetOperationsIntegrationTests.java @@ -57,11 +57,6 @@ public class DefaultReactiveSetOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -75,8 +70,6 @@ public class DefaultReactiveSetOperationsIntegrationTests { this.setOperations = redisTemplate.opsForSet(); this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveValueOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveValueOperationsIntegrationTests.java index 0d27e4d64..2f4c5c0bf 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveValueOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveValueOperationsIntegrationTests.java @@ -69,11 +69,6 @@ public class DefaultReactiveValueOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -88,8 +83,6 @@ public class DefaultReactiveValueOperationsIntegrationTests { this.keyFactory = keyFactory; this.valueFactory = valueFactory; this.serializer = serializer; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultReactiveZSetOperationsIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/DefaultReactiveZSetOperationsIntegrationTests.java index 025a1f4e4..d4029046b 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultReactiveZSetOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultReactiveZSetOperationsIntegrationTests.java @@ -73,11 +73,6 @@ public class DefaultReactiveZSetOperationsIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param redisTemplate * @param keyFactory @@ -92,8 +87,6 @@ public class DefaultReactiveZSetOperationsIntegrationTests { this.keyFactory = keyFactory; this.valueFactory = valueFactory; this.serializer = serializer; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before diff --git a/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java index e9ede8d8d..b0b0d208b 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java @@ -67,8 +67,6 @@ public class DefaultSetOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -76,11 +74,6 @@ public class DefaultSetOperationsTests { return AbstractOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { setOps = redisTemplate.opsForSet(); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultStreamOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultStreamOperationsTests.java index 8fe09913a..eecc1f022 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultStreamOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultStreamOperationsTests.java @@ -80,8 +80,6 @@ public class DefaultStreamOperationsTests { this.keyFactory = keyFactory; this.hashKeyFactory = (ObjectFactory) keyFactory; this.hashValueFactory = (ObjectFactory) objectFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -89,11 +87,6 @@ public class DefaultStreamOperationsTests { return AbstractOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { streamOps = redisTemplate.opsForStream(); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultTypedTupleUnitTests.java b/src/test/java/org/springframework/data/redis/core/DefaultTypedTupleUnitTests.java index 53d3289db..9dfff1650 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultTypedTupleUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultTypedTupleUnitTests.java @@ -15,16 +15,17 @@ */ package org.springframework.data.redis.core; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; import org.springframework.data.redis.core.ZSetOperations.TypedTuple; /** * @author Christoph Strobl */ -public class DefaultTypedTupleUnitTests { +class DefaultTypedTupleUnitTests { private static final TypedTuple WITH_SCORE_1 = new DefaultTypedTuple<>("foo", 1D); private static final TypedTuple ANOTHER_ONE_WITH_SCORE_1 = new DefaultTypedTuple<>("another", 1D); @@ -32,24 +33,24 @@ public class DefaultTypedTupleUnitTests { private static final TypedTuple WITH_SCORE_NULL = new DefaultTypedTuple<>("foo", null); @Test // DATAREDIS-294 - public void compareToShouldUseScore() { + void compareToShouldUseScore() { - assertThat(WITH_SCORE_1.compareTo(WITH_SCORE_2)).isEqualTo(-1); - assertThat(WITH_SCORE_2.compareTo(WITH_SCORE_1)).isEqualTo(1); - assertThat(WITH_SCORE_1.compareTo(ANOTHER_ONE_WITH_SCORE_1)).isEqualTo(0); + assertThat(WITH_SCORE_1).isLessThan(WITH_SCORE_2); + assertThat(WITH_SCORE_2).isGreaterThan(WITH_SCORE_1); + assertThat(WITH_SCORE_1).isEqualByComparingTo(ANOTHER_ONE_WITH_SCORE_1); } @Test // DATAREDIS-294 - public void compareToShouldConsiderGivenNullAsZeroScore() { + void compareToShouldConsiderGivenNullAsZeroScore() { - assertThat(WITH_SCORE_1.compareTo(null)).isEqualTo(1); - assertThat(WITH_SCORE_NULL.compareTo(null)).isEqualTo(0); + assertThat(WITH_SCORE_1).isGreaterThan(null); + assertThat(WITH_SCORE_NULL).isEqualByComparingTo(null); } @Test // DATAREDIS-294 - public void compareToShouldConsiderNullScoreAsZeroScore() { + void compareToShouldConsiderNullScoreAsZeroScore() { - assertThat(WITH_SCORE_1.compareTo(WITH_SCORE_NULL)).isEqualTo(1); - assertThat(WITH_SCORE_NULL.compareTo(WITH_SCORE_1)).isEqualTo(-1); + assertThat(WITH_SCORE_1).isGreaterThan(WITH_SCORE_NULL); + assertThat(WITH_SCORE_NULL).isLessThan(WITH_SCORE_1); } } diff --git a/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsTests.java index 32d39a4f3..3331428c7 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsTests.java @@ -68,8 +68,6 @@ public class DefaultValueOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -77,11 +75,6 @@ public class DefaultValueOperationsTests { return AbstractOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { valueOps = redisTemplate.opsForValue(); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsUnitTests.java b/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsUnitTests.java index 10fe57191..ab6b0a64d 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultValueOperationsUnitTests.java @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.redis.core; import static org.mockito.Mockito.*; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.data.redis.connection.BitFieldSubCommands; import org.springframework.data.redis.connection.BitFieldSubCommands.BitFieldType; @@ -34,17 +35,18 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; /** * @author Christoph Strobl */ -@RunWith(MockitoJUnitRunner.class) -public class DefaultValueOperationsUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class DefaultValueOperationsUnitTests { @Mock RedisConnectionFactory connectionFactoryMock; @Mock RedisConnection connectionMock; - RedisSerializer serializer; - RedisTemplate template; - ValueOperations valueOps; + private RedisSerializer serializer; + private RedisTemplate template; + private ValueOperations valueOps; - @Before - public void setUp() { + @BeforeEach + void setUp() { when(connectionFactoryMock.getConnection()).thenReturn(connectionMock); @@ -59,7 +61,7 @@ public class DefaultValueOperationsUnitTests { } @Test // DATAREDIS-562 - public void bitfieldShouldBeDelegatedCorrectly() { + void bitfieldShouldBeDelegatedCorrectly() { BitFieldSubCommands command = BitFieldSubCommands.create().get(BitFieldType.INT_8).valueAt(0L); diff --git a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java index 89892de99..d53523990 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java @@ -77,8 +77,6 @@ public class DefaultZSetOperationsTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Parameters @@ -86,11 +84,6 @@ public class DefaultZSetOperationsTests { return AbstractOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { zSetOps = redisTemplate.opsForZSet(); diff --git a/src/test/java/org/springframework/data/redis/core/IndexWriterUnitTests.java b/src/test/java/org/springframework/data/redis/core/IndexWriterUnitTests.java index 9ea982fe7..bf341bd73 100644 --- a/src/test/java/org/springframework/data/redis/core/IndexWriterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/IndexWriterUnitTests.java @@ -23,12 +23,14 @@ import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.GenericConversionService; @@ -47,21 +49,22 @@ import org.springframework.util.ObjectUtils; * @author Christoph Strobl * @author Rob Winch */ -@RunWith(MockitoJUnitRunner.Silent.class) -public class IndexWriterUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class IndexWriterUnitTests { private static final Charset CHARSET = Charset.forName("UTF-8"); private static final String KEYSPACE = "persons"; private static final String KEY = "key-1"; private static final byte[] KEY_BIN = KEY.getBytes(CHARSET); - IndexWriter writer; - MappingRedisConverter converter; + private IndexWriter writer; + private MappingRedisConverter converter; @Mock RedisConnection connectionMock; @Mock ReferenceResolver referenceResolverMock; - @Before - public void setUp() { + @BeforeEach + void setUp() { converter = new MappingRedisConverter(new RedisMappingContext(), new PathIndexResolver(), referenceResolverMock); converter.afterPropertiesSet(); @@ -70,7 +73,7 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-425 - public void addKeyToIndexShouldInvokeSaddCorrectly() { + void addKeyToIndexShouldInvokeSaddCorrectly() { writer.addKeyToIndex(KEY_BIN, new SimpleIndexedPropertyValue(KEYSPACE, "firstname", "Rand")); @@ -80,12 +83,12 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-425 - public void addKeyToIndexShouldThrowErrorWhenIndexedDataIsNull() { + void addKeyToIndexShouldThrowErrorWhenIndexedDataIsNull() { assertThatIllegalArgumentException().isThrownBy(() -> writer.addKeyToIndex(KEY_BIN, null)); } @Test // DATAREDIS-425 - public void removeKeyFromExistingIndexesShouldCheckForExistingIndexesForPath() { + void removeKeyFromExistingIndexesShouldCheckForExistingIndexesForPath() { writer.removeKeyFromExistingIndexes(KEY_BIN, new StubIndxedData()); @@ -94,7 +97,7 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-425 - public void removeKeyFromExistingIndexesShouldRemoveKeyFromAllExistingIndexesForPath() { + void removeKeyFromExistingIndexesShouldRemoveKeyFromAllExistingIndexesForPath() { byte[] indexKey1 = "persons:firstname:rand".getBytes(CHARSET); byte[] indexKey2 = "persons:firstname:mat".getBytes(CHARSET); @@ -109,12 +112,12 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-425 - public void removeKeyFromExistingIndexesShouldThrowExecptionForNullIndexedData() { + void removeKeyFromExistingIndexesShouldThrowExecptionForNullIndexedData() { assertThatIllegalArgumentException().isThrownBy(() -> writer.removeKeyFromExistingIndexes(KEY_BIN, null)); } @Test // DATAREDIS-425 - public void removeAllIndexesShouldDeleteAllIndexKeys() { + void removeAllIndexesShouldDeleteAllIndexKeys() { byte[] indexKey1 = "persons:firstname:rand".getBytes(CHARSET); byte[] indexKey2 = "persons:firstname:mat".getBytes(CHARSET); @@ -131,13 +134,13 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-425 - public void addToIndexShouldThrowDataAccessExceptionWhenAddingDataThatConnotBeConverted() { + void addToIndexShouldThrowDataAccessExceptionWhenAddingDataThatConnotBeConverted() { assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy( () -> writer.addKeyToIndex(KEY_BIN, new SimpleIndexedPropertyValue(KEYSPACE, "firstname", new DummyObject()))); } @Test // DATAREDIS-425 - public void addToIndexShouldUseRegisteredConverterWhenAddingData() { + void addToIndexShouldUseRegisteredConverterWhenAddingData() { DummyObject value = new DummyObject(); final String identityHexString = ObjectUtils.getIdentityHexString(value); @@ -156,7 +159,7 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-512 - public void createIndexShouldNotTryToRemoveExistingValues() { + void createIndexShouldNotTryToRemoveExistingValues() { when(connectionMock.keys(any(byte[].class))) .thenReturn(new LinkedHashSet<>(Arrays.asList("persons:firstname:rand".getBytes(CHARSET)))); @@ -171,7 +174,7 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-512 - public void updateIndexShouldRemoveExistingValues() { + void updateIndexShouldRemoveExistingValues() { when(connectionMock.keys(any(byte[].class))) .thenReturn(new LinkedHashSet<>(Arrays.asList("persons:firstname:rand".getBytes(CHARSET)))); @@ -186,7 +189,7 @@ public class IndexWriterUnitTests { } @Test // DATAREDIS-533 - public void removeGeoIndexShouldCallGeoRemove() { + void removeGeoIndexShouldCallGeoRemove() { byte[] indexKey1 = "persons:location".getBytes(CHARSET); @@ -210,7 +213,7 @@ public class IndexWriterUnitTests { } } - static class DummyObject { + private static class DummyObject { } } diff --git a/src/test/java/org/springframework/data/redis/core/MultithreadedRedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/MultithreadedRedisTemplateTests.java index 73e0ecc53..899879009 100644 --- a/src/test/java/org/springframework/data/redis/core/MultithreadedRedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/MultithreadedRedisTemplateTests.java @@ -32,8 +32,11 @@ import org.junit.runners.Parameterized.Parameters; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Artem Bilian @@ -47,25 +50,14 @@ public class MultithreadedRedisTemplateTests { public MultithreadedRedisTemplateTests(RedisConnectionFactory factory) { this.factory = factory; - ConnectionFactoryTracker.add(factory); - } - - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); } @Parameters public static Collection testParams() { - JedisConnectionFactory jedis = new JedisConnectionFactory(); - jedis.setPort(6379); - jedis.afterPropertiesSet(); + JedisConnectionFactory jedis = JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); - LettuceConnectionFactory lettuce = new LettuceConnectionFactory(); - lettuce.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuce.setPort(6379); - lettuce.afterPropertiesSet(); + LettuceConnectionFactory lettuce = LettuceConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); return Arrays.asList(new Object[][] { { jedis }, { lettuce } }); } diff --git a/src/test/java/org/springframework/data/redis/core/ReactiveOperationsTestParams.java b/src/test/java/org/springframework/data/redis/core/ReactiveOperationsTestParams.java index 362305761..b9b56bf1a 100644 --- a/src/test/java/org/springframework/data/redis/core/ReactiveOperationsTestParams.java +++ b/src/test/java/org/springframework/data/redis/core/ReactiveOperationsTestParams.java @@ -15,16 +15,14 @@ */ package org.springframework.data.redis.core; -import static org.springframework.data.redis.connection.ClusterTestVariables.*; - import java.nio.ByteBuffer; -import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.junit.runners.model.Statement; + import org.springframework.data.redis.ByteBufferObjectFactory; import org.springframework.data.redis.DoubleObjectFactory; import org.springframework.data.redis.LongObjectFactory; @@ -32,15 +30,9 @@ import org.springframework.data.redis.ObjectFactory; import org.springframework.data.redis.Person; import org.springframework.data.redis.PersonObjectFactory; import org.springframework.data.redis.PrefixStringObjectFactory; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; -import org.springframework.data.redis.connection.RedisClusterConfiguration; -import org.springframework.data.redis.connection.RedisClusterNode; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; @@ -48,6 +40,8 @@ import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.RedisCluster; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.oxm.xstream.XStreamMarshaller; @@ -61,19 +55,6 @@ abstract public class ReactiveOperationsTestParams { public static Collection testParams() { - LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - LettucePoolingClientConfiguration poolingConfiguration = LettucePoolingClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration(SettingsUtils.getHost(), - SettingsUtils.getPort()); - ObjectFactory stringFactory = new StringObjectFactory(); ObjectFactory clusterKeyStringFactory = new PrefixStringObjectFactory("{u1}.", stringFactory); ObjectFactory longFactory = new LongObjectFactory(); @@ -89,21 +70,12 @@ abstract public class ReactiveOperationsTestParams { throw new RuntimeException("Cannot init XStream", ex); } - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - clientConfiguration); - lettuceConnectionFactory.afterPropertiesSet(); - - LettuceConnectionFactory poolingConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - poolingConfiguration); - poolingConnectionFactory.afterPropertiesSet(); - + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); ReactiveRedisTemplate objectTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory, RedisSerializationContext.java(ReactiveOperationsTestParams.class.getClassLoader())); - ReactiveRedisTemplate pooledObjectTemplate = new ReactiveRedisTemplate<>(poolingConnectionFactory, - RedisSerializationContext.java()); - StringRedisSerializer stringRedisSerializer = StringRedisSerializer.UTF_8; ReactiveRedisTemplate stringTemplate = new ReactiveRedisTemplate<>(lettuceConnectionFactory, RedisSerializationContext.fromSerializer(stringRedisSerializer)); @@ -143,7 +115,6 @@ abstract public class ReactiveOperationsTestParams { List list = Arrays.asList(new Object[][] { // { stringTemplate, stringFactory, stringFactory, stringRedisSerializer, "String" }, // { objectTemplate, personFactory, personFactory, jdkSerializationRedisSerializer, "Person/JDK" }, // - { pooledObjectTemplate, personFactory, personFactory, jdkSerializationRedisSerializer, "Pooled/Person/JDK" }, // { longTemplate, stringFactory, longFactory, longToStringSerializer, "Long" }, // { doubleTemplate, stringFactory, doubleFactory, doubleToStringSerializer, "Double" }, // { rawTemplate, rawFactory, rawFactory, null, "raw" }, // @@ -156,14 +127,10 @@ abstract public class ReactiveOperationsTestParams { if (clusterAvailable()) { - RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); - clusterConfiguration.addClusterNode(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)); - ReactiveRedisTemplate clusterStringTemplate = null; - LettuceConnectionFactory lettuceClusterConnectionFactory = new LettuceConnectionFactory(clusterConfiguration, - clientConfiguration); - lettuceClusterConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceClusterConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); clusterStringTemplate = new ReactiveRedisTemplate<>(lettuceClusterConnectionFactory, RedisSerializationContext.string()); diff --git a/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateIntegrationTests.java index 1759e59a0..ef2a38b93 100644 --- a/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateIntegrationTests.java @@ -93,8 +93,6 @@ public class ReactiveRedisTemplateIntegrationTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @Before @@ -218,13 +216,13 @@ public class ReactiveRedisTemplateIntegrationTests { redisTemplate.hasKey(key1).as(StepVerifier::create).expectNext(false).verifyComplete(); redisTemplate.hasKey(key2).as(StepVerifier::create).expectNext(false).verifyComplete(); } - + @Test // DATAREDIS-913 public void unlinkManyPublisher() { K key1 = keyFactory.instance(); K key2 = keyFactory.instance(); - + assumeTrue(key1 instanceof String && valueFactory instanceof StringObjectFactory); redisTemplate.opsForValue().set(key1, valueFactory.instance()).as(StepVerifier::create).expectNext(true) @@ -237,13 +235,13 @@ public class ReactiveRedisTemplateIntegrationTests { redisTemplate.hasKey(key1).as(StepVerifier::create).expectNext(false).verifyComplete(); redisTemplate.hasKey(key2).as(StepVerifier::create).expectNext(false).verifyComplete(); } - + @Test // DATAREDIS-913 public void deleteManyPublisher() { K key1 = keyFactory.instance(); K key2 = keyFactory.instance(); - + assumeTrue(key1 instanceof String && valueFactory instanceof StringObjectFactory); redisTemplate.opsForValue().set(key1, valueFactory.instance()).as(StepVerifier::create).expectNext(true) diff --git a/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateUnitTests.java b/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateUnitTests.java index 512f37f22..8aa96a974 100644 --- a/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/ReactiveRedisTemplateUnitTests.java @@ -24,7 +24,8 @@ import reactor.test.StepVerifier; import java.util.concurrent.atomic.AtomicBoolean; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.connection.ReactivePubSubCommands; import org.springframework.data.redis.connection.ReactiveRedisConnection; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; @@ -36,13 +37,13 @@ import org.springframework.data.redis.serializer.RedisSerializationContext; * * @author Mark Paluch */ -public class ReactiveRedisTemplateUnitTests { +class ReactiveRedisTemplateUnitTests { - ReactiveRedisConnectionFactory connectionFactoryMock = mock(ReactiveRedisConnectionFactory.class); - ReactiveRedisConnection connectionMock = mock(ReactiveRedisConnection.class); + private ReactiveRedisConnectionFactory connectionFactoryMock = mock(ReactiveRedisConnectionFactory.class); + private ReactiveRedisConnection connectionMock = mock(ReactiveRedisConnection.class); @Test // DATAREDIS-999 - public void closeShouldUseAsyncRelease() { + void closeShouldUseAsyncRelease() { when(connectionFactoryMock.getReactiveConnection()).thenReturn(connectionMock); when(connectionMock.closeLater()).thenReturn(Mono.empty()); @@ -59,7 +60,7 @@ public class ReactiveRedisTemplateUnitTests { } @Test // DATAREDIS-1053 - public void listenToShouldSubscribeToChannel() { + void listenToShouldSubscribeToChannel() { AtomicBoolean closed = new AtomicBoolean(); when(connectionFactoryMock.getReactiveConnection()).thenReturn(connectionMock); diff --git a/src/test/java/org/springframework/data/redis/core/ReactiveStringRedisTemplateIntegrationTests.java b/src/test/java/org/springframework/data/redis/core/ReactiveStringRedisTemplateIntegrationTests.java index 7809b5832..522541181 100644 --- a/src/test/java/org/springframework/data/redis/core/ReactiveStringRedisTemplateIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/core/ReactiveStringRedisTemplateIntegrationTests.java @@ -17,39 +17,31 @@ package org.springframework.data.redis.core; import reactor.test.StepVerifier; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.data.redis.ConnectionFactoryTracker; -import org.springframework.data.redis.SettingsUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientConfiguration; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; /** * Integration tests for {@link ReactiveStringRedisTemplate}. * * @author Mark Paluch */ +@ExtendWith(LettuceConnectionFactoryExtension.class) public class ReactiveStringRedisTemplateIntegrationTests { - private static ReactiveRedisConnectionFactory connectionFactory; + private ReactiveRedisConnectionFactory connectionFactory; private ReactiveStringRedisTemplate template; - @BeforeClass - public static void beforeClass() { - - LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(SettingsUtils.standaloneConfiguration(), - LettuceTestClientConfiguration.create()); - connectionFactory.afterPropertiesSet(); - ConnectionFactoryTracker.add(connectionFactory); - - ReactiveStringRedisTemplateIntegrationTests.connectionFactory = connectionFactory; + public ReactiveStringRedisTemplateIntegrationTests(ReactiveRedisConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; } - @Before - public void before() { + @BeforeEach + void before() { template = new ReactiveStringRedisTemplate(connectionFactory); @@ -58,7 +50,7 @@ public class ReactiveStringRedisTemplateIntegrationTests { } @Test // DATAREDIS-643 - public void shouldSetAndGetKeys() { + void shouldSetAndGetKeys() { template.opsForValue().set("key", "value").as(StepVerifier::create).expectNext(true).verifyComplete(); template.opsForValue().get("key").as(StepVerifier::create).expectNext("value").verifyComplete(); diff --git a/src/test/java/org/springframework/data/redis/core/RedisClusterTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisClusterTemplateTests.java index d9359ebc7..a14c66265 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisClusterTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisClusterTemplateTests.java @@ -35,13 +35,16 @@ import org.springframework.data.redis.RawObjectFactory; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisCluster; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.oxm.xstream.XStreamMarshaller; @@ -51,8 +54,6 @@ import org.springframework.oxm.xstream.XStreamMarshaller; */ public class RedisClusterTemplateTests extends RedisTemplateTests { - static final List CLUSTER_NODES = Arrays.asList("127.0.0.1:7379", "127.0.0.1:7380", "127.0.0.1:7381"); - public RedisClusterTemplateTests(RedisTemplate redisTemplate, ObjectFactory keyFactory, ObjectFactory valueFactory) { super(redisTemplate, keyFactory, valueFactory); @@ -166,8 +167,8 @@ public class RedisClusterTemplateTests extends RedisTemplateTests { Jackson2JsonRedisSerializer jackson2JsonSerializer = new Jackson2JsonRedisSerializer<>(Person.class); // JEDIS - JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory( - new RedisClusterConfiguration(CLUSTER_NODES)); + JedisConnectionFactory jedisConnectionFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); jedisConnectionFactory.afterPropertiesSet(); @@ -203,17 +204,8 @@ public class RedisClusterTemplateTests extends RedisTemplateTests { // LETTUCE - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory( - new RedisClusterConfiguration(CLUSTER_NODES)); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - - lettuceConnectionFactory.afterPropertiesSet(); - - LettuceConnectionFactory pooledLettuceConnectionFactory = new LettuceConnectionFactory( - new RedisClusterConfiguration(CLUSTER_NODES), LettucePoolingClientConfiguration.builder() - .clientResources(LettuceTestClientResources.getSharedClientResources()).build()); - - pooledLettuceConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); RedisTemplate lettuceStringTemplate = new RedisTemplate<>(); lettuceStringTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8); @@ -245,11 +237,6 @@ public class RedisClusterTemplateTests extends RedisTemplateTests { lettuceJackson2JsonPersonTemplate.setValueSerializer(jackson2JsonSerializer); lettuceJackson2JsonPersonTemplate.afterPropertiesSet(); - RedisTemplate pooledLettuceStringTemplate = new RedisTemplate<>(); - pooledLettuceStringTemplate.setDefaultSerializer(StringRedisSerializer.UTF_8); - pooledLettuceStringTemplate.setConnectionFactory(pooledLettuceConnectionFactory); - pooledLettuceStringTemplate.afterPropertiesSet(); - return Arrays.asList(new Object[][] { // // JEDIS @@ -267,7 +254,6 @@ public class RedisClusterTemplateTests extends RedisTemplateTests { { lettucePersonTemplate, stringFactory, personFactory }, // { lettuceXstreamStringTemplate, stringFactory, stringFactory }, // { lettuceJackson2JsonPersonTemplate, stringFactory, personFactory }, // - { pooledLettuceStringTemplate, stringFactory, stringFactory } // }); } diff --git a/src/test/java/org/springframework/data/redis/core/RedisCommandUnitTests.java b/src/test/java/org/springframework/data/redis/core/RedisCommandUnitTests.java index 05fec2365..cd9a51666 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisCommandUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisCommandUnitTests.java @@ -17,9 +17,7 @@ package org.springframework.data.redis.core; import static org.assertj.core.api.Assertions.*; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link RedisCommand}. @@ -29,42 +27,40 @@ import org.junit.rules.ExpectedException; * @author Mark Paluch * @author Oscar Cai */ -public class RedisCommandUnitTests { - - public @Rule ExpectedException expectedException = ExpectedException.none(); +class RedisCommandUnitTests { @Test // DATAREDIS-73 - public void shouldIdentifyAliasCorrectly() { + void shouldIdentifyAliasCorrectly() { assertThat(RedisCommand.CONFIG_SET.isRepresentedBy("setconfig")).isTrue(); } @Test // DATAREDIS-73 - public void shouldIdentifyAliasCorrectlyWhenNamePassedInMixedCase() { + void shouldIdentifyAliasCorrectlyWhenNamePassedInMixedCase() { assertThat(RedisCommand.CONFIG_SET.isRepresentedBy("SetConfig")).isTrue(); } @Test // DATAREDIS-73 - public void shouldNotThrowExceptionWhenUsingNullKeyForRepresentationCheck() { + void shouldNotThrowExceptionWhenUsingNullKeyForRepresentationCheck() { assertThat(RedisCommand.CONFIG_SET.isRepresentedBy(null)).isFalse(); } @Test // DATAREDIS-73 - public void shouldIdentifyAliasCorrectlyViaLookup() { + void shouldIdentifyAliasCorrectlyViaLookup() { assertThat(RedisCommand.failsafeCommandLookup("setconfig")).isEqualTo(RedisCommand.CONFIG_SET); } @Test // DATAREDIS-73 - public void shouldIdentifyAliasCorrectlyWhenNamePassedInMixedCaseViaLookup() { + void shouldIdentifyAliasCorrectlyWhenNamePassedInMixedCaseViaLookup() { assertThat(RedisCommand.failsafeCommandLookup("SetConfig")).isEqualTo(RedisCommand.CONFIG_SET); } @Test // DATAREDIS-73 - public void shouldReturnUnknownCommandForUnknownCommandString() { + void shouldReturnUnknownCommandForUnknownCommandString() { assertThat(RedisCommand.failsafeCommandLookup("strangecommand")).isEqualTo(RedisCommand.UNKNOWN); } @Test // DATAREDIS-73, DATAREDIS-972, DATAREDIS-1013 - public void shouldNotThrowExceptionOnValidArgumentCount() { + void shouldNotThrowExceptionOnValidArgumentCount() { RedisCommand.AUTH.validateArgumentCount(1); RedisCommand.ZADD.validateArgumentCount(3); @@ -75,7 +71,7 @@ public class RedisCommandUnitTests { } @Test // DATAREDIS-822 - public void shouldConsiderMinMaxArguments() { + void shouldConsiderMinMaxArguments() { RedisCommand.BITPOS.validateArgumentCount(2); RedisCommand.BITPOS.validateArgumentCount(3); @@ -83,38 +79,26 @@ public class RedisCommandUnitTests { } @Test // DATAREDIS-822 - public void shouldReportArgumentMismatchIfMaxArgumentsExceeded() { - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("SELECT command requires 1 argument"); - - RedisCommand.SELECT.validateArgumentCount(0); + void shouldReportArgumentMismatchIfMaxArgumentsExceeded() { + assertThatIllegalArgumentException().isThrownBy(() -> RedisCommand.SELECT.validateArgumentCount(0)) + .withMessageContaining("SELECT command requires 1 argument"); } @Test // DATAREDIS-73 - public void shouldThrowExceptionOnInvalidArgumentCountWhenExpectedExactMatch() { - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("AUTH command requires 1 argument"); - - RedisCommand.AUTH.validateArgumentCount(2); + void shouldThrowExceptionOnInvalidArgumentCountWhenExpectedExactMatch() { + assertThatIllegalArgumentException().isThrownBy(() -> RedisCommand.AUTH.validateArgumentCount(2)) + .withMessageContaining("AUTH command requires 1 argument"); } @Test // DATAREDIS-73 - public void shouldThrowExceptionOnInvalidArgumentCountForDelWhenExpectedMinimalMatch() { - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("DEL command requires at least 1 argument"); - - RedisCommand.DEL.validateArgumentCount(0); + void shouldThrowExceptionOnInvalidArgumentCountForDelWhenExpectedMinimalMatch() { + assertThatIllegalArgumentException().isThrownBy(() -> RedisCommand.DEL.validateArgumentCount(0)) + .withMessageContaining("DEL command requires at least 1 argument"); } @Test // DATAREDIS-972 - public void shouldThrowExceptionOnInvalidArgumentCountForZaddWhenExpectedMinimalMatch() { - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("ZADD command requires at least 3 arguments"); - - RedisCommand.ZADD.validateArgumentCount(2); + void shouldThrowExceptionOnInvalidArgumentCountForZaddWhenExpectedMinimalMatch() { + assertThatIllegalArgumentException().isThrownBy(() -> RedisCommand.ZADD.validateArgumentCount(2)) + .withMessageContaining("ZADD command requires at least 3 arguments"); } } diff --git a/src/test/java/org/springframework/data/redis/core/RedisConnectionUtilsUnitTests.java b/src/test/java/org/springframework/data/redis/core/RedisConnectionUtilsUnitTests.java index 3e84d3391..72718445c 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisConnectionUtilsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisConnectionUtilsUnitTests.java @@ -17,7 +17,7 @@ package org.springframework.data.redis.core; import static org.mockito.Mockito.*; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -27,10 +27,10 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; * * @author Mark Paluch */ -public class RedisConnectionUtilsUnitTests { +class RedisConnectionUtilsUnitTests { @Test // DATAREDIS-1104 - public void shouldSilentlyCloseRedisConnection() { + void shouldSilentlyCloseRedisConnection() { RedisConnection connectionMock = mock(RedisConnection.class); RedisConnectionFactory factoryMock = mock(RedisConnectionFactory.class); diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyExpiredEventUnitTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyExpiredEventUnitTests.java index 2a7fe9c36..07413c6bd 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyExpiredEventUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyExpiredEventUnitTests.java @@ -15,30 +15,31 @@ */ package org.springframework.data.redis.core; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; /** * Unit tests for {@link RedisKeyExpiredEvent}. * * @author Mark Paluch */ -public class RedisKeyExpiredEventUnitTests { +class RedisKeyExpiredEventUnitTests { @Test // DATAREDIS-744 - public void shouldReturnKeyspace() { + void shouldReturnKeyspace() { - assertThat(new RedisKeyExpiredEvent("foo".getBytes(), "").getKeyspace()).isNull(); - assertThat(new RedisKeyExpiredEvent("foo:bar".getBytes(), "").getKeyspace()).isEqualTo("foo"); - assertThat(new RedisKeyExpiredEvent("foo:bar:baz".getBytes(), "").getKeyspace()).isEqualTo("foo"); + assertThat(new RedisKeyExpiredEvent<>("foo".getBytes(), "").getKeyspace()).isNull(); + assertThat(new RedisKeyExpiredEvent<>("foo:bar".getBytes(), "").getKeyspace()).isEqualTo("foo"); + assertThat(new RedisKeyExpiredEvent<>("foo:bar:baz".getBytes(), "").getKeyspace()).isEqualTo("foo"); } @Test // DATAREDIS-744 - public void shouldReturnId() { + void shouldReturnId() { - assertThat(new RedisKeyExpiredEvent("foo".getBytes(), "").getId()).isEqualTo("foo".getBytes()); - assertThat(new RedisKeyExpiredEvent("foo:bar".getBytes(), "").getId()).isEqualTo("bar".getBytes()); - assertThat(new RedisKeyExpiredEvent("foo:bar:baz".getBytes(), "").getId()).isEqualTo("bar:baz".getBytes()); + assertThat(new RedisKeyExpiredEvent<>("foo".getBytes(), "").getId()).isEqualTo("foo".getBytes()); + assertThat(new RedisKeyExpiredEvent<>("foo:bar".getBytes(), "").getId()).isEqualTo("bar".getBytes()); + assertThat(new RedisKeyExpiredEvent<>("foo:bar:baz".getBytes(), "").getId()).isEqualTo("bar:baz".getBytes()); } } diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java index cf2e9df8b..94c2cff46 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterTests.java @@ -22,22 +22,17 @@ import static org.junit.Assume.*; import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.springframework.beans.factory.InitializingBean; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Reference; import org.springframework.data.geo.Point; @@ -46,8 +41,7 @@ import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.RedisTestProfileValueSource; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.RedisKeyValueAdapter.EnableKeyspaceEvents; import org.springframework.data.redis.core.RedisKeyValueAdapter.ShadowCopy; import org.springframework.data.redis.core.convert.KeyspaceConfiguration; @@ -63,41 +57,19 @@ import org.springframework.data.redis.core.mapping.RedisMappingContext; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(Parameterized.class) +@ExtendWith(LettuceConnectionFactoryExtension.class) public class RedisKeyValueAdapterTests { - private static Set initializedFactories = new HashSet<>(); - - RedisKeyValueAdapter adapter; - StringRedisTemplate template; - RedisConnectionFactory connectionFactory; + private RedisKeyValueAdapter adapter; + private StringRedisTemplate template; + private RedisConnectionFactory connectionFactory; public RedisKeyValueAdapterTests(RedisConnectionFactory connectionFactory) throws Exception { - - if (connectionFactory instanceof InitializingBean && initializedFactories.add(connectionFactory)) { - ((InitializingBean) connectionFactory).afterPropertiesSet(); - } - this.connectionFactory = connectionFactory; - ConnectionFactoryTracker.add(connectionFactory); } - @Parameters - public static List params() { - - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - return Collections.singletonList(lettuceConnectionFactory); - } - - @AfterClass - public static void cleanUp() { - initializedFactories.clear(); - ConnectionFactoryTracker.cleanUp(); - } - - @Before - public void setUp() { + @BeforeEach + void setUp() { template = new StringRedisTemplate(connectionFactory); template.afterPropertiesSet(); @@ -124,8 +96,8 @@ public class RedisKeyValueAdapterTests { } } - @After - public void tearDown() { + @AfterEach + void tearDown() { try { adapter.destroy(); @@ -135,7 +107,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void putWritesDataCorrectly() { + void putWritesDataCorrectly() { Person rand = new Person(); rand.age = 24; @@ -149,7 +121,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-744 - public void putWritesDataWithColonCorrectly() { + void putWritesDataWithColonCorrectly() { Person rand = new Person(); rand.age = 24; @@ -163,7 +135,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void putWritesSimpleIndexDataCorrectly() { + void putWritesSimpleIndexDataCorrectly() { Person rand = new Person(); rand.firstname = "rand"; @@ -175,7 +147,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-744 - public void putWritesSimpleIndexDataWithColonCorrectly() { + void putWritesSimpleIndexDataWithColonCorrectly() { Person rand = new Person(); rand.firstname = "rand"; @@ -187,7 +159,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void putWritesNestedDataCorrectly() { + void putWritesNestedDataCorrectly() { Person rand = new Person(); rand.address = new Address(); @@ -200,7 +172,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void putWritesSimpleNestedIndexValuesCorrectly() { + void putWritesSimpleNestedIndexValuesCorrectly() { Person rand = new Person(); rand.address = new Address(); @@ -213,7 +185,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void getShouldReadSimpleObjectCorrectly() { + void getShouldReadSimpleObjectCorrectly() { Map map = new LinkedHashMap<>(); map.put("_class", Person.class.getName()); @@ -227,7 +199,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-744 - public void getShouldReadSimpleObjectWithColonInIdCorrectly() { + void getShouldReadSimpleObjectWithColonInIdCorrectly() { Map map = new LinkedHashMap(); map.put("_class", Person.class.getName()); @@ -241,7 +213,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void getShouldReadNestedObjectCorrectly() { + void getShouldReadNestedObjectCorrectly() { Map map = new LinkedHashMap<>(); map.put("_class", Person.class.getName()); @@ -255,7 +227,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void couldReadsKeyspaceSizeCorrectly() { + void couldReadsKeyspaceSizeCorrectly() { Map map = new LinkedHashMap<>(); map.put("_class", Person.class.getName()); @@ -268,7 +240,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void deleteRemovesEntriesCorrectly() { + void deleteRemovesEntriesCorrectly() { Map map = new LinkedHashMap<>(); map.put("_class", Person.class.getName()); @@ -283,7 +255,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void deleteCleansIndexedDataCorrectly() { + void deleteCleansIndexedDataCorrectly() { Map map = new LinkedHashMap<>(); map.put("_class", Person.class.getName()); @@ -300,7 +272,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-1106 - public void deleteRemovesExpireHelperStructures() { + void deleteRemovesExpireHelperStructures() { WithExpiration source = new WithExpiration(); source.id = "1"; @@ -318,7 +290,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-425 - public void keyExpiredEventShouldRemoveHelperStructures() throws Exception { + void keyExpiredEventShouldRemoveHelperStructures() throws Exception { assumeTrue(RedisTestProfileValueSource.matches("runLongTests", "true")); @@ -346,7 +318,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-744 - public void keyExpiredEventShouldRemoveHelperStructuresForObjectsWithColonInId() throws Exception { + void keyExpiredEventShouldRemoveHelperStructuresForObjectsWithColonInId() throws Exception { assumeTrue(RedisTestProfileValueSource.matches("runLongTests", "true")); @@ -374,7 +346,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-589 - public void keyExpiredEventWithoutKeyspaceShouldBeIgnored() throws Exception { + void keyExpiredEventWithoutKeyspaceShouldBeIgnored() throws Exception { assumeTrue(RedisTestProfileValueSource.matches("runLongTests", "true")); @@ -401,7 +373,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-512 - public void putWritesIndexDataCorrectly() { + void putWritesIndexDataCorrectly() { Person rand = new Person(); rand.age = 24; @@ -437,7 +409,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldAlterIndexDataCorrectly() { + void updateShouldAlterIndexDataCorrectly() { Person rand = new Person(); rand.firstname = "rand"; @@ -456,7 +428,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-744 - public void updateShouldAlterIndexDataForObjectsWithColonInIdCorrectly() { + void updateShouldAlterIndexDataForObjectsWithColonInIdCorrectly() { Person rand = new Person(); rand.firstname = "rand"; @@ -475,7 +447,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldAlterIndexDataOnNestedObjectCorrectly() { + void updateShouldAlterIndexDataOnNestedObjectCorrectly() { Person rand = new Person(); rand.address = new Address(); @@ -498,7 +470,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldAlterIndexDataOnNestedObjectPathCorrectly() { + void updateShouldAlterIndexDataOnNestedObjectPathCorrectly() { Person rand = new Person(); rand.address = new Address(); @@ -518,7 +490,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldRemoveComplexObjectCorrectly() { + void updateShouldRemoveComplexObjectCorrectly() { Person rand = new Person(); rand.address = new Address(); @@ -538,7 +510,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldRemoveSimpleListValuesCorrectly() { + void updateShouldRemoveSimpleListValuesCorrectly() { Person rand = new Person(); rand.nicknames = Arrays.asList("lews therin", "dragon reborn"); @@ -555,7 +527,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldRemoveComplexListValuesCorrectly() { + void updateShouldRemoveComplexListValuesCorrectly() { Person mat = new Person(); mat.firstname = "mat"; @@ -582,7 +554,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldRemoveSimpleMapValuesCorrectly() { + void updateShouldRemoveSimpleMapValuesCorrectly() { Person rand = new Person(); rand.physicalAttributes = Collections.singletonMap("eye-color", "grey"); @@ -598,7 +570,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-471 - public void updateShouldRemoveComplexMapValuesCorrectly() { + void updateShouldRemoveComplexMapValuesCorrectly() { Person tam = new Person(); tam.firstname = "tam"; @@ -617,7 +589,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-533 - public void putShouldCreateGeoIndexCorrectly() { + void putShouldCreateGeoIndexCorrectly() { Person tam = new Person(); tam.id = "1"; @@ -631,7 +603,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-533 - public void deleteShouldRemoveGeoIndexCorrectly() { + void deleteShouldRemoveGeoIndexCorrectly() { Person tam = new Person(); tam.id = "1"; @@ -647,7 +619,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-533 - public void updateShouldAlterGeoIndexCorrectlyOnDelete() { + void updateShouldAlterGeoIndexCorrectlyOnDelete() { Person tam = new Person(); tam.id = "1"; @@ -666,7 +638,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-533, DATAREDIS-614 - public void updateShouldAlterGeoIndexCorrectlyOnUpdate() { + void updateShouldAlterGeoIndexCorrectlyOnUpdate() { Person tam = new Person(); tam.id = "1"; @@ -689,7 +661,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-1091 - public void phantomKeyNotInsertedOnPutWhenShadowCopyIsTurnedOff() { + void phantomKeyNotInsertedOnPutWhenShadowCopyIsTurnedOff() { RedisMappingContext mappingContext = new RedisMappingContext( new MappingConfiguration(new IndexConfiguration(), new KeyspaceConfiguration())); @@ -708,7 +680,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-1091 - public void phantomKeyInsertedOnPutWhenShadowCopyIsTurnedOn() { + void phantomKeyInsertedOnPutWhenShadowCopyIsTurnedOn() { RedisMappingContext mappingContext = new RedisMappingContext( new MappingConfiguration(new IndexConfiguration(), new KeyspaceConfiguration())); @@ -727,7 +699,7 @@ public class RedisKeyValueAdapterTests { } @Test // DATAREDIS-1091 - public void phantomKeyInsertedOnPutWhenShadowCopyIsInDefaultAndKeyspaceNotificationEnabled() { + void phantomKeyInsertedOnPutWhenShadowCopyIsInDefaultAndKeyspaceNotificationEnabled() { ExpiringPerson rand = new ExpiringPerson(); rand.age = 24; diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterUnitTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterUnitTests.java index db8bc3f91..34bb77d45 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyValueAdapterUnitTests.java @@ -26,13 +26,15 @@ import java.util.LinkedHashSet; import java.util.Properties; import java.util.concurrent.atomic.AtomicReference; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.data.annotation.Id; import org.springframework.data.redis.connection.RedisConnection; @@ -53,17 +55,18 @@ import org.springframework.data.redis.listener.KeyExpirationEventMessageListener * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.Silent.class) -public class RedisKeyValueAdapterUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class RedisKeyValueAdapterUnitTests { - RedisKeyValueAdapter adapter; - RedisTemplate template; - RedisMappingContext context; + private RedisKeyValueAdapter adapter; + private RedisTemplate template; + private RedisMappingContext context; @Mock JedisConnectionFactory jedisConnectionFactoryMock; @Mock RedisConnection redisConnectionMock; - @Before - public void setUp() throws Exception { + @BeforeEach + void setUp() throws Exception { template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactoryMock); @@ -83,13 +86,13 @@ public class RedisKeyValueAdapterUnitTests { adapter.afterPropertiesSet(); } - @After - public void tearDown() throws Exception { + @AfterEach + void tearDown() throws Exception { adapter.destroy(); } @Test // DATAREDIS-507 - public void destroyShouldNotDestroyConnectionFactory() throws Exception { + void destroyShouldNotDestroyConnectionFactory() throws Exception { adapter.destroy(); @@ -97,7 +100,7 @@ public class RedisKeyValueAdapterUnitTests { } @Test // DATAREDIS-512, DATAREDIS-530 - public void putShouldRemoveExistingIndexValuesWhenUpdating() { + void putShouldRemoveExistingIndexValuesWhenUpdating() { RedisData rd = new RedisData(Bucket.newBucketFromStringMap(Collections.singletonMap("_id", "1"))); rd.addIndexedData(new SimpleIndexedPropertyValue("persons", "firstname", "rand")); @@ -112,7 +115,7 @@ public class RedisKeyValueAdapterUnitTests { } @Test // DATAREDIS-512 - public void putShouldNotTryToRemoveExistingIndexValuesWhenInsertingNew() { + void putShouldNotTryToRemoveExistingIndexValuesWhenInsertingNew() { RedisData rd = new RedisData(Bucket.newBucketFromStringMap(Collections.singletonMap("_id", "1"))); rd.addIndexedData(new SimpleIndexedPropertyValue("persons", "firstname", "rand")); @@ -127,7 +130,7 @@ public class RedisKeyValueAdapterUnitTests { } @Test // DATAREDIS-491 - public void shouldInitKeyExpirationListenerOnStartup() throws Exception { + void shouldInitKeyExpirationListenerOnStartup() throws Exception { adapter.destroy(); @@ -141,7 +144,7 @@ public class RedisKeyValueAdapterUnitTests { } @Test // DATAREDIS-491 - public void shouldInitKeyExpirationListenerOnFirstPutWithTtl() throws Exception { + void shouldInitKeyExpirationListenerOnFirstPutWithTtl() throws Exception { adapter.destroy(); @@ -165,7 +168,7 @@ public class RedisKeyValueAdapterUnitTests { } @Test // DATAREDIS-491 - public void shouldNeverInitKeyExpirationListener() throws Exception { + void shouldNeverInitKeyExpirationListener() throws Exception { adapter.destroy(); diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java index 7ba75f63e..670e2bb33 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java @@ -43,10 +43,13 @@ import org.springframework.data.annotation.Id; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.core.index.Indexed; import org.springframework.data.redis.core.mapping.RedisMappingContext; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.util.ObjectUtils; /** @@ -65,30 +68,19 @@ public class RedisKeyValueTemplateTests { RedisKeyValueAdapter adapter; public RedisKeyValueTemplateTests(RedisConnectionFactory connectionFactory) { - this.connectionFactory = connectionFactory; - ConnectionFactoryTracker.add(connectionFactory); - } @Parameters public static List params() { - JedisConnectionFactory jedis = new JedisConnectionFactory(); - jedis.afterPropertiesSet(); + JedisConnectionFactory jedis = JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); - LettuceConnectionFactory lettuce = new LettuceConnectionFactory(); - lettuce.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuce.afterPropertiesSet(); + LettuceConnectionFactory lettuce = LettuceConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); return Arrays. asList(jedis, lettuce); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Before public void setUp() { diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java index 43d1d774a..c9bd53735 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java @@ -45,7 +45,7 @@ import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.connection.StringRedisConnection; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.core.ZSetOperations.TypedTuple; import org.springframework.data.redis.core.query.SortQueryBuilder; import org.springframework.data.redis.core.script.DefaultRedisScript; @@ -79,8 +79,6 @@ public class RedisTemplateTests { this.redisTemplate = redisTemplate; this.keyFactory = keyFactory; this.valueFactory = valueFactory; - - ConnectionFactoryTracker.add(redisTemplate.getConnectionFactory()); } @After diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateUnitTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateUnitTests.java index a409afe50..6ea50e94e 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateUnitTests.java @@ -21,10 +21,13 @@ import static org.mockito.Mockito.*; import java.io.Serializable; import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; @@ -40,15 +43,15 @@ import org.springframework.transaction.support.TransactionSynchronizationManager * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) -public class RedisTemplateUnitTests { +@ExtendWith(MockitoExtension.class) +class RedisTemplateUnitTests { private RedisTemplate template; private @Mock RedisConnectionFactory connectionFactoryMock; private @Mock RedisConnection redisConnectionMock; - @Before - public void setUp() { + @BeforeEach + void setUp() { TransactionSynchronizationManager.clear(); @@ -60,21 +63,21 @@ public class RedisTemplateUnitTests { } @Test // DATAREDIS-277 - public void slaveOfIsDelegatedToConnectionCorrectly() { + void slaveOfIsDelegatedToConnectionCorrectly() { template.slaveOf("127.0.0.1", 1001); verify(redisConnectionMock, times(1)).slaveOf(eq("127.0.0.1"), eq(1001)); } @Test // DATAREDIS-277 - public void slaveOfNoOneIsDelegatedToConnectionCorrectly() { + void slaveOfNoOneIsDelegatedToConnectionCorrectly() { template.slaveOfNoOne(); verify(redisConnectionMock, times(1)).slaveOfNoOne(); } @Test // DATAREDIS-501 - public void templateShouldPassOnAndUseResoureLoaderClassLoaderToDefaultJdkSerializerWhenNotAlreadySet() { + void templateShouldPassOnAndUseResoureLoaderClassLoaderToDefaultJdkSerializerWhenNotAlreadySet() { ShadowingClassLoader scl = new ShadowingClassLoader(ClassLoader.getSystemClassLoader()); @@ -92,7 +95,7 @@ public class RedisTemplateUnitTests { } @Test // DATAREDIS-531 - public void executeWithStickyConnectionShouldNotCloseConnectionWhenDone() { + void executeWithStickyConnectionShouldNotCloseConnectionWhenDone() { CapturingCallback callback = new CapturingCallback(); template.executeWithStickyConnection(callback); @@ -102,7 +105,7 @@ public class RedisTemplateUnitTests { } @Test // DATAREDIS-988 - public void executeSessionShouldReuseConnection() { + void executeSessionShouldReuseConnection() { template.execute(new SessionCallback() { @Nullable @@ -120,7 +123,7 @@ public class RedisTemplateUnitTests { } @Test // DATAREDIS-988 - public void executeSessionInTransactionShouldReuseConnection() { + void executeSessionInTransactionShouldReuseConnection() { TransactionSynchronizationManager.setCurrentTransactionReadOnly(true); @@ -139,7 +142,7 @@ public class RedisTemplateUnitTests { } @Test // DATAREDIS-988 - public void transactionAwareTemplateShouldReleaseConnection() { + void transactionAwareTemplateShouldReleaseConnection() { template.setEnableTransactionSupport(true); TransactionSynchronizationManager.setCurrentTransactionReadOnly(true); @@ -159,7 +162,7 @@ public class RedisTemplateUnitTests { verify(redisConnectionMock, times(2)).close(); } - static class SomeArbitrarySerializableObject implements Serializable { + private static class SomeArbitrarySerializableObject implements Serializable { private static final long serialVersionUID = -5973659324040506423L; } diff --git a/src/test/java/org/springframework/data/redis/core/ScanCursorUnitTests.java b/src/test/java/org/springframework/data/redis/core/ScanCursorUnitTests.java index 9b11068ff..0c373f411 100644 --- a/src/test/java/org/springframework/data/redis/core/ScanCursorUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/ScanCursorUnitTests.java @@ -27,33 +27,29 @@ import java.util.NoSuchElementException; import java.util.Queue; import java.util.Stack; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; import org.springframework.dao.InvalidDataAccessApiUsageException; /** * @author Christoph Strobl */ -public class ScanCursorUnitTests { - - public @Rule ExpectedException exception = ExpectedException.none(); +class ScanCursorUnitTests { @Test // DATAREDIS-290 - public void cursorShouldNotLoopWhenNoValuesFound() { + void cursorShouldNotLoopWhenNoValuesFound() { CapturingCursorDummy cursor = initCursor(new LinkedList<>()); assertThat(cursor.hasNext()).isFalse(); } @Test // DATAREDIS-290 - public void cursorShouldReturnNullWhenNoNextElementAvailable() { + void cursorShouldReturnNullWhenNoNextElementAvailable() { assertThatExceptionOfType(NoSuchElementException.class).isThrownBy(() -> initCursor(new LinkedList<>()).next()); } @Test // DATAREDIS-290 - public void cursorShouldNotLoopWhenReachingStartingPointInFistLoop() { + void cursorShouldNotLoopWhenReachingStartingPointInFistLoop() { LinkedList> values = new LinkedList<>(); values.add(createIteration(0, "spring", "data", "redis")); @@ -73,7 +69,7 @@ public class ScanCursorUnitTests { } @Test // DATAREDIS-290 - public void cursorShouldStopLoopWhenReachingStartingPoint() { + void cursorShouldStopLoopWhenReachingStartingPoint() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1, "spring")); @@ -95,40 +91,29 @@ public class ScanCursorUnitTests { } @Test // DATAREDIS-290 - public void shouldThrowExceptionWhenAccessingClosedCursor() { + void shouldThrowExceptionWhenAccessingClosedCursor() { CapturingCursorDummy cursor = new CapturingCursorDummy(null); assertThat(cursor.isClosed()).isFalse(); - exception.expect(InvalidDataAccessApiUsageException.class); - exception.expectMessage("closed cursor"); - - cursor.next(); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(cursor::next) + .withMessageContaining("closed cursor"); } - @Test(expected = InvalidDataAccessApiUsageException.class) // DATAREDIS-290 - public void repoeningCursorShouldHappenAtLastPosition() throws IOException { + @Test // DATAREDIS-290 + void repoeningCursorShouldHappenAtLastPosition() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1, "spring")); values.add(createIteration(2, "data")); values.add(createIteration(0, "redis")); - Cursor cursor = initCursor(values).open(); - assertThat(cursor.next()).isEqualTo("spring"); - assertThat(cursor.getCursorId()).isEqualTo(1L); - - // close the cursor - cursor.close(); - assertThat(cursor.isClosed()).isTrue(); - - // reopen cursor at last position - cursor.open(); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(() -> initCursor(values).open()); } @Test // DATAREDIS-290 - public void positionShouldBeIncrementedCorrectly() throws IOException { + void positionShouldBeIncrementedCorrectly() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1, "spring")); @@ -146,7 +131,7 @@ public class ScanCursorUnitTests { } @Test // DATAREDIS-417 - public void hasNextShouldCallScanUntilFinishedWhenScanResultIsAnEmptyCollection() { + void hasNextShouldCallScanUntilFinishedWhenScanResultIsAnEmptyCollection() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1, "spring")); @@ -167,7 +152,7 @@ public class ScanCursorUnitTests { } @Test // DATAREDIS-417 - public void hasNextShouldStopWhenScanResultIsAnEmptyCollectionAndStateIsFinished() { + void hasNextShouldStopWhenScanResultIsAnEmptyCollectionAndStateIsFinished() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1, "spring")); @@ -190,7 +175,7 @@ public class ScanCursorUnitTests { } @Test // DATAREDIS-417 - public void hasNextShouldStopCorrectlyWhenWholeScanIterationDoesNotReturnResultsAndStateIsFinished() { + void hasNextShouldStopCorrectlyWhenWholeScanIterationDoesNotReturnResultsAndStateIsFinished() { LinkedList> values = new LinkedList<>(); values.add(createIteration(1)); @@ -229,7 +214,7 @@ public class ScanCursorUnitTests { private Stack cursors; - public CapturingCursorDummy(Queue> values) { + CapturingCursorDummy(Queue> values) { this.values = values; } diff --git a/src/test/java/org/springframework/data/redis/core/SessionTest.java b/src/test/java/org/springframework/data/redis/core/SessionUnitTests.java similarity index 80% rename from src/test/java/org/springframework/data/redis/core/SessionTest.java rename to src/test/java/org/springframework/data/redis/core/SessionUnitTests.java index ff9d2b952..44649f93b 100644 --- a/src/test/java/org/springframework/data/redis/core/SessionTest.java +++ b/src/test/java/org/springframework/data/redis/core/SessionUnitTests.java @@ -15,10 +15,11 @@ */ package org.springframework.data.redis.core; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.Test; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -27,14 +28,14 @@ import org.springframework.data.redis.connection.StringRedisConnection; /** * @author Costin Leau */ -public class SessionTest { +class SessionUnitTests { @Test - public void testSession() throws Exception { - final RedisConnection conn = mock(RedisConnection.class); - final StringRedisConnection stringConn = mock(StringRedisConnection.class); + void testSession() throws Exception { + RedisConnection conn = mock(RedisConnection.class); + StringRedisConnection stringConn = mock(StringRedisConnection.class); RedisConnectionFactory factory = mock(RedisConnectionFactory.class); - final StringRedisTemplate template = spy(new StringRedisTemplate(factory)); + StringRedisTemplate template = spy(new StringRedisTemplate(factory)); when(factory.getConnection()).thenReturn(conn); doReturn(stringConn).when(template).preProcessConnection(eq(conn), anyBoolean()); @@ -50,7 +51,7 @@ public class SessionTest { }); } - private void checkConnection(RedisTemplate template, final RedisConnection expectedConnection) { + private void checkConnection(RedisTemplate template, RedisConnection expectedConnection) { template.execute(connection -> { assertThat(connection).isSameAs(expectedConnection); return null; diff --git a/src/test/java/org/springframework/data/redis/core/SortTest.java b/src/test/java/org/springframework/data/redis/core/SortTest.java deleted file mode 100644 index 9ed14ee87..000000000 --- a/src/test/java/org/springframework/data/redis/core/SortTest.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2011-2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.redis.core; - -import org.junit.After; -import org.junit.Before; -import org.springframework.data.redis.core.query.SortQueryBuilder; - -public class SortTest { - - @Before - public void setUp() throws Exception {} - - @After - public void tearDown() throws Exception {} - - public void testBasicDSL() throws Exception { - SortQueryBuilder.sort("list").build(); - } - -} diff --git a/src/test/java/org/springframework/data/redis/core/TimeoutUtilsTests.java b/src/test/java/org/springframework/data/redis/core/TimeoutUtilsUnitTests.java similarity index 73% rename from src/test/java/org/springframework/data/redis/core/TimeoutUtilsTests.java rename to src/test/java/org/springframework/data/redis/core/TimeoutUtilsUnitTests.java index 828fdb407..34621d034 100644 --- a/src/test/java/org/springframework/data/redis/core/TimeoutUtilsTests.java +++ b/src/test/java/org/springframework/data/redis/core/TimeoutUtilsUnitTests.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.*; import java.time.Duration; import java.util.concurrent.TimeUnit; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit test of {@link TimeoutUtils} @@ -28,82 +28,82 @@ import org.junit.Test; * @author Jennifer Hickey * @author Christoph Strobl */ -public class TimeoutUtilsTests { +class TimeoutUtilsUnitTests { @Test - public void testConvertMoreThanOneSecond() { + void testConvertMoreThanOneSecond() { assertThat(TimeoutUtils.toSeconds(2010, TimeUnit.MILLISECONDS)).isEqualTo(2); } @Test - public void testConvertLessThanOneSecond() { + void testConvertLessThanOneSecond() { assertThat(TimeoutUtils.toSeconds(999, TimeUnit.NANOSECONDS)).isOne(); } @Test - public void testConvertZeroSeconds() { + void testConvertZeroSeconds() { assertThat(TimeoutUtils.toSeconds(0, TimeUnit.MINUTES)).isZero(); } @Test - public void testConvertNegativeSecondsGreaterThanNegativeOne() { + void testConvertNegativeSecondsGreaterThanNegativeOne() { // Ensure we convert this to 0 as before, though ideally we wouldn't accept negative values assertThat(TimeoutUtils.toSeconds(-123, TimeUnit.MILLISECONDS)).isZero(); } @Test - public void testConvertNegativeSecondsEqualNegativeOne() { + void testConvertNegativeSecondsEqualNegativeOne() { assertThat(TimeoutUtils.toSeconds(-1111, TimeUnit.MILLISECONDS)).isEqualTo(-1); } @Test - public void testConvertNegativeSecondsLessThanNegativeOne() { + void testConvertNegativeSecondsLessThanNegativeOne() { assertThat(TimeoutUtils.toSeconds(-2344, TimeUnit.MILLISECONDS)).isEqualTo(-2); } @Test - public void testConvertMoreThanOneMilli() { + void testConvertMoreThanOneMilli() { assertThat(TimeoutUtils.toMillis(2010, TimeUnit.MICROSECONDS)).isEqualTo(2); } @Test - public void testConvertLessThanOneMilli() { + void testConvertLessThanOneMilli() { assertThat(TimeoutUtils.toMillis(999, TimeUnit.NANOSECONDS)).isOne(); } @Test - public void testConvertZeroMillis() { + void testConvertZeroMillis() { assertThat(TimeoutUtils.toMillis(0, TimeUnit.SECONDS)).isZero(); } @Test - public void testConvertNegativeMillisGreaterThanNegativeOne() { + void testConvertNegativeMillisGreaterThanNegativeOne() { // Ensure we convert this to 0 as before, though ideally we wouldn't accept negative values assertThat(TimeoutUtils.toMillis(-123, TimeUnit.MICROSECONDS)).isZero(); } @Test - public void testConvertNegativeMillisEqualNegativeOne() { + void testConvertNegativeMillisEqualNegativeOne() { assertThat(TimeoutUtils.toMillis(-1111, TimeUnit.MICROSECONDS)).isEqualTo(-1); } @Test - public void testConvertNegativeMillisLessThanNegativeOne() { + void testConvertNegativeMillisLessThanNegativeOne() { assertThat(TimeoutUtils.toMillis(-2344, TimeUnit.MICROSECONDS)).isEqualTo(-2); } @Test // DATAREDIS-815 - public void hasMillisReturnsFalseForTimeoutOfExactSeconds() { + void hasMillisReturnsFalseForTimeoutOfExactSeconds() { assertThat(TimeoutUtils.hasMillis(Duration.ofSeconds(1))).isFalse(); } @Test // DATAREDIS-815 - public void hasMillisReturnsTrueForTimeoutWithMsec() { + void hasMillisReturnsTrueForTimeoutWithMsec() { assertThat(TimeoutUtils.hasMillis(Duration.ofMillis(1500))).isTrue(); } @Test // DATAREDIS-815 - public void hasMillisReturnsTrueForTimeoutLessThanOneSecond() { + void hasMillisReturnsTrueForTimeoutLessThanOneSecond() { assertThat(TimeoutUtils.hasMillis(Duration.ofMillis(500))).isTrue(); } } diff --git a/src/test/java/org/springframework/data/redis/core/script/AbstractDefaultScriptExecutorTests.java b/src/test/java/org/springframework/data/redis/core/script/AbstractDefaultScriptExecutorTests.java index 35335f9eb..1c8b63790 100644 --- a/src/test/java/org/springframework/data/redis/core/script/AbstractDefaultScriptExecutorTests.java +++ b/src/test/java/org/springframework/data/redis/core/script/AbstractDefaultScriptExecutorTests.java @@ -21,8 +21,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.dao.DataAccessException; @@ -36,9 +36,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.scripting.support.StaticScriptSource; -import org.springframework.test.annotation.IfProfileValue; /** * Integration test of {@link DefaultScriptExecutor} @@ -48,23 +46,19 @@ import org.springframework.test.annotation.IfProfileValue; * @author Christoph Strobl * @author Mark Paluch */ -@IfProfileValue(name = "redisVersion", value = "2.6+") public abstract class AbstractDefaultScriptExecutorTests { - public static @ClassRule MinimumRedisVersionRule minRedisVersion = new MinimumRedisVersionRule(); - @SuppressWarnings("rawtypes") // private RedisTemplate template; protected abstract RedisConnectionFactory getConnectionFactory(); - @SuppressWarnings("unchecked") - public void tearDown() { - - if (template == null) { - return; - } + @BeforeEach + void setup() { + StringRedisTemplate template = new StringRedisTemplate(); + template.setConnectionFactory(getConnectionFactory()); + template.afterPropertiesSet(); template.execute((RedisCallback) connection -> { connection.flushDb(); connection.scriptFlush(); @@ -74,7 +68,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings("unchecked") @Test - public void testExecuteLongResult() { + void testExecuteLongResult() { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); template.afterPropertiesSet(); @@ -90,7 +84,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings("unchecked") @Test - public void testExecuteBooleanResult() { + void testExecuteBooleanResult() { this.template = new RedisTemplate(); template.setKeySerializer(StringRedisSerializer.UTF_8); template.setValueSerializer(new GenericToStringSerializer<>(Long.class)); @@ -108,7 +102,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings({ "unchecked", "rawtypes" }) @Test - public void testExecuteListResultCustomArgsSerializer() { + void testExecuteListResultCustomArgsSerializer() { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); template.afterPropertiesSet(); @@ -124,7 +118,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings({ "unchecked", "rawtypes" }) @Test - public void testExecuteMixedListResult() { + void testExecuteMixedListResult() { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); template.afterPropertiesSet(); @@ -140,7 +134,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings("unchecked") @Test - public void testExecuteValueResult() { + void testExecuteValueResult() { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); template.afterPropertiesSet(); @@ -154,7 +148,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings({ "unchecked", "rawtypes" }) @Test - public void testExecuteStatusResult() { + void testExecuteStatusResult() { this.template = new RedisTemplate(); template.setKeySerializer(StringRedisSerializer.UTF_8); template.setValueSerializer(new GenericToStringSerializer<>(Long.class)); @@ -170,7 +164,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings("unchecked") @Test - public void testExecuteCustomResultSerializer() { + void testExecuteCustomResultSerializer() { Jackson2JsonRedisSerializer personSerializer = new Jackson2JsonRedisSerializer<>(Person.class); this.template = new RedisTemplate(); template.setKeySerializer(StringRedisSerializer.UTF_8); @@ -232,7 +226,7 @@ public abstract class AbstractDefaultScriptExecutorTests { @SuppressWarnings("unchecked") @Test - public void testExecuteCachedNullKeys() { + void testExecuteCachedNullKeys() { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); template.afterPropertiesSet(); @@ -246,7 +240,7 @@ public abstract class AbstractDefaultScriptExecutorTests { } @Test // DATAREDIS-356 - public void shouldTransparentlyReEvaluateScriptIfNotPresent() throws Exception { + void shouldTransparentlyReEvaluateScriptIfNotPresent() throws Exception { this.template = new StringRedisTemplate(); template.setConnectionFactory(getConnectionFactory()); diff --git a/src/test/java/org/springframework/data/redis/core/script/DefaultReactiveScriptExecutorTests.java b/src/test/java/org/springframework/data/redis/core/script/DefaultReactiveScriptExecutorTests.java index 4bfaad96b..326fb44d8 100644 --- a/src/test/java/org/springframework/data/redis/core/script/DefaultReactiveScriptExecutorTests.java +++ b/src/test/java/org/springframework/data/redis/core/script/DefaultReactiveScriptExecutorTests.java @@ -24,17 +24,16 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.Person; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientConfiguration; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; @@ -45,6 +44,7 @@ import org.springframework.data.redis.serializer.RedisElementWriter; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializationContext.RedisSerializationContextBuilder; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.scripting.support.StaticScriptSource; /** @@ -57,27 +57,17 @@ public class DefaultReactiveScriptExecutorTests { private static StringRedisTemplate stringTemplate; private static ReactiveScriptExecutor stringScriptExecutor; - @BeforeClass - public static void setUp() { + @BeforeAll + static void setUp() { - connectionFactory = new LettuceConnectionFactory(SettingsUtils.standaloneConfiguration(), - LettuceTestClientConfiguration.create()); - connectionFactory.afterPropertiesSet(); + connectionFactory = LettuceConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); stringTemplate = new StringRedisTemplate(connectionFactory); stringScriptExecutor = new DefaultReactiveScriptExecutor<>(connectionFactory, RedisSerializationContext.string()); } - @AfterClass - public static void cleanUp() { - - if (connectionFactory != null) { - connectionFactory.destroy(); - } - } - - @After - public void tearDown() { + @BeforeEach + void before() { RedisConnection connection = connectionFactory.getConnection(); try { @@ -93,7 +83,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void shouldReturnLong() { + void shouldReturnLong() { DefaultRedisScript script = new DefaultRedisScript<>(); script.setLocation(new ClassPathResource("org/springframework/data/redis/core/script/increment.lua")); @@ -108,7 +98,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void shouldReturnBoolean() { + void shouldReturnBoolean() { RedisSerializationContextBuilder builder = RedisSerializationContext .newSerializationContext(StringRedisSerializer.UTF_8); @@ -132,7 +122,7 @@ public class DefaultReactiveScriptExecutorTests { @Test // DATAREDIS-711 @SuppressWarnings({ "unchecked", "rawtypes" }) - public void shouldApplyCustomArgsSerializer() { + void shouldApplyCustomArgsSerializer() { DefaultRedisScript script = new DefaultRedisScript<>(); script.setLocation(new ClassPathResource("org/springframework/data/redis/core/script/bulkpop.lua")); @@ -148,7 +138,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void testExecuteMixedListResult() { + void testExecuteMixedListResult() { DefaultRedisScript script = new DefaultRedisScript<>(); script.setLocation(new ClassPathResource("org/springframework/data/redis/core/script/popandlength.lua")); @@ -164,7 +154,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void shouldReturnValueResult() { + void shouldReturnValueResult() { DefaultRedisScript script = new DefaultRedisScript<>(); script.setScriptText("return redis.call('GET',KEYS[1])"); @@ -179,7 +169,7 @@ public class DefaultReactiveScriptExecutorTests { @Test // DATAREDIS-711 @SuppressWarnings({ "unchecked", "rawtypes" }) - public void shouldReturnStatusValue() { + void shouldReturnStatusValue() { DefaultRedisScript script = new DefaultRedisScript(); script.setScriptText("return redis.call('SET',KEYS[1], ARGV[1])"); @@ -198,7 +188,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void shouldApplyCustomResultSerializer() { + void shouldApplyCustomResultSerializer() { Jackson2JsonRedisSerializer personSerializer = new Jackson2JsonRedisSerializer<>(Person.class); @@ -223,7 +213,7 @@ public class DefaultReactiveScriptExecutorTests { } @Test // DATAREDIS-711 - public void executeAddsScriptToScriptCache() { + void executeAddsScriptToScriptCache() { DefaultRedisScript script = new DefaultRedisScript<>(); script.setScriptText("return 'HELLO'"); diff --git a/src/test/java/org/springframework/data/redis/core/script/jedis/JedisDefaultScriptExecutorTests.java b/src/test/java/org/springframework/data/redis/core/script/jedis/JedisDefaultScriptExecutorTests.java index 6266dc302..571253a9a 100644 --- a/src/test/java/org/springframework/data/redis/core/script/jedis/JedisDefaultScriptExecutorTests.java +++ b/src/test/java/org/springframework/data/redis/core/script/jedis/JedisDefaultScriptExecutorTests.java @@ -15,15 +15,15 @@ */ package org.springframework.data.redis.core.script.jedis; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; +import redis.clients.jedis.Jedis; + +import org.junit.jupiter.api.Disabled; + import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.core.script.AbstractDefaultScriptExecutorTests; import org.springframework.data.redis.core.script.DefaultScriptExecutor; - -import redis.clients.jedis.Jedis; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration test of {@link DefaultScriptExecutor} with {@link Jedis}. @@ -32,38 +32,18 @@ import redis.clients.jedis.Jedis; */ public class JedisDefaultScriptExecutorTests extends AbstractDefaultScriptExecutorTests { - private static JedisConnectionFactory connectionFactory; - - @Before - public void setup() { - - connectionFactory = new JedisConnectionFactory(); - connectionFactory.afterPropertiesSet(); - - } - - @After - public void teardown() { - - super.tearDown(); - - if (connectionFactory != null) { - connectionFactory.destroy(); - } - } - @Override protected RedisConnectionFactory getConnectionFactory() { - return connectionFactory; + return JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); } - @Ignore("transactional execution is currently not supported with Jedis") + @Disabled("transactional execution is currently not supported with Jedis") @Override public void testExecuteTx() { // super.testExecuteTx(); } - @Ignore("pipelined execution is currently not supported with Jedis") + @Disabled("pipelined execution is currently not supported with Jedis") @Override public void testExecutePipelined() { // super.testExecutePipelined(); diff --git a/src/test/java/org/springframework/data/redis/core/script/lettuce/LettuceDefaultScriptExecutorTests.java b/src/test/java/org/springframework/data/redis/core/script/lettuce/LettuceDefaultScriptExecutorTests.java index c4fd6bb40..a7a62ec9e 100644 --- a/src/test/java/org/springframework/data/redis/core/script/lettuce/LettuceDefaultScriptExecutorTests.java +++ b/src/test/java/org/springframework/data/redis/core/script/lettuce/LettuceDefaultScriptExecutorTests.java @@ -15,15 +15,11 @@ */ package org.springframework.data.redis.core.script.lettuce; -import org.junit.After; -import org.junit.Before; - -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.script.AbstractDefaultScriptExecutorTests; import org.springframework.data.redis.core.script.DefaultScriptExecutor; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration test of {@link DefaultScriptExecutor} with Lettuce. @@ -33,29 +29,8 @@ import org.springframework.data.redis.core.script.DefaultScriptExecutor; */ public class LettuceDefaultScriptExecutorTests extends AbstractDefaultScriptExecutorTests { - private static LettuceConnectionFactory connectionFactory; - - @Before - public void setup() { - - connectionFactory = new LettuceConnectionFactory(SettingsUtils.getHost(), SettingsUtils.getPort()); - connectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - connectionFactory.setShutdownTimeout(0); - connectionFactory.afterPropertiesSet(); - } - - @After - public void teardown() { - - super.tearDown(); - - if (connectionFactory != null) { - connectionFactory.destroy(); - } - } - @Override protected RedisConnectionFactory getConnectionFactory() { - return connectionFactory; + return LettuceConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); } } diff --git a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerTests.java b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerIntegrationTests.java similarity index 75% rename from src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerTests.java rename to src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerIntegrationTests.java index d10f71a2e..9095ae709 100644 --- a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerTests.java +++ b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerIntegrationTests.java @@ -22,13 +22,10 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import org.awaitility.Awaitility; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationEvent; @@ -36,26 +33,27 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) -public class KeyExpirationEventMessageListenerTests { +class KeyExpirationEventMessageListenerIntegrationTests { - RedisMessageListenerContainer container; - RedisConnectionFactory connectionFactory; - KeyExpirationEventMessageListener listener; + private RedisMessageListenerContainer container; + private RedisConnectionFactory connectionFactory; + private KeyExpirationEventMessageListener listener; - @Mock ApplicationEventPublisher publisherMock; + ApplicationEventPublisher publisherMock; - @Before - public void setUp() { + @BeforeEach + void setUp() { - JedisConnectionFactory connectionFactory = new JedisConnectionFactory(); - connectionFactory.afterPropertiesSet(); - this.connectionFactory = connectionFactory; + publisherMock = mock(ApplicationEventPublisher.class); + + this.connectionFactory = JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); @@ -71,18 +69,15 @@ public class KeyExpirationEventMessageListenerTests { } } - @After - public void tearDown() throws Exception { + @AfterEach + void tearDown() throws Exception { listener.destroy(); container.destroy(); - if (connectionFactory instanceof DisposableBean) { - ((DisposableBean) connectionFactory).destroy(); - } } @Test // DATAREDIS-425 - public void listenerShouldPublishEventCorrectly() { + void listenerShouldPublishEventCorrectly() { byte[] key = ("to-expire:" + UUID.randomUUID().toString()).getBytes(); AtomicBoolean called = new AtomicBoolean(); @@ -106,7 +101,7 @@ public class KeyExpirationEventMessageListenerTests { } @Test // DATAREDIS-425 - public void listenerShouldNotReactToDeleteEvents() throws InterruptedException { + void listenerShouldNotReactToDeleteEvents() throws InterruptedException { byte[] key = ("to-delete:" + UUID.randomUUID().toString()).getBytes(); diff --git a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java index 4ac48a884..0bf2e5628 100644 --- a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java @@ -18,12 +18,12 @@ package org.springframework.data.redis.listener; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; @@ -34,8 +34,8 @@ import org.springframework.data.redis.core.RedisKeyExpiredEvent; /** * @author Christoph Strobl */ -@RunWith(MockitoJUnitRunner.class) -public class KeyExpirationEventMessageListenerUnitTests { +@ExtendWith(MockitoExtension.class) +class KeyExpirationEventMessageListenerUnitTests { private static final String MESSAGE_CHANNEL = "channel"; private static final String MESSAGE_BODY = "body"; @@ -45,15 +45,15 @@ public class KeyExpirationEventMessageListenerUnitTests { @Mock ApplicationEventPublisher publisherMock; KeyExpirationEventMessageListener listener; - @Before - public void setUp() { + @BeforeEach + void setUp() { listener = new KeyExpirationEventMessageListener(containerMock); listener.setApplicationEventPublisher(publisherMock); } @Test // DATAREDIS-425 - public void handleMessageShouldPublishKeyExpiredEvent() { + void handleMessageShouldPublishKeyExpiredEvent() { listener.onMessage(MESSAGE, "*".getBytes()); @@ -65,10 +65,10 @@ public class KeyExpirationEventMessageListenerUnitTests { } @Test // DATAREDIS-425, DATAREDIS-692 - public void handleMessageShouldNotRespondToEmptyMessage() { + void handleMessageShouldNotRespondToEmptyMessage() { listener.onMessage(new DefaultMessage(new byte[] {}, new byte[] {}), "*".getBytes()); - verifyZeroInteractions(publisherMock); + verifyNoInteractions(publisherMock); } } diff --git a/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java b/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java index 9978383fd..f945eef75 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubResubscribeTests.java @@ -50,7 +50,7 @@ import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; @@ -80,7 +80,6 @@ public class PubSubResubscribeTests { public PubSubResubscribeTests(RedisConnectionFactory connectionFactory) { this.factory = connectionFactory; - ConnectionFactoryTracker.add(factory); } @BeforeClass diff --git a/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java b/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java index 0edb26f6e..5da02b5e4 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubTestParams.java @@ -26,12 +26,14 @@ import org.springframework.data.redis.PersonObjectFactory; import org.springframework.data.redis.RawObjectFactory; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; -import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisCluster; import org.springframework.data.redis.test.util.RedisClusterRule; /** @@ -89,18 +91,15 @@ public class PubSubTestParams { if (clusterAvailable()) { - RedisClusterConfiguration configuration = new RedisClusterConfiguration().clusterNode("127.0.0.1", 7379); - // add Jedis - JedisConnectionFactory jedisClusterFactory = new JedisConnectionFactory(configuration); - jedisClusterFactory.afterPropertiesSet(); + JedisConnectionFactory jedisClusterFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); RedisTemplate jedisClusterStringTemplate = new StringRedisTemplate(jedisClusterFactory); // add Lettuce - LettuceConnectionFactory lettuceClusterFactory = new LettuceConnectionFactory(configuration); - lettuceClusterFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceClusterFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceClusterFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisCluster.class); RedisTemplate lettuceClusterStringTemplate = new StringRedisTemplate(lettuceClusterFactory); diff --git a/src/test/java/org/springframework/data/redis/listener/PubSubTests.java b/src/test/java/org/springframework/data/redis/listener/PubSubTests.java index c4379a1cc..3e45e3977 100644 --- a/src/test/java/org/springframework/data/redis/listener/PubSubTests.java +++ b/src/test/java/org/springframework/data/redis/listener/PubSubTests.java @@ -116,11 +116,6 @@ public class PubSubTests { ConnectionFactoryTracker.add(template.getConnectionFactory()); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Parameters public static Collection testParams() { return PubSubTestParams.testParams(); diff --git a/src/test/java/org/springframework/data/redis/listener/ReactiveOperationsTestParams.java b/src/test/java/org/springframework/data/redis/listener/ReactiveOperationsTestParams.java index 53c6c63c6..3c19548f4 100644 --- a/src/test/java/org/springframework/data/redis/listener/ReactiveOperationsTestParams.java +++ b/src/test/java/org/springframework/data/redis/listener/ReactiveOperationsTestParams.java @@ -17,21 +17,18 @@ package org.springframework.data.redis.listener; import static org.springframework.data.redis.connection.ClusterTestVariables.*; -import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.junit.runners.model.Statement; -import org.springframework.data.redis.SettingsUtils; + import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisClusterNode; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.data.redis.test.util.RedisClusterRule; /** @@ -43,26 +40,10 @@ class ReactiveOperationsTestParams { public static Collection testParams() { - LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - LettucePoolingClientConfiguration poolingConfiguration = LettucePoolingClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration(SettingsUtils.getHost(), - SettingsUtils.getPort()); - - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - clientConfiguration); - lettuceConnectionFactory.afterPropertiesSet(); - - LettuceConnectionFactory poolingConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - poolingConfiguration); - poolingConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class, false); + LettuceConnectionFactory poolingConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class, true); List list = Arrays.asList(new Object[][] { // { lettuceConnectionFactory, "Standalone" }, // @@ -74,9 +55,8 @@ class ReactiveOperationsTestParams { RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration(); clusterConfiguration.addClusterNode(new RedisClusterNode(CLUSTER_HOST, MASTER_NODE_1_PORT)); - LettuceConnectionFactory lettuceClusterConnectionFactory = new LettuceConnectionFactory(clusterConfiguration, - clientConfiguration); - lettuceClusterConnectionFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceClusterConnectionFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); list = new ArrayList<>(list); list.add(new Object[] { lettuceClusterConnectionFactory, "Cluster" }); diff --git a/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerIntegrationTests.java b/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerIntegrationTests.java index 2cf0f36cd..21b78d1f6 100644 --- a/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerIntegrationTests.java @@ -66,20 +66,13 @@ public class ReactiveRedisMessageListenerContainerIntegrationTests { return ReactiveOperationsTestParams.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - /** * @param connectionFactory * @param label parameterized test label, no further use besides that. */ public ReactiveRedisMessageListenerContainerIntegrationTests(LettuceConnectionFactory connectionFactory, String label) { - this.connectionFactory = connectionFactory; - ConnectionFactoryTracker.add(connectionFactory); } @Before diff --git a/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerUnitTests.java b/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerUnitTests.java index dcabec611..d07c65d4f 100644 --- a/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/listener/ReactiveRedisMessageListenerContainerUnitTests.java @@ -19,7 +19,6 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import static org.springframework.data.redis.util.ByteUtils.*; -import org.springframework.data.redis.connection.ReactiveSubscription.Message; import reactor.core.Disposable; import reactor.core.publisher.DirectProcessor; import reactor.core.publisher.Flux; @@ -30,16 +29,20 @@ import reactor.test.StepVerifier; import java.nio.ByteBuffer; import java.util.concurrent.CancellationException; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + import org.springframework.data.redis.connection.ReactivePubSubCommands; import org.springframework.data.redis.connection.ReactiveRedisConnection; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; import org.springframework.data.redis.connection.ReactiveSubscription; import org.springframework.data.redis.connection.ReactiveSubscription.ChannelMessage; +import org.springframework.data.redis.connection.ReactiveSubscription.Message; import org.springframework.data.redis.connection.ReactiveSubscription.PatternMessage; /** @@ -47,18 +50,19 @@ import org.springframework.data.redis.connection.ReactiveSubscription.PatternMes * * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) -public class ReactiveRedisMessageListenerContainerUnitTests { +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class ReactiveRedisMessageListenerContainerUnitTests { - ReactiveRedisMessageListenerContainer container; + private ReactiveRedisMessageListenerContainer container; @Mock ReactiveRedisConnectionFactory connectionFactoryMock; @Mock ReactiveRedisConnection connectionMock; @Mock ReactivePubSubCommands commandsMock; @Mock ReactiveSubscription subscriptionMock; - @Before - public void before() { + @BeforeEach + void before() { when(connectionFactoryMock.getReactiveConnection()).thenReturn(connectionMock); when(connectionMock.pubSubCommands()).thenReturn(commandsMock); @@ -70,7 +74,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldSubscribeToPattern() { + void shouldSubscribeToPattern() { when(subscriptionMock.receive()).thenReturn(Flux.never()); @@ -82,7 +86,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldSubscribeToMultiplePatterns() { + void shouldSubscribeToMultiplePatterns() { when(subscriptionMock.receive()).thenReturn(Flux.never()); container = createContainer(); @@ -95,7 +99,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldSubscribeToChannel() { + void shouldSubscribeToChannel() { when(subscriptionMock.receive()).thenReturn(Flux.never()); container = createContainer(); @@ -106,7 +110,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldSubscribeToMultipleChannels() { + void shouldSubscribeToMultipleChannels() { when(subscriptionMock.receive()).thenReturn(Flux.never()); container = createContainer(); @@ -118,7 +122,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldEmitChannelMessage() { + void shouldEmitChannelMessage() { DirectProcessor> processor = DirectProcessor.create(); @@ -137,7 +141,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldEmitPatternMessage() { + void shouldEmitPatternMessage() { DirectProcessor> processor = DirectProcessor.create(); @@ -157,7 +161,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldRegisterSubscription() { + void shouldRegisterSubscription() { MonoProcessor subscribeMono = MonoProcessor.create(); @@ -179,7 +183,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldRegisterSubscriptionMultipleSubscribers() { + void shouldRegisterSubscriptionMultipleSubscribers() { reset(subscriptionMock); when(subscriptionMock.subscribe(any())).thenReturn(Mono.empty()); @@ -204,7 +208,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldUnsubscribeOnCancel() { + void shouldUnsubscribeOnCancel() { when(subscriptionMock.receive()).thenReturn(DirectProcessor.create()); container = createContainer(); @@ -221,7 +225,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldTerminateSubscriptionsOnShutdown() { + void shouldTerminateSubscriptionsOnShutdown() { DirectProcessor> processor = DirectProcessor.create(); @@ -241,7 +245,7 @@ public class ReactiveRedisMessageListenerContainerUnitTests { } @Test // DATAREDIS-612 - public void shouldCleanupDownstream() { + void shouldCleanupDownstream() { DirectProcessor> processor = DirectProcessor.create(); diff --git a/src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerTests.java b/src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerIntegrationTests.java similarity index 91% rename from src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerTests.java rename to src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerIntegrationTests.java index a263c4ac8..038b03492 100644 --- a/src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerTests.java +++ b/src/test/java/org/springframework/data/redis/listener/RedisMessageListenerContainerIntegrationTests.java @@ -20,9 +20,9 @@ import static org.mockito.Mockito.*; import java.util.concurrent.Executor; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.data.redis.SettingsUtils; @@ -36,7 +36,7 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; * @author Mark Paluch * @author Christoph Strobl */ -public class RedisMessageListenerContainerTests { +class RedisMessageListenerContainerIntegrationTests { private final Object handler = new Object() { @@ -51,8 +51,8 @@ public class RedisMessageListenerContainerTests { private Executor executorMock; - @Before - public void setUp() { + @BeforeEach + void setUp() { executorMock = mock(Executor.class); @@ -72,15 +72,15 @@ public class RedisMessageListenerContainerTests { container.afterPropertiesSet(); } - @After - public void tearDown() throws Exception { + @AfterEach + void tearDown() throws Exception { container.destroy(); connectionFactory.destroy(); } @Test // DATAREDIS-415 - public void interruptAtStart() { + void interruptAtStart() { final Thread main = Thread.currentThread(); diff --git a/src/test/java/org/springframework/data/redis/listener/SubscriptionConnectionTests.java b/src/test/java/org/springframework/data/redis/listener/SubscriptionConnectionTests.java index d5154fd50..097f1d462 100644 --- a/src/test/java/org/springframework/data/redis/listener/SubscriptionConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/listener/SubscriptionConnectionTests.java @@ -37,9 +37,12 @@ import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration tests confirming that {@link RedisMessageListenerContainer} closes connections after unsubscribing @@ -68,7 +71,6 @@ public class SubscriptionConnectionTests { public SubscriptionConnectionTests(RedisConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; - ConnectionFactoryTracker.add(connectionFactory); } @After @@ -80,29 +82,18 @@ public class SubscriptionConnectionTests { } } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Parameters public static Collection testParams() { int port = SettingsUtils.getPort(); String host = SettingsUtils.getHost(); // Jedis - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setPort(port); - jedisConnFactory.setHostName(host); - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); - lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnFactory.setPort(port); - lettuceConnFactory.setHostName(host); - lettuceConnFactory.setValidateConnection(true); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); return Arrays.asList(new Object[][] { { jedisConnFactory }, { lettuceConnFactory } }); } diff --git a/src/test/java/org/springframework/data/redis/listener/adapter/ContainerXmlSetupTest.java b/src/test/java/org/springframework/data/redis/listener/adapter/ContainerXmlSetupTest.java index 91ae16154..e25c68f04 100644 --- a/src/test/java/org/springframework/data/redis/listener/adapter/ContainerXmlSetupTest.java +++ b/src/test/java/org/springframework/data/redis/listener/adapter/ContainerXmlSetupTest.java @@ -17,31 +17,28 @@ package org.springframework.data.redis.listener.adapter; import static org.assertj.core.api.Assertions.*; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.test.condition.EnabledOnRedisAvailable; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * @author Costin Leau * @author Jennifer Hickey */ -public class ContainerXmlSetupTest { +@ExtendWith(SpringExtension.class) +@EnabledOnRedisAvailable +@ContextConfiguration("/org/springframework/data/redis/listener/container.xml") +class ContainerXmlSetupTest { - private GenericXmlApplicationContext ctx; - - @After - public void tearDown() { - if (ctx != null) { - ctx.destroy(); - } - } + @Autowired RedisMessageListenerContainer container; @Test - public void testContainerSetup() throws Exception { - ctx = new GenericXmlApplicationContext("/org/springframework/data/redis/listener/container.xml"); - RedisMessageListenerContainer container = ctx.getBean("redisContainer", RedisMessageListenerContainer.class); + void testContainerSetup() { assertThat(container.isRunning()).isTrue(); } } diff --git a/src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerTest.java b/src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerUnitTests.java similarity index 86% rename from src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerTest.java rename to src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerUnitTests.java index 69e425e74..2cbc9312c 100644 --- a/src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerTest.java +++ b/src/test/java/org/springframework/data/redis/listener/adapter/MessageListenerUnitTests.java @@ -18,10 +18,11 @@ package org.springframework.data.redis.listener.adapter; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.redis.connection.DefaultMessage; import org.springframework.data.redis.connection.Message; @@ -38,7 +39,8 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; * @author Thomas Darimont * @author Mark Paluch */ -public class MessageListenerTest { +@ExtendWith(MockitoExtension.class) +class MessageListenerUnitTests { private static final StringRedisSerializer serializer = StringRedisSerializer.UTF_8; private static final String CHANNEL = "some::test:"; @@ -59,24 +61,24 @@ public class MessageListenerTest { @Mock private Delegate target; - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); + @BeforeEach + void setUp() { this.adapter = new MessageListenerAdapter(); } @Test - public void testThatWhenNoDelegateIsSuppliedTheDelegateIsAssumedToBeTheMessageListenerAdapterItself() + void testThatWhenNoDelegateIsSuppliedTheDelegateIsAssumedToBeTheMessageListenerAdapterItself() throws Exception { assertThat(adapter.getDelegate()).isSameAs(adapter); } @Test - public void testThatTheDefaultMessageHandlingMethodNameIsTheConstantDefault() throws Exception { + void testThatTheDefaultMessageHandlingMethodNameIsTheConstantDefault() throws Exception { assertThat(adapter.getDefaultListenerMethod()).isEqualTo(MessageListenerAdapter.ORIGINAL_DEFAULT_LISTENER_METHOD); } - public void testAdapterWithListenerAndDefaultMessage() throws Exception { + @Test + void testAdapterWithListenerAndDefaultMessage() throws Exception { MessageListener mock = mock(MessageListener.class); MessageListenerAdapter adapter = new MessageListenerAdapter(mock) { @@ -90,7 +92,7 @@ public class MessageListenerTest { } @Test - public void testRawMessage() throws Exception { + void testRawMessage() throws Exception { MessageListenerAdapter adapter = new MessageListenerAdapter(target); adapter.afterPropertiesSet(); adapter.onMessage(STRING_MSG, null); @@ -99,7 +101,7 @@ public class MessageListenerTest { } @Test - public void testCustomMethod() throws Exception { + void testCustomMethod() throws Exception { MessageListenerAdapter adapter = new MessageListenerAdapter(target); adapter.setDefaultListenerMethod("customMethod"); adapter.afterPropertiesSet(); @@ -110,7 +112,7 @@ public class MessageListenerTest { } @Test - public void testCustomMethodWithAlternateConstructor() throws Exception { + void testCustomMethodWithAlternateConstructor() throws Exception { MessageListenerAdapter adapter = new MessageListenerAdapter(target, "customMethod"); adapter.afterPropertiesSet(); @@ -120,7 +122,7 @@ public class MessageListenerTest { } @Test - public void testCustomMethodWithChannel() throws Exception { + void testCustomMethodWithChannel() { MessageListenerAdapter adapter = new MessageListenerAdapter(target); adapter.setDefaultListenerMethod("customMethodWithChannel"); adapter.afterPropertiesSet(); @@ -131,7 +133,7 @@ public class MessageListenerTest { } @Test - public void testCustomMethodWithChannelAndAlternateConstructor() throws Exception { + void testCustomMethodWithChannelAndAlternateConstructor() { MessageListenerAdapter adapter = new MessageListenerAdapter(target, "customMethodWithChannel"); adapter.afterPropertiesSet(); @@ -141,7 +143,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-92 - public void triggersListenerImplementingInterfaceCorrectly() { + void triggersListenerImplementingInterfaceCorrectly() { SampleListener listener = new SampleListener(); @@ -157,7 +159,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void defaultConcreteHandlerMethodShouldOnlyBeInvokedOnce() { + void defaultConcreteHandlerMethodShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -170,7 +172,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void defaultConcreteHandlerMethodWithoutSerializerShouldOnlyBeInvokedOnce() { + void defaultConcreteHandlerMethodWithoutSerializerShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -184,7 +186,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void defaultConcreteHandlerMethodWithCustomSerializerShouldOnlyBeInvokedOnce() { + void defaultConcreteHandlerMethodWithCustomSerializerShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -198,7 +200,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void customConcreteHandlerMethodShouldOnlyBeInvokedOnce() { + void customConcreteHandlerMethodShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -212,7 +214,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void customConcreteMessageOnlyHandlerMethodShouldOnlyBeInvokedOnce() { + void customConcreteMessageOnlyHandlerMethodShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -226,7 +228,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void customConcreteHandlerMethodWithoutSerializerShouldOnlyBeInvokedOnce() { + void customConcreteHandlerMethodWithoutSerializerShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); @@ -241,7 +243,7 @@ public class MessageListenerTest { } @Test // DATAREDIS-337 - public void customConcreteHandlerMethodWithCustomSerializerShouldOnlyBeInvokedOnce() { + void customConcreteHandlerMethodWithCustomSerializerShouldOnlyBeInvokedOnce() { ConcreteMessageHandler listener = spy(new ConcreteMessageHandler()); diff --git a/src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTest.java b/src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTests.java similarity index 95% rename from src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTest.java rename to src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTests.java index 3c01a79af..7639d5716 100644 --- a/src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTest.java +++ b/src/test/java/org/springframework/data/redis/mapping/AbstractHashMapperTests.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.Address; import org.springframework.data.redis.Person; @@ -29,7 +29,7 @@ import org.springframework.data.redis.hash.HashMapper; * @author Costin Leau * @author Christoph Strobl */ -public abstract class AbstractHashMapperTest { +public abstract class AbstractHashMapperTests { @SuppressWarnings("rawtypes") protected abstract HashMapper mapperFor(Class t); diff --git a/src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTest.java b/src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTests.java similarity index 90% rename from src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTest.java rename to src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTests.java index 22aa10797..792253cb8 100644 --- a/src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTest.java +++ b/src/test/java/org/springframework/data/redis/mapping/BeanUtilsHashMapperTests.java @@ -15,9 +15,10 @@ */ package org.springframework.data.redis.mapping; +import org.junit.jupiter.api.Test; + import static org.assertj.core.api.Assertions.*; -import org.junit.Test; import org.springframework.data.redis.hash.BeanUtilsHashMapper; @@ -25,7 +26,7 @@ import org.springframework.data.redis.hash.BeanUtilsHashMapper; * @author Costin Leau * @author Christoph Strobl */ -public class BeanUtilsHashMapperTest extends AbstractHashMapperTest { +public class BeanUtilsHashMapperTests extends AbstractHashMapperTests { protected BeanUtilsHashMapper mapperFor(Class t) { return new BeanUtilsHashMapper<>(t); diff --git a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperTests.java b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperTests.java index 7a178e990..c1d225461 100644 --- a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperTests.java +++ b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperTests.java @@ -20,7 +20,6 @@ import static org.assertj.core.api.Assertions.*; import java.util.Arrays; import java.util.Collection; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,14 +28,13 @@ import org.junit.runners.Parameterized.Parameters; import org.springframework.beans.factory.InitializingBean; import org.springframework.data.redis.Address; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.Person; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.hash.Jackson2HashMapper; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration tests for {@link Jackson2HashMapper}. @@ -57,21 +55,13 @@ public class Jackson2HashMapperTests { if (factory instanceof InitializingBean) { ((InitializingBean) factory).afterPropertiesSet(); } - - ConnectionFactoryTracker.add(factory); } @Parameters public static Collection params() { - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(); - lettuceConnectionFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - return Arrays. asList(new JedisConnectionFactory(), lettuceConnectionFactory); - } - - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); + return Arrays.asList(JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class), + LettuceConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class)); } @Before diff --git a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java index e3dcd5ab0..0b5f75473 100644 --- a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java +++ b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java @@ -22,16 +22,13 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collection; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.Address; import org.springframework.data.redis.Person; import org.springframework.data.redis.hash.HashMapper; @@ -43,18 +40,25 @@ import org.springframework.data.redis.hash.Jackson2HashMapper; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(Parameterized.class) -public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { +public abstract class Jackson2HashMapperUnitTests extends AbstractHashMapperTests { private final Jackson2HashMapper mapper; - public Jackson2HashMapperUnitTests(Jackson2HashMapper mapper) { + Jackson2HashMapperUnitTests(Jackson2HashMapper mapper) { this.mapper = mapper; } - @Parameters - public static Collection params() { - return Arrays.asList(new Jackson2HashMapper(true), new Jackson2HashMapper(false)); + static class FlatteningJackson2HashMapperUnitTests extends Jackson2HashMapperUnitTests { + FlatteningJackson2HashMapperUnitTests() { + super(new Jackson2HashMapper(true)); + } + } + + static class NonFlatteningJackson2HashMapperUnitTests extends Jackson2HashMapperUnitTests { + + NonFlatteningJackson2HashMapperUnitTests() { + super(new Jackson2HashMapper(false)); + } } @Override @@ -64,7 +68,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapTypedListOfSimpleType() { + void shouldMapTypedListOfSimpleType() { WithList source = new WithList(); source.strings = Arrays.asList("spring", "data", "redis"); @@ -72,7 +76,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapTypedListOfComplexType() { + void shouldMapTypedListOfComplexType() { WithList source = new WithList(); @@ -81,7 +85,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapTypedListOfComplexObjectWihtNestedElements() { + void shouldMapTypedListOfComplexObjectWihtNestedElements() { WithList source = new WithList(); @@ -96,7 +100,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapNestedObject() { + void shouldMapNestedObject() { Person jon = new Person("jon", "snow", 19); Address adr = new Address(); @@ -108,7 +112,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapUntypedList() { + void shouldMapUntypedList() { WithList source = new WithList(); source.objects = Arrays.asList(100, "foo", new Person("jon", "snow", 19)); @@ -116,7 +120,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapTypedMapOfSimpleTypes() { + void shouldMapTypedMapOfSimpleTypes() { WithMap source = new WithMap(); source.strings = new LinkedHashMap<>(); @@ -127,7 +131,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapTypedMapOfComplexTypes() { + void shouldMapTypedMapOfComplexTypes() { WithMap source = new WithMap(); source.persons = new LinkedHashMap<>(); @@ -137,7 +141,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void shouldMapUntypedMap() { + void shouldMapUntypedMap() { WithMap source = new WithMap(); source.objects = new LinkedHashMap<>(); @@ -148,7 +152,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-423 - public void nestedStuff() { + void nestedStuff() { WithList nestedList = new WithList(); nestedList.objects = new ArrayList<>(); @@ -167,7 +171,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Test // DATAREDIS-1001 - public void dateValueShouldBeTreatedCorrectly() { + void dateValueShouldBeTreatedCorrectly() { WithDates source = new WithDates(); source.string = "id-1"; @@ -194,7 +198,7 @@ public class Jackson2HashMapperUnitTests extends AbstractHashMapperTest { } @Data - static class WithDates { + private static class WithDates { private String string; private Date date; diff --git a/src/test/java/org/springframework/data/redis/mapping/ObjectHashMapperTests.java b/src/test/java/org/springframework/data/redis/mapping/ObjectHashMapperTests.java index 1d46b9ccb..cd411724a 100644 --- a/src/test/java/org/springframework/data/redis/mapping/ObjectHashMapperTests.java +++ b/src/test/java/org/springframework/data/redis/mapping/ObjectHashMapperTests.java @@ -34,7 +34,7 @@ import org.springframework.data.redis.hash.ObjectHashMapper; * @author Christoph Strobl * @author Mark Paluch */ -class ObjectHashMapperTests extends AbstractHashMapperTest { +class ObjectHashMapperTests extends AbstractHashMapperTests { protected ObjectHashMapper mapperFor(Class t) { return new ObjectHashMapper(); diff --git a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryClusterIntegrationTests.java b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryClusterIntegrationTests.java index 7e9ffb57b..9afc9fa38 100644 --- a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryClusterIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryClusterIntegrationTests.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.List; import org.junit.ClassRule; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.runner.RunWith; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -32,13 +33,14 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; import org.springframework.data.redis.test.util.RedisClusterRule; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration public class RedisRepositoryClusterIntegrationTests extends RedisRepositoryIntegrationTestBase { diff --git a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java index 76f3a8386..22f6d40a9 100644 --- a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java +++ b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java @@ -19,15 +19,15 @@ import static org.assertj.core.api.Assertions.*; import lombok.Data; import lombok.Value; -import lombok.experimental.Wither; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; +import lombok.With; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.annotation.Id; @@ -64,8 +64,8 @@ public abstract class RedisRepositoryIntegrationTestBase { @Autowired ImmutableObjectRepository immutableObjectRepo; @Autowired KeyValueTemplate kvTemplate; - @Before - public void setUp() { + @BeforeEach + void setUp() { // flush keyspaces kvTemplate.delete(Person.class); @@ -73,7 +73,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-425 - public void simpleFindShouldReturnEntitiesCorrectly() { + void simpleFindShouldReturnEntitiesCorrectly() { Person rand = new Person(); rand.firstname = "rand"; @@ -99,7 +99,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-425 - public void simpleFindByMultipleProperties() { + void simpleFindByMultipleProperties() { Person egwene = new Person(); egwene.firstname = "egwene"; @@ -118,7 +118,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-425 - public void findReturnsReferenceDataCorrectly() { + void findReturnsReferenceDataCorrectly() { // Prepare referenced data entry City tarValon = new City(); @@ -148,7 +148,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-425 - public void findReturnsPageCorrectly() { + void findReturnsPageCorrectly() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -171,7 +171,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-425 - public void findUsingOrReturnsResultCorrectly() { + void findUsingOrReturnsResultCorrectly() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -186,7 +186,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldApplyFirstKeywordCorrectly() { + void shouldApplyFirstKeywordCorrectly() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -198,7 +198,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldApplyPageableCorrectlyWhenUsingFindAll() { + void shouldApplyPageableCorrectlyWhenUsingFindAll() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -212,7 +212,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-551 - public void shouldApplyPageableCorrectlyWhenUsingFindByWithoutCriteria() { + void shouldApplyPageableCorrectlyWhenUsingFindByWithoutCriteria() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -227,7 +227,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-771 - public void shouldFindByBooleanIsTrue() { + void shouldFindByBooleanIsTrue() { Person eddard = new Person("eddard", "stark"); eddard.setAlive(true); @@ -246,7 +246,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-771 - public void shouldFindByBooleanIsFalse() { + void shouldFindByBooleanIsFalse() { Person eddard = new Person("eddard", "stark"); eddard.setAlive(true); @@ -265,7 +265,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldReturnEmptyListWhenPageableOutOfBoundsUsingFindAll() { + void shouldReturnEmptyListWhenPageableOutOfBoundsUsingFindAll() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -278,7 +278,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldReturnEmptyListWhenPageableOutOfBoundsUsingQueryMethod() { + void shouldReturnEmptyListWhenPageableOutOfBoundsUsingQueryMethod() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -300,7 +300,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldApplyTopKeywordCorrectly() { + void shouldApplyTopKeywordCorrectly() { Person eddard = new Person("eddard", "stark"); Person robb = new Person("robb", "stark"); @@ -312,7 +312,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-547 - public void shouldApplyTopKeywordCorrectlyWhenCriteriaPresent() { + void shouldApplyTopKeywordCorrectlyWhenCriteriaPresent() { Person eddard = new Person("eddard", "stark"); Person tyrion = new Person("tyrion", "lannister"); @@ -331,7 +331,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-605 - public void shouldFindByExample() { + void shouldFindByExample() { Person eddard = new Person("eddard", "stark"); Person tyrion = new Person("tyrion", "lannister"); @@ -347,7 +347,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-533 - public void nearQueryShouldReturnResultsCorrectly() { + void nearQueryShouldReturnResultsCorrectly() { City palermo = new City(); palermo.location = new Point(13.361389D, 38.115556D); @@ -365,7 +365,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-533 - public void nearQueryShouldFindNothingIfOutOfRange() { + void nearQueryShouldFindNothingIfOutOfRange() { City palermo = new City(); palermo.location = new Point(13.361389D, 38.115556D); @@ -380,7 +380,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-533 - public void nearQueryShouldReturnResultsCorrectlyOnNestedProperty() { + void nearQueryShouldReturnResultsCorrectlyOnNestedProperty() { City palermo = new City(); palermo.location = new Point(13.361389D, 38.115556D); @@ -404,7 +404,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-849 - public void shouldReturnNewObjectInstanceOnImmutableSave() { + void shouldReturnNewObjectInstanceOnImmutableSave() { Immutable object = new Immutable(null, "Walter", new Immutable("heisenberg", "White", null)); Immutable saved = immutableObjectRepo.save(object); @@ -414,7 +414,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-849 - public void shouldReturnNewObjectInstanceOnImmutableSaveAll() { + void shouldReturnNewObjectInstanceOnImmutableSaveAll() { Immutable object = new Immutable(null, "Walter", new Immutable("heisenberg", "White", null)); List saved = (List) immutableObjectRepo.saveAll(Collections.singleton(object)); @@ -424,7 +424,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Test // DATAREDIS-849 - public void shouldProperlyReadNestedImmutableObject() { + void shouldProperlyReadNestedImmutableObject() { Immutable nested = new Immutable("heisenberg", "White", null); Immutable object = new Immutable(null, "Walter", nested); @@ -519,7 +519,7 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Data - public static class City { + static class City { @Id String id; String name; @@ -528,8 +528,8 @@ public abstract class RedisRepositoryIntegrationTestBase { } @Value - @Wither - public static class Immutable { + @With + static class Immutable { @Id String id; String name; diff --git a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTests.java index ae754dd5e..4e8a5a03a 100644 --- a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTests.java @@ -21,8 +21,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -42,13 +42,13 @@ import org.springframework.data.redis.core.mapping.RedisMappingContext; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; /** * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(SpringJUnit4ClassRunner.class) +@ExtendWith(SpringExtension.class) @ContextConfiguration public class RedisRepositoryIntegrationTests extends RedisRepositoryIntegrationTestBase { diff --git a/src/test/java/org/springframework/data/redis/repository/cdi/CdiExtensionIntegrationTests.java b/src/test/java/org/springframework/data/redis/repository/cdi/CdiExtensionIntegrationTests.java index c60690d7f..2092fa026 100644 --- a/src/test/java/org/springframework/data/redis/repository/cdi/CdiExtensionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/repository/cdi/CdiExtensionIntegrationTests.java @@ -25,21 +25,21 @@ import javax.enterprise.inject.se.SeContainer; import javax.enterprise.inject.se.SeContainerInitializer; import javax.enterprise.inject.spi.Bean; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; /** * Integration tests for Spring Data Redis CDI extension. * * @author Mark Paluch */ -public class CdiExtensionIntegrationTests { +class CdiExtensionIntegrationTests { - static SeContainer container; + private static SeContainer container; - @BeforeClass - public static void setUp() { + @BeforeAll + static void setUp() { container = SeContainerInitializer.newInstance() // .disableDiscovery() // @@ -47,14 +47,14 @@ public class CdiExtensionIntegrationTests { .initialize(); } - @AfterClass - public static void cleanUp() { + @AfterAll + static void cleanUp() { container.close(); } @Test // DATAREDIS-425, DATAREDIS-700 @SuppressWarnings("rawtypes") - public void beanShouldBeRegistered() { + void beanShouldBeRegistered() { Set> beans = container.getBeanManager().getBeans(PersonRepository.class); @@ -63,7 +63,7 @@ public class CdiExtensionIntegrationTests { } @Test // DATAREDIS-425, DATAREDIS-700 - public void saveAndFindUnqualified() { + void saveAndFindUnqualified() { RepositoryConsumer repositoryConsumer = container.select(RepositoryConsumer.class).get(); repositoryConsumer.deleteAll(); @@ -77,7 +77,7 @@ public class CdiExtensionIntegrationTests { } @Test // DATAREDIS-425, DATAREDIS-700 - public void saveAndFindQualified() { + void saveAndFindQualified() { RepositoryConsumer repositoryConsumer = container.select(RepositoryConsumer.class).get(); repositoryConsumer.deleteAll(); @@ -91,7 +91,7 @@ public class CdiExtensionIntegrationTests { } @Test // DATAREDIS-425, DATAREDIS-700 - public void callMethodOnCustomRepositoryShouldSuceed() { + void callMethodOnCustomRepositoryShouldSuceed() { RepositoryConsumer repositoryConsumer = container.select(RepositoryConsumer.class).get(); diff --git a/src/test/java/org/springframework/data/redis/repository/cdi/RedisCdiDependenciesProducer.java b/src/test/java/org/springframework/data/redis/repository/cdi/RedisCdiDependenciesProducer.java index 22bdad406..91b036418 100644 --- a/src/test/java/org/springframework/data/redis/repository/cdi/RedisCdiDependenciesProducer.java +++ b/src/test/java/org/springframework/data/redis/repository/cdi/RedisCdiDependenciesProducer.java @@ -20,14 +20,14 @@ import javax.enterprise.inject.Disposes; import javax.enterprise.inject.Produces; import org.springframework.beans.factory.DisposableBean; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.core.RedisKeyValueAdapter; import org.springframework.data.redis.core.RedisKeyValueTemplate; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.mapping.RedisMappingContext; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Mark Paluch @@ -39,19 +39,7 @@ public class RedisCdiDependenciesProducer { */ @Produces public RedisConnectionFactory redisConnectionFactory() { - - JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); - jedisConnectionFactory.setHostName(SettingsUtils.getHost()); - jedisConnectionFactory.setPort(SettingsUtils.getPort()); - jedisConnectionFactory.afterPropertiesSet(); - return jedisConnectionFactory; - } - - public void closeRedisConnectionFactory(@Disposes RedisConnectionFactory redisConnectionFactory) throws Exception { - - if (redisConnectionFactory instanceof DisposableBean) { - ((DisposableBean) redisConnectionFactory).destroy(); - } + return JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); } /** diff --git a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java index 095285bdb..ae2aa5f85 100644 --- a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java @@ -19,8 +19,7 @@ import static org.assertj.core.api.Assertions.*; import java.util.Collection; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.DefaultListableBeanFactory; @@ -45,41 +44,36 @@ import org.springframework.data.repository.config.RepositoryConfigurationSource; * @author Christoph Strobl * @author Mark Paluch */ -public class RedisRepositoryConfigurationExtensionUnitTests { +class RedisRepositoryConfigurationExtensionUnitTests { - StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(Config.class, true); - ResourceLoader loader = new PathMatchingResourcePatternResolver(); - Environment environment = new StandardEnvironment(); - BeanDefinitionRegistry registry = new DefaultListableBeanFactory(); - RepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, + private StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(Config.class, true); + private ResourceLoader loader = new PathMatchingResourcePatternResolver(); + private Environment environment = new StandardEnvironment(); + private BeanDefinitionRegistry registry = new DefaultListableBeanFactory(); + private RepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, EnableRedisRepositories.class, loader, environment, registry); - RedisRepositoryConfigurationExtension extension; - - @Before - public void setUp() { - extension = new RedisRepositoryConfigurationExtension(); - } + private RedisRepositoryConfigurationExtension extension = new RedisRepositoryConfigurationExtension(); @Test // DATAREDIS-425 - public void isStrictMatchIfDomainTypeIsAnnotatedWithDocument() { + void isStrictMatchIfDomainTypeIsAnnotatedWithDocument() { assertHasRepo(SampleRepository.class, extension.getRepositoryConfigurations(configurationSource, loader, true)); } @Test // DATAREDIS-425 - public void isStrictMatchIfRepositoryExtendsStoreSpecificBase() { + void isStrictMatchIfRepositoryExtendsStoreSpecificBase() { assertHasRepo(StoreRepository.class, extension.getRepositoryConfigurations(configurationSource, loader, true)); } @Test // DATAREDIS-425 - public void isNotStrictMatchIfDomainTypeIsNotAnnotatedWithDocument() { + void isNotStrictMatchIfDomainTypeIsNotAnnotatedWithDocument() { assertDoesNotHaveRepo(UnannotatedRepository.class, extension.getRepositoryConfigurations(configurationSource, loader, true)); } @Test // DATAREDIS-491 - public void picksUpEnableKeyspaceEventsOnStartupCorrectly() { + void picksUpEnableKeyspaceEventsOnStartupCorrectly() { metadata = new StandardAnnotationMetadata(Config.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); @@ -88,7 +82,7 @@ public class RedisRepositoryConfigurationExtensionUnitTests { } @Test // DATAREDIS-491 - public void picksUpEnableKeyspaceEventsDefaultCorrectly() { + void picksUpEnableKeyspaceEventsDefaultCorrectly() { metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsDisabled.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); @@ -97,7 +91,7 @@ public class RedisRepositoryConfigurationExtensionUnitTests { } @Test // DATAREDIS-505 - public void picksUpDefaultKeyspaceNotificationsConfigParameterCorrectly() { + void picksUpDefaultKeyspaceNotificationsConfigParameterCorrectly() { metadata = new StandardAnnotationMetadata(Config.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); @@ -106,7 +100,7 @@ public class RedisRepositoryConfigurationExtensionUnitTests { } @Test // DATAREDIS-505 - public void picksUpCustomKeyspaceNotificationsConfigParameterCorrectly() { + void picksUpCustomKeyspaceNotificationsConfigParameterCorrectly() { metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsEnabledAndCustomEventConfig.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); @@ -115,7 +109,7 @@ public class RedisRepositoryConfigurationExtensionUnitTests { } @Test // DATAREDIS-1049 - public void explicitlyEmptyKeyspaceNotificationsConfigParameterShouldBeCapturedCorrectly() { + void explicitlyEmptyKeyspaceNotificationsConfigParameterShouldBeCapturedCorrectly() { metadata = new StandardAnnotationMetadata(ConfigWithEmptyConfigParameter.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); @@ -173,24 +167,24 @@ public class RedisRepositoryConfigurationExtensionUnitTests { } @EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP) - static class Config { + private static class Config { } @EnableRedisRepositories(considerNestedRepositories = true) - static class ConfigWithKeyspaceEventsDisabled { + private static class ConfigWithKeyspaceEventsDisabled { } @EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "KEA") - static class ConfigWithKeyspaceEventsEnabledAndCustomEventConfig { + private static class ConfigWithKeyspaceEventsEnabledAndCustomEventConfig { } @EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "") - static class ConfigWithEmptyConfigParameter { + private static class ConfigWithEmptyConfigParameter { } diff --git a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationUnitTests.java index 019d9b02f..78a2f35b4 100644 --- a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationUnitTests.java @@ -18,10 +18,9 @@ package org.springframework.data.redis.repository.configuration; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -33,19 +32,15 @@ import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.RedisKeyValueAdapter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.convert.ReferenceResolver; -import org.springframework.data.redis.repository.configuration.RedisRepositoryConfigurationUnitTests.ContextWithCustomReferenceResolver; -import org.springframework.data.redis.repository.configuration.RedisRepositoryConfigurationUnitTests.ContextWithoutCustomization; import org.springframework.data.repository.Repository; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; /** * @author Christoph Strobl */ -@RunWith(Suite.class) -@SuiteClasses({ ContextWithCustomReferenceResolver.class, ContextWithoutCustomization.class }) public class RedisRepositoryConfigurationUnitTests { static RedisTemplate createTemplateMock() { @@ -60,10 +55,10 @@ public class RedisRepositoryConfigurationUnitTests { return template; } - @RunWith(SpringJUnit4ClassRunner.class) + @ExtendWith(SpringExtension.class) @DirtiesContext - @ContextConfiguration(classes = { ContextWithCustomReferenceResolver.Config.class }) - public static class ContextWithCustomReferenceResolver { + @ContextConfiguration(classes = { ContextWithCustomReferenceResolverUnitTests.Config.class }) + public static class ContextWithCustomReferenceResolverUnitTests { @EnableRedisRepositories(considerNestedRepositories = true, includeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = { ".*ContextSampleRepository" }) }) @@ -95,10 +90,10 @@ public class RedisRepositoryConfigurationUnitTests { } } - @RunWith(SpringJUnit4ClassRunner.class) + @ExtendWith(SpringExtension.class) @DirtiesContext - @ContextConfiguration(classes = { ContextWithoutCustomization.Config.class }) - public static class ContextWithoutCustomization { + @ContextConfiguration(classes = { ContextWithoutCustomizationUnitTests.Config.class }) + public static class ContextWithoutCustomizationUnitTests { @EnableRedisRepositories(considerNestedRepositories = true, includeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = { ".*ContextSampleRepository" }) }) diff --git a/src/test/java/org/springframework/data/redis/repository/core/MappingRedisEntityInformationUnitTests.java b/src/test/java/org/springframework/data/redis/repository/core/MappingRedisEntityInformationUnitTests.java index 5734be9e4..ff233dc51 100644 --- a/src/test/java/org/springframework/data/redis/repository/core/MappingRedisEntityInformationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/core/MappingRedisEntityInformationUnitTests.java @@ -15,12 +15,14 @@ */ package org.springframework.data.redis.repository.core; +import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; + import org.springframework.data.mapping.MappingException; import org.springframework.data.redis.core.mapping.RedisPersistentEntity; @@ -28,16 +30,17 @@ import org.springframework.data.redis.core.mapping.RedisPersistentEntity; * @author Christoph Strobl * @author Mark Paluch */ -@RunWith(MockitoJUnitRunner.class) -public class MappingRedisEntityInformationUnitTests { +@ExtendWith(MockitoExtension.class) +class MappingRedisEntityInformationUnitTests { @Mock RedisPersistentEntity entity; - @Test(expected = MappingException.class) // DATAREDIS-425 - public void throwsMappingExceptionWhenNoIdPropertyPresent() { + @Test // DATAREDIS-425 + void throwsMappingExceptionWhenNoIdPropertyPresent() { when(entity.hasIdProperty()).thenReturn(false); - new MappingRedisEntityInformation(entity); + assertThatExceptionOfType(MappingException.class) + .isThrownBy(() -> new MappingRedisEntityInformation(entity)); } } diff --git a/src/test/java/org/springframework/data/redis/repository/query/ExampleQueryMapperUnitTests.java b/src/test/java/org/springframework/data/redis/repository/query/ExampleQueryMapperUnitTests.java index 6a60fc9c6..6a77c957f 100644 --- a/src/test/java/org/springframework/data/redis/repository/query/ExampleQueryMapperUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/query/ExampleQueryMapperUnitTests.java @@ -24,7 +24,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Reference; @@ -44,11 +45,11 @@ import org.springframework.data.redis.repository.query.RedisOperationChain.PathA */ public class ExampleQueryMapperUnitTests { - RedisMappingContext mappingContext = new RedisMappingContext(); - ExampleQueryMapper mapper = new ExampleQueryMapper(mappingContext, new PathIndexResolver(mappingContext)); + private RedisMappingContext mappingContext = new RedisMappingContext(); + private ExampleQueryMapper mapper = new ExampleQueryMapper(mappingContext, new PathIndexResolver(mappingContext)); @Test // DATAREDIS-605 - public void shouldRejectCaseInsensitiveMatching() { + void shouldRejectCaseInsensitiveMatching() { assertThatThrownBy(() -> { mapper.getMappedExample(Example.of(new Person(), ExampleMatcher.matching().withIgnoreCase())); @@ -56,7 +57,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldRejectUnsupportedStringMatchers() { + void shouldRejectUnsupportedStringMatchers() { List unsupported = Arrays.asList(StringMatcher.STARTING, StringMatcher.REGEX, StringMatcher.CONTAINING, StringMatcher.ENDING); @@ -74,7 +75,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldMapSimpleExample() { + void shouldMapSimpleExample() { Person person = new Person(); person.setFirstname("Walter"); @@ -89,7 +90,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldIgnoreFieldsWithoutIndexWithAllMatch() { + void shouldIgnoreFieldsWithoutIndexWithAllMatch() { Person person = new Person(); person.setLastname("Foo"); @@ -101,7 +102,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldIncludeFieldsWithoutIndexWithAnyMatch() { + void shouldIncludeFieldsWithoutIndexWithAnyMatch() { Person person = new Person(); person.setLastname("Foo"); @@ -113,7 +114,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldIgnorePaths() { + void shouldIgnorePaths() { Person person = new Person(); person.setFirstname("Walter"); @@ -128,7 +129,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldMapNestedExample() { + void shouldMapNestedExample() { Person person = new Person(); @@ -145,7 +146,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldIgnoreMapsAndCollections() { + void shouldIgnoreMapsAndCollections() { Person person = new Person(); person.setNicknames(Arrays.asList("Heisenberg")); @@ -158,7 +159,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldMapMatchingAny() { + void shouldMapMatchingAny() { Person person = new Person(); person.setFirstname("Walter"); @@ -173,7 +174,7 @@ public class ExampleQueryMapperUnitTests { } @Test // DATAREDIS-605 - public void shouldApplyPropertyTransformation() { + void shouldApplyPropertyTransformation() { Person person = new Person(); person.setFirstname("Walter"); diff --git a/src/test/java/org/springframework/data/redis/repository/query/RedisQueryCreatorUnitTests.java b/src/test/java/org/springframework/data/redis/repository/query/RedisQueryCreatorUnitTests.java index fe18e818b..3f9b205f4 100644 --- a/src/test/java/org/springframework/data/redis/repository/query/RedisQueryCreatorUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/query/RedisQueryCreatorUnitTests.java @@ -19,10 +19,10 @@ import static org.assertj.core.api.Assertions.*; import java.lang.reflect.Method; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.geo.Box; @@ -46,14 +46,13 @@ import org.springframework.data.repository.query.parser.PartTree; * @author Christoph Strobl * @author Mark Paluch */ -public class RedisQueryCreatorUnitTests { - - public @Rule ExpectedException exception = ExpectedException.none(); +@ExtendWith(MockitoExtension.class) +class RedisQueryCreatorUnitTests { private @Mock RepositoryMetadata metadataMock; @Test // DATAREDIS-425 - public void findBySingleSimpleProperty() throws SecurityException, NoSuchMethodException { + void findBySingleSimpleProperty() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByFirstname", String.class), new Object[] { "eddard" }); @@ -65,7 +64,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-425 - public void findByMultipleSimpleProperties() throws SecurityException, NoSuchMethodException { + void findByMultipleSimpleProperties() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByFirstnameAndAge", String.class, Integer.class), @@ -79,7 +78,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-425 - public void findByMultipleSimplePropertiesUsingOr() throws SecurityException, NoSuchMethodException { + void findByMultipleSimplePropertiesUsingOr() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByAgeOrFirstname", Integer.class, String.class), @@ -93,7 +92,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-533 - public void findWithinCircle() throws SecurityException, NoSuchMethodException { + void findWithinCircle() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationWithin", Circle.class), @@ -107,7 +106,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-533 - public void findNearWithPointAndDistance() throws SecurityException, NoSuchMethodException { + void findNearWithPointAndDistance() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationNear", Point.class, Distance.class), @@ -121,7 +120,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-533 - public void findNearWithPointAndNumericValueDefaultsToKilometers() throws SecurityException, NoSuchMethodException { + void findNearWithPointAndNumericValueDefaultsToKilometers() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationNear", Shape.class, Object.class), @@ -135,45 +134,39 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-533 - public void findNearWithInvalidShapeParameter() throws SecurityException, NoSuchMethodException { - - exception.expect(InvalidDataAccessApiUsageException.class); - exception.expectMessage("Expected to find a Circle or Point/Distance"); + void findNearWithInvalidShapeParameter() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationNear", Shape.class, Object.class), new Object[] { new Box(new Point(0, 0), new Point(1, 1)), 200F }); - creator.createQuery(); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(creator::createQuery) + .withMessageContaining("Expected to find a Circle or Point/Distance"); } @Test // DATAREDIS-533 - public void findNearWithInvalidDistanceParameter() throws SecurityException, NoSuchMethodException { - - exception.expect(InvalidDataAccessApiUsageException.class); - exception.expectMessage("Expected to find Distance or Numeric value"); + void findNearWithInvalidDistanceParameter() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationNear", Shape.class, Object.class), new Object[] { new Point(0, 0), "200" }); - creator.createQuery(); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(creator::createQuery) + .withMessageContaining("Expected to find Distance or Numeric value"); } @Test // DATAREDIS-533 - public void findNearWithMissingDistanceParameter() throws SecurityException, NoSuchMethodException { - - exception.expect(InvalidDataAccessApiUsageException.class); - exception.expectMessage("Are you missing a parameter?"); + void findNearWithMissingDistanceParameter() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByLocationNear", Shape.class), new Object[] { new Point(0, 0) }); - creator.createQuery(); + assertThatExceptionOfType(InvalidDataAccessApiUsageException.class).isThrownBy(creator::createQuery) + .withMessageContaining("Are you missing a parameter?"); } @Test // DATAREDIS-771 - public void findByBooleanIsTrue() throws SecurityException, NoSuchMethodException { + void findByBooleanIsTrue() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByAliveIsTrue"), new Object[0]); @@ -185,7 +178,7 @@ public class RedisQueryCreatorUnitTests { } @Test // DATAREDIS-771 - public void findByBooleanIsFalse() throws SecurityException, NoSuchMethodException { + void findByBooleanIsFalse() throws SecurityException, NoSuchMethodException { RedisQueryCreator creator = createQueryCreatorForMethodWithArgs( SampleRepository.class.getMethod("findByAliveIsFalse"), new Object[0]); diff --git a/src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorTests.java b/src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorIntegrationTests.java similarity index 85% rename from src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorTests.java rename to src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorIntegrationTests.java index b869f9a3e..4e4645730 100644 --- a/src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorTests.java +++ b/src/test/java/org/springframework/data/redis/repository/support/QueryByExampleRedisExecutorIntegrationTests.java @@ -24,9 +24,11 @@ import lombok.NoArgsConstructor; import java.util.Arrays; import java.util.Optional; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.data.annotation.Id; import org.springframework.data.domain.Example; @@ -36,6 +38,7 @@ import org.springframework.data.domain.Sort; import org.springframework.data.keyvalue.core.KeyValueTemplate; import org.springframework.data.keyvalue.repository.support.SimpleKeyValueRepository; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.RedisKeyValueAdapter; import org.springframework.data.redis.core.RedisKeyValueTemplate; @@ -44,6 +47,7 @@ import org.springframework.data.redis.core.index.Indexed; import org.springframework.data.redis.core.mapping.RedisMappingContext; import org.springframework.data.redis.core.mapping.RedisPersistentEntity; import org.springframework.data.redis.repository.core.MappingRedisEntityInformation; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * Integration tests for {@link QueryByExampleRedisExecutor}. @@ -51,19 +55,21 @@ import org.springframework.data.redis.repository.core.MappingRedisEntityInformat * @author Mark Paluch * @author Christoph Strobl */ -public class QueryByExampleRedisExecutorTests { +public class QueryByExampleRedisExecutorIntegrationTests { - JedisConnectionFactory connectionFactory; - RedisMappingContext mappingContext = new RedisMappingContext(); - RedisKeyValueTemplate kvTemplate; + private static JedisConnectionFactory connectionFactory; + private RedisMappingContext mappingContext = new RedisMappingContext(); + private RedisKeyValueTemplate kvTemplate; - Person walt, hank, gus; + private Person walt, hank, gus; - @Before - public void before() { + @BeforeAll + static void beforeAll() { + connectionFactory = JedisConnectionFactoryExtension.getConnectionFactory(RedisStanalone.class); + } - connectionFactory = new JedisConnectionFactory(); - connectionFactory.afterPropertiesSet(); + @BeforeEach + void before() { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); @@ -87,13 +93,8 @@ public class QueryByExampleRedisExecutorTests { repository.saveAll(Arrays.asList(walt, hank, gus)); } - @After - public void tearDown() { - connectionFactory.destroy(); - } - @Test // DATAREDIS-605 - public void shouldFindOneByExample() { + void shouldFindOneByExample() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -104,7 +105,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldThrowExceptionWhenFindOneByExampleReturnsNonUniqueResult() { + void shouldThrowExceptionWhenFindOneByExampleReturnsNonUniqueResult() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -117,7 +118,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldNotFindOneByExample() { + void shouldNotFindOneByExample() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -127,7 +128,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldFindAllByExample() { + void shouldFindAllByExample() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -140,7 +141,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldNotSupportFindAllOrdered() { + void shouldNotSupportFindAllOrdered() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -153,7 +154,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldFindAllPagedByExample() { + void shouldFindAllPagedByExample() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -167,7 +168,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldCountCorrectly() { + void shouldCountCorrectly() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -182,7 +183,7 @@ public class QueryByExampleRedisExecutorTests { } @Test // DATAREDIS-605 - public void shouldReportExistenceCorrectly() { + void shouldReportExistenceCorrectly() { QueryByExampleRedisExecutor executor = new QueryByExampleRedisExecutor<>(getEntityInformation(Person.class), kvTemplate); @@ -211,9 +212,9 @@ public class QueryByExampleRedisExecutorTests { String lastname; City hometown; - public Person() {} + Person() {} - public Person(String firstname, String lastname) { + Person(String firstname, String lastname) { this.firstname = firstname; this.lastname = lastname; diff --git a/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementReaderUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementReaderUnitTests.java index f14b626b5..d86286c53 100644 --- a/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementReaderUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementReaderUnitTests.java @@ -20,17 +20,17 @@ import static org.assertj.core.api.Assertions.*; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link DefaultRedisElementReader}. * * @author Mark Paluch */ -public class DefaultRedisElementReaderUnitTests { +class DefaultRedisElementReaderUnitTests { @Test // DATAREDIS-602 - public void shouldDecodeByteBufferCorrectly() { + void shouldDecodeByteBufferCorrectly() { String input = "123ü?™"; byte[] bytes = input.getBytes(StandardCharsets.UTF_8); @@ -44,7 +44,7 @@ public class DefaultRedisElementReaderUnitTests { } @Test // DATAREDIS-602 - public void shouldPassThroughByteBufferForAbsentSerializer() { + void shouldPassThroughByteBufferForAbsentSerializer() { ByteBuffer input = ByteBuffer.allocate(1); diff --git a/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementWriterUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementWriterUnitTests.java index e975a5dcf..4fa69f3ae 100644 --- a/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementWriterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/DefaultRedisElementWriterUnitTests.java @@ -20,17 +20,17 @@ import static org.assertj.core.api.Assertions.*; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link DefaultRedisElementWriter}. * * @author Mark Paluch */ -public class DefaultRedisElementWriterUnitTests { +class DefaultRedisElementWriterUnitTests { @Test // DATAREDIS-602 - public void shouldSerializeInputCorrectly() { + void shouldSerializeInputCorrectly() { String input = "123ü?™"; byte[] bytes = input.getBytes(StandardCharsets.UTF_8); @@ -44,7 +44,7 @@ public class DefaultRedisElementWriterUnitTests { } @Test // DATAREDIS-602 - public void shouldWrapByteArrayForAbsentSerializer() { + void shouldWrapByteArrayForAbsentSerializer() { DefaultRedisElementWriter writer = new DefaultRedisElementWriter<>(null); @@ -55,7 +55,7 @@ public class DefaultRedisElementWriterUnitTests { } @Test // DATAREDIS-602 - public void shouldPassThroughByteBufferForAbsentSerializer() { + void shouldPassThroughByteBufferForAbsentSerializer() { DefaultRedisElementWriter writer = new DefaultRedisElementWriter<>(null); @@ -65,11 +65,11 @@ public class DefaultRedisElementWriterUnitTests { assertThat(result.array()).isEqualTo(input); } - @Test(expected = IllegalStateException.class) // DATAREDIS-602 - public void shouldFailForUnsupportedTypeWithAbsentSerializer() { + @Test // DATAREDIS-602 + void shouldFailForUnsupportedTypeWithAbsentSerializer() { DefaultRedisElementWriter writer = new DefaultRedisElementWriter<>(null); - writer.write(new Object()); + assertThatIllegalStateException().isThrownBy(() -> writer.write(new Object())); } } diff --git a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java index 8911e6007..1a3f9692d 100644 --- a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java @@ -22,7 +22,7 @@ import static org.springframework.util.ObjectUtils.*; import java.io.IOException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.BeanUtils; @@ -44,18 +44,18 @@ import com.fasterxml.jackson.databind.type.TypeFactory; * @author Christoph Strobl * @author Mark Paluch */ -public class GenericJackson2JsonRedisSerializerUnitTests { +class GenericJackson2JsonRedisSerializerUnitTests { private static final SimpleObject SIMPLE_OBJECT = new SimpleObject(1L); private static final ComplexObject COMPLEX_OBJECT = new ComplexObject("steelheart", SIMPLE_OBJECT); @Test // DATAREDIS-392 - public void shouldUseDefaultTyping() { + void shouldUseDefaultTyping() { assertThat(extractTypeResolver(new GenericJackson2JsonRedisSerializer())).isNotNull(); } @Test // DATAREDIS-392 - public void shouldUseDefaultTypingWhenClassPropertyNameIsEmpty() { + void shouldUseDefaultTypingWhenClassPropertyNameIsEmpty() { TypeResolverBuilder typeResolver = extractTypeResolver(new GenericJackson2JsonRedisSerializer("")); assertThat((String) getField(typeResolver, "_typeProperty")) @@ -63,7 +63,7 @@ public class GenericJackson2JsonRedisSerializerUnitTests { } @Test // DATAREDIS-392 - public void shouldUseDefaultTypingWhenClassPropertyNameIsNull() { + void shouldUseDefaultTypingWhenClassPropertyNameIsNull() { TypeResolverBuilder typeResolver = extractTypeResolver(new GenericJackson2JsonRedisSerializer((String) null)); assertThat((String) getField(typeResolver, "_typeProperty")) @@ -71,29 +71,29 @@ public class GenericJackson2JsonRedisSerializerUnitTests { } @Test // DATAREDIS-392 - public void shouldUseDefaultTypingWhenClassPropertyNameIsProvided() { + void shouldUseDefaultTypingWhenClassPropertyNameIsProvided() { TypeResolverBuilder typeResolver = extractTypeResolver(new GenericJackson2JsonRedisSerializer("firefight")); assertThat((String) getField(typeResolver, "_typeProperty")).isEqualTo("firefight"); } @Test // DATAREDIS-392 - public void serializeShouldReturnEmptyByteArrayWhenSouceIsNull() { + void serializeShouldReturnEmptyByteArrayWhenSouceIsNull() { assertThat(new GenericJackson2JsonRedisSerializer().serialize(null)).isEqualTo(SerializationUtils.EMPTY_ARRAY); } @Test // DATAREDIS-392 - public void deserializeShouldReturnNullWhenSouceIsNull() { + void deserializeShouldReturnNullWhenSouceIsNull() { assertThat(new GenericJackson2JsonRedisSerializer().deserialize(null)).isNull(); } @Test // DATAREDIS-392 - public void deserializeShouldReturnNullWhenSouceIsEmptyArray() { + void deserializeShouldReturnNullWhenSouceIsEmptyArray() { assertThat(new GenericJackson2JsonRedisSerializer().deserialize(SerializationUtils.EMPTY_ARRAY)).isNull(); } @Test // DATAREDIS-392 - public void deserializeShouldBeAbleToRestoreSimpleObjectAfterSerialization() { + void deserializeShouldBeAbleToRestoreSimpleObjectAfterSerialization() { GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); @@ -101,34 +101,36 @@ public class GenericJackson2JsonRedisSerializerUnitTests { } @Test // DATAREDIS-392 - public void deserializeShouldBeAbleToRestoreComplexObjectAfterSerialization() { + void deserializeShouldBeAbleToRestoreComplexObjectAfterSerialization() { GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); assertThat((ComplexObject) serializer.deserialize(serializer.serialize(COMPLEX_OBJECT))).isEqualTo(COMPLEX_OBJECT); } - @Test(expected = SerializationException.class) // DATAREDIS-392 - public void serializeShouldThrowSerializationExceptionProcessingError() throws JsonProcessingException { + @Test // DATAREDIS-392 + void serializeShouldThrowSerializationExceptionProcessingError() throws JsonProcessingException { ObjectMapper objectMapperMock = mock(ObjectMapper.class); when(objectMapperMock.writeValueAsBytes(any())).thenThrow(new JsonGenerationException("nightwielder")); - new GenericJackson2JsonRedisSerializer(objectMapperMock).serialize(SIMPLE_OBJECT); + assertThatExceptionOfType(SerializationException.class) + .isThrownBy(() -> new GenericJackson2JsonRedisSerializer(objectMapperMock).serialize(SIMPLE_OBJECT)); } - @Test(expected = SerializationException.class) // DATAREDIS-392 - public void deserializeShouldThrowSerializationExceptionProcessingError() throws IOException { + @Test // DATAREDIS-392 + void deserializeShouldThrowSerializationExceptionProcessingError() throws IOException { ObjectMapper objectMapperMock = mock(ObjectMapper.class); when(objectMapperMock.readValue(Mockito.any(byte[].class), Mockito.any(Class.class))) .thenThrow(new JsonMappingException("conflux")); - new GenericJackson2JsonRedisSerializer(objectMapperMock).deserialize(new byte[] { 1 }); + assertThatExceptionOfType(SerializationException.class) + .isThrownBy(() -> new GenericJackson2JsonRedisSerializer(objectMapperMock).deserialize(new byte[] { 1 })); } @Test // DATAREDIS-553, DATAREDIS-865 - public void shouldSerializeNullValueSoThatItCanBeDeserializedWithDefaultTypingEnabled() { + void shouldSerializeNullValueSoThatItCanBeDeserializedWithDefaultTypingEnabled() { GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); @@ -136,7 +138,7 @@ public class GenericJackson2JsonRedisSerializerUnitTests { } @Test // DATAREDIS-865 - public void shouldSerializeNullValueWithCustomObjectMapper() { + void shouldSerializeNullValueWithCustomObjectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); @@ -166,12 +168,12 @@ public class GenericJackson2JsonRedisSerializerUnitTests { static class ComplexObject { - public String stringValue; - public SimpleObject simpleObject; + String stringValue; + SimpleObject simpleObject; public ComplexObject() {} - public ComplexObject(String stringValue, SimpleObject simpleObject) { + ComplexObject(String stringValue, SimpleObject simpleObject) { this.stringValue = stringValue; this.simpleObject = simpleObject; } @@ -201,11 +203,11 @@ public class GenericJackson2JsonRedisSerializerUnitTests { static class SimpleObject { - public Long longValue; + Long longValue; public SimpleObject() {} - public SimpleObject(Long longValue) { + SimpleObject(Long longValue) { this.longValue = longValue; } diff --git a/src/test/java/org/springframework/data/redis/serializer/Jackson2JsonRedisSerializerTests.java b/src/test/java/org/springframework/data/redis/serializer/Jackson2JsonRedisSerializerTests.java index fc684feea..cf9f84741 100644 --- a/src/test/java/org/springframework/data/redis/serializer/Jackson2JsonRedisSerializerTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/Jackson2JsonRedisSerializerTests.java @@ -19,8 +19,7 @@ import static org.assertj.core.api.Assertions.*; import java.util.Arrays; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.Person; import org.springframework.data.redis.PersonObjectFactory; @@ -29,44 +28,39 @@ import org.springframework.data.redis.PersonObjectFactory; * @author Thomas Darimont * @author Christoph Strobl */ -public class Jackson2JsonRedisSerializerTests { +class Jackson2JsonRedisSerializerTests { - private Jackson2JsonRedisSerializer serializer; - - @Before - public void setUp() { - this.serializer = new Jackson2JsonRedisSerializer<>(Person.class); - } + private Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Person.class); @Test // DATAREDIS-241 - public void testJackson2JsonSerializer() throws Exception { + void testJackson2JsonSerializer() throws Exception { Person person = new PersonObjectFactory().instance(); assertThat(serializer.deserialize(serializer.serialize(person))).isEqualTo(person); } @Test // DATAREDIS-241 - public void testJackson2JsonSerializerShouldReturnEmptyByteArrayWhenSerializingNull() { + void testJackson2JsonSerializerShouldReturnEmptyByteArrayWhenSerializingNull() { assertThat(serializer.serialize(null)).isEqualTo(new byte[0]); } @Test // DTATREDIS-241 - public void testJackson2JsonSerializerShouldReturnNullWhenDerserializingEmtyByteArray() { + void testJackson2JsonSerializerShouldReturnNullWhenDerserializingEmtyByteArray() { assertThat(serializer.deserialize(new byte[0])).isNull(); } - @Test(expected = SerializationException.class) // DTATREDIS-241 - public void testJackson2JsonSerilizerShouldThrowExceptionWhenDeserializingInvalidByteArray() { + @Test // DTATREDIS-241 + void testJackson2JsonSerilizerShouldThrowExceptionWhenDeserializingInvalidByteArray() { Person person = new PersonObjectFactory().instance(); byte[] serializedValue = serializer.serialize(person); Arrays.sort(serializedValue); // corrupt serialization result - serializer.deserialize(serializedValue); + assertThatExceptionOfType(SerializationException.class).isThrownBy(() -> serializer.deserialize(serializedValue)); } @Test // DTATREDIS-241 - public void testJackson2JsonSerilizerThrowsExceptionWhenSettingNullObjectMapper() { + void testJackson2JsonSerilizerThrowsExceptionWhenSettingNullObjectMapper() { assertThatIllegalArgumentException().isThrownBy(() -> serializer.setObjectMapper(null)); } diff --git a/src/test/java/org/springframework/data/redis/serializer/RedisSerializationContextUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/RedisSerializationContextUnitTests.java index 7fde446d1..a3730c060 100644 --- a/src/test/java/org/springframework/data/redis/serializer/RedisSerializationContextUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/RedisSerializationContextUnitTests.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*; import java.nio.ByteBuffer; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link RedisSerializationContext}. @@ -27,10 +27,10 @@ import org.junit.Test; * @author Mark Paluch * @author Christoph Strobl */ -public class RedisSerializationContextUnitTests { +class RedisSerializationContextUnitTests { @Test // DATAREDIS-602 - public void shouldRejectBuildIfKeySerializerIsNotSet() { + void shouldRejectBuildIfKeySerializerIsNotSet() { assertThatIllegalArgumentException() .isThrownBy(() -> RedisSerializationContext. newSerializationContext() // .value(StringRedisSerializer.UTF_8) // @@ -40,7 +40,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldRejectBuildIfValueSerializerIsNotSet() { + void shouldRejectBuildIfValueSerializerIsNotSet() { assertThatIllegalArgumentException() .isThrownBy(() -> RedisSerializationContext. newSerializationContext() // .key(StringRedisSerializer.UTF_8) // @@ -50,7 +50,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldRejectBuildIfHashKeySerializerIsNotSet() { + void shouldRejectBuildIfHashKeySerializerIsNotSet() { assertThatIllegalArgumentException() .isThrownBy(() -> RedisSerializationContext. newSerializationContext() // .key(StringRedisSerializer.UTF_8) // @@ -60,7 +60,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldRejectBuildIfHashValueSerializerIsNotSet() { + void shouldRejectBuildIfHashValueSerializerIsNotSet() { assertThatIllegalArgumentException() .isThrownBy(() -> RedisSerializationContext. newSerializationContext() // .key(StringRedisSerializer.UTF_8) // @@ -70,7 +70,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldUseDefaultIfSet() { + void shouldUseDefaultIfSet() { RedisSerializationContext. newSerializationContext(StringRedisSerializer.UTF_8) .key(new GenericToStringSerializer(Long.class))// @@ -78,7 +78,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldBuildSerializationContext() { + void shouldBuildSerializationContext() { RedisSerializationContext serializationContext = createSerializationContext(); @@ -90,7 +90,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldEncodeAndDecodeKey() { + void shouldEncodeAndDecodeKey() { RedisSerializationContext serializationContext = createSerializationContext(); @@ -101,7 +101,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-602 - public void shouldEncodeAndDecodeValue() { + void shouldEncodeAndDecodeValue() { RedisSerializationContext serializationContext = createSerializationContext(); @@ -112,7 +112,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-1000 - public void shouldEncodeAndDecodeRawByteBufferValue() { + void shouldEncodeAndDecodeRawByteBufferValue() { RedisSerializationContext serializationContext = RedisSerializationContext .byteBuffer(); @@ -125,7 +125,7 @@ public class RedisSerializationContextUnitTests { } @Test // DATAREDIS-1000 - public void shouldEncodeAndDecodeByteArrayValue() { + void shouldEncodeAndDecodeByteArrayValue() { RedisSerializationContext serializationContext = RedisSerializationContext .byteArray(); diff --git a/src/test/java/org/springframework/data/redis/serializer/SimpleRedisSerializerTests.java b/src/test/java/org/springframework/data/redis/serializer/SimpleRedisSerializerTests.java index 10b03e548..4db559f21 100644 --- a/src/test/java/org/springframework/data/redis/serializer/SimpleRedisSerializerTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/SimpleRedisSerializerTests.java @@ -17,12 +17,12 @@ package org.springframework.data.redis.serializer; import static org.assertj.core.api.Assertions.*; +import lombok.EqualsAndHashCode; + import java.io.Serializable; import java.util.UUID; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.data.redis.Address; import org.springframework.data.redis.Person; @@ -34,85 +34,25 @@ import org.springframework.oxm.xstream.XStreamMarshaller; * @author Mark Paluch * @author Christoph Strobl */ -public class SimpleRedisSerializerTests { +class SimpleRedisSerializerTests { + @EqualsAndHashCode private static class A implements Serializable { private Integer value = Integer.valueOf(30); - - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - A other = (A) obj; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } } + @EqualsAndHashCode private static class B implements Serializable { private String name = getClass().getName(); private A a = new A(); - - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((a == null) ? 0 : a.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - B other = (B) obj; - if (a == null) { - if (other.a != null) - return false; - } else if (!a.equals(other.a)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } } - private RedisSerializer serializer; - - @Before - public void setUp() { - serializer = new JdkSerializationRedisSerializer(); - } - - @After - public void tearDown() { - serializer = null; - } + private RedisSerializer serializer = new JdkSerializationRedisSerializer(); @Test - public void testBasicSerializationRoundtrip() throws Exception { + void testBasicSerializationRoundtrip() throws Exception { verifySerializedObjects(new Integer(300), new Double(200), new B()); } @@ -124,7 +64,7 @@ public class SimpleRedisSerializerTests { } @Test // DATAREDIS-427 - public void jdkSerializerShouldUseCustomClassLoader() throws ClassNotFoundException { + void jdkSerializerShouldUseCustomClassLoader() throws ClassNotFoundException { ClassLoader customClassLoader = new ShadowingClassLoader(ClassLoader.getSystemClassLoader()); @@ -140,7 +80,7 @@ public class SimpleRedisSerializerTests { } @Test - public void testStringEncodedSerialization() { + void testStringEncodedSerialization() { String value = UUID.randomUUID().toString(); assertThat(serializer.deserialize(serializer.serialize(value))).isEqualTo(value); assertThat(serializer.deserialize(serializer.serialize(value))).isEqualTo(value); @@ -148,7 +88,7 @@ public class SimpleRedisSerializerTests { } @Test - public void testPersonSerialization() throws Exception { + void testPersonSerialization() throws Exception { String value = UUID.randomUUID().toString(); Person p1 = new Person(value, value, 1, new Address(value, 2)); assertThat(serializer.deserialize(serializer.serialize(p1))).isEqualTo(p1); @@ -156,7 +96,7 @@ public class SimpleRedisSerializerTests { } @Test - public void testOxmSerializer() throws Exception { + void testOxmSerializer() throws Exception { XStreamMarshaller xstream = new XStreamMarshaller(); xstream.afterPropertiesSet(); @@ -169,7 +109,7 @@ public class SimpleRedisSerializerTests { } @Test - public void testJsonSerializer() throws Exception { + void testJsonSerializer() throws Exception { Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Person.class); String value = UUID.randomUUID().toString(); Person p1 = new Person(value, value, 1, new Address(value, 2)); diff --git a/src/test/java/org/springframework/data/redis/serializer/StringRedisSerializerUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/StringRedisSerializerUnitTests.java index eb4d14bce..e8b53ae19 100644 --- a/src/test/java/org/springframework/data/redis/serializer/StringRedisSerializerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/StringRedisSerializerUnitTests.java @@ -19,51 +19,51 @@ import static org.assertj.core.api.Assertions.*; import java.nio.charset.StandardCharsets; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Unit tests for {@link StringRedisSerializer}. * * @author Mark Paluch */ -public class StringRedisSerializerUnitTests { +class StringRedisSerializerUnitTests { @Test - public void shouldSerializeToAscii() { + void shouldSerializeToAscii() { assertThat(StringRedisSerializer.US_ASCII.serialize("foo-bar")).isEqualTo("foo-bar".getBytes()); assertThat(StringRedisSerializer.US_ASCII.serialize("üߨ")).isEqualTo("???".getBytes()); } @Test - public void shouldDeserializeFromAscii() { + void shouldDeserializeFromAscii() { assertThat(StringRedisSerializer.US_ASCII.deserialize("foo-bar".getBytes())).isEqualTo("foo-bar"); } @Test - public void shouldSerializeToIso88591() { + void shouldSerializeToIso88591() { assertThat(StringRedisSerializer.ISO_8859_1.serialize("üߨ")) .isEqualTo("üߨ".getBytes(StandardCharsets.ISO_8859_1)); } @Test - public void shouldDeserializeFromIso88591() { + void shouldDeserializeFromIso88591() { assertThat(StringRedisSerializer.ISO_8859_1.deserialize("üߨ".getBytes(StandardCharsets.ISO_8859_1))) .isEqualTo("üߨ"); } @Test - public void shouldSerializeToUtf8() { + void shouldSerializeToUtf8() { assertThat(StringRedisSerializer.UTF_8.serialize("foo-bar")).isEqualTo("foo-bar".getBytes()); assertThat(StringRedisSerializer.UTF_8.serialize("üߨ")).isEqualTo("üߨ".getBytes(StandardCharsets.UTF_8)); } @Test - public void shouldDeserializeFromUtf8() { + void shouldDeserializeFromUtf8() { assertThat(StringRedisSerializer.UTF_8.deserialize("üߨ".getBytes(StandardCharsets.UTF_8))).isEqualTo("üߨ"); } } diff --git a/src/test/java/org/springframework/data/redis/stream/ReadOffsetStrategyUnitTests.java b/src/test/java/org/springframework/data/redis/stream/ReadOffsetStrategyUnitTests.java index c4b32a414..2817aa0a1 100644 --- a/src/test/java/org/springframework/data/redis/stream/ReadOffsetStrategyUnitTests.java +++ b/src/test/java/org/springframework/data/redis/stream/ReadOffsetStrategyUnitTests.java @@ -19,7 +19,8 @@ import static org.assertj.core.api.Assertions.*; import java.util.Optional; -import org.junit.Test; +import org.junit.jupiter.api.Test; + import org.springframework.data.redis.connection.stream.Consumer; import org.springframework.data.redis.connection.stream.ReadOffset; @@ -28,12 +29,12 @@ import org.springframework.data.redis.connection.stream.ReadOffset; * * @author Mark Paluch */ -public class ReadOffsetStrategyUnitTests { +class ReadOffsetStrategyUnitTests { - static Optional consumer = Optional.of(Consumer.from("foo", "bar")); + private static Optional consumer = Optional.of(Consumer.from("foo", "bar")); @Test // DATAREDIS-864 - public void nextMessageStandaloneShouldReturnLastSeenMessageId() { + void nextMessageStandaloneShouldReturnLastSeenMessageId() { ReadOffset offset = ReadOffset.from("foo"); @@ -42,7 +43,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void lastConsumedStandaloneShouldReturnLastSeenMessageId() { + void lastConsumedStandaloneShouldReturnLastSeenMessageId() { ReadOffset offset = ReadOffset.lastConsumed(); @@ -52,7 +53,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void latestStandaloneShouldReturnLatest() { + void latestStandaloneShouldReturnLatest() { ReadOffset offset = ReadOffset.latest(); @@ -61,7 +62,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void nextMessageConsumerGroupShouldReturnLastSeenMessageId() { + void nextMessageConsumerGroupShouldReturnLastSeenMessageId() { ReadOffset offset = ReadOffset.from("foo"); @@ -70,7 +71,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void lastConsumedConsumerGroupShouldReturnLastSeenMessageId() { + void lastConsumedConsumerGroupShouldReturnLastSeenMessageId() { ReadOffset offset = ReadOffset.lastConsumed(); @@ -79,7 +80,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void latestConsumerGroupShouldReturnLatest() { + void latestConsumerGroupShouldReturnLatest() { ReadOffset offset = ReadOffset.latest(); @@ -88,7 +89,7 @@ public class ReadOffsetStrategyUnitTests { } @Test // DATAREDIS-864 - public void getStrategyShouldReturnAppropriateStrategy() { + void getStrategyShouldReturnAppropriateStrategy() { assertThat(ReadOffsetStrategy.getStrategy(ReadOffset.from("foo"))).isEqualTo(ReadOffsetStrategy.NextMessage); assertThat(ReadOffsetStrategy.getStrategy(ReadOffset.lastConsumed())).isEqualTo(ReadOffsetStrategy.LastConsumed); diff --git a/src/test/java/org/springframework/data/redis/stream/StreamMessageListenerContainerIntegrationTests.java b/src/test/java/org/springframework/data/redis/stream/StreamMessageListenerContainerIntegrationTests.java index 450420661..46dc908c4 100644 --- a/src/test/java/org/springframework/data/redis/stream/StreamMessageListenerContainerIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/stream/StreamMessageListenerContainerIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.data.redis.stream; import static org.assertj.core.api.Assertions.*; -import static org.junit.Assume.*; import io.lettuce.core.codec.StringCodec; import io.lettuce.core.output.NestedMultiOutput; @@ -31,20 +30,17 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.awaitility.Awaitility; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.springframework.data.redis.ConnectionFactoryTracker; -import org.springframework.data.redis.RedisVersionUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnection; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.connection.stream.Consumer; import org.springframework.data.redis.connection.stream.MapRecord; import org.springframework.data.redis.connection.stream.ObjectRecord; @@ -55,6 +51,7 @@ import org.springframework.data.redis.connection.stream.StreamOffset; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.stream.StreamMessageListenerContainer.StreamMessageListenerContainerOptions; import org.springframework.data.redis.stream.StreamMessageListenerContainer.StreamReadRequest; +import org.springframework.data.redis.test.condition.EnabledOnCommand; import org.springframework.util.NumberUtils; /** @@ -63,44 +60,28 @@ import org.springframework.util.NumberUtils; * @author Mark Paluch * @author Christoph Strobl */ +@ExtendWith(LettuceConnectionFactoryExtension.class) +@EnabledOnCommand("XREAD") +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class StreamMessageListenerContainerIntegrationTests { private static final RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration( SettingsUtils.getHost(), SettingsUtils.getPort()); - public static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(2); + private static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(2); - private static RedisConnectionFactory connectionFactory; - - private StringRedisTemplate redisTemplate = new StringRedisTemplate(connectionFactory); - private StreamMessageListenerContainerOptions> containerOptions = StreamMessageListenerContainerOptions + private final RedisConnectionFactory connectionFactory; + private final StringRedisTemplate redisTemplate; + private final StreamMessageListenerContainerOptions> containerOptions = StreamMessageListenerContainerOptions .builder().pollTimeout(Duration.ofMillis(100)).build(); - @BeforeClass - public static void beforeClass() { - - LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - clientConfiguration); - lettuceConnectionFactory.afterPropertiesSet(); - - ConnectionFactoryTracker.add(lettuceConnectionFactory); - - connectionFactory = lettuceConnectionFactory; - - assumeTrue(RedisVersionUtils.atLeast("5.0", connectionFactory.getConnection())); + public StreamMessageListenerContainerIntegrationTests(RedisConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + this.redisTemplate = new StringRedisTemplate(connectionFactory); + this.redisTemplate.afterPropertiesSet(); } - @AfterClass - public static void tearDown() { - ConnectionFactoryTracker.cleanUp(); - } - - @Before - public void before() { + @BeforeEach + void before() { RedisConnection connection = connectionFactory.getConnection(); connection.flushDb(); @@ -108,7 +89,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveMapMessages() throws InterruptedException { + void shouldReceiveMapMessages() throws InterruptedException { StreamMessageListenerContainer> container = StreamMessageListenerContainer .create(connectionFactory, containerOptions); @@ -133,7 +114,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveSimpleObjectHashRecords() throws InterruptedException { + void shouldReceiveSimpleObjectHashRecords() throws InterruptedException { StreamMessageListenerContainerOptions> containerOptions = StreamMessageListenerContainerOptions .builder().pollTimeout(Duration.ofMillis(100)).targetType(String.class).build(); @@ -157,7 +138,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveObjectHashRecords() throws InterruptedException { + void shouldReceiveObjectHashRecords() throws InterruptedException { StreamMessageListenerContainerOptions> containerOptions = StreamMessageListenerContainerOptions .builder().pollTimeout(Duration.ofMillis(100)).targetType(LoginEvent.class).build(); @@ -182,7 +163,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864, DATAREDIS-1079 - public void shouldReceiveMessagesInConsumerGroup() throws InterruptedException { + void shouldReceiveMessagesInConsumerGroup() throws InterruptedException { StreamMessageListenerContainer> container = StreamMessageListenerContainer .create(connectionFactory, containerOptions); @@ -208,7 +189,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-1079 - public void shouldReceiveAndAckMessagesInConsumerGroup() throws InterruptedException { + void shouldReceiveAndAckMessagesInConsumerGroup() throws InterruptedException { StreamMessageListenerContainer> container = StreamMessageListenerContainer .create(connectionFactory, containerOptions); @@ -234,7 +215,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void shouldUseCustomErrorHandler() throws InterruptedException { + void shouldUseCustomErrorHandler() throws InterruptedException { BlockingQueue failures = new LinkedBlockingQueue<>(); @@ -257,7 +238,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void errorShouldStopListening() throws InterruptedException { + void errorShouldStopListening() throws InterruptedException { BlockingQueue failures = new LinkedBlockingQueue<>(); @@ -286,7 +267,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void customizedCancelPredicateShouldNotStopListening() throws InterruptedException { + void customizedCancelPredicateShouldNotStopListening() throws InterruptedException { BlockingQueue failures = new LinkedBlockingQueue<>(); @@ -318,7 +299,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void cancelledStreamShouldNotReceiveMessages() throws InterruptedException { + void cancelledStreamShouldNotReceiveMessages() throws InterruptedException { StreamMessageListenerContainer> container = StreamMessageListenerContainer .create(connectionFactory, containerOptions); @@ -336,7 +317,7 @@ public class StreamMessageListenerContainerIntegrationTests { } @Test // DATAREDIS-864 - public void containerRestartShouldRestartSubscription() throws InterruptedException { + void containerRestartShouldRestartSubscription() throws InterruptedException { StreamMessageListenerContainer> container = StreamMessageListenerContainer .create(connectionFactory, containerOptions); diff --git a/src/test/java/org/springframework/data/redis/stream/StreamReceiverIntegrationTests.java b/src/test/java/org/springframework/data/redis/stream/StreamReceiverIntegrationTests.java index 7146a78d9..3fc83413f 100644 --- a/src/test/java/org/springframework/data/redis/stream/StreamReceiverIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/stream/StreamReceiverIntegrationTests.java @@ -16,7 +16,6 @@ package org.springframework.data.redis.stream; import static org.assertj.core.api.Assertions.*; -import static org.junit.Assume.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -29,20 +28,14 @@ import java.nio.ByteBuffer; import java.time.Duration; import java.util.Collections; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.RedisSystemException; -import org.springframework.data.redis.RedisVersionUtils; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; -import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.connection.stream.Consumer; import org.springframework.data.redis.connection.stream.MapRecord; import org.springframework.data.redis.connection.stream.ObjectRecord; @@ -54,6 +47,7 @@ import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.stream.StreamReceiver.StreamReceiverOptions; +import org.springframework.data.redis.test.condition.EnabledOnCommand; /** * Integration tests for {@link StreamReceiver}. @@ -61,47 +55,28 @@ import org.springframework.data.redis.stream.StreamReceiver.StreamReceiverOption * @author Mark Paluch * @author Eddie McDaniel */ +@EnabledOnCommand("XREAD") +@ExtendWith(LettuceConnectionFactoryExtension.class) public class StreamReceiverIntegrationTests { - private static final RedisStandaloneConfiguration standaloneConfiguration = new RedisStandaloneConfiguration( - SettingsUtils.getHost(), SettingsUtils.getPort()); + final LettuceConnectionFactory connectionFactory; + final StringRedisTemplate redisTemplate; + final ReactiveRedisTemplate reactiveRedisTemplate; - private static LettuceConnectionFactory connectionFactory; - private StringRedisTemplate redisTemplate = new StringRedisTemplate(connectionFactory); - private static ReactiveRedisTemplate reactiveRedisTemplate; + public StreamReceiverIntegrationTests(LettuceConnectionFactory connectionFactory) { - @BeforeClass - public static void beforeClass() { - - LettuceClientConfiguration clientConfiguration = LettuceClientConfiguration.builder() // - .shutdownTimeout(Duration.ZERO) // - .clientResources(LettuceTestClientResources.getSharedClientResources()) // - .build(); - - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(standaloneConfiguration, - clientConfiguration); - lettuceConnectionFactory.afterPropertiesSet(); - - ConnectionFactoryTracker.add(lettuceConnectionFactory); - - connectionFactory = lettuceConnectionFactory; - - assumeTrue(RedisVersionUtils.atLeast("5.0", connectionFactory.getConnection())); + this.connectionFactory = connectionFactory; + this.redisTemplate = new StringRedisTemplate(connectionFactory); RedisSerializationContext serializationContext = RedisSerializationContext . newSerializationContext(StringRedisSerializer.UTF_8).hashKey(SerializationPair.raw()) .hashValue(SerializationPair.raw()).build(); - reactiveRedisTemplate = new ReactiveRedisTemplate<>(connectionFactory, serializationContext); + this.reactiveRedisTemplate = new ReactiveRedisTemplate<>(connectionFactory, serializationContext); } - @AfterClass - public static void tearDown() { - ConnectionFactoryTracker.cleanUp(); - } - - @Before - public void before() { + @BeforeEach + void before() { RedisConnection connection = connectionFactory.getConnection(); connection.flushDb(); @@ -109,7 +84,7 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveMapRecords() { + void shouldReceiveMapRecords() { StreamReceiver> receiver = StreamReceiver.create(connectionFactory); @@ -129,7 +104,7 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveSimpleObjectHashRecords() { + void shouldReceiveSimpleObjectHashRecords() { StreamReceiverOptions> receiverOptions = StreamReceiverOptions.builder() .targetType(String.class).build(); @@ -151,7 +126,7 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveObjectHashRecords() { + void shouldReceiveObjectHashRecords() { StreamReceiverOptions> receiverOptions = StreamReceiverOptions.builder() .targetType(LoginEvent.class).build(); @@ -174,32 +149,28 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-1172 - public void shouldReceiveCustomHashValueRecords() { + void shouldReceiveCustomHashValueRecords() { SerializationPair serializationPair = mock(SerializationPair.class); when(serializationPair.read(any(ByteBuffer.class))).thenReturn(345920); StreamReceiverOptions> receiverOptions = StreamReceiverOptions.builder() - .hashValueSerializer(serializationPair).build(); + . hashValueSerializer(serializationPair).build(); StreamReceiver> receiver = StreamReceiver.create(connectionFactory, receiverOptions); Flux> messages = receiver.receive(StreamOffset.fromStart("my-stream")); - messages.as(StepVerifier::create) - .then(() -> reactiveRedisTemplate.opsForStream() - .add("my-stream", Collections.singletonMap("Jesse", "Pinkman")).subscribe()) - .consumeNextWith(it -> { + messages.as(StepVerifier::create).then(() -> reactiveRedisTemplate.opsForStream() + .add("my-stream", Collections.singletonMap("Jesse", "Pinkman")).subscribe()).consumeNextWith(it -> { assertThat(it.getStream()).isEqualTo("my-stream"); assertThat(it.getValue()).contains(entry("Jesse", 345920)); - }) - .thenCancel() - .verify(Duration.ofSeconds(5)); + }).thenCancel().verify(Duration.ofSeconds(5)); } @Test // DATAREDIS-864 - public void latestModeLosesMessages() { + void latestModeLosesMessages() { // XADD/XREAD highly timing-dependent as this tests require a poll subscription to receive messages using $ offset. @@ -234,7 +205,7 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-864 - public void shouldReceiveAsConsumerGroupMessages() { + void shouldReceiveAsConsumerGroupMessages() { StreamReceiver> receiver = StreamReceiver.create(connectionFactory); @@ -262,7 +233,7 @@ public class StreamReceiverIntegrationTests { } @Test // DATAREDIS-864 - public void shouldStopReceivingOnError() { + void shouldStopReceivingOnError() { StreamReceiverOptions> options = StreamReceiverOptions.builder() .pollTimeout(Duration.ofMillis(100)).build(); diff --git a/src/test/java/org/springframework/data/redis/support/BoundKeyOperationsTest.java b/src/test/java/org/springframework/data/redis/support/BoundKeyOperationsTest.java index 19d657737..b178afde8 100644 --- a/src/test/java/org/springframework/data/redis/support/BoundKeyOperationsTest.java +++ b/src/test/java/org/springframework/data/redis/support/BoundKeyOperationsTest.java @@ -60,7 +60,6 @@ public class BoundKeyOperationsTest { this.objFactory = objFactory; this.keyOps = keyOps; this.template = template; - ConnectionFactoryTracker.add(template.getConnectionFactory()); } @Before @@ -77,11 +76,6 @@ public class BoundKeyOperationsTest { }); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @Parameters public static Collection testParams() { return BoundKeyParams.testParams(); diff --git a/src/test/java/org/springframework/data/redis/support/BoundKeyParams.java b/src/test/java/org/springframework/data/redis/support/BoundKeyParams.java index 9f2e563c1..6969a6f2d 100644 --- a/src/test/java/org/springframework/data/redis/support/BoundKeyParams.java +++ b/src/test/java/org/springframework/data/redis/support/BoundKeyParams.java @@ -18,11 +18,11 @@ package org.springframework.data.redis.support; import java.util.Arrays; import java.util.Collection; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.support.atomic.RedisAtomicInteger; import org.springframework.data.redis.support.atomic.RedisAtomicLong; @@ -30,6 +30,7 @@ import org.springframework.data.redis.support.collections.DefaultRedisList; import org.springframework.data.redis.support.collections.DefaultRedisMap; import org.springframework.data.redis.support.collections.DefaultRedisSet; import org.springframework.data.redis.support.collections.RedisList; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Costin Leau @@ -40,10 +41,8 @@ public class BoundKeyParams { public static Collection testParams() { // Jedis - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setPort(SettingsUtils.getPort()); - jedisConnFactory.setHostName(SettingsUtils.getHost()); - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); StringRedisTemplate templateJS = new StringRedisTemplate(jedisConnFactory); DefaultRedisMap mapJS = new DefaultRedisMap("bound:key:map", templateJS); @@ -51,11 +50,8 @@ public class BoundKeyParams { RedisList list = new DefaultRedisList("bound:key:list", templateJS); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); - lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnFactory.setPort(SettingsUtils.getPort()); - lettuceConnFactory.setHostName(SettingsUtils.getHost()); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); StringRedisTemplate templateLT = new StringRedisTemplate(lettuceConnFactory); DefaultRedisMap mapLT = new DefaultRedisMap("bound:key:mapLT", templateLT); diff --git a/src/test/java/org/springframework/data/redis/support/atomic/AtomicCountersParam.java b/src/test/java/org/springframework/data/redis/support/atomic/AtomicCountersParam.java index 44662d528..8844e5fe9 100644 --- a/src/test/java/org/springframework/data/redis/support/atomic/AtomicCountersParam.java +++ b/src/test/java/org/springframework/data/redis/support/atomic/AtomicCountersParam.java @@ -20,9 +20,12 @@ import java.util.Collection; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Costin Leau @@ -35,14 +38,12 @@ abstract class AtomicCountersParam { static Collection testParams() { // Jedis - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(new RedisStandaloneConfiguration()); - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(new RedisStandaloneConfiguration(), - LettuceClientConfiguration.builder().clientResources(LettuceTestClientResources.getSharedClientResources()) - .build()); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class, false); return Arrays.asList(new Object[][] { { jedisConnFactory }, { lettuceConnFactory } }); } diff --git a/src/test/java/org/springframework/data/redis/support/atomic/CompareAndSetIntegrationTests.java b/src/test/java/org/springframework/data/redis/support/atomic/CompareAndSetIntegrationTests.java index 3f47a9182..0f50d8732 100644 --- a/src/test/java/org/springframework/data/redis/support/atomic/CompareAndSetIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/support/atomic/CompareAndSetIntegrationTests.java @@ -59,8 +59,6 @@ public class CompareAndSetIntegrationTests { this.template.afterPropertiesSet(); this.valueOps = this.template.opsForValue(); - - ConnectionFactoryTracker.add(factory); } @Parameters @@ -68,11 +66,6 @@ public class CompareAndSetIntegrationTests { return AtomicCountersParam.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - @After public void tearDown() { diff --git a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicDoubleTests.java b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicDoubleTests.java index 66a6a357c..44cb9d14a 100644 --- a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicDoubleTests.java +++ b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicDoubleTests.java @@ -25,14 +25,13 @@ import java.util.function.DoubleBinaryOperator; import java.util.function.DoubleUnaryOperator; import org.assertj.core.data.Offset; -import org.junit.After; -import org.junit.AfterClass; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; + import org.springframework.dao.DataRetrievalFailureException; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @@ -57,7 +56,6 @@ public class RedisAtomicDoubleTests extends AbstractRedisAtomicsTests { public RedisAtomicDoubleTests(RedisConnectionFactory factory) { - this.doubleCounter = new RedisAtomicDouble(getClass().getSimpleName() + ":double", factory); this.factory = factory; this.template = new RedisTemplate<>(); @@ -65,8 +63,6 @@ public class RedisAtomicDoubleTests extends AbstractRedisAtomicsTests { this.template.setKeySerializer(StringRedisSerializer.UTF_8); this.template.setValueSerializer(new GenericToStringSerializer<>(Double.class)); this.template.afterPropertiesSet(); - - ConnectionFactoryTracker.add(factory); } @Parameters @@ -74,17 +70,14 @@ public class RedisAtomicDoubleTests extends AbstractRedisAtomicsTests { return AtomicCountersParam.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - - @After - public void tearDown() { + @Before + public void before() { RedisConnection connection = factory.getConnection(); connection.flushDb(); connection.close(); + + this.doubleCounter = new RedisAtomicDouble(getClass().getSimpleName() + ":double", factory); } @Test // DATAREDIS-198 diff --git a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicIntegerTests.java b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicIntegerTests.java index 28241ac38..5c776aa91 100644 --- a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicIntegerTests.java +++ b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicIntegerTests.java @@ -23,14 +23,13 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.IntBinaryOperator; import java.util.function.IntUnaryOperator; -import org.junit.After; -import org.junit.AfterClass; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; + import org.springframework.dao.DataRetrievalFailureException; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @@ -56,7 +55,6 @@ public class RedisAtomicIntegerTests extends AbstractRedisAtomicsTests { public RedisAtomicIntegerTests(RedisConnectionFactory factory) { - this.intCounter = new RedisAtomicInteger(getClass().getSimpleName() + ":int", factory); this.factory = factory; this.template = new RedisTemplate<>(); @@ -64,8 +62,6 @@ public class RedisAtomicIntegerTests extends AbstractRedisAtomicsTests { this.template.setKeySerializer(StringRedisSerializer.UTF_8); this.template.setValueSerializer(new GenericToStringSerializer<>(Integer.class)); this.template.afterPropertiesSet(); - - ConnectionFactoryTracker.add(factory); } @Parameters @@ -73,17 +69,14 @@ public class RedisAtomicIntegerTests extends AbstractRedisAtomicsTests { return AtomicCountersParam.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - - @After - public void tearDown() { + @Before + public void before() { RedisConnection connection = factory.getConnection(); connection.flushDb(); connection.close(); + + this.intCounter = new RedisAtomicInteger(getClass().getSimpleName() + ":int", factory); } @Test diff --git a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicLongTests.java b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicLongTests.java index b983e4d33..5cbdfc6e9 100644 --- a/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicLongTests.java +++ b/src/test/java/org/springframework/data/redis/support/atomic/RedisAtomicLongTests.java @@ -22,14 +22,13 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.LongBinaryOperator; import java.util.function.LongUnaryOperator; -import org.junit.After; -import org.junit.AfterClass; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; + import org.springframework.dao.DataRetrievalFailureException; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @@ -55,7 +54,6 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests { public RedisAtomicLongTests(RedisConnectionFactory factory) { - this.longCounter = new RedisAtomicLong(getClass().getSimpleName() + ":long", factory); this.factory = factory; this.template = new RedisTemplate<>(); @@ -63,8 +61,6 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests { this.template.setKeySerializer(StringRedisSerializer.UTF_8); this.template.setValueSerializer(new GenericToStringSerializer<>(Long.class)); this.template.afterPropertiesSet(); - - ConnectionFactoryTracker.add(factory); } @Parameters @@ -72,17 +68,14 @@ public class RedisAtomicLongTests extends AbstractRedisAtomicsTests { return AtomicCountersParam.testParams(); } - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); - } - - @After - public void tearDown() { + @Before + public void before() { RedisConnection connection = factory.getConnection(); connection.flushDb(); connection.close(); + + this.longCounter = new RedisAtomicLong(getClass().getSimpleName() + ":long", factory); } @Test diff --git a/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisCollectionTests.java b/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisCollectionTests.java index 032cccc8a..70b80bac3 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisCollectionTests.java +++ b/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisCollectionTests.java @@ -62,12 +62,6 @@ public abstract class AbstractRedisCollectionTests { public AbstractRedisCollectionTests(ObjectFactory factory, RedisTemplate template) { this.factory = factory; this.template = template; - ConnectionFactoryTracker.add(template.getConnectionFactory()); - } - - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); } @Parameters diff --git a/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisMapTests.java b/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisMapTests.java index 9b320bb3a..055ef89e0 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisMapTests.java +++ b/src/test/java/org/springframework/data/redis/support/collections/AbstractRedisMapTests.java @@ -22,15 +22,12 @@ import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -38,7 +35,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.springframework.dao.InvalidDataAccessApiUsageException; -import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.DoubleAsStringObjectFactory; import org.springframework.data.redis.LongAsStringObjectFactory; import org.springframework.data.redis.ObjectFactory; @@ -50,9 +46,6 @@ import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.test.util.MinimumRedisVersionRule; import org.springframework.data.redis.test.util.RedisClientRule; -import org.springframework.data.redis.test.util.RedisDriver; -import org.springframework.data.redis.test.util.WithRedisDriver; -import org.springframework.test.annotation.IfProfileValue; /** * Integration test for Redis Map. @@ -91,12 +84,6 @@ public abstract class AbstractRedisMapTests { this.keyFactory = keyFactory; this.valueFactory = valueFactory; this.template = template; - ConnectionFactoryTracker.add(template.getConnectionFactory()); - } - - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); } protected K getKey() { @@ -113,12 +100,10 @@ public abstract class AbstractRedisMapTests { } @SuppressWarnings("unchecked") - @After - public void tearDown() throws Exception { - // remove the collection entirely since clear() doesn't always work - map.getOperations().delete(Collections.singleton(map.getKey())); + @Before + public void before() throws Exception { template.execute((RedisCallback) connection -> { - connection.flushDb(); + connection.flushAll(); return null; }); } @@ -231,7 +216,6 @@ public abstract class AbstractRedisMapTests { } @Test - @IfProfileValue(name = "redisVersion", value = "2.6+") public void testIncrementDouble() { assumeTrue(valueFactory instanceof DoubleAsStringObjectFactory); K k1 = getKey(); @@ -483,8 +467,6 @@ public abstract class AbstractRedisMapTests { } @Test // DATAREDIS-314 - @IfProfileValue(name = "redisVersion", value = "2.8+") - @WithRedisDriver({ RedisDriver.JEDIS, RedisDriver.LETTUCE }) public void testScanWorksCorrectly() throws IOException { K k1 = getKey(); diff --git a/src/test/java/org/springframework/data/redis/support/collections/CollectionTestParams.java b/src/test/java/org/springframework/data/redis/support/collections/CollectionTestParams.java index af2cea4fd..d3c26057c 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/CollectionTestParams.java +++ b/src/test/java/org/springframework/data/redis/support/collections/CollectionTestParams.java @@ -26,13 +26,16 @@ import org.springframework.data.redis.RawObjectFactory; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.oxm.xstream.XStreamMarshaller; /** @@ -62,13 +65,8 @@ public abstract class CollectionTestParams { ObjectFactory personFactory = new PersonObjectFactory(); ObjectFactory rawFactory = new RawObjectFactory(); - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setUsePool(true); - - jedisConnFactory.setPort(SettingsUtils.getPort()); - jedisConnFactory.setHostName(SettingsUtils.getHost()); - - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate stringTemplate = new StringRedisTemplate(jedisConnFactory); RedisTemplate personTemplate = new RedisTemplate<>(); @@ -98,11 +96,8 @@ public abstract class CollectionTestParams { rawTemplate.afterPropertiesSet(); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); - lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnFactory.setPort(SettingsUtils.getPort()); - lettuceConnFactory.setHostName(SettingsUtils.getHost()); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate stringTemplateLtc = new StringRedisTemplate(lettuceConnFactory); RedisTemplate personTemplateLtc = new RedisTemplate<>(); diff --git a/src/test/java/org/springframework/data/redis/support/collections/RedisCollectionFactoryBeanTests.java b/src/test/java/org/springframework/data/redis/support/collections/RedisCollectionFactoryBeanTests.java index 23ddf4c8f..3013afda8 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/RedisCollectionFactoryBeanTests.java +++ b/src/test/java/org/springframework/data/redis/support/collections/RedisCollectionFactoryBeanTests.java @@ -23,12 +23,13 @@ import org.junit.Test; import org.springframework.data.redis.ConnectionFactoryTracker; import org.springframework.data.redis.ObjectFactory; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.support.collections.RedisCollectionFactoryBean.CollectionType; +import org.springframework.data.redis.test.extension.RedisStanalone; /** * @author Costin Leau @@ -40,21 +41,10 @@ public class RedisCollectionFactoryBeanTests { protected RedisStore col; public RedisCollectionFactoryBeanTests() { - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setUsePool(true); - - jedisConnFactory.setPort(SettingsUtils.getPort()); - jedisConnFactory.setHostName(SettingsUtils.getHost()); - - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); this.template = new StringRedisTemplate(jedisConnFactory); - ConnectionFactoryTracker.add(jedisConnFactory); - } - - @AfterClass - public static void cleanUp() { - ConnectionFactoryTracker.cleanUp(); } @After diff --git a/src/test/java/org/springframework/data/redis/support/collections/RedisMapTests.java b/src/test/java/org/springframework/data/redis/support/collections/RedisMapTests.java index 1beb15d92..508dd694d 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/RedisMapTests.java +++ b/src/test/java/org/springframework/data/redis/support/collections/RedisMapTests.java @@ -29,13 +29,16 @@ import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.PoolConfig; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.oxm.xstream.XStreamMarshaller; /** @@ -88,12 +91,8 @@ public class RedisMapTests extends AbstractRedisMapTests { ObjectFactory longFactory = new LongAsStringObjectFactory(); ObjectFactory rawFactory = new RawObjectFactory(); - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.getPoolConfig().setMaxTotal(defaultPoolConfig.getMaxTotal()); - jedisConnFactory.setUsePool(true); - jedisConnFactory.setPort(SettingsUtils.getPort()); - jedisConnFactory.setHostName(SettingsUtils.getHost()); - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate genericTemplate = new RedisTemplate(); genericTemplate.setConnectionFactory(jedisConnFactory); @@ -118,11 +117,8 @@ public class RedisMapTests extends AbstractRedisMapTests { rawTemplate.afterPropertiesSet(); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); - lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnFactory.setHostName(SettingsUtils.getHost()); - lettuceConnFactory.setPort(SettingsUtils.getPort()); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class, false); RedisTemplate genericTemplateLettuce = new RedisTemplate(); genericTemplateLettuce.setConnectionFactory(lettuceConnFactory); diff --git a/src/test/java/org/springframework/data/redis/support/collections/RedisPropertiesTests.java b/src/test/java/org/springframework/data/redis/support/collections/RedisPropertiesTests.java index 33417038c..35108a651 100644 --- a/src/test/java/org/springframework/data/redis/support/collections/RedisPropertiesTests.java +++ b/src/test/java/org/springframework/data/redis/support/collections/RedisPropertiesTests.java @@ -17,7 +17,6 @@ package org.springframework.data.redis.support.collections; import static org.assertj.core.api.Assertions.*; -import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; @@ -28,7 +27,6 @@ import java.util.LinkedHashSet; import java.util.Properties; import java.util.Set; -import org.junit.Ignore; import org.junit.Test; import org.junit.runners.Parameterized.Parameters; @@ -36,15 +34,16 @@ import org.springframework.data.redis.DoubleAsStringObjectFactory; import org.springframework.data.redis.LongAsStringObjectFactory; import org.springframework.data.redis.ObjectFactory; import org.springframework.data.redis.Person; -import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.StringObjectFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.extension.JedisConnectionFactoryExtension; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.connection.lettuce.extension.LettuceConnectionFactoryExtension; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.OxmSerializer; +import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.oxm.xstream.XStreamMarshaller; /** @@ -106,28 +105,6 @@ public class RedisPropertiesTests extends RedisMapTests { assertThat(props.size()).isEqualTo(size + 3); } - @Test - @Ignore - public void testPropertiesLoadXml() throws Exception { - InputStream stream = getClass() - .getResourceAsStream("/org/springframework/data/keyvalue/redis/support/collections/props.properties"); - - assertThat(stream).isNotNull(); - - int size = props.size(); - - try { - props.loadFromXML(stream); - } finally { - stream.close(); - } - - assertThat(props.get("foo")).isEqualTo("bar"); - assertThat(props.get("bucket")).isEqualTo("head"); - assertThat(props.get("lotus")).isEqualTo("island"); - assertThat(props.size()).isEqualTo(size + 3); - } - @Test public void testPropertiesSave() throws Exception { props.setProperty("x", "y"); @@ -137,15 +114,6 @@ public class RedisPropertiesTests extends RedisMapTests { props.store(writer, "no-comment"); } - @Test - @Ignore - public void testPropertiesSaveXml() throws Exception { - props.setProperty("x", "y"); - props.setProperty("a", "b"); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - props.storeToXML(bos, "comment"); - } - @Test public void testGetProperty() throws Exception { String property = props.getProperty("a"); @@ -246,13 +214,8 @@ public class RedisPropertiesTests extends RedisMapTests { ObjectFactory longFactory = new LongAsStringObjectFactory(); ObjectFactory doubleFactory = new DoubleAsStringObjectFactory(); - JedisConnectionFactory jedisConnFactory = new JedisConnectionFactory(); - jedisConnFactory.setUsePool(true); - - jedisConnFactory.setPort(SettingsUtils.getPort()); - jedisConnFactory.setHostName(SettingsUtils.getHost()); - - jedisConnFactory.afterPropertiesSet(); + JedisConnectionFactory jedisConnFactory = JedisConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class); RedisTemplate genericTemplate = new StringRedisTemplate(jedisConnFactory); @@ -269,11 +232,8 @@ public class RedisPropertiesTests extends RedisMapTests { jackson2JsonPersonTemplate.afterPropertiesSet(); // Lettuce - LettuceConnectionFactory lettuceConnFactory = new LettuceConnectionFactory(); - lettuceConnFactory.setClientResources(LettuceTestClientResources.getSharedClientResources()); - lettuceConnFactory.setPort(SettingsUtils.getPort()); - lettuceConnFactory.setHostName(SettingsUtils.getHost()); - lettuceConnFactory.afterPropertiesSet(); + LettuceConnectionFactory lettuceConnFactory = LettuceConnectionFactoryExtension + .getConnectionFactory(RedisStanalone.class, false); RedisTemplate genericTemplateLtc = new StringRedisTemplate(lettuceConnFactory); RedisTemplate xGenericTemplateLtc = new RedisTemplate<>(); diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommand.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommand.java new file mode 100644 index 000000000..cb49fa4dd --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommand.java @@ -0,0 +1,46 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * {@code @EnabledOnCommand} is used to signal that the annotated test class or test method is only enabled if + * the specified command is available. + *

+ * When applied at the class level, all test methods within that class will be enabled. + * + * @author Mark Paluch + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@ExtendWith(EnabledOnCommandCondition.class) +public @interface EnabledOnCommand { + + /** + * Name of the Redis command to be available. + */ + String value(); +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommandCondition.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommandCondition.java new file mode 100644 index 000000000..451f821c2 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnCommandCondition.java @@ -0,0 +1,68 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.*; + +import io.lettuce.core.api.StatefulRedisConnection; + +import java.util.Optional; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.util.AnnotationUtils; + +import org.springframework.data.redis.test.extension.LettuceExtension; + +/** + * {@link ExecutionCondition} for {@link EnabledOnCommandCondition @EnabledOnCommand}. + * + * @see EnabledOnCommandCondition + */ +class EnabledOnCommandCondition implements ExecutionCondition { + + private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled("@EnabledOnCommand is not present"); + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace + .create(RedisConditions.class); + + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + + Optional optional = AnnotationUtils.findAnnotation(context.getElement(), EnabledOnCommand.class); + + if (optional.isPresent()) { + + String command = optional.get().value(); + + ExtensionContext.Store store = context.getStore(NAMESPACE); + RedisConditions conditions = store.getOrComputeIfAbsent(RedisConditions.class, ignore -> { + + StatefulRedisConnection connection = new LettuceExtension().resolve(context, StatefulRedisConnection.class); + return RedisConditions.of(connection); + }, RedisConditions.class); + + boolean hasCommand = conditions.hasCommand(command); + return hasCommand ? enabled("Enabled on command " + command) + : disabled( + "Disabled, command " + command + " not available on Redis version " + conditions.getRedisVersion()); + } + + return ENABLED_BY_DEFAULT; + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailable.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailable.java new file mode 100644 index 000000000..6b5019907 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailable.java @@ -0,0 +1,46 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * {@code @EnabledOnRedisAvailable} is used to signal that the annotated test class or test method is only + * enabled if Redis is running at {@link #value() port}. + *

+ * When applied at the class level, all test methods within that class will be enabled. + * + * @author Mark Paluch + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@ExtendWith(EnabledOnRedisAvailableCondition.class) +public @interface EnabledOnRedisAvailable { + + /** + * Redis port number. + */ + int value() default 6379; +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailableCondition.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailableCondition.java new file mode 100644 index 000000000..cb8f1eef0 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisAvailableCondition.java @@ -0,0 +1,68 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.*; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Optional; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.util.AnnotationUtils; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@link ExecutionCondition} for {@link EnabledOnRedisAvailableCondition @EnabledOnRedisAvailable}. + * + * @author Mark Paluch + * @see EnabledOnRedisAvailableCondition + */ +class EnabledOnRedisAvailableCondition implements ExecutionCondition { + + private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled( + "@EnabledOnRedisAvailable is not present"); + + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + + Optional optional = AnnotationUtils.findAnnotation(context.getElement(), + EnabledOnRedisAvailable.class); + + if (optional.isPresent()) { + + EnabledOnRedisAvailable annotation = optional.get(); + + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(SettingsUtils.getHost(), annotation.value()), 100); + + return enabled( + String.format("Connection successful to Redis at %s:%d", SettingsUtils.getHost(), annotation.value())); + } catch (IOException e) { + return disabled( + String.format("Cannot connect to Redis at %s:%d (%s)", SettingsUtils.getHost(), annotation.value(), e)); + } + } + + return ENABLED_BY_DEFAULT; + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterAvailable.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterAvailable.java new file mode 100644 index 000000000..2d4d046a1 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterAvailable.java @@ -0,0 +1,42 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * {@code @EnabledOnRedisClusterAvailable} is used to signal that the annotated test class or test method is only + * enabled if Redis Cluster is running. + *

+ * When applied at the class level, all test methods within that class will be enabled. + * + * @author Mark Paluch + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@ExtendWith(EnabledOnRedisClusterCondition.class) +public @interface EnabledOnRedisClusterAvailable { + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterCondition.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterCondition.java new file mode 100644 index 000000000..2f1791e26 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisClusterCondition.java @@ -0,0 +1,65 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.*; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Optional; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.util.AnnotationUtils; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@link ExecutionCondition} for {@link EnabledOnRedisClusterCondition @EnabledOnRedisClusterAvailable}. + * + * @author Mark Paluch + * @see EnabledOnRedisClusterCondition + */ +class EnabledOnRedisClusterCondition implements ExecutionCondition { + + private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled( + "@EnabledOnClusterAvailable is not present"); + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + + Optional optional = AnnotationUtils.findAnnotation(context.getElement(), + EnabledOnRedisClusterAvailable.class); + + if (optional.isPresent()) { + + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(SettingsUtils.getHost(), SettingsUtils.getClusterPort()), 100); + + return enabled(String.format("Connection successful to Redis Cluster at %s:%d", SettingsUtils.getHost(), + SettingsUtils.getClusterPort())); + } catch (IOException e) { + return disabled(String.format("Cannot connect to Redis Cluster at %s:%d (%s)", SettingsUtils.getHost(), + SettingsUtils.getClusterPort(), e)); + } + } + + return ENABLED_BY_DEFAULT; + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelAvailable.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelAvailable.java new file mode 100644 index 000000000..5157391cb --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelAvailable.java @@ -0,0 +1,46 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * {@code @EnabledOnRedisSentinelAvailable} is used to signal that the annotated test class or test method is only + * enabled if Redis Sentinel is running. + *

+ * When applied at the class level, all test methods within that class will be enabled. + * + * @author Mark Paluch + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@ExtendWith(EnabledOnRedisSentinelCondition.class) +public @interface EnabledOnRedisSentinelAvailable { + + /** + * Sentinel port number. + */ + int value() default 26379; +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelCondition.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelCondition.java new file mode 100644 index 000000000..21ea1305f --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisSentinelCondition.java @@ -0,0 +1,67 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.*; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Optional; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.util.AnnotationUtils; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@link ExecutionCondition} for {@link EnabledOnRedisSentinelCondition @EnabledOnRedisSentinelAvailable}. + * + * @author Mark Paluch + * @see EnabledOnRedisSentinelCondition + */ +class EnabledOnRedisSentinelCondition implements ExecutionCondition { + + private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled( + "@EnabledOnSentinelAvailable is not present"); + + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + + Optional optional = AnnotationUtils.findAnnotation(context.getElement(), + EnabledOnRedisSentinelAvailable.class); + + if (optional.isPresent()) { + + EnabledOnRedisSentinelAvailable annotation = optional.get(); + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(SettingsUtils.getHost(), annotation.value()), 100); + + return enabled(String.format("Connection successful to Redis Sentinel at %s:%d", SettingsUtils.getHost(), + annotation.value())); + } catch (IOException e) { + return disabled(String.format("Cannot connect to Redis Sentinel at %s:%d (%s)", SettingsUtils.getHost(), + annotation.value(), e)); + } + } + + return ENABLED_BY_DEFAULT; + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersion.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersion.java new file mode 100644 index 000000000..c5002620a --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersion.java @@ -0,0 +1,46 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.junit.jupiter.api.extension.ExtendWith; + +/** + * {@code @EnabledOnRedisVersion} is used to signal that the annotated test class or test method is only + * enabled if Redis has at least the specified {@link #value() version number}. + *

+ * When applied at the class level, all test methods within that class will be enabled. + * + * @author Mark Paluch + */ +@Target({ ElementType.TYPE, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +@ExtendWith(EnabledOnRedisVersionCondition.class) +public @interface EnabledOnRedisVersion { + + /** + * Minimum version number + */ + String value(); +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersionCondition.java b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersionCondition.java new file mode 100644 index 000000000..f75b84941 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/EnabledOnRedisVersionCondition.java @@ -0,0 +1,72 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.*; + +import io.lettuce.core.api.StatefulRedisConnection; + +import java.util.Optional; + +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.util.AnnotationUtils; + +import org.springframework.data.redis.test.extension.LettuceExtension; + +/** + * {@link ExecutionCondition} for {@link EnabledOnRedisVersionCondition @EnabledOnVersion}. + * + * @author Mark Paluch + * @see EnabledOnRedisVersionCondition + */ +class EnabledOnRedisVersionCondition implements ExecutionCondition { + + private static final ConditionEvaluationResult ENABLED_BY_DEFAULT = enabled("@EnabledOnVersion is not present"); + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace + .create(EnabledOnRedisVersionCondition.class); + + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + + Optional optional = AnnotationUtils.findAnnotation(context.getElement(), + EnabledOnRedisVersion.class); + + if (optional.isPresent()) { + + String requiredVersion = optional.get().value(); + + ExtensionContext.Store store = context.getStore(NAMESPACE); + RedisConditions conditions = store.getOrComputeIfAbsent(RedisConditions.class, ignore -> { + + StatefulRedisConnection connection = new LettuceExtension().resolve(context, StatefulRedisConnection.class); + return RedisConditions.of(connection); + }, RedisConditions.class); + + boolean versionMet = conditions.hasVersionGreaterOrEqualsTo(requiredVersion); + return versionMet + ? enabled(String.format("Enabled on version %s (actual version: %s)", requiredVersion, + conditions.getRedisVersion())) + : disabled(String.format("Disabled, version %s not available on Redis version %s", requiredVersion, + conditions.getRedisVersion())); + } + + return ENABLED_BY_DEFAULT; + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/condition/RedisConditions.java b/src/test/java/org/springframework/data/redis/test/condition/RedisConditions.java new file mode 100644 index 000000000..39361f044 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/condition/RedisConditions.java @@ -0,0 +1,131 @@ +/* + * Copyright 2018-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.condition; + +import io.lettuce.core.api.StatefulRedisConnection; +import io.lettuce.core.api.sync.RedisCommands; +import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; +import io.lettuce.core.cluster.api.sync.RedisClusterCommands; +import io.lettuce.core.models.command.CommandDetail; +import io.lettuce.core.models.command.CommandDetailParser; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import org.springframework.data.util.Version; + +/** + * Collection of utility methods to test conditions during test execution. + * + * @author Mark Paluch + */ +class RedisConditions { + + private final Map commands; + private final Version version; + + private RedisConditions(RedisClusterCommands commands) { + + List result = CommandDetailParser.parse(commands.command()); + + this.commands = result.stream() + .collect(Collectors.toMap(commandDetail -> commandDetail.getName().toUpperCase(), CommandDetail::getArity)); + + String info = commands.info("server"); + + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(info.getBytes()); + Properties p = new Properties(); + p.load(inputStream); + + version = Version.parse(p.getProperty("redis_version")); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Create {@link RedisCommands} given {@link StatefulRedisConnection}. + * + * @param connection must not be {@code null}. + * @return + */ + public static RedisConditions of(StatefulRedisConnection connection) { + return new RedisConditions(connection.sync()); + } + + /** + * Create {@link RedisCommands} given {@link StatefulRedisClusterConnection}. + * + * @param connection must not be {@code null}. + * @return + */ + public static RedisConditions of(StatefulRedisClusterConnection connection) { + return new RedisConditions(connection.sync()); + } + + /** + * Create {@link RedisConditions} given {@link RedisCommands}. + * + * @param commands must not be {@code null}. + * @return + */ + public static RedisConditions of(RedisClusterCommands commands) { + return new RedisConditions(commands); + } + + /** + * @return the Redis {@link Version}. + */ + public Version getRedisVersion() { + return version; + } + + /** + * @param command + * @return {@code true} if the command is present. + */ + public boolean hasCommand(String command) { + return commands.containsKey(command.toUpperCase()); + } + + /** + * @param command command name. + * @param arity expected arity. + * @return {@code true} if the command is present with the given arity. + */ + public boolean hasCommandArity(String command, int arity) { + + if (!hasCommand(command)) { + throw new IllegalStateException("Unknown command: " + command + " in " + commands); + } + + return commands.get(command.toUpperCase()) == arity; + } + + /** + * @param versionNumber + * @return {@code true} if the version number is met. + */ + public boolean hasVersionGreaterOrEqualsTo(String versionNumber) { + return version.isGreaterThanOrEqualTo(Version.parse(versionNumber)); + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/extension/JedisExtension.java b/src/test/java/org/springframework/data/redis/test/extension/JedisExtension.java new file mode 100644 index 000000000..327183d06 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/JedisExtension.java @@ -0,0 +1,187 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisCluster; + +import java.lang.reflect.Parameter; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +import org.springframework.core.ResolvableType; +import org.springframework.data.redis.SettingsUtils; +import org.springframework.data.util.Lazy; + +/** + * JUnit 5 {@link Extension} using Jedis providing parameter resolution for connection resources and that reacts to + * callbacks. The following resource types are supported by this extension: + *

    + *
  • {@link Jedis} (singleton)
  • + *
  • {@link JediCluster} (singleton)
  • + *
+ * + *
+ * @ExtendWith(JedisExtension.class)
+ * public class CustomCommandTest {
+ *
+ * 	private final Jedis jedis;
+ *
+ * 	public CustomCommandTest(Jedis jedis) {
+ * 		this.jedis = jedis;
+ * 	}
+ *
+ * }
+ * 
+ * + *

Resource lifecycle

This extension allocates resources lazily and stores them in its {@link ExtensionContext} + * {@link ExtensionContext.Store} for reuse across multiple tests. Connections are allocated through suppliers. Shutdown + * is managed by this extension. + * + * @author Mark Paluch + * @see ParameterResolver + * @see BeforeEachCallback + */ +public class JedisExtension implements ParameterResolver { + + private final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create(JedisExtension.class); + + private static final Set> SUPPORTED_INJECTABLE_TYPES = new HashSet<>( + Arrays.asList(Jedis.class, JedisCluster.class)); + + private static final List> SUPPLIERS = Arrays.asList(JedisSupplier.INSTANCE, + JedisClusterSupplier.INSTANCE); + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return SUPPORTED_INJECTABLE_TYPES.contains(parameterContext.getParameter().getType()); + } + + /** + * Attempt to resolve the {@code requestedResourceType}. + * + * @param extensionContext + * @param requestedResourceType + * @param + * @return + */ + public T resolve(ExtensionContext extensionContext, Class requestedResourceType) { + + ExtensionContext.Store store = getStore(extensionContext); + + return (T) store.getOrComputeIfAbsent(requestedResourceType, it -> findSupplier(requestedResourceType).get()); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + + ExtensionContext.Store store = getStore(extensionContext); + Parameter parameter = parameterContext.getParameter(); + Type parameterizedType = parameter.getParameterizedType(); + + return store.getOrComputeIfAbsent(parameter.getType(), it -> doGetInstance(parameterizedType)); + } + + @SuppressWarnings("unchecked") + private static Supplier findSupplier(Type type) { + + ResolvableType requested = ResolvableType.forType(type); + + Supplier supplier = SUPPLIERS.stream().filter(it -> { + + ResolvableType providedType = ResolvableType.forType(it.getClass()).as(Supplier.class).getGeneric(0); + + if (requested.isAssignableFrom(providedType)) { + return true; + } + return false; + }).findFirst().orElseThrow(() -> new NoSuchElementException("Cannot find a factory for " + type)); + + return (Supplier) supplier; + } + + private Object doGetInstance(Type parameterizedType) { + return findSupplier(parameterizedType).get(); + } + + private ExtensionContext.Store getStore(ExtensionContext extensionContext) { + return extensionContext.getStore(NAMESPACE); + } + + static class ResourceFunction { + + final ResolvableType dependsOn; + final ResolvableType provides; + final Function function; + + public ResourceFunction(ResolvableType dependsOn, ResolvableType provides, Function function) { + this.dependsOn = dependsOn; + this.provides = provides; + this.function = (Function) function; + } + } + + enum JedisSupplier implements Supplier { + + INSTANCE; + + final Lazy lazy = Lazy.of(() -> { + Jedis client = new Jedis(SettingsUtils.getHost(), SettingsUtils.getPort()); + + ShutdownQueue.INSTANCE.register(client); + return client; + }); + + @Override + public Jedis get() { + return lazy.get(); + } + } + + enum JedisClusterSupplier implements Supplier { + + INSTANCE; + + final Lazy lazy = Lazy.of(() -> { + JedisCluster client = new JedisCluster(new HostAndPort(SettingsUtils.getHost(), SettingsUtils.getClusterPort())); + + ShutdownQueue.INSTANCE.register(client); + return client; + }); + + @Override + public JedisCluster get() { + return lazy.get(); + } + } + +} diff --git a/src/test/java/org/springframework/data/redis/test/extension/LettuceExtension.java b/src/test/java/org/springframework/data/redis/test/extension/LettuceExtension.java new file mode 100644 index 000000000..3c4b6c951 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/LettuceExtension.java @@ -0,0 +1,316 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import io.lettuce.core.RedisClient; +import io.lettuce.core.RedisURI; +import io.lettuce.core.api.StatefulConnection; +import io.lettuce.core.api.StatefulRedisConnection; +import io.lettuce.core.api.sync.RedisCommands; +import io.lettuce.core.cluster.ClusterClientOptions; +import io.lettuce.core.cluster.RedisClusterClient; +import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; +import io.lettuce.core.protocol.ProtocolVersion; +import io.lettuce.core.pubsub.StatefulRedisPubSubConnection; +import io.lettuce.core.resource.ClientResources; + +import java.lang.reflect.Parameter; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; + +import org.springframework.core.ResolvableType; +import org.springframework.data.redis.SettingsUtils; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.util.Lazy; + +/** + * JUnit 5 {@link Extension} using Lettuce providing parameter resolution for connection resources and that reacts to + * callbacks. The following resource types are supported by this extension: + *
    + *
  • {@link ClientResources} (singleton)
  • + *
  • {@link RedisClient} (singleton)
  • + *
  • {@link RedisClusterClient} (singleton)
  • + *
  • {@link StatefulRedisConnection}
  • + *
  • {@link StatefulRedisPubSubConnection}
  • + *
  • {@link StatefulRedisClusterConnection}
  • + *
+ * + *
+ * @ExtendWith(LettuceExtension.class)
+ * public class CustomCommandTest {
+ *
+ * 	private final RedisCommands<String, String> redis;
+ *
+ * 	public CustomCommandTest(StatefulRedisConnection<String, String> connection) {
+ * 		this.redis = connection.sync();
+ * 	}
+ *
+ * }
+ * 
+ * + *

Resource lifecycle

This extension allocates resources lazily and stores them in its {@link ExtensionContext} + * {@link ExtensionContext.Store} for reuse across multiple tests. Client and {@link ClientResources} are allocated + * through{@link DefaultRedisClient} respective {@link TestClientResources} so shutdown is managed by the actual + * suppliers. Singleton connection resources are closed after the test class (test container) is finished. + * + * @author Mark Paluch + * @see ParameterResolver + * @see BeforeEachCallback + * @see AfterEachCallback + * @see AfterAllCallback + */ +public class LettuceExtension implements ParameterResolver, AfterAllCallback, AfterEachCallback { + + private static final ExtensionContext.Namespace NAMESPACE = ExtensionContext.Namespace.create(LettuceExtension.class); + + private static final ClusterClientOptions DEFAULT_OPTIONS = ClusterClientOptions.builder() + .protocolVersion(ProtocolVersion.RESP2).pingBeforeActivateConnection(false).build(); + + private static final Set> SUPPORTED_INJECTABLE_TYPES = new HashSet<>( + Arrays.asList(StatefulRedisConnection.class, StatefulRedisPubSubConnection.class, RedisCommands.class, + RedisClient.class, ClientResources.class, StatefulRedisClusterConnection.class, RedisClusterClient.class)); + + private static final Set> CLOSE_AFTER_EACH = new HashSet<>(Arrays.asList(StatefulRedisConnection.class, + StatefulRedisPubSubConnection.class, StatefulRedisClusterConnection.class)); + + private static final List> SUPPLIERS = Arrays.asList(ClientResourcesSupplier.INSTANCE, + RedisClusterClientSupplier.INSTANCE, RedisClientSupplier.INSTANCE, StatefulRedisConnectionSupplier.INSTANCE, + StatefulRedisPubSubConnectionSupplier.INSTANCE, StatefulRedisClusterConnectionSupplier.INSTANCE); + + private static final List> RESOURCE_FUNCTIONS = Collections + .singletonList(RedisCommandsFunction.INSTANCE); + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + return SUPPORTED_INJECTABLE_TYPES.contains(parameterContext.getParameter().getType()); + } + + /** + * Attempt to resolve the {@code requestedResourceType}. + * + * @param extensionContext + * @param requestedResourceType + * @param + * @return + */ + public T resolve(ExtensionContext extensionContext, Class requestedResourceType) { + + ExtensionContext.Store store = getStore(extensionContext); + + return (T) store.getOrComputeIfAbsent(requestedResourceType, it -> findSupplier(requestedResourceType).get()); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) + throws ParameterResolutionException { + + ExtensionContext.Store store = getStore(extensionContext); + Parameter parameter = parameterContext.getParameter(); + Type parameterizedType = parameter.getParameterizedType(); + + return store.getOrComputeIfAbsent(parameter.getType(), it -> doGetInstance(parameterizedType)); + } + + @Override + public void afterAll(ExtensionContext context) { + + ExtensionContext.Store store = getStore(context); + + CLOSE_AFTER_EACH.forEach(it -> { + + StatefulConnection connection = store.get(it, StatefulConnection.class); + + if (connection != null) { + connection.close(); + store.remove(StatefulRedisConnection.class); + } + }); + } + + @Override + public void afterEach(ExtensionContext context) { + + ExtensionContext.Store store = getStore(context); + + RedisClient redisClient = store.get(RedisClient.class, RedisClient.class); + if (redisClient != null) { + redisClient.setOptions(DEFAULT_OPTIONS); + } + } + + @SuppressWarnings("unchecked") + private static Supplier findSupplier(Type type) { + + ResolvableType requested = ResolvableType.forType(type); + + Supplier supplier = SUPPLIERS.stream().filter(it -> { + + ResolvableType providedType = ResolvableType.forType(it.getClass()).as(Supplier.class).getGeneric(0); + + if (requested.isAssignableFrom(providedType)) { + return true; + } + return false; + }).findFirst().orElseThrow(() -> new NoSuchElementException("Cannot find a factory for " + type)); + + return (Supplier) supplier; + } + + private Object doGetInstance(Type parameterizedType) { + + Optional resourceFunction = findFunction(parameterizedType); + return resourceFunction.map(it -> it.function.apply(findSupplier(it.dependsOn.getType()).get())) + .orElseGet(() -> findSupplier(parameterizedType).get()); + } + + private ExtensionContext.Store getStore(ExtensionContext extensionContext) { + return extensionContext.getStore(NAMESPACE); + } + + private static Optional findFunction(Type type) { + + ResolvableType requested = ResolvableType.forType(type); + + return RESOURCE_FUNCTIONS.stream().map(it -> { + + ResolvableType dependsOn = ResolvableType.forType(it.getClass()).as(Function.class).getGeneric(0); + ResolvableType providedType = ResolvableType.forType(it.getClass()).as(Function.class).getGeneric(1); + + return new ResourceFunction(dependsOn, providedType, it); + }).filter(it -> requested.isAssignableFrom(it.provides)).findFirst(); + } + + static class ResourceFunction { + + final ResolvableType dependsOn; + final ResolvableType provides; + final Function function; + + public ResourceFunction(ResolvableType dependsOn, ResolvableType provides, Function function) { + this.dependsOn = dependsOn; + this.provides = provides; + this.function = (Function) function; + } + } + + enum ClientResourcesSupplier implements Supplier { + + INSTANCE; + + @Override + public ClientResources get() { + return LettuceTestClientResources.getSharedClientResources(); + } + } + + enum RedisClientSupplier implements Supplier { + + INSTANCE; + + final Lazy lazy = Lazy.of(() -> { + RedisClient client = RedisClient.create(ClientResourcesSupplier.INSTANCE.get(), + RedisURI.create(SettingsUtils.getHost(), SettingsUtils.getPort())); + client.setOptions(DEFAULT_OPTIONS); + + ShutdownQueue.register(() -> client.shutdown(0, 0, TimeUnit.MILLISECONDS)); + return client; + }); + + @Override + public RedisClient get() { + return lazy.get(); + } + } + + enum RedisClusterClientSupplier implements Supplier { + + INSTANCE; + + final Lazy lazy = Lazy.of(() -> { + RedisClusterClient client = RedisClusterClient.create(ClientResourcesSupplier.INSTANCE.get(), + RedisURI.create(SettingsUtils.getHost(), SettingsUtils.getClusterPort())); + client.setOptions(DEFAULT_OPTIONS); + + ShutdownQueue.register(() -> client.shutdown(0, 0, TimeUnit.MILLISECONDS)); + return client; + }); + + @Override + public RedisClusterClient get() { + return lazy.get(); + } + } + + enum StatefulRedisConnectionSupplier implements Supplier> { + + INSTANCE; + + @Override + public StatefulRedisConnection get() { + return RedisClientSupplier.INSTANCE.get().connect(); + } + } + + enum StatefulRedisPubSubConnectionSupplier implements Supplier> { + + INSTANCE; + + @Override + public StatefulRedisPubSubConnection get() { + return RedisClientSupplier.INSTANCE.get().connectPubSub(); + } + } + + enum StatefulRedisClusterConnectionSupplier implements Supplier> { + + INSTANCE; + + @Override + public StatefulRedisClusterConnection get() { + return RedisClusterClientSupplier.INSTANCE.get().connect(); + } + } + + enum RedisCommandsFunction + implements Function, RedisCommands> { + INSTANCE; + + @Override + public RedisCommands apply(StatefulRedisConnection connection) { + return connection.sync(); + } + } + +} diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientResources.java b/src/test/java/org/springframework/data/redis/test/extension/LettuceTestClientResources.java similarity index 60% rename from src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientResources.java rename to src/test/java/org/springframework/data/redis/test/extension/LettuceTestClientResources.java index 0adecfe2e..332d2407a 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceTestClientResources.java +++ b/src/test/java/org/springframework/data/redis/test/extension/LettuceTestClientResources.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 the original author or authors. + * Copyright 2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.redis.connection.lettuce; +package org.springframework.data.redis.test.extension; import io.lettuce.core.resource.ClientResources; import io.lettuce.core.resource.DefaultClientResources; @@ -21,8 +21,7 @@ import io.lettuce.core.resource.DefaultClientResources; import java.util.concurrent.TimeUnit; /** - * Client-Resources suitable for testing. Uses {@link TestEventLoopGroupProvider} to preserve the event loop groups - * between tests. Every time a new {@link LettuceTestClientResources} instance is created, a + * Client-Resources suitable for testing. Every time a new {@link LettuceTestClientResources} instance is created, a * {@link Runtime#addShutdownHook(Thread) shutdown hook} is added to close the client resources. * * @author Mark Paluch @@ -34,27 +33,13 @@ public class LettuceTestClientResources { static { - SHARED_CLIENT_RESOURCES = DefaultClientResources.builder().eventLoopGroupProvider(new TestEventLoopGroupProvider()) + SHARED_CLIENT_RESOURCES = DefaultClientResources.builder() .build(); - appendShutdownHook(); + ShutdownQueue.INSTANCE.register(() -> SHARED_CLIENT_RESOURCES.shutdown(0, 0, TimeUnit.MILLISECONDS)); } private LettuceTestClientResources() {} - private static void appendShutdownHook() { - - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - try { - SHARED_CLIENT_RESOURCES.shutdown(0, 0, TimeUnit.MILLISECONDS).get(1, TimeUnit.SECONDS); - } catch (Exception o_O) { - // ignore - } - } - }); - } - /** * @return the client resources. */ diff --git a/src/test/java/org/springframework/data/redis/test/extension/RedisCluster.java b/src/test/java/org/springframework/data/redis/test/extension/RedisCluster.java new file mode 100644 index 000000000..bd2b559bf --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/RedisCluster.java @@ -0,0 +1,38 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@code @RedisCluster} is used to qualify a connection resource to point to Redis Cluster. + * + * @author Mark Paluch + * @see SettingsUtils#getClusterPort() + */ +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface RedisCluster { +} diff --git a/src/test/java/org/springframework/data/redis/test/extension/RedisSentinel.java b/src/test/java/org/springframework/data/redis/test/extension/RedisSentinel.java new file mode 100644 index 000000000..694cd755c --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/RedisSentinel.java @@ -0,0 +1,38 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@code @RedisSentinel} is used to qualify a connection resource to point to Redis Sentinel. + * + * @author Mark Paluch + * @see SettingsUtils#getSentinelPort() + */ +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface RedisSentinel { +} diff --git a/src/test/java/org/springframework/data/redis/test/extension/RedisStanalone.java b/src/test/java/org/springframework/data/redis/test/extension/RedisStanalone.java new file mode 100644 index 000000000..0ba7bc9ae --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/RedisStanalone.java @@ -0,0 +1,38 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.data.redis.SettingsUtils; + +/** + * {@code @RedisStanalone} is used to qualify a connection resource to point to Redis Standalone. + * + * @author Mark Paluch + * @see SettingsUtils#getPort() + */ +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface RedisStanalone { +} diff --git a/src/test/java/org/springframework/data/redis/test/extension/ShutdownQueue.java b/src/test/java/org/springframework/data/redis/test/extension/ShutdownQueue.java new file mode 100644 index 000000000..092e2b3f3 --- /dev/null +++ b/src/test/java/org/springframework/data/redis/test/extension/ShutdownQueue.java @@ -0,0 +1,66 @@ +/* + * Copyright 2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.redis.test.extension; + +import java.io.Closeable; +import java.util.LinkedList; + +import org.springframework.beans.factory.DisposableBean; + +/** + * Shutdown queue allowing ordered resource shutdown (LIFO). + * + * @author Mark Paluch + */ +public enum ShutdownQueue { + + INSTANCE; + + static { + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + + Closeable closeable; + while ((closeable = INSTANCE.closeables.pollLast()) != null) { + try { + closeable.close(); + } catch (Exception o_O) { + // ignore + o_O.printStackTrace(); + } + } + + } + }); + } + + private final LinkedList closeables = new LinkedList<>(); + + public static void register(Closeable closeable) { + INSTANCE.closeables.add(closeable); + } + + public static Closeable toCloseable(DisposableBean closeable) { + return () -> { + try { + closeable.destroy(); + } catch (Exception e) { + e.printStackTrace(); + } + }; + } +} diff --git a/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClientProvider.java b/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClientProvider.java index eb4ec8bab..666b1ec22 100644 --- a/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClientProvider.java +++ b/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClientProvider.java @@ -23,7 +23,7 @@ import io.lettuce.core.protocol.ProtocolVersion; import org.junit.rules.ExternalResource; import org.springframework.data.redis.SettingsUtils; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; /** * @author Christoph Strobl diff --git a/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClusterClientProvider.java b/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClusterClientProvider.java index 7f5eabbd0..b8f42b4f4 100644 --- a/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClusterClientProvider.java +++ b/src/test/java/org/springframework/data/redis/test/util/LettuceRedisClusterClientProvider.java @@ -23,7 +23,7 @@ import io.lettuce.core.protocol.ProtocolVersion; import org.junit.rules.ExternalResource; -import org.springframework.data.redis.connection.lettuce.LettuceTestClientResources; +import org.springframework.data.redis.test.extension.LettuceTestClientResources; /** * @author Christoph Strobl diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveGeoOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveGeoOperationsExtensionsUnitTests.kt index 8df4664d8..269c268bd 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveGeoOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveGeoOperationsExtensionsUnitTests.kt @@ -18,20 +18,15 @@ package org.springframework.data.redis.core import io.mockk.every import io.mockk.mockk import io.mockk.verify -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import org.reactivestreams.Publisher -import org.springframework.data.geo.Circle -import org.springframework.data.geo.Distance -import org.springframework.data.geo.GeoResult -import org.springframework.data.geo.Metrics -import org.springframework.data.geo.Point -import org.springframework.data.redis.connection.RedisGeoCommands -import org.springframework.data.redis.connection.RedisGeoCommands.* +import org.springframework.data.geo.* +import org.springframework.data.redis.connection.RedisGeoCommands.GeoLocation +import org.springframework.data.redis.connection.RedisGeoCommands.GeoRadiusCommandArgs import reactor.core.publisher.Flux import reactor.core.publisher.Mono diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveHashOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveHashOperationsExtensionsUnitTests.kt index f833ee2e1..7862e8a03 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveHashOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveHashOperationsExtensionsUnitTests.kt @@ -21,7 +21,7 @@ import io.mockk.verify import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import reactor.core.publisher.Flux import reactor.core.publisher.Mono diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveHyperLogLogOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveHyperLogLogOperationsExtensionsUnitTests.kt index 0019f1214..7ca6157a5 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveHyperLogLogOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveHyperLogLogOperationsExtensionsUnitTests.kt @@ -20,7 +20,7 @@ import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import reactor.core.publisher.Mono /** diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveListOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveListOperationsExtensionsUnitTests.kt index f7414616b..8f47c8809 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveListOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveListOperationsExtensionsUnitTests.kt @@ -21,7 +21,7 @@ import io.mockk.verify import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import reactor.core.publisher.Flux import reactor.core.publisher.Mono import java.time.Duration diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveRedisOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveRedisOperationsExtensionsUnitTests.kt index 6df9514ff..7d91943dd 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveRedisOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveRedisOperationsExtensionsUnitTests.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import org.springframework.data.redis.connection.DataType import org.springframework.data.redis.connection.ReactiveSubscription import org.springframework.data.redis.core.script.RedisScript diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveSetOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveSetOperationsExtensionsUnitTests.kt index 7ccb9fc4a..4cb9758cb 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveSetOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveSetOperationsExtensionsUnitTests.kt @@ -21,7 +21,7 @@ import io.mockk.verify import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import reactor.core.publisher.Flux import reactor.core.publisher.Mono diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveStreamOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveStreamOperationsExtensionsUnitTests.kt index a8bf2bb8d..76accf5ea 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveStreamOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveStreamOperationsExtensionsUnitTests.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import org.reactivestreams.Publisher import org.springframework.data.domain.Range import org.springframework.data.redis.connection.RedisZSetCommands.Limit diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveValueOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveValueOperationsExtensionsUnitTests.kt index c91ff51b5..11783959b 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveValueOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveValueOperationsExtensionsUnitTests.kt @@ -20,7 +20,7 @@ import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import org.springframework.data.redis.connection.BitFieldSubCommands import reactor.core.publisher.Mono import java.time.Duration diff --git a/src/test/kotlin/org/springframework/data/redis/core/ReactiveZSetOperationsExtensionsUnitTests.kt b/src/test/kotlin/org/springframework/data/redis/core/ReactiveZSetOperationsExtensionsUnitTests.kt index 80eacf676..5ebbb97e3 100644 --- a/src/test/kotlin/org/springframework/data/redis/core/ReactiveZSetOperationsExtensionsUnitTests.kt +++ b/src/test/kotlin/org/springframework/data/redis/core/ReactiveZSetOperationsExtensionsUnitTests.kt @@ -21,7 +21,7 @@ import io.mockk.verify import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat -import org.junit.Test +import org.junit.jupiter.api.Test import org.springframework.data.domain.Range import org.springframework.data.redis.connection.RedisZSetCommands import org.springframework.data.redis.connection.RedisZSetCommands.Aggregate diff --git a/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests-context.xml b/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests-context.xml index d21424f03..af0bdffed 100644 --- a/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests-context.xml +++ b/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests-context.xml @@ -13,9 +13,9 @@ - + - \ No newline at end of file + diff --git a/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineFlushOnEndIntegrationTests-context.xml b/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineFlushOnEndIntegrationTests-context.xml index 27fd45a38..093961dba 100644 --- a/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineFlushOnEndIntegrationTests-context.xml +++ b/src/test/resources/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineFlushOnEndIntegrationTests-context.xml @@ -19,7 +19,7 @@ - diff --git a/src/test/resources/org/springframework/data/redis/test.properties b/src/test/resources/org/springframework/data/redis/test.properties index 6d3f61a5f..557f4769a 100644 --- a/src/test/resources/org/springframework/data/redis/test.properties +++ b/src/test/resources/org/springframework/data/redis/test.properties @@ -1,4 +1,6 @@ # redis connection properties host=127.0.0.1 port=6379 +clusterPort=7379 +sentinelPort=26379 socket=work/redis-6379.sock