content: package com.alibaba.druid.bvt.pool;
  
  import com.alibaba.druid.pool.DruidDataSource;
  import junit.framework.TestCase;
  
  import java.sql.Connection;
  import java.util.concurrent.CountDownLatch;
  import java.util.concurrent.TimeUnit;
  
  /**
   * 这个场景测试maxActive < 0
   *
   * @author wenshao [szujobs@hotmail.com]
   */
  public class DruidDataSourceTest_notEmptyWait extends TestCase {
      private DruidDataSource dataSource;
  
      protected void setUp() throws Exception {
          dataSource = new DruidDataSource();
          dataSource.setUrl("jdbc:mock:xxx");
          dataSource.setTestOnBorrow(false);
          dataSource.setFilters("stat");
          dataSource.setMaxActive(1);
      }
  
      protected void tearDown() throws Exception {
          dataSource.close();
      }
  
      public void test_error() throws Exception {
          {
              Connection conn = dataSource.getConnection();
              conn.close();
              assertEquals(1, dataSource.getNotEmptyWaitCount());
          }
  
          {
              Connection conn = dataSource.getConnection();
              conn.close();
              assertEquals(1, dataSource.getNotEmptyWaitCount()); // notEmptyWaitCount没有增长
          }
  
          Connection conn = dataSource.getConnection();
  
          final int THREAD_COUNT = 10;
          final CountDownLatch startLatch = new CountDownLatch(THREAD_COUNT);
          final CountDownLatch endLatch = new CountDownLatch(THREAD_COUNT);
          Thread[] threads = new Thread[THREAD_COUNT];
          for (int i = 0; i < THREAD_COUNT; ++i) {
              threads[i] = new Thread("thread-" + i) {
                  public void run() {
                      startLatch.countDown();
                      try {
                          Connection conn = dataSource.getConnection();
                          Thread.sleep(1);
                          conn.close();
                      } catch (Exception e) {
                          //e.printStackTrace();
                      } finally {
                          endLatch.countDown();
                      }
                  }
              };
              threads[i].start();
          }
  
          startLatch.await(10, TimeUnit.MILLISECONDS);
  
          for (int i = 0; i < 100; ++i) {
              if (dataSource.getNotEmptyWaitThreadCount() == 10) {
                  break;
              }
              Thread.sleep(10);
          }
  
          assertEquals(10, dataSource.getNotEmptyWaitThreadCount());
          assertEquals(10, dataSource.getNotEmptyWaitThreadPeak());
  
          conn.close();
  
          endLatch.await(100, TimeUnit.MILLISECONDS);
  
          Thread.sleep(10);
  //        assertEquals(0, dataSource.getNotEmptyWaitThreadCount());
          assertEquals(10, dataSource.getNotEmptyWaitThreadPeak());
      }
  }
  