Author: markt
Date: Sun Jun 21 16:24:55 2009
New Revision: 787047

URL: http://svn.apache.org/viewvc?rev=787047&view=rev
Log:
Add a test case for DBCP-291

Modified:
    
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java

Modified: 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java?rev=787047&r1=787046&r2=787047&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java
 Sun Jun 21 16:24:55 2009
@@ -318,6 +318,53 @@
         }
     }
     
+    public void testMaxWait() throws Exception {
+        final int maxWait = 1000;
+        final int theadCount = 20;
+        
+        ((SharedPoolDataSource)ds).setMaxWait(maxWait);
+        // Obtain all the connections from the pool
+        Connection[] c = new Connection[getMaxActive()];
+        for (int i=0; i<c.length; i++) {
+            c[i] = ds.getConnection("foo","bar");
+            assertTrue(c[i] != null);            
+        }
+
+        long start = System.currentTimeMillis();
+        
+        // Run a thread test with minimal hold time
+        // All threads should end after maxWait - DBCP-291
+        final PoolTest[] pts = new PoolTest[theadCount];
+        ThreadGroup threadGroup = new ThreadGroup("testMaxWait");
+
+        // Should take ~maxWait for threads to stop 
+        for (int i = 0; i < pts.length; i++) {
+            pts[i] = new PoolTest(threadGroup, 1, true);
+        }
+        
+        // Wait for all the threads to complete
+        boolean running = true;
+        while (running) {
+            Thread.sleep(maxWait / 2);
+            running = false;
+            for (int i = 0; i < pts.length; i++) {
+                running = running || pts[i].isRun; 
+            }
+        }
+        
+        long end = System.currentTimeMillis();
+        
+        System.out.println("testMaxWait took " + (end-start) + " ms");
+        
+        // Threads should time out in parallel - allow double that to be safe
+        assertTrue((end-start) < (2 * maxWait)); 
+
+        // Put all the connections back in the pool
+        for (int i=0; i<c.length; i++) {
+            c[i].close();
+        }
+    }
+
     public void testMultipleThreads() throws Exception {
         assertTrue(multipleThreads(1));
         assertTrue(!multipleThreads(2 * (int)(getMaxWait())));
@@ -372,8 +419,16 @@
 
         private String state;
 
+        boolean isStopOnException;
+
         protected PoolTest(ThreadGroup threadGroup, int connHoldTime) {
+            this(threadGroup, connHoldTime, false);
+        }
+            
+        protected PoolTest(ThreadGroup threadGroup, int connHoldTime,
+                boolean isStopOnException) {
             this.connHoldTime = connHoldTime;
+            this.isStopOnException = isStopOnException;
             Thread thread =
                 new Thread(threadGroup, this, "Thread+" + 
currentThreadCount++);
             thread.setDaemon(false);
@@ -402,9 +457,19 @@
                     stmt.close();
                     conn.close();
                 } catch (RuntimeException e) {
-                    throw e;
+                    if (isStopOnException) {
+                        stop();
+                        e.printStackTrace();
+                    } else {
+                        throw e;
+                    }
                 } catch (Exception e) {
-                    throw new RuntimeException(e.toString());
+                    if (isStopOnException) {
+                        stop();
+                        e.printStackTrace();
+                    } else {
+                        throw new RuntimeException(e.toString());
+                    }
                 }
             }
         }


Reply via email to