Repository: commons-pool Updated Branches: refs/heads/master c7d7b2ab1 -> e64df25b5
[POOL-332] ObjectPool and KeyedObject pool should extend Closeable. Cleaning up tests by managing pools with try-with-resource blocks. More to do. Any help appreciated. 'mvn clean verify' passes. Project: http://git-wip-us.apache.org/repos/asf/commons-pool/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-pool/commit/e64df25b Tree: http://git-wip-us.apache.org/repos/asf/commons-pool/tree/e64df25b Diff: http://git-wip-us.apache.org/repos/asf/commons-pool/diff/e64df25b Branch: refs/heads/master Commit: e64df25b516b6a02be6fd8655356b232be7ebcc9 Parents: c7d7b2a Author: Gary Gregory <ggreg...@apache.org> Authored: Wed Nov 1 10:19:25 2017 -0600 Committer: Gary Gregory <ggreg...@apache.org> Committed: Wed Nov 1 10:19:25 2017 -0600 ---------------------------------------------------------------------- .../org/apache/commons/pool2/TestPoolUtils.java | 243 ++++++++++--------- 1 file changed, 123 insertions(+), 120 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-pool/blob/e64df25b/src/test/java/org/apache/commons/pool2/TestPoolUtils.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/pool2/TestPoolUtils.java b/src/test/java/org/apache/commons/pool2/TestPoolUtils.java index 10f09bb..33737e1 100644 --- a/src/test/java/org/apache/commons/pool2/TestPoolUtils.java +++ b/src/test/java/org/apache/commons/pool2/TestPoolUtils.java @@ -96,9 +96,8 @@ public class TestPoolUtils { } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings("unchecked") - final ObjectPool<Object> pool = createProxy(ObjectPool.class, (List<String>)null); + try (@SuppressWarnings("unchecked") + final ObjectPool<Object> pool = createProxy(ObjectPool.class, (List<String>) null)) { PoolUtils.checkMinIdle(pool, -1, 1); fail("PoolUtils.checkMinIdle(ObjectPool,,) must not accept negative min idle values."); } catch (final IllegalArgumentException iae) { @@ -132,21 +131,22 @@ public class TestPoolUtils { afe = null; try { calledMethods.clear(); - @SuppressWarnings("unchecked") - final ObjectPool<Object> pool = createProxy(ObjectPool.class, calledMethods); - final TimerTask task = PoolUtils.checkMinIdle(pool, 1, CHECK_PERIOD); // checks minIdle immediately - - Thread.sleep(CHECK_SLEEP_PERIOD); // will check CHECK_COUNT more times. - task.cancel(); - task.toString(); + try (@SuppressWarnings("unchecked") + final ObjectPool<Object> pool = createProxy(ObjectPool.class, calledMethods)) { + final TimerTask task = PoolUtils.checkMinIdle(pool, 1, CHECK_PERIOD); // checks minIdle immediately - final List<String> expectedMethods = new ArrayList<>(); - for (int i=0; i < CHECK_COUNT; i++) { - expectedMethods.add("getNumIdle"); - expectedMethods.add("addObject"); + Thread.sleep(CHECK_SLEEP_PERIOD); // will check CHECK_COUNT more times. + task.cancel(); + task.toString(); + + final List<String> expectedMethods = new ArrayList<>(); + for (int i = 0; i < CHECK_COUNT; i++) { + expectedMethods.add("getNumIdle"); + expectedMethods.add("addObject"); + } + expectedMethods.add("toString"); + assertEquals(expectedMethods, calledMethods); // may fail because of the thread scheduler } - expectedMethods.add("toString"); - assertEquals(expectedMethods, calledMethods); // may fail because of the thread scheduler } catch (final AssertionFailedError e) { afe = e; } @@ -164,17 +164,15 @@ public class TestPoolUtils { } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null)) { PoolUtils.checkMinIdle(pool, (Object)null, 1, 1); fail("PoolUtils.checkMinIdle(KeyedObjectPool,Object,int,long) must not accept null keys."); } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null)) { PoolUtils.checkMinIdle(pool, new Object(), -1, 1); fail("PoolUtils.checkMinIdle(KeyedObjectPool,Object,int,long) must not accept negative min idle values."); } catch (final IllegalArgumentException iae) { @@ -212,21 +210,23 @@ public class TestPoolUtils { afe = null; try { calledMethods.clear(); - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, calledMethods); - final TimerTask task = PoolUtils.checkMinIdle(pool, key, 1, CHECK_PERIOD); // checks minIdle immediately - - Thread.sleep(CHECK_SLEEP_PERIOD); // will check CHECK_COUNT more times. - task.cancel(); - task.toString(); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object, Object> pool = createProxy(KeyedObjectPool.class, calledMethods)) { + // checks minIdle immediately + final TimerTask task = PoolUtils.checkMinIdle(pool, key, 1, CHECK_PERIOD); - final List<String> expectedMethods = new ArrayList<>(); - for (int i=0; i < CHECK_COUNT; i++) { - expectedMethods.add("getNumIdle"); - expectedMethods.add("addObject"); + Thread.sleep(CHECK_SLEEP_PERIOD); // will check CHECK_COUNT more times. + task.cancel(); + task.toString(); + + final List<String> expectedMethods = new ArrayList<>(); + for (int i = 0; i < CHECK_COUNT; i++) { + expectedMethods.add("getNumIdle"); + expectedMethods.add("addObject"); + } + expectedMethods.add("toString"); + assertEquals(expectedMethods, calledMethods); // may fail because of the thread scheduler } - expectedMethods.add("toString"); - assertEquals(expectedMethods, calledMethods); // may fail because of the thread scheduler } catch (final AssertionFailedError e) { afe = e; } @@ -237,37 +237,38 @@ public class TestPoolUtils { } @Test - public void testCheckMinIdleKeyedObjectPoolKeys() throws Exception { - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null); + public void testCheckMinIdleKeyedObjectPoolKeysNulls() throws Exception { + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null)) { PoolUtils.checkMinIdle(pool, (Collection<?>) null, 1, 1); fail("PoolUtils.checkMinIdle(KeyedObjectPool,Collection,int,long) must not accept null keys."); } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null)) { PoolUtils.checkMinIdle(pool, (Collection<?>) Collections.emptyList(), 1, 1); } catch (final IllegalArgumentException iae) { fail("PoolUtils.checkMinIdle(KeyedObjectPool,Collection,int,long) must accept empty lists."); } - + } + + @Test + public void testCheckMinIdleKeyedObjectPoolKeys() throws Exception { // Because this isn't deterministic and you can get false failures, try more than once. AssertionFailedError afe = null; int triesLeft = 3; do { afe = null; - try { - final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final KeyedObjectPool<String,Object> pool = createProxy(KeyedObjectPool.class, calledMethods); + final List<String> calledMethods = new ArrayList<>(); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<String, Object> pool = createProxy(KeyedObjectPool.class, calledMethods)) { final Collection<String> keys = new ArrayList<>(2); keys.add("one"); keys.add("two"); - final Map<String, TimerTask> tasks = PoolUtils.checkMinIdle(pool, keys, 1, CHECK_PERIOD); // checks minIdle immediately + // checks minIdle immediately + final Map<String, TimerTask> tasks = PoolUtils.checkMinIdle(pool, keys, 1, CHECK_PERIOD); Thread.sleep(CHECK_SLEEP_PERIOD); // will check CHECK_COUNT more times. for (final TimerTask task : tasks.values()) { @@ -275,7 +276,7 @@ public class TestPoolUtils { } final List<String> expectedMethods = new ArrayList<>(); - for (int i=0; i < CHECK_COUNT * keys.size(); i++) { + for (int i = 0; i < CHECK_COUNT * keys.size(); i++) { expectedMethods.add("getNumIdle"); expectedMethods.add("addObject"); } @@ -299,19 +300,20 @@ public class TestPoolUtils { } final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final ObjectPool<Object> pool = createProxy(ObjectPool.class, calledMethods); + try (@SuppressWarnings("unchecked") + final ObjectPool<Object> pool = createProxy(ObjectPool.class, calledMethods)) { - PoolUtils.prefill(pool, 0); - final List<String> expectedMethods = new ArrayList<>(); - assertEquals(expectedMethods, calledMethods); + PoolUtils.prefill(pool, 0); + final List<String> expectedMethods = new ArrayList<>(); + assertEquals(expectedMethods, calledMethods); - calledMethods.clear(); - PoolUtils.prefill(pool, 3); - for (int i=0; i < 3; i++) { - expectedMethods.add("addObject"); + calledMethods.clear(); + PoolUtils.prefill(pool, 3); + for (int i = 0; i < 3; i++) { + expectedMethods.add("addObject"); + } + assertEquals(expectedMethods, calledMethods); } - assertEquals(expectedMethods, calledMethods); } @Test @@ -322,98 +324,100 @@ public class TestPoolUtils { } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, (List<String>)null); - PoolUtils.prefill(pool, (Object)null, 1); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object, Object> pool = createProxy(KeyedObjectPool.class, (List<String>) null)) { + PoolUtils.prefill(pool, (Object) null, 1); fail("PoolUtils.prefill(KeyedObjectPool,Object,int) must not accept null key."); } catch (final IllegalArgumentException iae) { // expected } final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> pool = createProxy(KeyedObjectPool.class, calledMethods); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object, Object> pool = createProxy(KeyedObjectPool.class, calledMethods)) { - PoolUtils.prefill(pool, new Object(), 0); - final List<String> expectedMethods = new ArrayList<>(); - assertEquals(expectedMethods, calledMethods); + PoolUtils.prefill(pool, new Object(), 0); + final List<String> expectedMethods = new ArrayList<>(); + assertEquals(expectedMethods, calledMethods); - calledMethods.clear(); - PoolUtils.prefill(pool, new Object(), 3); - for (int i=0; i < 3; i++) { - expectedMethods.add("addObject"); + calledMethods.clear(); + PoolUtils.prefill(pool, new Object(), 3); + for (int i = 0; i < 3; i++) { + expectedMethods.add("addObject"); + } + assertEquals(expectedMethods, calledMethods); } - assertEquals(expectedMethods, calledMethods); } @Test public void testPrefillKeyedObjectPoolCollection() throws Exception { - try { - @SuppressWarnings("unchecked") - final KeyedObjectPool<String,String> pool = createProxy(KeyedObjectPool.class, (List<String>)null); - PoolUtils.prefill(pool, (Collection<String>)null, 1); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<String, String> pool = createProxy(KeyedObjectPool.class, (List<String>) null)) { + PoolUtils.prefill(pool, (Collection<String>) null, 1); fail("PoolUtils.prefill(KeyedObjectPool,Collection,int) must not accept null keys."); } catch (final IllegalArgumentException iae) { // expected } final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final KeyedObjectPool<String,Object> pool = createProxy(KeyedObjectPool.class, calledMethods); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<String, Object> pool = createProxy(KeyedObjectPool.class, calledMethods)) { - final Set<String> keys = new HashSet<>(); - PoolUtils.prefill(pool, keys, 0); - final List<String> expectedMethods = new ArrayList<>(); - assertEquals(expectedMethods, calledMethods); + final Set<String> keys = new HashSet<>(); + PoolUtils.prefill(pool, keys, 0); + final List<String> expectedMethods = new ArrayList<>(); + assertEquals(expectedMethods, calledMethods); - calledMethods.clear(); - keys.add("one"); - keys.add("two"); - keys.add("three"); - PoolUtils.prefill(pool, keys, 3); - for (int i=0; i < keys.size() * 3; i++) { - expectedMethods.add("addObject"); + calledMethods.clear(); + keys.add("one"); + keys.add("two"); + keys.add("three"); + PoolUtils.prefill(pool, keys, 3); + for (int i = 0; i < keys.size() * 3; i++) { + expectedMethods.add("addObject"); + } + assertEquals(expectedMethods, calledMethods); } - assertEquals(expectedMethods, calledMethods); } @Test public void testSynchronizedPoolObjectPool() throws Exception { try { - PoolUtils.synchronizedPool((ObjectPool<Object>)null); + PoolUtils.synchronizedPool((ObjectPool<Object>) null); fail("PoolUtils.synchronizedPool(ObjectPool) must not allow a null pool."); - } catch(final IllegalArgumentException iae) { + } catch (final IllegalArgumentException iae) { // expected } final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final ObjectPool<Object> op = createProxy(ObjectPool.class, calledMethods); + try (@SuppressWarnings("unchecked") + final ObjectPool<Object> op = createProxy(ObjectPool.class, calledMethods)) { - final ObjectPool<Object> sop = PoolUtils.synchronizedPool(op); - final List<String> expectedMethods = invokeEveryMethod(sop); - assertEquals(expectedMethods, calledMethods); + final ObjectPool<Object> sop = PoolUtils.synchronizedPool(op); + final List<String> expectedMethods = invokeEveryMethod(sop); + assertEquals(expectedMethods, calledMethods); - // TODO: Anyone feel motivated to construct a test that verifies proper synchronization? + // TODO: Anyone feel motivated to construct a test that verifies proper synchronization? + } } @Test public void testSynchronizedPoolKeyedObjectPool() throws Exception { try { - PoolUtils.synchronizedPool((KeyedObjectPool<Object,Object>)null); + PoolUtils.synchronizedPool((KeyedObjectPool<Object, Object>) null); fail("PoolUtils.synchronizedPool(KeyedObjectPool) must not allow a null pool."); - } catch(final IllegalArgumentException iae) { + } catch (final IllegalArgumentException iae) { // expected } final List<String> calledMethods = new ArrayList<>(); - @SuppressWarnings("unchecked") - final KeyedObjectPool<Object,Object> kop = createProxy(KeyedObjectPool.class, calledMethods); + try (@SuppressWarnings("unchecked") + final KeyedObjectPool<Object, Object> kop = createProxy(KeyedObjectPool.class, calledMethods)) { - final KeyedObjectPool<Object,Object> skop = PoolUtils.synchronizedPool(kop); - final List<String> expectedMethods = invokeEveryMethod(skop); - assertEquals(expectedMethods, calledMethods); + final KeyedObjectPool<Object, Object> skop = PoolUtils.synchronizedPool(kop); + final List<String> expectedMethods = invokeEveryMethod(skop); + assertEquals(expectedMethods, calledMethods); + } // TODO: Anyone feel motivated to construct a test that verifies proper synchronization? } @@ -489,9 +493,8 @@ public class TestPoolUtils { } }; - try { - @SuppressWarnings({ "unchecked", "unused" }) - final Object o = PoolUtils.erodingPool(createProxy(ObjectPool.class, handler), -1f); + try (@SuppressWarnings({ "unchecked", "unused" }) + final ObjectPool<?> o = PoolUtils.erodingPool(createProxy(ObjectPool.class, handler), -1f)) { fail("PoolUtils.erodingPool(ObjectPool, float) must not allow a non-positive factor."); } catch (final IllegalArgumentException iae) { // expected @@ -555,16 +558,15 @@ public class TestPoolUtils { @Test public void testErodingObjectPoolDefaultFactor() { @SuppressWarnings("unchecked") - final - ObjectPool<Object> internalPool = createProxy(ObjectPool.class, new InvocationHandler() { + final ObjectPool<Object> internalPool = createProxy(ObjectPool.class, new InvocationHandler() { @Override - public Object invoke(final Object arg0, final Method arg1, final Object[] arg2) - throws Throwable { + public Object invoke(final Object arg0, final Method arg1, final Object[] arg2) throws Throwable { return null; } }); final ObjectPool<Object> pool = PoolUtils.erodingPool(internalPool); - final String expectedToString = "ErodingObjectPool{factor=ErodingFactor{factor=1.0, idleHighWaterMark=1}, pool=" + internalPool + "}"; + final String expectedToString = "ErodingObjectPool{factor=ErodingFactor{factor=1.0, idleHighWaterMark=1}, pool=" + + internalPool + "}"; // The factor is not exposed, but will be printed in the toString() method // In this case since we didn't pass one, the default 1.0f will be printed assertEquals(expectedToString, pool.toString()); @@ -606,17 +608,15 @@ public class TestPoolUtils { } }; - try { - @SuppressWarnings({ "unchecked", "unused" }) - final Object o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f); + try (@SuppressWarnings({ "unchecked" }) + final KeyedObjectPool<?, ?> o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f)) { fail("PoolUtils.erodingPool(ObjectPool, float) must not allow a non-positive factor."); } catch (final IllegalArgumentException iae) { // expected } - try { - @SuppressWarnings({ "unchecked", "unused" }) - final Object o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f, false); + try (@SuppressWarnings({ "unchecked" }) + final KeyedObjectPool<?, ?> o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f, false)) { fail("PoolUtils.erodingPool(ObjectPool, float, boolean) must not allow a non-positive factor."); } catch (final IllegalArgumentException iae) { // expected @@ -885,6 +885,9 @@ public class TestPoolUtils { @Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + if (calledMethods == null) { + return null; + } calledMethods.add(method.getName()); if (boolean.class.equals(method.getReturnType())) { return Boolean.FALSE;