From 566d39317a6ab623d566c67dc28f690f6102c7c2 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Thu, 20 Nov 2025 19:51:27 +0100 Subject: [PATCH 01/12] Add helpers to Jedis pool --- src/main/java/redis/clients/jedis/JedisPool.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index 3cc9aad107..3339769bce 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -1,6 +1,8 @@ package redis.clients.jedis; import java.net.URI; +import java.util.function.Consumer; +import java.util.function.Function; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocketFactory; @@ -392,4 +394,17 @@ public void returnResource(final Jedis resource) { } } } + + public void withJedisPoolDo(Consumer consumer) { + try (Jedis jedis = this.getResource()) { + consumer.accept(jedis); + } + } + + public K withJedisPoolGet(Function function) { + try (Jedis jedis = this.getResource()) { + return function.apply(jedis); + } + } + } From 308ece4035a72d972054d139d21bfd999686ea2d Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Fri, 21 Nov 2025 10:19:14 +0100 Subject: [PATCH 02/12] Test for helpers to Jedis pool --- .../redis/clients/jedis/JedisPoolTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index 29209eee59..a0d9942436 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -462,4 +462,30 @@ public void testResetValidCredentials() { } } } + + @Test + public void testWithJedisPoolDoWithConnection() { + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); + pool.withJedisPoolDo(jedis -> { + jedis.auth(endpointStandalone0.getPassword()); + jedis.set("foo", "bar"); + assertEquals("bar", jedis.get("foo")); + }); + pool.close(); + assertTrue(pool.isClosed()); + } + + @Test + public void testWithJedisPoolGetWithConnection() { + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); + String result = pool.withJedisPoolGet(jedis -> { + jedis.auth(endpointStandalone0.getPassword()); + jedis.set("foo", "bar"); + return jedis.get("foo"); + }); + assertEquals("bar", result); + pool.close(); + assertTrue(pool.isClosed()); + } + } From 179bd5312fa64bcd49dfb0347e064cdfcf0fa91b Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Fri, 21 Nov 2025 17:00:38 +0100 Subject: [PATCH 03/12] amedn method and test --- src/main/java/redis/clients/jedis/JedisPool.java | 4 ++-- src/test/java/redis/clients/jedis/JedisPoolTest.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index 3339769bce..411247da69 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -395,13 +395,13 @@ public void returnResource(final Jedis resource) { } } - public void withJedisPoolDo(Consumer consumer) { + public void withResource(Consumer consumer) { try (Jedis jedis = this.getResource()) { consumer.accept(jedis); } } - public K withJedisPoolGet(Function function) { + public K withResourceGet(Function function) { try (Jedis jedis = this.getResource()) { return function.apply(jedis); } diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index a0d9942436..8c650e1b3e 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -20,6 +20,7 @@ import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -466,11 +467,12 @@ public void testResetValidCredentials() { @Test public void testWithJedisPoolDoWithConnection() { JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); - pool.withJedisPoolDo(jedis -> { + pool.withResource(jedis -> { jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "bar"); assertEquals("bar", jedis.get("foo")); }); + pool.withResource( jedis -> assertNotNull(jedis.ping())); pool.close(); assertTrue(pool.isClosed()); } @@ -478,12 +480,14 @@ public void testWithJedisPoolDoWithConnection() { @Test public void testWithJedisPoolGetWithConnection() { JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); - String result = pool.withJedisPoolGet(jedis -> { + String result = pool.withResourceGet(jedis -> { jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "bar"); return jedis.get("foo"); }); + String ping = pool.withResourceGet(Jedis::ping); assertEquals("bar", result); + assertNotNull(ping); pool.close(); assertTrue(pool.isClosed()); } From 72edf15fe55226225ebd38ef543656e2b2329bb9 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Fri, 21 Nov 2025 22:06:59 +0100 Subject: [PATCH 04/12] make a bridge between JedisPool and JedisPooled --- src/main/java/redis/clients/jedis/Jedis.java | 14 ++++++++ .../java/redis/clients/jedis/JedisPool.java | 15 +-------- .../java/redis/clients/jedis/JedisPooled.java | 11 ++++++- .../clients/jedis/JedisWithResource.java | 22 +++++++++++++ .../redis/clients/jedis/JedisPooledTest.java | 33 +++++++++++++++++++ 5 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 src/main/java/redis/clients/jedis/JedisWithResource.java diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index f6cf43f167..4429f8bcea 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -47,6 +47,7 @@ public class Jedis implements ServerCommands, DatabaseCommands, JedisCommands, J protected static final byte[][] DUMMY_ARRAY = new byte[0][]; private Pool dataSource = null; + private Pool connectionSource = null; public Jedis() { connection = new Connection(); @@ -300,6 +301,11 @@ protected void setDataSource(Pool jedisPool) { this.dataSource = jedisPool; } + protected void setConnectionSource(Pool connectionPool) { + this.connectionSource = connectionPool; + } + + @Override public void close() { if (dataSource != null) { @@ -310,6 +316,14 @@ public void close() { } else { pool.returnResource(this); } + } else if (connectionSource != null) { + Pool pool = connectionSource; + this.connectionSource = null; + if (isBroken()) { + pool.returnBrokenResource(connection); + } else { + pool.returnResource(connection); + } } else { connection.close(); } diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index 411247da69..cb05ebbdfd 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -1,8 +1,6 @@ package redis.clients.jedis; import java.net.URI; -import java.util.function.Consumer; -import java.util.function.Function; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocketFactory; @@ -16,7 +14,7 @@ import redis.clients.jedis.util.Pool; // Legacy -public class JedisPool extends Pool { +public class JedisPool extends Pool implements JedisWithResource { private static final Logger log = LoggerFactory.getLogger(JedisPool.class); @@ -395,16 +393,5 @@ public void returnResource(final Jedis resource) { } } - public void withResource(Consumer consumer) { - try (Jedis jedis = this.getResource()) { - consumer.accept(jedis); - } - } - - public K withResourceGet(Function function) { - try (Jedis jedis = this.getResource()) { - return function.apply(jedis); - } - } } diff --git a/src/main/java/redis/clients/jedis/JedisPooled.java b/src/main/java/redis/clients/jedis/JedisPooled.java index ece0341977..31f96f037e 100644 --- a/src/main/java/redis/clients/jedis/JedisPooled.java +++ b/src/main/java/redis/clients/jedis/JedisPooled.java @@ -18,7 +18,7 @@ import redis.clients.jedis.util.JedisURIHelper; import redis.clients.jedis.util.Pool; -public class JedisPooled extends UnifiedJedis { +public class JedisPooled extends UnifiedJedis implements JedisWithResource { public JedisPooled() { this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT); @@ -463,4 +463,13 @@ public final Pool getPool() { public Pipeline pipelined() { return (Pipeline) super.pipelined(); } + + public Jedis getResource() { + Pool pool = getPool(); + Connection conn = pool.getResource(); + Jedis jedis = new Jedis(conn); + jedis.setConnectionSource(pool); + return jedis; + } + } diff --git a/src/main/java/redis/clients/jedis/JedisWithResource.java b/src/main/java/redis/clients/jedis/JedisWithResource.java new file mode 100644 index 0000000000..74ae104235 --- /dev/null +++ b/src/main/java/redis/clients/jedis/JedisWithResource.java @@ -0,0 +1,22 @@ +package redis.clients.jedis; + +import java.util.function.Consumer; +import java.util.function.Function; + + +public interface JedisWithResource { + + Jedis getResource(); + + default void withResource(Consumer consumer) { + try (Jedis jedis = this.getResource()) { + consumer.accept(jedis); + } + } + + default K withResourceGet(Function function) { + try (Jedis jedis = this.getResource()) { + return function.apply(jedis); + } + } +} diff --git a/src/test/java/redis/clients/jedis/JedisPooledTest.java b/src/test/java/redis/clients/jedis/JedisPooledTest.java index a7dead0b01..975cf65ce4 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledTest.java @@ -6,6 +6,7 @@ import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -222,6 +223,38 @@ public void testResetValidCredentials() { } } + @Test + public void testWithJedisPoolDoWithConnection() { + try(JedisPooled pool = JedisPooled.builder() + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { + pool.withResource(jedis -> { + jedis.auth(endpointStandalone1.getPassword()); + jedis.set("foo", "bar"); + assertEquals("bar", jedis.get("foo")); + }); + pool.withResource(jedis -> assertNotNull(jedis.ping())); + } + } + + @Test + public void testWithJedisPoolGetWithConnection() { + try (JedisPooled pool = JedisPooled.builder() + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { + String result = pool.withResourceGet(jedis -> { + jedis.auth(endpointStandalone1.getPassword()); + jedis.set("foo", "bar"); + return jedis.get("foo"); + }); + String ping = pool.withResourceGet(Jedis::ping); + assertEquals("bar", result); + assertNotNull(ping); + } + } + @Test public void testCredentialsProvider() { final AtomicInteger prepareCount = new AtomicInteger(); From 9a0b4b8ad6d337210984ba7bed3e61f15e72580d Mon Sep 17 00:00:00 2001 From: ggivo Date: Sun, 23 Nov 2025 11:26:39 +0200 Subject: [PATCH 05/12] Clean up + unit test - Add unit test to verify connection is returned to the pool --- pom.xml | 1 + .../redis/clients/jedis/JedisPoolTest.java | 89 ++++++++++++++----- .../clients/jedis/JedisPoolUnitTest.java | 60 +++++++++++++ 3 files changed, 127 insertions(+), 23 deletions(-) create mode 100644 src/test/java/redis/clients/jedis/JedisPoolUnitTest.java diff --git a/pom.xml b/pom.xml index af2bf25232..0af0a32787 100644 --- a/pom.xml +++ b/pom.xml @@ -546,6 +546,7 @@ **/*CommandFlags*.java **/*CompareCondition*.java **/*MSetExParams*.java + **/*UnitTest.java diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index 8c650e1b3e..77be4005e9 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -9,8 +9,10 @@ import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; import redis.clients.jedis.exceptions.InvalidURIException; import redis.clients.jedis.exceptions.JedisAccessControlException; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -18,9 +20,10 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.awaitility.Awaitility.await; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -34,6 +37,15 @@ public class JedisPoolTest { private static final EndpointConfig endpointStandalone1 = HostAndPorts.getRedisEndpoint("standalone1"); + private String testKey; + private String testValue; + + @BeforeEach + public void setUpTestKey(TestInfo testInfo) { + testKey = testInfo.getDisplayName() + "-key"; + testValue = testInfo.getDisplayName() + "-value"; + } + @Test public void checkConnections() { JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); @@ -465,31 +477,62 @@ public void testResetValidCredentials() { } @Test - public void testWithJedisPoolDoWithConnection() { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); - pool.withResource(jedis -> { - jedis.auth(endpointStandalone0.getPassword()); - jedis.set("foo", "bar"); - assertEquals("bar", jedis.get("foo")); - }); - pool.withResource( jedis -> assertNotNull(jedis.ping())); - pool.close(); - assertTrue(pool.isClosed()); + public void testWithResource() { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(), + endpointStandalone0.getClientConfigBuilder().build())) { + + pool.withResource(jedis -> { + jedis.set(testKey, testValue); + }); + + pool.withResource(jedis -> { + assertEquals(testValue, jedis.get(testKey)); + }); + } } @Test - public void testWithJedisPoolGetWithConnection() { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); - String result = pool.withResourceGet(jedis -> { - jedis.auth(endpointStandalone0.getPassword()); - jedis.set("foo", "bar"); - return jedis.get("foo"); - }); - String ping = pool.withResourceGet(Jedis::ping); - assertEquals("bar", result); - assertNotNull(ping); - pool.close(); - assertTrue(pool.isClosed()); + public void testWithResourceReturnsConnectionToPool() { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(), + endpointStandalone0.getClientConfigBuilder().build())) { + + pool.withResource(jedis -> { + assertThat(pool.getNumActive(), equalTo(1)); + jedis.set("foo", "bar"); + }); + + assertThat(pool.getNumActive(), equalTo(0)); + } + } + + @Test + public void testWithResourceGet() { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(), + endpointStandalone0.getClientConfigBuilder().build())) { + + String result = pool.withResourceGet(jedis -> { + jedis.set(testKey, testValue); + return jedis.get(testKey); + }); + + assertEquals(testValue, result); + } + } + + @Test + public void testWithResourceGetReturnsConnectionToPool() { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHostAndPort(), + endpointStandalone0.getClientConfigBuilder().build())) { + + String result = pool.withResourceGet(jedis -> { + assertThat(pool.getNumActive(), equalTo(1)); + jedis.set("foo", "bar"); + return jedis.get("foo"); + }); + + assertThat(result, equalTo("bar")); + assertThat(pool.getNumActive(), equalTo(0)); + } } } diff --git a/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java b/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java new file mode 100644 index 0000000000..47f6ed3ee7 --- /dev/null +++ b/src/test/java/redis/clients/jedis/JedisPoolUnitTest.java @@ -0,0 +1,60 @@ +package redis.clients.jedis; + +import org.apache.commons.pool2.PooledObjectFactory; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +public class JedisPoolUnitTest { + + private JedisPool pool; + private Jedis mockJedis; + + @BeforeEach + public void setUp() throws Exception { + mockJedis = mock(Jedis.class); + PooledObjectFactory mockFactory = mock(PooledObjectFactory.class); + + when(mockFactory.makeObject()).thenReturn(new DefaultPooledObject<>(mockJedis)); + + GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); + config.setMaxTotal(1); + pool = spy(new JedisPool(config, mockFactory)); + + } + + @AfterEach + public void tearDown() { + if (pool != null && !pool.isClosed()) { + pool.close(); + } + } + + @Test + public void testWithResourceClosesConnection() { + pool.withResource(jedis -> assertEquals(mockJedis, jedis)); + + verify(mockJedis, times(1)).close(); + } + + @Test + public void testWithResourceGetClosesConnection() { + String result = pool.withResourceGet(jedis -> "test-result"); + + verify(mockJedis, times(1)).close(); + } + + @Test + public void testWithResourceGetReturnsResult() { + when(mockJedis.get(eq("test-key"))).thenReturn("test-result"); + String result = pool.withResourceGet(jedis -> jedis.get("test-key")); + + verify(mockJedis, times(1)).close(); + } + +} From d5a1726a79ab940640cd7a33bfb78c42451c46a8 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Mon, 24 Nov 2025 10:05:04 +0100 Subject: [PATCH 06/12] make a bridge between JedisPool and JedisPooled more tests and renamed interface --- src/main/java/redis/clients/jedis/Jedis.java | 10 +++++++ .../java/redis/clients/jedis/JedisPool.java | 2 +- .../java/redis/clients/jedis/JedisPooled.java | 2 +- ...source.java => JedisResourceProvider.java} | 2 +- .../redis/clients/jedis/JedisPoolTest.java | 27 ++++++++++++++++++- .../redis/clients/jedis/JedisPooledTest.java | 21 +++++++++++++++ 6 files changed, 60 insertions(+), 4 deletions(-) rename src/main/java/redis/clients/jedis/{JedisWithResource.java => JedisResourceProvider.java} (91%) diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 4429f8bcea..14afd37ab4 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -298,13 +298,23 @@ public void resetState() { } protected void setDataSource(Pool jedisPool) { + assertNotPooled(); this.dataSource = jedisPool; } protected void setConnectionSource(Pool connectionPool) { + assertNotPooled(); this.connectionSource = connectionPool; } + private void assertNotPooled() { + if (connectionSource != null) { + throw new IllegalStateException("Connection source is already set."); + } + if (dataSource != null) { + throw new IllegalStateException("Data source is already set."); + } + } @Override public void close() { diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index cb05ebbdfd..cc22d55290 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -14,7 +14,7 @@ import redis.clients.jedis.util.Pool; // Legacy -public class JedisPool extends Pool implements JedisWithResource { +public class JedisPool extends Pool implements JedisResourceProvider { private static final Logger log = LoggerFactory.getLogger(JedisPool.class); diff --git a/src/main/java/redis/clients/jedis/JedisPooled.java b/src/main/java/redis/clients/jedis/JedisPooled.java index 31f96f037e..df8d29272c 100644 --- a/src/main/java/redis/clients/jedis/JedisPooled.java +++ b/src/main/java/redis/clients/jedis/JedisPooled.java @@ -18,7 +18,7 @@ import redis.clients.jedis.util.JedisURIHelper; import redis.clients.jedis.util.Pool; -public class JedisPooled extends UnifiedJedis implements JedisWithResource { +public class JedisPooled extends UnifiedJedis implements JedisResourceProvider { public JedisPooled() { this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT); diff --git a/src/main/java/redis/clients/jedis/JedisWithResource.java b/src/main/java/redis/clients/jedis/JedisResourceProvider.java similarity index 91% rename from src/main/java/redis/clients/jedis/JedisWithResource.java rename to src/main/java/redis/clients/jedis/JedisResourceProvider.java index 74ae104235..7db1fe8dc9 100644 --- a/src/main/java/redis/clients/jedis/JedisWithResource.java +++ b/src/main/java/redis/clients/jedis/JedisResourceProvider.java @@ -4,7 +4,7 @@ import java.util.function.Function; -public interface JedisWithResource { +public interface JedisResourceProvider { Jedis getResource(); diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index 8c650e1b3e..744631cfc9 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -292,7 +292,7 @@ public void passivateObject(PooledObject p) throws Exception { } @Test - public void returnResourceShouldResetState() { + public void returnResourceShouldResetState1() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); @@ -316,6 +316,31 @@ public void returnResourceShouldResetState() { assertTrue(pool.isClosed()); } + @Test + public void returnResourceShouldResetState2() { + GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); + config.setMaxTotal(1); + config.setBlockWhenExhausted(false); + JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); + + Jedis jedis = pool.getResource(); + try { + jedis.set("hello", "jedis"); + Transaction t = jedis.multi(); + t.set("hello", "world"); + } finally { + jedis.close(); + } + + pool.withResource(jedis2 -> { + assertSame(jedis, jedis2); + assertEquals("jedis", jedis2.get("hello")); + }); + + pool.close(); + assertTrue(pool.isClosed()); + } + @Test public void getNumActiveWhenPoolIsClosed() { JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, diff --git a/src/test/java/redis/clients/jedis/JedisPooledTest.java b/src/test/java/redis/clients/jedis/JedisPooledTest.java index 975cf65ce4..8b581d3164 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledTest.java @@ -170,6 +170,27 @@ public void getNumActiveReturnsTheCorrectNumber() { } } + @Test + public void getNumActiveReturnsTheCorrectNumberWithJedis() { + try (JedisPooled pool = JedisPooled.builder() + .hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort()) + .clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build()) + .poolConfig(new ConnectionPoolConfig()).build()) { + + Connection jedis = pool.getPool().getResource(); + assertEquals(1, pool.getPool().getNumActive()); + + Jedis jedis2 = pool.getResource(); + assertEquals(2, pool.getPool().getNumActive()); + + jedis.close(); + assertEquals(1, pool.getPool().getNumActive()); + + jedis2.close(); + assertEquals(0, pool.getPool().getNumActive()); + } + } + @Test public void closeResourceTwice() { try (JedisPooled pool = JedisPooled.builder() From 178c331025744242ca4bb44d1e54ad3c658bbe00 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Tue, 25 Nov 2025 10:07:05 +0100 Subject: [PATCH 07/12] make a bridge between JedisPool and JedisPooled more unir tests --- .../redis/clients/jedis/JedisPoolTest.java | 4 +- .../clients/jedis/JedisPooledUnitTest.java | 94 +++++++++++++++++++ .../jedis/JedisResourceProviderTest.java | 85 +++++++++++++++++ 3 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 src/test/java/redis/clients/jedis/JedisPooledUnitTest.java create mode 100644 src/test/java/redis/clients/jedis/JedisResourceProviderTest.java diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index cad9f613b9..85346f04ba 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -304,7 +304,7 @@ public void passivateObject(PooledObject p) throws Exception { } @Test - public void returnResourceShouldResetState1() { + public void returnResourceShouldResetState() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); @@ -329,7 +329,7 @@ public void returnResourceShouldResetState1() { } @Test - public void returnResourceShouldResetState2() { + public void returnResourceShouldResetStateWithGetResource() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); diff --git a/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java new file mode 100644 index 0000000000..62ee8c955d --- /dev/null +++ b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java @@ -0,0 +1,94 @@ +package redis.clients.jedis; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; +import redis.clients.jedis.providers.PooledConnectionProvider; +import redis.clients.jedis.util.Pool; + +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class JedisPooledUnitTest { + + private JedisPooled pooled; + private Pool mockPool; + private PooledConnectionProvider mockProvider; + private Connection mockConnection; + + @BeforeEach + public void setUp() throws Exception { + mockConnection = mock(Connection.class); + mockPool = mock(Pool.class); + mockProvider = mock(PooledConnectionProvider.class); + when(mockProvider.getPool()).thenReturn(mockPool); + when(mockPool.getResource()).thenReturn(mockConnection); + pooled = spy(new JedisPooled(mockProvider)); + } + + @AfterEach + public void tearDown() { + if (pooled != null) { + pooled.close(); + } + } + + @Test + public void testWithResourceClosesConnection() { + pooled.withResource(jedis -> assertEquals(mockConnection, jedis.getConnection())); + + verify(pooled, times(1)).getPool(); + verify(mockPool, times(1)).returnResource(eq(mockConnection)); + } + + @Test + public void testWithResourceGetClosesConnection() { + String result = pooled.withResourceGet(jedis -> "test-result"); + + assertNotNull(result); + verify(pooled, times(1)).getPool(); + verify(mockPool, times(1)).returnResource(eq(mockConnection)); + } + + @Test + public void testWithResourceGetSetData() { + AtomicReference settedValue = new AtomicReference<>(""); + try(MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class,(mock, context)-> + when(mock.set(eq("test-key"), anyString())).thenAnswer( ioc -> { + settedValue.set(ioc.getArgument(1)); + return "OK"; + }) + )) { + pooled.withResource( jedis -> jedis.set("test-key","test-result")); + assertEquals("test-result", settedValue.get()); + verify(pooled, times(1)).getPool(); + Jedis mockJedis = mockConstruction.constructed().get(0); + verify(mockJedis, times(1)).close(); + } + } + + @Test + public void testWithResourceGetReturnsResult() { + try(MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class,(mock, context)-> + when(mock.get(eq("test-key"))).thenReturn("test-result") + )) { + String result = pooled.withResourceGet( jedis -> jedis.get("test-key")); + assertEquals("test-result", result); + verify(pooled, times(1)).getPool(); + Jedis mockJedis = mockConstruction.constructed().get(0); + verify(mockJedis, times(1)).close(); + } + } + +} diff --git a/src/test/java/redis/clients/jedis/JedisResourceProviderTest.java b/src/test/java/redis/clients/jedis/JedisResourceProviderTest.java new file mode 100644 index 0000000000..95e57fdcd6 --- /dev/null +++ b/src/test/java/redis/clients/jedis/JedisResourceProviderTest.java @@ -0,0 +1,85 @@ +package redis.clients.jedis; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class JedisResourceProviderTest { + + private TestJedisResourceProvider provider = spy(new TestJedisResourceProvider()); + + + @Test + public void testWithResourceClosesConnection() { + provider.withResource(Jedis::ping); + + verify(provider, times(1)).getResource(); + assertEquals(1, provider.getBorrowed()); + assertEquals(1, provider.getClosed()); + } + + @Test + public void testWithResourceGetClosesConnection() { + String result = provider.withResourceGet(jedis -> jedis.ping()); + + verify(provider, times(1)).getResource(); + assertEquals(1, provider.getBorrowed()); + assertEquals(1, provider.getClosed()); + assertNotNull(result); + } + + @Test + public void testWithSomeResources() { + provider.withResource(Jedis::ping); + String result = provider.withResourceGet(Jedis::ping); + provider.withResource(Jedis::ping); + Jedis jedis = provider.getResource(); + assertEquals(4, provider.getBorrowed()); + assertEquals(3, provider.getClosed()); + assertNotNull(result); + jedis.close(); + assertEquals(4, provider.getClosed()); + } + + + + static class TestJedisResourceProvider implements JedisResourceProvider { + + private Jedis jedis; + private AtomicInteger borrowed = new AtomicInteger(0); + private AtomicInteger closed = new AtomicInteger(0); + + TestJedisResourceProvider() { + jedis = mock(Jedis.class); + Mockito.doAnswer(ioc -> { + closed.incrementAndGet(); + return null; + }).when(jedis).close(); + when(jedis.ping()).thenAnswer( ioc -> "PONG_" + System.nanoTime()); + } + + @Override + public Jedis getResource() { + borrowed.incrementAndGet(); + return jedis; + } + + public int getBorrowed() { + return borrowed.get(); + } + + public int getClosed() { + return closed.get(); + } + + } +} From cd51eb16f2b65ad8790417c38517f15da85e2525 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Sat, 29 Nov 2025 11:15:13 +0100 Subject: [PATCH 08/12] make a bridge between JedisPool and JedisPooled renamed to JedisProvider make return connection better tests --- .../java/redis/clients/jedis/JedisPool.java | 2 +- .../java/redis/clients/jedis/JedisPooled.java | 8 +++++- ...sourceProvider.java => JedisProvider.java} | 4 ++- .../redis/clients/jedis/JedisPooledTest.java | 17 ++++++++++++ .../clients/jedis/JedisPooledUnitTest.java | 23 ++++++++++++++-- ...oviderTest.java => JedisProviderTest.java} | 26 ++++++++++++++++--- 6 files changed, 71 insertions(+), 9 deletions(-) rename src/main/java/redis/clients/jedis/{JedisResourceProvider.java => JedisProvider.java} (85%) rename src/test/java/redis/clients/jedis/{JedisResourceProviderTest.java => JedisProviderTest.java} (74%) diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index cc22d55290..cd10131c82 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -14,7 +14,7 @@ import redis.clients.jedis.util.Pool; // Legacy -public class JedisPool extends Pool implements JedisResourceProvider { +public class JedisPool extends Pool implements JedisProvider { private static final Logger log = LoggerFactory.getLogger(JedisPool.class); diff --git a/src/main/java/redis/clients/jedis/JedisPooled.java b/src/main/java/redis/clients/jedis/JedisPooled.java index df8d29272c..0594a6b9fa 100644 --- a/src/main/java/redis/clients/jedis/JedisPooled.java +++ b/src/main/java/redis/clients/jedis/JedisPooled.java @@ -18,7 +18,7 @@ import redis.clients.jedis.util.JedisURIHelper; import redis.clients.jedis.util.Pool; -public class JedisPooled extends UnifiedJedis implements JedisResourceProvider { +public class JedisPooled extends UnifiedJedis implements JedisProvider { public JedisPooled() { this(Protocol.DEFAULT_HOST, Protocol.DEFAULT_PORT); @@ -472,4 +472,10 @@ public Jedis getResource() { return jedis; } + public void returnResource(final Jedis resource) { + Pool pool = getPool(); + pool.returnResource(resource.getConnection()); + } + + } diff --git a/src/main/java/redis/clients/jedis/JedisResourceProvider.java b/src/main/java/redis/clients/jedis/JedisProvider.java similarity index 85% rename from src/main/java/redis/clients/jedis/JedisResourceProvider.java rename to src/main/java/redis/clients/jedis/JedisProvider.java index 7db1fe8dc9..6b342c1386 100644 --- a/src/main/java/redis/clients/jedis/JedisResourceProvider.java +++ b/src/main/java/redis/clients/jedis/JedisProvider.java @@ -4,10 +4,12 @@ import java.util.function.Function; -public interface JedisResourceProvider { +public interface JedisProvider { Jedis getResource(); + void returnResource(final Jedis resource); + default void withResource(Consumer consumer) { try (Jedis jedis = this.getResource()) { consumer.accept(jedis); diff --git a/src/test/java/redis/clients/jedis/JedisPooledTest.java b/src/test/java/redis/clients/jedis/JedisPooledTest.java index 8b581d3164..750573ac03 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledTest.java @@ -276,6 +276,23 @@ public void testWithJedisPoolGetWithConnection() { } } + @Test + public void testWithJedisPoolGetWithReturnConnection() { + try (JedisPooled pool = JedisPooled.builder() + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { + Jedis jedis = pool.getResource(); + jedis.auth(endpointStandalone1.getPassword()); + jedis.set("foo", "bar"); + String result = jedis.get("foo"); + String ping = pool.withResourceGet(Jedis::ping); + pool.returnResource(jedis); + assertEquals("bar", result); + assertNotNull(ping); + } + } + @Test public void testCredentialsProvider() { final AtomicInteger prepareCount = new AtomicInteger(); diff --git a/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java index 62ee8c955d..dbc0134206 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java @@ -8,6 +8,7 @@ import redis.clients.jedis.providers.PooledConnectionProvider; import redis.clients.jedis.util.Pool; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,9 +28,16 @@ public class JedisPooledUnitTest { private PooledConnectionProvider mockProvider; private Connection mockConnection; + private AtomicInteger pings = new AtomicInteger(0); + @BeforeEach public void setUp() throws Exception { mockConnection = mock(Connection.class); + Mockito.doAnswer( ioc -> { + pings.incrementAndGet(); + return null; + }).when(mockConnection).sendCommand(eq(Protocol.Command.PING)); + when(mockConnection.getStatusCodeReply()).thenAnswer( ioc -> "PONG" + System.currentTimeMillis()); mockPool = mock(Pool.class); mockProvider = mock(PooledConnectionProvider.class); when(mockProvider.getPool()).thenReturn(mockPool); @@ -54,13 +62,24 @@ public void testWithResourceClosesConnection() { @Test public void testWithResourceGetClosesConnection() { - String result = pooled.withResourceGet(jedis -> "test-result"); - + String result = pooled.withResourceGet(Jedis::ping); assertNotNull(result); + assertEquals(1, pings.get()); verify(pooled, times(1)).getPool(); verify(mockPool, times(1)).returnResource(eq(mockConnection)); } + @Test + public void testWithResourceGetReturnsConnection() { + Jedis jedis = pooled.getResource(); + String result = jedis.ping(); + pooled.returnResource(jedis); + assertNotNull(result); + assertEquals(1, pings.get()); + verify(pooled, times(2)).getPool(); + verify(mockPool, times(1)).returnResource(eq(mockConnection)); + } + @Test public void testWithResourceGetSetData() { AtomicReference settedValue = new AtomicReference<>(""); diff --git a/src/test/java/redis/clients/jedis/JedisResourceProviderTest.java b/src/test/java/redis/clients/jedis/JedisProviderTest.java similarity index 74% rename from src/test/java/redis/clients/jedis/JedisResourceProviderTest.java rename to src/test/java/redis/clients/jedis/JedisProviderTest.java index 95e57fdcd6..cca8795e55 100644 --- a/src/test/java/redis/clients/jedis/JedisResourceProviderTest.java +++ b/src/test/java/redis/clients/jedis/JedisProviderTest.java @@ -13,9 +13,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class JedisResourceProviderTest { +public class JedisProviderTest { - private TestJedisResourceProvider provider = spy(new TestJedisResourceProvider()); + private TestJedisProvider provider = spy(new TestJedisProvider()); @Test @@ -50,15 +50,28 @@ public void testWithSomeResources() { assertEquals(4, provider.getClosed()); } + @Test + public void tesReturntWithSomeResources() { + provider.withResource(Jedis::ping); + String result = provider.withResourceGet(Jedis::ping); + provider.withResource(Jedis::ping); + Jedis jedis = provider.getResource(); + assertEquals(4, provider.getBorrowed()); + assertEquals(3, provider.getClosed()); + assertNotNull(result); + provider.returnResource(jedis); + assertEquals(4, provider.getClosed()); + } + - static class TestJedisResourceProvider implements JedisResourceProvider { + static class TestJedisProvider implements JedisProvider { private Jedis jedis; private AtomicInteger borrowed = new AtomicInteger(0); private AtomicInteger closed = new AtomicInteger(0); - TestJedisResourceProvider() { + TestJedisProvider() { jedis = mock(Jedis.class); Mockito.doAnswer(ioc -> { closed.incrementAndGet(); @@ -73,6 +86,11 @@ public Jedis getResource() { return jedis; } + @Override + public void returnResource(Jedis resource) { + jedis.close(); + } + public int getBorrowed() { return borrowed.get(); } From 5b4a7ebee708e9cc4446131a4837590fe3c3aa72 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Sat, 29 Nov 2025 11:46:07 +0100 Subject: [PATCH 09/12] format JedisProvider little fixes --- .../java/redis/clients/jedis/JedisPooled.java | 3 ++- .../redis/clients/jedis/JedisProvider.java | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/redis/clients/jedis/JedisPooled.java b/src/main/java/redis/clients/jedis/JedisPooled.java index 0594a6b9fa..10a4b84974 100644 --- a/src/main/java/redis/clients/jedis/JedisPooled.java +++ b/src/main/java/redis/clients/jedis/JedisPooled.java @@ -464,6 +464,7 @@ public Pipeline pipelined() { return (Pipeline) super.pipelined(); } + @Override public Jedis getResource() { Pool pool = getPool(); Connection conn = pool.getResource(); @@ -472,10 +473,10 @@ public Jedis getResource() { return jedis; } + @Override public void returnResource(final Jedis resource) { Pool pool = getPool(); pool.returnResource(resource.getConnection()); } - } diff --git a/src/main/java/redis/clients/jedis/JedisProvider.java b/src/main/java/redis/clients/jedis/JedisProvider.java index 6b342c1386..c8e96f070e 100644 --- a/src/main/java/redis/clients/jedis/JedisProvider.java +++ b/src/main/java/redis/clients/jedis/JedisProvider.java @@ -3,22 +3,42 @@ import java.util.function.Consumer; import java.util.function.Function; - +/** + * Interface for providing Jedis resources from a pool + */ public interface JedisProvider { + /** + * Get a Jedis resource from the pool + * @return Jedis object + */ Jedis getResource(); + /** + * Return a Jedis resource to the pool + * @param resource Jedis object + */ void returnResource(final Jedis resource); + /** + * Execute a consumer with a Jedis resource + * @param consumer code to execute with the Jedis resource + */ default void withResource(Consumer consumer) { try (Jedis jedis = this.getResource()) { consumer.accept(jedis); } } + /** + * Execute a function with a Jedis resource and return a value + * @param function code to execute with the Jedis resource + * @return return value from the function + */ default K withResourceGet(Function function) { try (Jedis jedis = this.getResource()) { return function.apply(jedis); } } + } From 37461004e3cbb14beeb1ebb44b1d5b9862ee348e Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Sat, 29 Nov 2025 12:20:54 +0100 Subject: [PATCH 10/12] format JedisProvider --- src/main/java/redis/clients/jedis/JedisProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/redis/clients/jedis/JedisProvider.java b/src/main/java/redis/clients/jedis/JedisProvider.java index c8e96f070e..983be9f213 100644 --- a/src/main/java/redis/clients/jedis/JedisProvider.java +++ b/src/main/java/redis/clients/jedis/JedisProvider.java @@ -10,18 +10,21 @@ public interface JedisProvider { /** * Get a Jedis resource from the pool + * * @return Jedis object */ Jedis getResource(); /** * Return a Jedis resource to the pool + * * @param resource Jedis object */ void returnResource(final Jedis resource); /** * Execute a consumer with a Jedis resource + * * @param consumer code to execute with the Jedis resource */ default void withResource(Consumer consumer) { @@ -32,6 +35,7 @@ default void withResource(Consumer consumer) { /** * Execute a function with a Jedis resource and return a value + * * @param function code to execute with the Jedis resource * @return return value from the function */ From 9befee7ae53bbe0c1520329c05567f297c4c1746 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Mon, 1 Dec 2025 17:55:48 +0100 Subject: [PATCH 11/12] format with maven --- .../redis/clients/jedis/JedisProvider.java | 60 +++++++++---------- .../clients/jedis/JedisPooledUnitTest.java | 25 ++++---- 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/src/main/java/redis/clients/jedis/JedisProvider.java b/src/main/java/redis/clients/jedis/JedisProvider.java index 983be9f213..3a87dc13a7 100644 --- a/src/main/java/redis/clients/jedis/JedisProvider.java +++ b/src/main/java/redis/clients/jedis/JedisProvider.java @@ -4,45 +4,41 @@ import java.util.function.Function; /** - * Interface for providing Jedis resources from a pool + * Interface providing Jedis resources from a pool */ public interface JedisProvider { - /** - * Get a Jedis resource from the pool - * - * @return Jedis object - */ - Jedis getResource(); + /** + * Get a Jedis resource from the pool + * @return Jedis object + */ + Jedis getResource(); - /** - * Return a Jedis resource to the pool - * - * @param resource Jedis object - */ - void returnResource(final Jedis resource); + /** + * Return a Jedis resource to the pool + * @param resource Jedis object + */ + void returnResource(final Jedis resource); - /** - * Execute a consumer with a Jedis resource - * - * @param consumer code to execute with the Jedis resource - */ - default void withResource(Consumer consumer) { - try (Jedis jedis = this.getResource()) { - consumer.accept(jedis); - } + /** + * Execute a consumer with a Jedis resource + * @param consumer code to execute with the Jedis resource + */ + default void withResource(Consumer consumer) { + try (Jedis jedis = this.getResource()) { + consumer.accept(jedis); } + } - /** - * Execute a function with a Jedis resource and return a value - * - * @param function code to execute with the Jedis resource - * @return return value from the function - */ - default K withResourceGet(Function function) { - try (Jedis jedis = this.getResource()) { - return function.apply(jedis); - } + /** + * Execute a function with a Jedis resource and return a value + * @param function code to execute with the Jedis resource + * @return return value from the function + */ + default K withResourceGet(Function function) { + try (Jedis jedis = this.getResource()) { + return function.apply(jedis); } + } } diff --git a/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java index dbc0134206..c1f99548e0 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledUnitTest.java @@ -33,11 +33,12 @@ public class JedisPooledUnitTest { @BeforeEach public void setUp() throws Exception { mockConnection = mock(Connection.class); - Mockito.doAnswer( ioc -> { + Mockito.doAnswer(ioc -> { pings.incrementAndGet(); return null; }).when(mockConnection).sendCommand(eq(Protocol.Command.PING)); - when(mockConnection.getStatusCodeReply()).thenAnswer( ioc -> "PONG" + System.currentTimeMillis()); + when(mockConnection.getStatusCodeReply()) + .thenAnswer(ioc -> "PONG" + System.currentTimeMillis()); mockPool = mock(Pool.class); mockProvider = mock(PooledConnectionProvider.class); when(mockProvider.getPool()).thenReturn(mockPool); @@ -83,13 +84,12 @@ public void testWithResourceGetReturnsConnection() { @Test public void testWithResourceGetSetData() { AtomicReference settedValue = new AtomicReference<>(""); - try(MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class,(mock, context)-> - when(mock.set(eq("test-key"), anyString())).thenAnswer( ioc -> { - settedValue.set(ioc.getArgument(1)); - return "OK"; - }) - )) { - pooled.withResource( jedis -> jedis.set("test-key","test-result")); + try (MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class, + (mock, context) -> when(mock.set(eq("test-key"), anyString())).thenAnswer(ioc -> { + settedValue.set(ioc.getArgument(1)); + return "OK"; + }))) { + pooled.withResource(jedis -> jedis.set("test-key", "test-result")); assertEquals("test-result", settedValue.get()); verify(pooled, times(1)).getPool(); Jedis mockJedis = mockConstruction.constructed().get(0); @@ -99,10 +99,9 @@ public void testWithResourceGetSetData() { @Test public void testWithResourceGetReturnsResult() { - try(MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class,(mock, context)-> - when(mock.get(eq("test-key"))).thenReturn("test-result") - )) { - String result = pooled.withResourceGet( jedis -> jedis.get("test-key")); + try (MockedConstruction mockConstruction = Mockito.mockConstruction(Jedis.class, + (mock, context) -> when(mock.get(eq("test-key"))).thenReturn("test-result"))) { + String result = pooled.withResourceGet(jedis -> jedis.get("test-key")); assertEquals("test-result", result); verify(pooled, times(1)).getPool(); Jedis mockJedis = mockConstruction.constructed().get(0); From dd825d58a699ef426e238123c9706e2784b6c3ee Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Tue, 2 Dec 2025 10:54:26 +0100 Subject: [PATCH 12/12] format with maven --- .../redis/clients/jedis/JedisPoolTest.java | 125 +++++++++------ .../redis/clients/jedis/JedisPooledTest.java | 68 ++++---- .../clients/jedis/JedisProviderTest.java | 149 +++++++++--------- 3 files changed, 188 insertions(+), 154 deletions(-) diff --git a/src/test/java/redis/clients/jedis/JedisPoolTest.java b/src/test/java/redis/clients/jedis/JedisPoolTest.java index 85346f04ba..16582ac793 100644 --- a/src/test/java/redis/clients/jedis/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/JedisPoolTest.java @@ -33,9 +33,11 @@ @Tag("integration") public class JedisPoolTest { - private static final EndpointConfig endpointStandalone0 = HostAndPorts.getRedisEndpoint("standalone0"); + private static final EndpointConfig endpointStandalone0 = HostAndPorts + .getRedisEndpoint("standalone0"); - private static final EndpointConfig endpointStandalone1 = HostAndPorts.getRedisEndpoint("standalone1"); + private static final EndpointConfig endpointStandalone1 = HostAndPorts + .getRedisEndpoint("standalone1"); private String testKey; private String testValue; @@ -48,7 +50,8 @@ public void setUpTestKey(TestInfo testInfo) { @Test public void checkConnections() { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000); try (Jedis jedis = pool.getResource()) { jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "bar"); @@ -60,7 +63,8 @@ public void checkConnections() { @Test public void checkResourceWithConfig() { - try (JedisPool pool = new JedisPool(HostAndPorts.getRedisEndpoint("standalone7-with-lfu-policy").getHostAndPort(), + try (JedisPool pool = new JedisPool( + HostAndPorts.getRedisEndpoint("standalone7-with-lfu-policy").getHostAndPort(), DefaultJedisClientConfig.builder().socketTimeoutMillis(5000).build())) { try (Jedis jedis = pool.getResource()) { @@ -72,7 +76,8 @@ public void checkResourceWithConfig() { @Test public void checkCloseableConnections() throws Exception { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000); + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000); try (Jedis jedis = pool.getResource()) { jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "bar"); @@ -99,7 +104,8 @@ public void checkResourceIsClosableAndReusable() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); - try (JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 0, + try (JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 0, "closable-reusable-pool", false, null, null, null)) { Jedis jedis = pool.getResource(); @@ -115,7 +121,8 @@ public void checkResourceIsClosableAndReusable() { @Test public void checkPoolRepairedWhenJedisIsBroken() { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort()); + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort()); try (Jedis jedis = pool.getResource()) { jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "0"); @@ -135,7 +142,9 @@ public void checkPoolOverflow() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); - try (JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort()); + try ( + JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), + endpointStandalone0.getPort()); Jedis jedis = pool.getResource()) { jedis.auth(endpointStandalone0.getPassword()); @@ -147,7 +156,8 @@ public void checkPoolOverflow() { public void securePool() { JedisPoolConfig config = new JedisPoolConfig(); config.setTestOnBorrow(true); - JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); + JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); try (Jedis jedis = pool.getResource()) { jedis.set("foo", "bar"); } @@ -157,14 +167,18 @@ public void securePool() { @Test public void nonDefaultDatabase() { - try (JedisPool pool0 = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword()); Jedis jedis0 = pool0.getResource()) { + try ( + JedisPool pool0 = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); + Jedis jedis0 = pool0.getResource()) { jedis0.set("foo", "bar"); assertEquals("bar", jedis0.get("foo")); } - try (JedisPool pool1 = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword(), 1); Jedis jedis1 = pool1.getResource()) { + try ( + JedisPool pool1 = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 1); + Jedis jedis1 = pool1.getResource()) { assertNull(jedis1.get("foo")); } } @@ -177,8 +191,9 @@ public void startWithUrlString() { j.set("foo", "bar"); } - try (JedisPool pool = new JedisPool( - endpointStandalone1.getURIBuilder().credentials("", endpointStandalone1.getPassword()).path("/2").build()); + try ( + JedisPool pool = new JedisPool(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build()); Jedis jedis = pool.getResource()) { assertEquals("PONG", jedis.ping()); assertEquals("bar", jedis.get("foo")); @@ -193,8 +208,9 @@ public void startWithUrl() throws URISyntaxException { j.set("foo", "bar"); } - try (JedisPool pool = new JedisPool( - endpointStandalone1.getURIBuilder().credentials("", endpointStandalone1.getPassword()).path("/2").build()); + try ( + JedisPool pool = new JedisPool(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build()); Jedis jedis = pool.getResource()) { assertEquals("bar", jedis.get("foo")); } @@ -202,7 +218,7 @@ public void startWithUrl() throws URISyntaxException { @Test public void shouldThrowInvalidURIExceptionForInvalidURI() throws URISyntaxException { - assertThrows(InvalidURIException.class, ()->new JedisPool(new URI("localhost:6380")).close()); + assertThrows(InvalidURIException.class, () -> new JedisPool(new URI("localhost:6380")).close()); } @Test @@ -213,8 +229,8 @@ public void allowUrlWithNoDBAndNoPassword() throws URISyntaxException { @Test public void selectDatabaseOnActivation() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword())) { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword())) { Jedis jedis0 = pool.getResource(); assertEquals(0, jedis0.getDB()); @@ -234,8 +250,11 @@ public void selectDatabaseOnActivation() { @Test public void customClientName() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword(), 0, "my_shiny_client_name"); Jedis jedis = pool.getResource()) { + try ( + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 0, + "my_shiny_client_name"); + Jedis jedis = pool.getResource()) { assertEquals("my_shiny_client_name", jedis.clientGetname()); } @@ -243,11 +262,14 @@ public void customClientName() { @Test public void invalidClientName() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword(), 0, "invalid client name"); Jedis jedis = pool.getResource()) { + try ( + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 0, + "invalid client name"); + Jedis jedis = pool.getResource()) { } catch (Exception e) { if (!e.getMessage().startsWith("client info cannot contain space")) { - fail("invalid client name test fail"); + fail("invalid client name test fail"); } } } @@ -308,7 +330,8 @@ public void returnResourceShouldResetState() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); - JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); + JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); Jedis jedis = pool.getResource(); try { @@ -333,7 +356,8 @@ public void returnResourceShouldResetStateWithGetResource() { GenericObjectPoolConfig config = new GenericObjectPoolConfig<>(); config.setMaxTotal(1); config.setBlockWhenExhausted(false); - JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); + JedisPool pool = new JedisPool(config, endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword()); Jedis jedis = pool.getResource(); try { @@ -355,8 +379,9 @@ public void returnResourceShouldResetStateWithGetResource() { @Test public void getNumActiveWhenPoolIsClosed() { - JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000, - endpointStandalone0.getPassword(), 0, "my_shiny_client_name"); + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, endpointStandalone0.getPassword(), 0, + "my_shiny_client_name"); try (Jedis j = pool.getResource()) { j.ping(); @@ -368,7 +393,8 @@ public void getNumActiveWhenPoolIsClosed() { @Test public void getNumActiveReturnsTheCorrectNumber() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000)) { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000)) { Jedis jedis = pool.getResource(); jedis.auth(endpointStandalone0.getPassword()); jedis.set("foo", "bar"); @@ -393,7 +419,8 @@ public void getNumActiveReturnsTheCorrectNumber() { @Test public void testAddObject() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000)) { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000)) { pool.addObjects(1); assertEquals(1, pool.getNumIdle()); } @@ -401,7 +428,8 @@ public void testAddObject() { @Test public void closeResourceTwice() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000)) { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000)) { Jedis j = pool.getResource(); j.auth(endpointStandalone0.getPassword()); j.ping(); @@ -412,7 +440,8 @@ public void closeResourceTwice() { @Test public void closeBrokenResourceTwice() { - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), endpointStandalone0.getPort(), 2000)) { + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000)) { Jedis j = pool.getResource(); try { // make connection broken @@ -431,8 +460,9 @@ public void closeBrokenResourceTwice() { public void testCloseConnectionOnMakeObject() { JedisPoolConfig config = new JedisPoolConfig(); config.setTestOnBorrow(true); - try (JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), - endpointStandalone0.getPort(), 2000, "wrong pass"); + try ( + JedisPool pool = new JedisPool(new JedisPoolConfig(), endpointStandalone0.getHost(), + endpointStandalone0.getPort(), 2000, "wrong pass"); Jedis jedis = new Jedis(endpointStandalone0.getURIBuilder().defaultCredentials().build())) { int currentClientCount = getClientCount(jedis.clientList()); assertThrows(JedisAccessControlException.class, pool::getResource); @@ -449,10 +479,11 @@ private int getClientCount(final String clientList) { @Test public void testResetInvalidCredentials() { - DefaultRedisCredentialsProvider credentialsProvider - = new DefaultRedisCredentialsProvider(new DefaultRedisCredentials(null, endpointStandalone0.getPassword())); - JedisFactory factory = new JedisFactory(endpointStandalone0.getHostAndPort(), DefaultJedisClientConfig.builder() - .credentialsProvider(credentialsProvider).clientName("my_shiny_client_name").build()); + DefaultRedisCredentialsProvider credentialsProvider = new DefaultRedisCredentialsProvider( + new DefaultRedisCredentials(null, endpointStandalone0.getPassword())); + JedisFactory factory = new JedisFactory(endpointStandalone0.getHostAndPort(), + DefaultJedisClientConfig.builder().credentialsProvider(credentialsProvider) + .clientName("my_shiny_client_name").build()); try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { Jedis obj1_ref; @@ -470,7 +501,7 @@ public void testResetInvalidCredentials() { try (Jedis obj2 = pool.getResource()) { fail("Should not get resource from pool"); } catch (JedisException e) { - //ignore + // ignore } assertEquals(1, pool.getNumActive()); } @@ -480,20 +511,22 @@ public void testResetInvalidCredentials() { @Test public void testResetValidCredentials() { - DefaultRedisCredentialsProvider credentialsProvider - = new DefaultRedisCredentialsProvider(new DefaultRedisCredentials(null, "bad password")); - JedisFactory factory = new JedisFactory(endpointStandalone0.getHostAndPort(), DefaultJedisClientConfig.builder() - .credentialsProvider(credentialsProvider).clientName("my_shiny_client_name").build()); + DefaultRedisCredentialsProvider credentialsProvider = new DefaultRedisCredentialsProvider( + new DefaultRedisCredentials(null, "bad password")); + JedisFactory factory = new JedisFactory(endpointStandalone0.getHostAndPort(), + DefaultJedisClientConfig.builder().credentialsProvider(credentialsProvider) + .clientName("my_shiny_client_name").build()); try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { try (Jedis obj1 = pool.getResource()) { fail("Should not get resource from pool"); } catch (JedisException e) { - //ignore + // ignore } assertEquals(0, pool.getNumActive()); - credentialsProvider.setCredentials(new DefaultRedisCredentials(null, endpointStandalone0.getPassword())); + credentialsProvider + .setCredentials(new DefaultRedisCredentials(null, endpointStandalone0.getPassword())); try (Jedis obj2 = pool.getResource()) { obj2.set("foo", "bar"); assertEquals("bar", obj2.get("foo")); diff --git a/src/test/java/redis/clients/jedis/JedisPooledTest.java b/src/test/java/redis/clients/jedis/JedisPooledTest.java index 750573ac03..2b501d324c 100644 --- a/src/test/java/redis/clients/jedis/JedisPooledTest.java +++ b/src/test/java/redis/clients/jedis/JedisPooledTest.java @@ -25,10 +25,10 @@ @Tag("integration") public class JedisPooledTest { - private static final EndpointConfig endpointStandalone7 = HostAndPorts.getRedisEndpoint( - "standalone7-with-lfu-policy"); - private static final EndpointConfig endpointStandalone1 = HostAndPorts.getRedisEndpoint( - "standalone1"); // password protected + private static final EndpointConfig endpointStandalone7 = HostAndPorts + .getRedisEndpoint("standalone7-with-lfu-policy"); + private static final EndpointConfig endpointStandalone1 = HostAndPorts + .getRedisEndpoint("standalone1"); // password protected @Test public void checkCloseableConnections() { @@ -173,9 +173,9 @@ public void getNumActiveReturnsTheCorrectNumber() { @Test public void getNumActiveReturnsTheCorrectNumberWithJedis() { try (JedisPooled pool = JedisPooled.builder() - .hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort()) - .clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build()) - .poolConfig(new ConnectionPoolConfig()).build()) { + .hostAndPort(endpointStandalone7.getHost(), endpointStandalone7.getPort()) + .clientConfig(DefaultJedisClientConfig.builder().timeoutMillis(2000).build()) + .poolConfig(new ConnectionPoolConfig()).build()) { Connection jedis = pool.getPool().getResource(); assertEquals(1, pool.getPool().getNumActive()); @@ -226,8 +226,8 @@ public void closeBrokenResourceTwice() { @Test public void testResetValidCredentials() { - DefaultRedisCredentialsProvider credentialsProvider = - new DefaultRedisCredentialsProvider(new DefaultRedisCredentials(null, "bad password")); + DefaultRedisCredentialsProvider credentialsProvider = new DefaultRedisCredentialsProvider( + new DefaultRedisCredentials(null, "bad password")); try (JedisPooled pool = JedisPooled.builder().hostAndPort(endpointStandalone1.getHostAndPort()) .clientConfig( @@ -236,20 +236,22 @@ public void testResetValidCredentials() { try { pool.get("foo"); fail("Should not get resource from pool"); - } catch (JedisException e) { } + } catch (JedisException e) { + } assertEquals(0, pool.getPool().getNumActive()); - credentialsProvider.setCredentials(new DefaultRedisCredentials(null, endpointStandalone1.getPassword())); + credentialsProvider + .setCredentials(new DefaultRedisCredentials(null, endpointStandalone1.getPassword())); assertThat(pool.get("foo"), anything()); } } @Test public void testWithJedisPoolDoWithConnection() { - try(JedisPooled pool = JedisPooled.builder() - .fromURI(endpointStandalone1.getURIBuilder() - .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) - .build();) { + try (JedisPooled pool = JedisPooled.builder() + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { pool.withResource(jedis -> { jedis.auth(endpointStandalone1.getPassword()); jedis.set("foo", "bar"); @@ -262,26 +264,26 @@ public void testWithJedisPoolDoWithConnection() { @Test public void testWithJedisPoolGetWithConnection() { try (JedisPooled pool = JedisPooled.builder() - .fromURI(endpointStandalone1.getURIBuilder() - .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) - .build();) { - String result = pool.withResourceGet(jedis -> { - jedis.auth(endpointStandalone1.getPassword()); - jedis.set("foo", "bar"); - return jedis.get("foo"); - }); - String ping = pool.withResourceGet(Jedis::ping); - assertEquals("bar", result); - assertNotNull(ping); + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { + String result = pool.withResourceGet(jedis -> { + jedis.auth(endpointStandalone1.getPassword()); + jedis.set("foo", "bar"); + return jedis.get("foo"); + }); + String ping = pool.withResourceGet(Jedis::ping); + assertEquals("bar", result); + assertNotNull(ping); } } @Test public void testWithJedisPoolGetWithReturnConnection() { try (JedisPooled pool = JedisPooled.builder() - .fromURI(endpointStandalone1.getURIBuilder() - .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) - .build();) { + .fromURI(endpointStandalone1.getURIBuilder() + .credentials("", endpointStandalone1.getPassword()).path("/2").build().toString()) + .build();) { Jedis jedis = pool.getResource(); jedis.auth(endpointStandalone1.getPassword()); jedis.set("foo", "bar"); @@ -336,7 +338,8 @@ public void cleanUp() { } }; - // TODO: do it without the help of pool config; from Connection constructor? (configurable) force ping? + // TODO: do it without the help of pool config; from Connection constructor? (configurable) + // force ping? GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>(); poolConfig.setMaxTotal(1); poolConfig.setTestOnBorrow(true); @@ -348,9 +351,10 @@ public void cleanUp() { pool.get("foo"); fail("Should not get resource from pool"); } catch (JedisException e) { - //ignore + // ignore } - assertEquals(0, pool.getPool().getNumActive() + pool.getPool().getNumIdle() + pool.getPool().getNumWaiters()); + assertEquals(0, pool.getPool().getNumActive() + pool.getPool().getNumIdle() + + pool.getPool().getNumWaiters()); assertThat(prepareCount.getAndSet(0), greaterThanOrEqualTo(1)); assertThat(cleanupCount.getAndSet(0), greaterThanOrEqualTo(1)); diff --git a/src/test/java/redis/clients/jedis/JedisProviderTest.java b/src/test/java/redis/clients/jedis/JedisProviderTest.java index cca8795e55..080edb3ef8 100644 --- a/src/test/java/redis/clients/jedis/JedisProviderTest.java +++ b/src/test/java/redis/clients/jedis/JedisProviderTest.java @@ -15,89 +15,86 @@ public class JedisProviderTest { - private TestJedisProvider provider = spy(new TestJedisProvider()); - - - @Test - public void testWithResourceClosesConnection() { - provider.withResource(Jedis::ping); - - verify(provider, times(1)).getResource(); - assertEquals(1, provider.getBorrowed()); - assertEquals(1, provider.getClosed()); + private TestJedisProvider provider = spy(new TestJedisProvider()); + + @Test + public void testWithResourceClosesConnection() { + provider.withResource(Jedis::ping); + + verify(provider, times(1)).getResource(); + assertEquals(1, provider.getBorrowed()); + assertEquals(1, provider.getClosed()); + } + + @Test + public void testWithResourceGetClosesConnection() { + String result = provider.withResourceGet(jedis -> jedis.ping()); + + verify(provider, times(1)).getResource(); + assertEquals(1, provider.getBorrowed()); + assertEquals(1, provider.getClosed()); + assertNotNull(result); + } + + @Test + public void testWithSomeResources() { + provider.withResource(Jedis::ping); + String result = provider.withResourceGet(Jedis::ping); + provider.withResource(Jedis::ping); + Jedis jedis = provider.getResource(); + assertEquals(4, provider.getBorrowed()); + assertEquals(3, provider.getClosed()); + assertNotNull(result); + jedis.close(); + assertEquals(4, provider.getClosed()); + } + + @Test + public void tesReturntWithSomeResources() { + provider.withResource(Jedis::ping); + String result = provider.withResourceGet(Jedis::ping); + provider.withResource(Jedis::ping); + Jedis jedis = provider.getResource(); + assertEquals(4, provider.getBorrowed()); + assertEquals(3, provider.getClosed()); + assertNotNull(result); + provider.returnResource(jedis); + assertEquals(4, provider.getClosed()); + } + + static class TestJedisProvider implements JedisProvider { + + private Jedis jedis; + private AtomicInteger borrowed = new AtomicInteger(0); + private AtomicInteger closed = new AtomicInteger(0); + + TestJedisProvider() { + jedis = mock(Jedis.class); + Mockito.doAnswer(ioc -> { + closed.incrementAndGet(); + return null; + }).when(jedis).close(); + when(jedis.ping()).thenAnswer(ioc -> "PONG_" + System.nanoTime()); } - @Test - public void testWithResourceGetClosesConnection() { - String result = provider.withResourceGet(jedis -> jedis.ping()); - - verify(provider, times(1)).getResource(); - assertEquals(1, provider.getBorrowed()); - assertEquals(1, provider.getClosed()); - assertNotNull(result); + @Override + public Jedis getResource() { + borrowed.incrementAndGet(); + return jedis; } - @Test - public void testWithSomeResources() { - provider.withResource(Jedis::ping); - String result = provider.withResourceGet(Jedis::ping); - provider.withResource(Jedis::ping); - Jedis jedis = provider.getResource(); - assertEquals(4, provider.getBorrowed()); - assertEquals(3, provider.getClosed()); - assertNotNull(result); - jedis.close(); - assertEquals(4, provider.getClosed()); + @Override + public void returnResource(Jedis resource) { + jedis.close(); } - @Test - public void tesReturntWithSomeResources() { - provider.withResource(Jedis::ping); - String result = provider.withResourceGet(Jedis::ping); - provider.withResource(Jedis::ping); - Jedis jedis = provider.getResource(); - assertEquals(4, provider.getBorrowed()); - assertEquals(3, provider.getClosed()); - assertNotNull(result); - provider.returnResource(jedis); - assertEquals(4, provider.getClosed()); + public int getBorrowed() { + return borrowed.get(); } - - - static class TestJedisProvider implements JedisProvider { - - private Jedis jedis; - private AtomicInteger borrowed = new AtomicInteger(0); - private AtomicInteger closed = new AtomicInteger(0); - - TestJedisProvider() { - jedis = mock(Jedis.class); - Mockito.doAnswer(ioc -> { - closed.incrementAndGet(); - return null; - }).when(jedis).close(); - when(jedis.ping()).thenAnswer( ioc -> "PONG_" + System.nanoTime()); - } - - @Override - public Jedis getResource() { - borrowed.incrementAndGet(); - return jedis; - } - - @Override - public void returnResource(Jedis resource) { - jedis.close(); - } - - public int getBorrowed() { - return borrowed.get(); - } - - public int getClosed() { - return closed.get(); - } - + public int getClosed() { + return closed.get(); } + + } }