package org.infinispan.persistence.jdbc;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.HashSet;
import java.util.Set;
import org.infinispan.persistence.jdbc.configuration.ConnectionFactoryConfiguration;
import org.infinispan.persistence.jdbc.configuration.ConnectionFactoryConfigurationBuilder;
import org.infinispan.persistence.jdbc.configuration.JdbcStringBasedStoreConfigurationBuilder;
import org.infinispan.persistence.jdbc.connectionfactory.C3P0ConnectionPool;
import org.infinispan.persistence.jdbc.connectionfactory.ConnectionPool;
import org.infinispan.persistence.jdbc.connectionfactory.HikariConnectionPool;
import org.infinispan.persistence.jdbc.connectionfactory.PooledConnectionFactory;
import org.infinispan.persistence.spi.PersistenceException;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.test.fwk.UnitTestDatabaseManager;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Tester class for {@link org.infinispan.persistence.jdbc.connectionfactory.PooledConnectionFactory}.
*
* @author Mircea.Markus@jboss.com
* @author Tristan Tarrant
*/
@Test(groups = "functional", testName = "persistence.jdbc.PooledConnectionFactoryTest")
public class PooledConnectionFactoryTest {
private PooledConnectionFactory factory;
private JdbcStringBasedStoreConfigurationBuilder storeBuilder;
private ConnectionFactoryConfigurationBuilder<?> factoryBuilder;
@BeforeMethod
public void beforeMethod() {
factory = new PooledConnectionFactory();
}
@AfterMethod
public void destroyFactory() {
factory.stop();
System.setProperty("infinispan.jdbc.c3p0.force", "false");
}
@Test
public void testHikariValuesNoOverrides() throws Exception {
testValuesNoOverrides();
}
@Test(groups = "unstable", description = "See ISPN-3522")
public void testC3P0ValuesNoOverrides() throws Exception {
System.setProperty("infinispan.jdbc.c3p0.force", "true");
testValuesNoOverrides();
}
private void testValuesNoOverrides() throws Exception {
storeBuilder = TestCacheManagerFactory
.getDefaultCacheConfiguration(false)
.persistence()
.addStore(JdbcStringBasedStoreConfigurationBuilder.class);
factoryBuilder = UnitTestDatabaseManager.configureUniqueConnectionFactory(storeBuilder);
ConnectionFactoryConfiguration factoryConfiguration = factoryBuilder.create();
factory.start(factoryConfiguration, Thread.currentThread().getContextClassLoader());
int hardcodedMaxPoolSize = factory.getMaxPoolSize();
Set<Connection> connections = new HashSet<>();
for (int i = 0; i < hardcodedMaxPoolSize; i++) {
connections.add(factory.getConnection());
}
assert connections.size() == hardcodedMaxPoolSize;
assert factory.getNumBusyConnectionsAllUsers() == hardcodedMaxPoolSize;
for (Connection conn : connections) {
conn.close();
}
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < 2000) {
if (factory.getNumBusyConnectionsAllUsers() == 0)
break;
}
//this must happen eventually
assert factory.getNumBusyConnectionsAllUsers() == 0;
}
@Test(expectedExceptions = PersistenceException.class)
public void testC3PONoDriverClassFound() throws Exception {
System.setProperty("infinispan.jdbc.c3p0.force", "true");
testNoDriverClassFound();
}
@Test(expectedExceptions = PersistenceException.class)
public void testHikariCPNoDriverClassFound() throws Exception {
testNoDriverClassFound();
}
private void testNoDriverClassFound() throws Exception {
storeBuilder = TestCacheManagerFactory
.getDefaultCacheConfiguration(false)
.persistence()
.addStore(JdbcStringBasedStoreConfigurationBuilder.class);
factoryBuilder = UnitTestDatabaseManager.configureBrokenConnectionFactory(storeBuilder);
ConnectionFactoryConfiguration factoryConfiguration = factoryBuilder.create();
factory.start(factoryConfiguration, Thread.currentThread().getContextClassLoader());
}
@Test
public void testHikariCPLoaded() throws Exception {
testConnectionPoolLoaded(HikariConnectionPool.class);
}
@Test
public void testC3POLoaded() throws Exception {
System.setProperty("infinispan.jdbc.c3p0.force", "true");
testConnectionPoolLoaded(C3P0ConnectionPool.class);
}
private void testConnectionPoolLoaded(Class connectionPoolType) throws Exception {
storeBuilder = TestCacheManagerFactory
.getDefaultCacheConfiguration(false)
.persistence()
.addStore(JdbcStringBasedStoreConfigurationBuilder.class);
factoryBuilder = UnitTestDatabaseManager.configureUniqueConnectionFactory(storeBuilder);
ConnectionFactoryConfiguration factoryConfiguration = factoryBuilder.create();
factory.start(factoryConfiguration, Thread.currentThread().getContextClassLoader());
Field field = factory.getClass().getDeclaredField("connectionPool");
field.setAccessible(true);
ConnectionPool connectionPool = (ConnectionPool) field.get(factory);
assert connectionPool != null;
assert connectionPoolType.isInstance(connectionPool);
}
}