/*
* Copyright (c) 2004, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.test.jdbc2;
import org.postgresql.test.TestUtil;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class TypeCacheDLLStressTest extends BaseTest4 {
private final static int DURATION = Integer.getInteger("TypeCacheDLLStressTest.DURATION", 5);
private Connection con2;
@Override
protected void updateProperties(Properties props) {
try {
con2 = TestUtil.openDB(props);
} catch (Exception e) {
throw new IllegalStateException("Unable to open second DB connection", e);
}
}
@Override
public void setUp() throws Exception {
super.setUp();
TestUtil.createTable(con, "create_and_drop_table", "user_id serial PRIMARY KEY");
}
@Override
public void tearDown() throws SQLException {
TestUtil.closeDB(con2);
}
@Test
public void createDropTableAndGetTypeInfo() throws Throwable {
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Void> typeInfoCache = executor.submit(new Callable<Void>() {
public Void call() throws Exception {
while (!Thread.currentThread().isInterrupted()) {
ResultSet rs = con.getMetaData().getTypeInfo();
rs.close();
}
return null;
}
});
Future<Void> createAndDrop = executor.submit(new Callable<Void>() {
public Void call() throws Exception {
Statement stmt = con2.createStatement();
while (!Thread.currentThread().isInterrupted()) {
stmt.execute("drop TABLE create_and_drop_table");
stmt.execute("CREATE TABLE create_and_drop_table"
+ "( user_id serial PRIMARY KEY, username VARCHAR (50) UNIQUE NOT NULL"
+ ", password VARCHAR (50) NOT NULL, email VARCHAR (355) UNIQUE NOT NULL"
+ ", created_on TIMESTAMP NOT NULL, last_login TIMESTAMP)");
}
return null;
}
});
try {
typeInfoCache.get(DURATION, TimeUnit.SECONDS);
} catch (ExecutionException e) {
createAndDrop.cancel(true);
throw e.getCause();
} catch (TimeoutException e) {
// Test is expected to run as long as it can
}
typeInfoCache.cancel(true);
createAndDrop.cancel(true);
try {
createAndDrop.get(DURATION, TimeUnit.SECONDS);
} catch (ExecutionException e) {
throw e.getCause();
} catch (TimeoutException e) {
// Test is expected to run as long as it can
} catch (CancellationException e) {
// Ignore
}
}
}