From 566d39317a6ab623d566c67dc28f690f6102c7c2 Mon Sep 17 00:00:00 2001 From: "oscar.besga" Date: Thu, 20 Nov 2025 19:51:27 +0100 Subject: [PATCH 1/4] 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 2/4] 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 3/4] 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 9a0b4b8ad6d337210984ba7bed3e61f15e72580d Mon Sep 17 00:00:00 2001 From: ggivo Date: Sun, 23 Nov 2025 11:26:39 +0200 Subject: [PATCH 4/4] 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(); + } + +}