package com.vaadin.v7.data.util.sqlcontainer.connection;
import java.sql.Connection;
import java.sql.SQLException;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.v7.data.util.sqlcontainer.SQLTestsConstants;
import com.vaadin.v7.data.util.sqlcontainer.query.ValidatingSimpleJDBCConnectionPool;
public class SimpleJDBCConnectionPoolTest {
private JDBCConnectionPool connectionPool;
@Before
public void setUp() throws SQLException {
connectionPool = new ValidatingSimpleJDBCConnectionPool(
SQLTestsConstants.dbDriver, SQLTestsConstants.dbURL,
SQLTestsConstants.dbUser, SQLTestsConstants.dbPwd, 2, 2);
}
@Test
public void reserveConnection_reserveNewConnection_returnsConnection()
throws SQLException {
Connection conn = connectionPool.reserveConnection();
Assert.assertNotNull(conn);
}
@Test
public void releaseConnection_releaseUnused_shouldNotThrowException()
throws SQLException {
Connection conn = connectionPool.reserveConnection();
connectionPool.releaseConnection(conn);
Assert.assertFalse(conn.isClosed());
}
@Test(expected = SQLException.class)
public void reserveConnection_noConnectionsLeft_shouldFail()
throws SQLException {
try {
connectionPool.reserveConnection();
connectionPool.reserveConnection();
} catch (SQLException e) {
e.printStackTrace();
Assert.fail(
"Exception before all connections used! " + e.getMessage());
}
connectionPool.reserveConnection();
Assert.fail(
"Reserving connection didn't fail even though no connections are available!");
}
@Test
public void reserveConnection_oneConnectionLeft_returnsConnection()
throws SQLException {
try {
connectionPool.reserveConnection();
} catch (SQLException e) {
e.printStackTrace();
Assert.fail(
"Exception before all connections used! " + e.getMessage());
}
Connection conn = connectionPool.reserveConnection();
Assert.assertNotNull(conn);
}
@Test
public void reserveConnection_oneConnectionJustReleased_returnsConnection()
throws SQLException {
Connection conn2 = null;
try {
connectionPool.reserveConnection();
conn2 = connectionPool.reserveConnection();
} catch (SQLException e) {
e.printStackTrace();
Assert.fail(
"Exception before all connections used! " + e.getMessage());
}
connectionPool.releaseConnection(conn2);
connectionPool.reserveConnection();
}
@Test(expected = IllegalArgumentException.class)
public void construct_allParametersNull_shouldFail() throws SQLException {
SimpleJDBCConnectionPool cp = new SimpleJDBCConnectionPool(null, null,
null, null);
}
@Test(expected = IllegalArgumentException.class)
public void construct_onlyDriverNameGiven_shouldFail() throws SQLException {
SimpleJDBCConnectionPool cp = new SimpleJDBCConnectionPool(
SQLTestsConstants.dbDriver, null, null, null);
}
@Test(expected = IllegalArgumentException.class)
public void construct_onlyDriverNameAndUrlGiven_shouldFail()
throws SQLException {
SimpleJDBCConnectionPool cp = new SimpleJDBCConnectionPool(
SQLTestsConstants.dbDriver, SQLTestsConstants.dbURL, null,
null);
}
@Test(expected = IllegalArgumentException.class)
public void construct_onlyDriverNameAndUrlAndUserGiven_shouldFail()
throws SQLException {
SimpleJDBCConnectionPool cp = new SimpleJDBCConnectionPool(
SQLTestsConstants.dbDriver, SQLTestsConstants.dbURL,
SQLTestsConstants.dbUser, null);
}
@Test(expected = RuntimeException.class)
public void construct_nonExistingDriver_shouldFail() throws SQLException {
SimpleJDBCConnectionPool cp = new SimpleJDBCConnectionPool("foo",
SQLTestsConstants.dbURL, SQLTestsConstants.dbUser,
SQLTestsConstants.dbPwd);
}
@Test
public void reserveConnection_newConnectionOpened_shouldSucceed()
throws SQLException {
connectionPool = new SimpleJDBCConnectionPool(
SQLTestsConstants.dbDriver, SQLTestsConstants.dbURL,
SQLTestsConstants.dbUser, SQLTestsConstants.dbPwd, 0, 2);
Connection c = connectionPool.reserveConnection();
Assert.assertNotNull(c);
}
@Test
public void releaseConnection_nullConnection_shouldDoNothing() {
connectionPool.releaseConnection(null);
}
@Test
public void releaseConnection_failingRollback_shouldCallClose()
throws SQLException {
Connection c = EasyMock.createMock(Connection.class);
c.getAutoCommit();
EasyMock.expectLastCall().andReturn(false);
c.rollback();
EasyMock.expectLastCall().andThrow(new SQLException("Rollback failed"));
c.close();
EasyMock.expectLastCall().atLeastOnce();
EasyMock.replay(c);
// make sure the connection pool is initialized
// Bypass validation
JDBCConnectionPool realPool = ((ValidatingSimpleJDBCConnectionPool) connectionPool)
.getRealPool();
realPool.reserveConnection();
realPool.releaseConnection(c);
EasyMock.verify(c);
}
@Test
public void destroy_shouldCloseAllConnections() throws SQLException {
Connection c1 = connectionPool.reserveConnection();
Connection c2 = connectionPool.reserveConnection();
try {
connectionPool.destroy();
} catch (RuntimeException e) {
// The test connection pool throws an exception when the pool was
// not empty but only after cleanup of the real pool has been done
}
Assert.assertTrue(c1.isClosed());
Assert.assertTrue(c2.isClosed());
}
@Test
public void destroy_shouldCloseAllConnections2() throws SQLException {
Connection c1 = connectionPool.reserveConnection();
Connection c2 = connectionPool.reserveConnection();
connectionPool.releaseConnection(c1);
connectionPool.releaseConnection(c2);
connectionPool.destroy();
Assert.assertTrue(c1.isClosed());
Assert.assertTrue(c2.isClosed());
}
}