From 039c5daa7cf0fa2a4b724947d6235a4859ba2bea Mon Sep 17 00:00:00 2001 From: Shivansh Soni Date: Thu, 18 Dec 2025 11:28:27 +0530 Subject: [PATCH] Add JedisPoolConfig and ConnectionPoolConfig with tests Signed-off-by: Shivansh Soni --- .../java/io/valkey/ConnectionPoolConfig.java | 17 +++- src/main/java/io/valkey/JedisPoolConfig.java | 17 +++- .../io/valkey/ConnectionPoolConfigTest.java | 81 +++++++++++++++++++ .../java/io/valkey/JedisPoolConfigTest.java | 81 +++++++++++++++++++ 4 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 src/test/java/io/valkey/ConnectionPoolConfigTest.java create mode 100644 src/test/java/io/valkey/JedisPoolConfigTest.java diff --git a/src/main/java/io/valkey/ConnectionPoolConfig.java b/src/main/java/io/valkey/ConnectionPoolConfig.java index 54c012a6..9c5b1295 100644 --- a/src/main/java/io/valkey/ConnectionPoolConfig.java +++ b/src/main/java/io/valkey/ConnectionPoolConfig.java @@ -5,11 +5,26 @@ public class ConnectionPoolConfig extends GenericObjectPoolConfig { + private static final int DEFAULT_MIN_IDLE = 16; + public ConnectionPoolConfig() { + this(DEFAULT_MIN_IDLE); + } + + public ConnectionPoolConfig(int minIdle) { + if (minIdle < 1) { + throw new IllegalArgumentException( + "minIdle must be at least 1, got: " + minIdle); + } + // defaults to make your life with connection pool easier :) setTestWhileIdle(true); setMinEvictableIdleTime(Duration.ofMillis(60000)); setTimeBetweenEvictionRuns(Duration.ofMillis(30000)); setNumTestsPerEvictionRun(-1); + + setMinIdle(minIdle); + setMaxIdle(2 * minIdle); + setMaxTotal(2 * minIdle); } -} +} \ No newline at end of file diff --git a/src/main/java/io/valkey/JedisPoolConfig.java b/src/main/java/io/valkey/JedisPoolConfig.java index 5cc8909a..e4a173f5 100644 --- a/src/main/java/io/valkey/JedisPoolConfig.java +++ b/src/main/java/io/valkey/JedisPoolConfig.java @@ -5,11 +5,26 @@ public class JedisPoolConfig extends GenericObjectPoolConfig { + private static final int DEFAULT_MIN_IDLE = 16; + public JedisPoolConfig() { + this(DEFAULT_MIN_IDLE); + } + + public JedisPoolConfig(int minIdle) { + if (minIdle < 1) { + throw new IllegalArgumentException( + "minIdle must be at least 1, got: " + minIdle); + } + // defaults to make your life with connection pool easier :) setTestWhileIdle(true); setMinEvictableIdleTime(Duration.ofMillis(60000)); setTimeBetweenEvictionRuns(Duration.ofMillis(30000)); setNumTestsPerEvictionRun(-1); + + setMinIdle(minIdle); + setMaxIdle(2 * minIdle); + setMaxTotal(2 * minIdle); } -} +} \ No newline at end of file diff --git a/src/test/java/io/valkey/ConnectionPoolConfigTest.java b/src/test/java/io/valkey/ConnectionPoolConfigTest.java new file mode 100644 index 00000000..d8e77dd1 --- /dev/null +++ b/src/test/java/io/valkey/ConnectionPoolConfigTest.java @@ -0,0 +1,81 @@ +package io.valkey; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class ConnectionPoolConfigTest { + + @Test + public void testDefaultConstructor() { + ConnectionPoolConfig config = new ConnectionPoolConfig(); + + // Verify performance defaults + assertEquals("Default minIdle should be 16", 16, config.getMinIdle()); + assertEquals("Default maxIdle should be 32", 32, config.getMaxIdle()); + assertEquals("Default maxTotal should be 32", 32, config.getMaxTotal()); + + // Verify other defaults are still set + assertTrue("testWhileIdle should be true", config.getTestWhileIdle()); + assertEquals("minEvictableIdleTime should be 60000ms", + 60000, config.getMinEvictableIdleTime().toMillis()); + assertEquals("timeBetweenEvictionRuns should be 30000ms", + 30000, config.getTimeBetweenEvictionRuns().toMillis()); + assertEquals("numTestsPerEvictionRun should be -1", + -1, config.getNumTestsPerEvictionRun()); + } + + @Test + public void testClusterOptimizedConstructor() { + int minIdle = 10; + ConnectionPoolConfig config = new ConnectionPoolConfig(minIdle); + + assertEquals("MinIdle should be 10", 10, config.getMinIdle()); + assertEquals("MaxIdle should be 20", 20, config.getMaxIdle()); + assertEquals("MaxTotal should be 20", 20, config.getMaxTotal()); + } + + @Test + public void testCustomMinIdle() { + ConnectionPoolConfig config = new ConnectionPoolConfig(8); + + assertEquals("MinIdle should be 8", 8, config.getMinIdle()); + assertEquals("MaxIdle should be 16", 16, config.getMaxIdle()); + assertEquals("MaxTotal should be 16", 16, config.getMaxTotal()); + } + + @Test + public void testLargeMinIdle() { + ConnectionPoolConfig config = new ConnectionPoolConfig(50); + + assertEquals("MinIdle should be 50", 50, config.getMinIdle()); + assertEquals("MaxIdle should be 100", 100, config.getMaxIdle()); + assertEquals("MaxTotal should be 100", 100, config.getMaxTotal()); + } + + @Test(expected = IllegalArgumentException.class) + public void testZeroMinIdle() { + new ConnectionPoolConfig(0); + } + + @Test(expected = IllegalArgumentException.class) + public void testNegativeMinIdle() { + new ConnectionPoolConfig(-5); + } + + @Test + public void testRatioConsistency() { + // Test the 2x ratio is maintained across various values + int[] testValues = { 1, 5, 8, 10, 16, 20, 32, 50, 100 }; + + for (int minIdle : testValues) { + ConnectionPoolConfig config = new ConnectionPoolConfig(minIdle); + assertEquals("maxIdle should be 2x minIdle for value " + minIdle, + minIdle * 2, config.getMaxIdle()); + assertEquals("maxTotal should be 2x minIdle for value " + minIdle, + minIdle * 2, config.getMaxTotal()); + assertEquals("maxIdle should equal maxTotal for value " + minIdle, + config.getMaxIdle(), config.getMaxTotal()); + } + } +} \ No newline at end of file diff --git a/src/test/java/io/valkey/JedisPoolConfigTest.java b/src/test/java/io/valkey/JedisPoolConfigTest.java new file mode 100644 index 00000000..6d89dde5 --- /dev/null +++ b/src/test/java/io/valkey/JedisPoolConfigTest.java @@ -0,0 +1,81 @@ +package io.valkey; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class JedisPoolConfigTest { + + @Test + public void testDefaultConstructor() { + JedisPoolConfig config = new JedisPoolConfig(); + + // Verify performance defaults + assertEquals("Default minIdle should be 16", 16, config.getMinIdle()); + assertEquals("Default maxIdle should be 32", 32, config.getMaxIdle()); + assertEquals("Default maxTotal should be 32", 32, config.getMaxTotal()); + + // Verify other defaults are still set + assertTrue("testWhileIdle should be true", config.getTestWhileIdle()); + assertEquals("minEvictableIdleTime should be 60000ms", + 60000, config.getMinEvictableIdleTime().toMillis()); + assertEquals("timeBetweenEvictionRuns should be 30000ms", + 30000, config.getTimeBetweenEvictionRuns().toMillis()); + assertEquals("numTestsPerEvictionRun should be -1", + -1, config.getNumTestsPerEvictionRun()); + } + + @Test + public void testOptimizedConstructor() { + int minIdle = 16; + JedisPoolConfig config = new JedisPoolConfig(minIdle); + + assertEquals("MinIdle should match input", minIdle, config.getMinIdle()); + assertEquals("MaxIdle should be 2x MinIdle", 32, config.getMaxIdle()); + assertEquals("MaxTotal should be 2x MinIdle", 32, config.getMaxTotal()); + } + + @Test + public void testCustomMinIdle() { + JedisPoolConfig config = new JedisPoolConfig(10); + + assertEquals("MinIdle should be 10", 10, config.getMinIdle()); + assertEquals("MaxIdle should be 20", 20, config.getMaxIdle()); + assertEquals("MaxTotal should be 20", 20, config.getMaxTotal()); + } + + @Test + public void testLargeMinIdle() { + JedisPoolConfig config = new JedisPoolConfig(50); + + assertEquals("MinIdle should be 50", 50, config.getMinIdle()); + assertEquals("MaxIdle should be 100", 100, config.getMaxIdle()); + assertEquals("MaxTotal should be 100", 100, config.getMaxTotal()); + } + + @Test(expected = IllegalArgumentException.class) + public void testZeroMinIdle() { + new JedisPoolConfig(0); + } + + @Test(expected = IllegalArgumentException.class) + public void testNegativeMinIdle() { + new JedisPoolConfig(-5); + } + + @Test + public void testRatioConsistency() { + // Test the 2x ratio is maintained across various values + int[] testValues = { 1, 5, 8, 10, 16, 20, 32, 50, 100 }; + + for (int minIdle : testValues) { + JedisPoolConfig config = new JedisPoolConfig(minIdle); + assertEquals("maxIdle should be 2x minIdle for value " + minIdle, + minIdle * 2, config.getMaxIdle()); + assertEquals("maxTotal should be 2x minIdle for value " + minIdle, + minIdle * 2, config.getMaxTotal()); + assertEquals("maxIdle should equal maxTotal for value " + minIdle, + config.getMaxIdle(), config.getMaxTotal()); + } + } +} \ No newline at end of file