package com.alibaba.druid.bvt.pool;
import java.sql.SQLException;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
/**
* 这个场景测试并发初始化
* @author wenshao<szujobs@hotmail.com>
*
*/
public class DruidDataSourceTest3 extends TestCase {
private DruidDataSource dataSource;
private volatile Exception error;
private volatile Exception errorB;
protected void setUp() throws Exception {
dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mock:xxx");
dataSource.setTestOnBorrow(false);
dataSource.setInitialSize(1);
dataSource.getProxyFilters().add(new FilterAdapter() {
public ConnectionProxy connection_connect(FilterChain chain, Properties info) throws SQLException {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
// skip
}
return null;
}
});
}
protected void tearDown() throws Exception {
dataSource.close();
}
public void test_error() throws Exception {
final CountDownLatch startedLatch = new CountDownLatch(1);
final CountDownLatch endLatch = new CountDownLatch(1);
Thread threadA = new Thread("A") {
public void run() {
try {
startedLatch.countDown();
dataSource.init();
} catch (SQLException e) {
error = e;
} finally {
endLatch.countDown();
}
}
};
threadA.start();
startedLatch.await();
Thread.sleep(10);
Assert.assertFalse(dataSource.isInited());
final CountDownLatch startedLatchB = new CountDownLatch(1);
final CountDownLatch endLatchB = new CountDownLatch(1);
Thread threadB = new Thread("B") {
public void run() {
try {
startedLatchB.countDown();
dataSource.init();
} catch (SQLException e) {
errorB = e;
} finally {
endLatchB.countDown();
}
}
};
threadB.start();
startedLatchB.await();
threadB.interrupt();
endLatchB.await();
Assert.assertNotNull(errorB);
Assert.assertTrue(errorB.getCause() instanceof InterruptedException);
threadA.interrupt();
endLatch.await();
endLatchB.await();
Assert.assertNotNull(error);
Assert.assertEquals(1, dataSource.getCreateErrorCount());
}
}