From d874aeb84f583d5fceec360c88949a9e3697c1b3 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 27 Mar 2019 09:43:57 +0100 Subject: [PATCH] DATAREDIS-950 - Fix ClassCastException on shared Lettuce Cluster connection validation. Original Pull Request: #445 --- .../lettuce/LettuceConnectionFactory.java | 2 +- .../LettuceConnectionFactoryUnitTests.java | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index 8bb6d41ce..a56d58f81 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -1129,7 +1129,7 @@ public class LettuceConnectionFactory } if (connection instanceof StatefulRedisClusterConnection) { - ((StatefulRedisConnection) connection).sync().ping(); + ((StatefulRedisClusterConnection) connection).sync().ping(); } valid = true; } catch (Exception e) { 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 2a9e752a5..8bb9bfe4d 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 @@ -26,11 +26,10 @@ import io.lettuce.core.AbstractRedisClient; import io.lettuce.core.ClientOptions; 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.cluster.ClusterClientOptions; import io.lettuce.core.cluster.RedisClusterClient; import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; +import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; import io.lettuce.core.codec.ByteArrayCodec; import io.lettuce.core.codec.RedisCodec; import io.lettuce.core.resource.ClientResources; @@ -640,8 +639,7 @@ public class LettuceConnectionFactoryUnitTests { RedisClusterClient clientMock = mock(RedisClusterClient.class); StatefulRedisClusterConnection connectionMock = mock(StatefulRedisClusterConnection.class); - when(clientMock.connect(ByteArrayCodec.INSTANCE)) - .thenReturn(connectionMock); + when(clientMock.connect(ByteArrayCodec.INSTANCE)).thenReturn(connectionMock); LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig, LettuceClientConfiguration.defaultConfiguration()) { @@ -662,6 +660,33 @@ public class LettuceConnectionFactoryUnitTests { verify(clientMock).connect(ArgumentMatchers.any(RedisCodec.class)); } + @Test // DATAREDIS-950 + public void shouldValidateSharedClusterConnection() { + + RedisClusterClient clientMock = mock(RedisClusterClient.class); + StatefulRedisClusterConnection connectionMock = mock(StatefulRedisClusterConnection.class); + RedisAdvancedClusterCommands syncMock = mock(RedisAdvancedClusterCommands.class); + when(clientMock.connect(ByteArrayCodec.INSTANCE)).thenReturn(connectionMock); + when(connectionMock.isOpen()).thenReturn(true); + when(connectionMock.sync()).thenReturn(syncMock); + + LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig, + LettuceClientConfiguration.defaultConfiguration()) { + + @Override + protected AbstractRedisClient createClient() { + return clientMock; + } + }; + + connectionFactory.setValidateConnection(true); + connectionFactory.afterPropertiesSet(); + + connectionFactory.getConnection().close(); + + verify(syncMock).ping(); + } + @Test // DATAREDIS-842 public void databaseShouldBeSetCorrectlyOnSentinelClient() {