Skip to content

Commit

Permalink
[POOL-332] ObjectPool and KeyedObject pool should extend Closeable.
Browse files Browse the repository at this point in the history
Start cleaning up tests by managing pools with try-with-resource blocks.
More to do. Any help appreciated. 'mvn clean verify' passes.
  • Loading branch information
garydgregory committed Oct 31, 2017
1 parent a5c1351 commit d8992b5
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -414,13 +414,10 @@ public void testKPOFCloseUsages() throws Exception {
public void testToString() throws Exception {
final FailingKeyedPooledObjectFactory factory =
new FailingKeyedPooledObjectFactory();
final KeyedObjectPool<Object,Object> pool = makeEmptyPool(factory);
try {
try (final KeyedObjectPool<Object,Object> pool = makeEmptyPool(factory)) {
pool.toString();
} catch(final UnsupportedOperationException uoe) {
return; // test not supported
} finally {
pool.close();
}
}

Expand Down
208 changes: 101 additions & 107 deletions src/test/java/org/apache/commons/pool2/TestPoolUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,11 @@ public void testCheckMinIdleObjectPool() throws Exception {
// Test that the minIdle check doesn't add too many idle objects
@SuppressWarnings("unchecked")
final PooledObjectFactory<Object> pof = createProxy(PooledObjectFactory.class, calledMethods);
final ObjectPool<Object> op = new GenericObjectPool<>(pof);
PoolUtils.checkMinIdle(op, 2, 100);
Thread.sleep(1000);
assertEquals(2, op.getNumIdle());
op.close();
try (final ObjectPool<Object> op = new GenericObjectPool<>(pof)) {
PoolUtils.checkMinIdle(op, 2, 100);
Thread.sleep(1000);
assertEquals(2, op.getNumIdle());
}
int makeObjectCount = 0;
final Iterator<String> iter = calledMethods.iterator();
while (iter.hasNext()) {
Expand Down Expand Up @@ -188,13 +188,13 @@ public void testCheckMinIdleKeyedObjectPool() throws Exception {
@SuppressWarnings("unchecked")
final KeyedPooledObjectFactory<Object,Object> kpof =
createProxy(KeyedPooledObjectFactory.class, calledMethods);
final KeyedObjectPool<Object,Object> kop =
new GenericKeyedObjectPool<>(kpof);
PoolUtils.checkMinIdle(kop, key, 2, 100);
Thread.sleep(400);
assertEquals(2, kop.getNumIdle(key));
assertEquals(2, kop.getNumIdle());
kop.close();
try (final KeyedObjectPool<Object,Object> kop =
new GenericKeyedObjectPool<>(kpof)) {
PoolUtils.checkMinIdle(kop, key, 2, 100);
Thread.sleep(400);
assertEquals(2, kop.getNumIdle(key));
assertEquals(2, kop.getNumIdle());
}
int makeObjectCount = 0;
final Iterator<String> iter = calledMethods.iterator();
while (iter.hasNext()) {
Expand Down Expand Up @@ -463,16 +463,16 @@ public void testSynchronizedPoolableFactoryKeyedPoolableObjectFactory() throws E
@Test
public void testErodingPoolObjectPool() throws Exception {
try {
PoolUtils.erodingPool((ObjectPool<Object>)null);
PoolUtils.erodingPool((ObjectPool<Object>) null);
fail("PoolUtils.erodingPool(ObjectPool) must not allow a null pool.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

try {
PoolUtils.erodingPool((ObjectPool<Object>)null, 1f);
PoolUtils.erodingPool((ObjectPool<Object>) null, 1f);
fail("PoolUtils.erodingPool(ObjectPool, float) must not allow a null pool.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

Expand All @@ -490,66 +490,63 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg
};

try {
@SuppressWarnings({"unchecked", "unused"})
final
Object o = PoolUtils.erodingPool(createProxy(ObjectPool.class, handler), -1f);
@SuppressWarnings({ "unchecked", "unused" })
final Object o = PoolUtils.erodingPool(createProxy(ObjectPool.class, handler), -1f);
fail("PoolUtils.erodingPool(ObjectPool, float) must not allow a non-positive factor.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

// If the logic behind PoolUtils.erodingPool changes then this will need to be tweaked.
final float factor = 0.01f; // about ~9 seconds until first discard
@SuppressWarnings("unchecked")
final ObjectPool<Object> pool = PoolUtils.erodingPool(
createProxy(ObjectPool.class, handler), factor);

final List<String> expectedMethods = new ArrayList<>();
assertEquals(expectedMethods, calledMethods);

pool.addObject();
expectedMethods.add("addObject");

Object o = pool.borrowObject();
expectedMethods.add("borrowObject");

assertEquals(expectedMethods, calledMethods);
try (@SuppressWarnings("unchecked")
final ObjectPool<Object> pool = PoolUtils.erodingPool(createProxy(ObjectPool.class, handler), factor)) {

pool.returnObject(o);
expectedMethods.add("returnObject");
assertEquals(expectedMethods, calledMethods);
assertEquals(expectedMethods, calledMethods);

// the invocation handler always returns 1
assertEquals(1, pool.getNumActive());
expectedMethods.add("getNumActive");
assertEquals(1, pool.getNumIdle());
expectedMethods.add("getNumIdle");
pool.addObject();
expectedMethods.add("addObject");

for (int i=0; i < 5; i ++) {
o = pool.borrowObject();
Object o = pool.borrowObject();
expectedMethods.add("borrowObject");

Thread.sleep(50);
assertEquals(expectedMethods, calledMethods);

pool.returnObject(o);
expectedMethods.add("returnObject");

assertEquals(expectedMethods, calledMethods);

expectedMethods.clear();
calledMethods.clear();
}
// the invocation handler always returns 1
assertEquals(1, pool.getNumActive());
expectedMethods.add("getNumActive");
assertEquals(1, pool.getNumIdle());
expectedMethods.add("getNumIdle");

Thread.sleep(10000); // 10 seconds
for (int i = 0; i < 5; i++) {
o = pool.borrowObject();
expectedMethods.add("borrowObject");

Thread.sleep(50);

o = pool.borrowObject();
expectedMethods.add("borrowObject");
pool.returnObject(o);
expectedMethods.add("getNumIdle");
expectedMethods.add("invalidateObject");
pool.clear();
pool.close();
pool.returnObject(o);
expectedMethods.add("returnObject");

assertEquals(expectedMethods, calledMethods);

expectedMethods.clear();
calledMethods.clear();
}

Thread.sleep(10000); // 10 seconds

o = pool.borrowObject();
expectedMethods.add("borrowObject");
pool.returnObject(o);
expectedMethods.add("getNumIdle");
expectedMethods.add("invalidateObject");
pool.clear();
}
expectedMethods.add("clear");
expectedMethods.add("close");
assertEquals(expectedMethods, calledMethods);
Expand All @@ -576,23 +573,23 @@ public Object invoke(final Object arg0, final Method arg1, final Object[] arg2)
@Test
public void testErodingPoolKeyedObjectPool() throws Exception {
try {
PoolUtils.erodingPool((KeyedObjectPool<Object,Object>)null);
PoolUtils.erodingPool((KeyedObjectPool<Object, Object>) null);
fail("PoolUtils.erodingPool(KeyedObjectPool) must not allow a null pool.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

try {
PoolUtils.erodingPool((KeyedObjectPool<Object,Object>)null, 1f);
PoolUtils.erodingPool((KeyedObjectPool<Object, Object>) null, 1f);
fail("PoolUtils.erodingPool(KeyedObjectPool, float) must not allow a null pool.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

try {
PoolUtils.erodingPool((KeyedObjectPool<Object,Object>)null, 1f, true);
PoolUtils.erodingPool((KeyedObjectPool<Object, Object>) null, 1f, true);
fail("PoolUtils.erodingPool(KeyedObjectPool, float, boolean) must not allow a null pool.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

Expand All @@ -610,77 +607,74 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg
};

try {
@SuppressWarnings({"unchecked", "unused"})
final
Object o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f);
@SuppressWarnings({ "unchecked", "unused" })
final Object o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f);
fail("PoolUtils.erodingPool(ObjectPool, float) must not allow a non-positive factor.");
} catch(final IllegalArgumentException iae) {
} catch (final IllegalArgumentException iae) {
// expected
}

try {
@SuppressWarnings({"unchecked", "unused"})
final
Object o = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), 0f, false);
@SuppressWarnings({ "unchecked", "unused" })
final Object 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) {
} catch (final IllegalArgumentException iae) {
// expected
}

// If the logic behind PoolUtils.erodingPool changes then this will need to be tweaked.
final float factor = 0.01f; // about ~9 seconds until first discard
@SuppressWarnings("unchecked")
final KeyedObjectPool<Object,Object> pool =
PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler), factor);

final List<String> expectedMethods = new ArrayList<>();
assertEquals(expectedMethods, calledMethods);

final Object key = "key";

pool.addObject(key);
expectedMethods.add("addObject");

Object o = pool.borrowObject(key);
expectedMethods.add("borrowObject");
try (@SuppressWarnings("unchecked")
final KeyedObjectPool<Object, Object> pool = PoolUtils.erodingPool(createProxy(KeyedObjectPool.class, handler),
factor)) {

assertEquals(expectedMethods, calledMethods);
assertEquals(expectedMethods, calledMethods);

pool.returnObject(key, o);
expectedMethods.add("returnObject");
assertEquals(expectedMethods, calledMethods);
final Object key = "key";

// the invocation handler always returns 1
assertEquals(1, pool.getNumActive());
expectedMethods.add("getNumActive");
assertEquals(1, pool.getNumIdle());
expectedMethods.add("getNumIdle");
pool.addObject(key);
expectedMethods.add("addObject");

for (int i=0; i < 5; i ++) {
o = pool.borrowObject(key);
Object o = pool.borrowObject(key);
expectedMethods.add("borrowObject");

Thread.sleep(50);
assertEquals(expectedMethods, calledMethods);

pool.returnObject(key, o);
expectedMethods.add("returnObject");

assertEquals(expectedMethods, calledMethods);

expectedMethods.clear();
calledMethods.clear();
}
// the invocation handler always returns 1
assertEquals(1, pool.getNumActive());
expectedMethods.add("getNumActive");
assertEquals(1, pool.getNumIdle());
expectedMethods.add("getNumIdle");

Thread.sleep(10000); // 10 seconds
for (int i = 0; i < 5; i++) {
o = pool.borrowObject(key);
expectedMethods.add("borrowObject");

Thread.sleep(50);

o = pool.borrowObject(key);
expectedMethods.add("borrowObject");
pool.returnObject(key, o);
expectedMethods.add("getNumIdle");
expectedMethods.add("invalidateObject");
pool.clear();
pool.close();
pool.returnObject(key, o);
expectedMethods.add("returnObject");

assertEquals(expectedMethods, calledMethods);

expectedMethods.clear();
calledMethods.clear();
}

Thread.sleep(10000); // 10 seconds

o = pool.borrowObject(key);
expectedMethods.add("borrowObject");
pool.returnObject(key, o);
expectedMethods.add("getNumIdle");
expectedMethods.add("invalidateObject");
pool.clear();
}
expectedMethods.add("clear");
expectedMethods.add("close");
assertEquals(expectedMethods, calledMethods);
Expand Down

0 comments on commit d8992b5

Please sign in to comment.