1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.pool2.impl;
18
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertNull;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24
25 import java.lang.reflect.Field;
26 import java.util.concurrent.ScheduledFuture;
27 import java.util.concurrent.ThreadPoolExecutor;
28
29 import org.apache.commons.pool2.BasePooledObjectFactory;
30 import org.apache.commons.pool2.PooledObject;
31 import org.junit.jupiter.api.Test;
32
33
34
35
36 public class TestEvictionTimer {
37
38 @Test
39 public void testStartStopEvictionTimer() throws Exception {
40
41 try (final GenericObjectPool<String> pool = new GenericObjectPool<>(new BasePooledObjectFactory<String>() {
42
43 @Override
44 public String create() {
45 return null;
46 }
47
48 @Override
49 public PooledObject<String> wrap(final String obj) {
50 return new DefaultPooledObject<>(obj);
51 }
52 })) {
53
54
55 final BaseGenericObjectPool<String>.Evictor evictor1 = pool.new Evictor();
56 EvictionTimer.schedule(evictor1, TestConstants.ONE_MINUTE_DURATION, TestConstants.ONE_MINUTE_DURATION);
57
58
59
60 final Field evictorTaskFutureField =
61 evictor1.getClass().getDeclaredField("scheduledFuture");
62 evictorTaskFutureField.setAccessible(true);
63 ScheduledFuture<?> sf = (ScheduledFuture<?>) evictorTaskFutureField.get(evictor1);
64 assertFalse(sf.isCancelled());
65
66 final Field evictorExecutorField = EvictionTimer.class.getDeclaredField("executor");
67 evictorExecutorField.setAccessible(true);
68 final ThreadPoolExecutor evictionExecutor = (ThreadPoolExecutor) evictorExecutorField.get(null);
69 assertEquals(2, evictionExecutor.getQueue().size());
70 assertEquals(1, EvictionTimer.getNumTasks());
71
72
73 final BaseGenericObjectPool<String>.Evictor evictor2 = pool.new Evictor();
74 EvictionTimer.schedule(evictor2, TestConstants.ONE_MINUTE_DURATION, TestConstants.ONE_MINUTE_DURATION);
75
76
77
78 sf = (ScheduledFuture<?>) evictorTaskFutureField.get(evictor2);
79 assertFalse(sf.isCancelled());
80
81 assertEquals(3, evictionExecutor.getQueue().size());
82 assertEquals(2, EvictionTimer.getNumTasks());
83
84
85 EvictionTimer.cancel(evictor1, BaseObjectPoolConfig.DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT, false);
86
87
88
89 sf = (ScheduledFuture<?>) evictorTaskFutureField.get(evictor1);
90 assertTrue(sf.isCancelled());
91
92 final ThreadPoolExecutor evictionExecutorOnStop = (ThreadPoolExecutor) evictorExecutorField.get(null);
93 assertEquals(2, evictionExecutorOnStop.getQueue().size());
94 assertEquals(1, EvictionTimer.getNumTasks());
95
96
97 EvictionTimer.cancel(evictor2, BaseObjectPoolConfig.DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT, false);
98
99
100
101 sf = (ScheduledFuture<?>) evictorTaskFutureField.get(evictor2);
102 assertTrue(sf.isCancelled());
103
104 assertNull(evictorExecutorField.get(null));
105 assertEquals(0, EvictionTimer.getNumTasks());
106 }
107 }
108 }