Skip to content

Commit 40f4ca0

Browse files
author
raju.gupta
committed
POOL-425 Add failing tests to reproduce POOL-426
1 parent 3f93386 commit 40f4ca0

File tree

1 file changed

+24
-37
lines changed

1 file changed

+24
-37
lines changed

src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import java.util.concurrent.TimeUnit;
5252
import java.util.concurrent.atomic.AtomicBoolean;
5353
import java.util.concurrent.atomic.AtomicInteger;
54+
import java.util.function.Function;
5455

5556
import javax.management.MBeanServer;
5657
import javax.management.ObjectName;
@@ -1002,21 +1003,37 @@ void testAddObjectRespectsMaxIdleLimit() throws Exception {
10021003
}
10031004

10041005
@RepeatedTest(10)
1005-
@Timeout(value = 60000, unit = TimeUnit.MILLISECONDS)
1006-
void testAddObjectConcurrentCallsRespectsMaxIdle() throws Exception {
1006+
@Timeout(value = 10, unit = TimeUnit.SECONDS)
1007+
void testAddObjectConcurrentCallsRespectsMaxIdleLimit() throws Exception {
1008+
final int maxIdleLimit = 5;
1009+
final int numThreads = 10;
1010+
final CyclicBarrier barrier = new CyclicBarrier(numThreads);
1011+
1012+
withConcurrentCallsRespectMaxIdle(maxIdleLimit, numThreads, pool -> getRunnables(numThreads, barrier, pool));
1013+
}
1014+
1015+
1016+
@RepeatedTest(10)
1017+
@Timeout(value = 10, unit = TimeUnit.SECONDS)
1018+
void testReturnObjectConcurrentCallsRespectsMaxIdleLimit() throws Exception {
1019+
final int maxIdleLimit = 5;
1020+
final int numThreads = 200;
1021+
final CyclicBarrier barrier = new CyclicBarrier(numThreads);
1022+
1023+
withConcurrentCallsRespectMaxIdle(maxIdleLimit, numThreads, pool -> getReturnRunnables(numThreads, barrier, pool));
1024+
}
1025+
1026+
void withConcurrentCallsRespectMaxIdle(int maxIdleLimit, int numThreads, Function<GenericObjectPool<String>, List<Runnable>> operation) throws Exception {
10071027
final GenericObjectPoolConfig<String> config = new GenericObjectPoolConfig<>();
10081028
config.setJmxEnabled(false);
10091029
try (GenericObjectPool<String> pool = new GenericObjectPool<>(new SimpleFactory(), config)) {
10101030
assertEquals(0, pool.getNumIdle(), "should be zero idle");
1011-
final int maxIdleLimit = 5;
1012-
final int numThreads = 10;
10131031
pool.setMaxIdle(maxIdleLimit);
10141032
pool.setMaxTotal(-1);
10151033

1016-
final CyclicBarrier barrier = new CyclicBarrier(numThreads);
1017-
List<Runnable> tasks = getRunnables(numThreads, barrier, pool);
1034+
final List<Runnable> tasks = operation.apply(pool);
10181035

1019-
ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
1036+
final ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
10201037
try {
10211038
tasks.forEach(executorService::submit);
10221039
executorService.shutdown();
@@ -1032,36 +1049,6 @@ void testAddObjectConcurrentCallsRespectsMaxIdle() throws Exception {
10321049
}
10331050
}
10341051

1035-
@RepeatedTest(10)
1036-
@Timeout(value = 60000, unit = TimeUnit.MILLISECONDS)
1037-
void testReturnObjectRespectsMaxIdleLimit() throws Exception {
1038-
final GenericObjectPoolConfig<String> config = new GenericObjectPoolConfig<>();
1039-
config.setJmxEnabled(false);
1040-
try (final GenericObjectPool<String> pool = new GenericObjectPool<>(new SimpleFactory(), config)) {
1041-
assertEquals(0, pool.getNumIdle(), "should be zero idle");
1042-
final int maxIdleLimit = 10;
1043-
final int numThreads = 200;
1044-
1045-
pool.setMaxTotal(-1);
1046-
pool.setMaxIdle(maxIdleLimit);
1047-
1048-
final CyclicBarrier barrier = new CyclicBarrier(numThreads);
1049-
List<Runnable> tasks = getReturnRunnables(numThreads, barrier, pool);
1050-
1051-
ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
1052-
try {
1053-
tasks.forEach(executorService::submit);
1054-
executorService.shutdown();
1055-
assertTrue(executorService.awaitTermination(60, TimeUnit.SECONDS),
1056-
"Executor did not terminate in time");
1057-
} finally {
1058-
executorService.shutdownNow(); // Ensure cleanup
1059-
}
1060-
1061-
assertEquals(maxIdleLimit, pool.getNumIdle(),
1062-
" Should not be more than " + maxIdleLimit + " idle objects");
1063-
}
1064-
}
10651052

10661053
private List<Runnable> getRunnables(final int numThreads,
10671054
final CyclicBarrier barrier,

0 commit comments

Comments
 (0)