Author: markt Date: Sun May 17 16:35:24 2009 New Revision: 775700 URL: http://svn.apache.org/viewvc?rev=775700&view=rev Log: Add test case for POOL-75
Modified: commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java Modified: commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java?rev=775700&r1=775699&r2=775700&view=diff ============================================================================== --- commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java (original) +++ commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java Sun May 17 16:35:24 2009 @@ -1117,6 +1117,7 @@ int _iter = 100; int _delay = 50; boolean _randomDelay = true; + Object _expectedObject = null; public TestThread(ObjectPool pool) { _pool = pool; @@ -1141,6 +1142,10 @@ _randomDelay = randomDelay; } + public void setExpectedObject(Object obj) { + _expectedObject = obj; + } + public boolean complete() { return _complete; } @@ -1168,6 +1173,12 @@ break; } + if (_expectedObject != null && !_expectedObject.equals(obj)) { + _failed = true; + _complete = true; + break; + } + try { Thread.sleep(delay); } catch(Exception e) { @@ -1375,7 +1386,54 @@ protected boolean isFifo() { return false; } - + + /* + * Note: This test relies on timing for correct execution. There *should* be + * enough margin for this to work correctly on most (all?) systems but be + * aware of this if you see a failure of this test. + */ + public void testBorrowObjectFairness() { + // Config + int numThreads = 30; + int maxActive = 10; + + SimpleFactory factory = new SimpleFactory(); + factory.setMaxActive(maxActive); + pool.setFactory(factory); + pool.setMaxActive(maxActive); + pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK); + pool.setTimeBetweenEvictionRunsMillis(-1); + + // Start threads to borrow objects + TestThread[] threads = new TestThread[numThreads]; + for(int i=0;i<numThreads;i++) { + threads[i] = new TestThread(pool, 1, 500, false); + threads[i].setExpectedObject(String.valueOf(i % maxActive)); + Thread t = new Thread(threads[i]); + t.start(); + // Short delay to ensure threads start in correct order + try { + Thread.sleep(10); + } catch (InterruptedException e) { + fail(); + e.printStackTrace(); + } + } + + // Wait for threads to finish + for(int i=0;i<numThreads;i++) { + while(!(threads[i]).complete()) { + try { + Thread.sleep(500L); + } catch(Exception e) { + // ignored + } + } + if(threads[i].failed()) { + fail(); + } + } + } }