/* * Copyright (c) 2004, PostgreSQL Global Development Group * See the LICENSE file in the project root for more information. */ package org.postgresql.test.jdbc2.optional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.postgresql.ds.common.BaseDataSource; import org.postgresql.jdbc2.optional.PoolingDataSource; import org.junit.Test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Minimal tests for pooling DataSource. Needs many more. * * @author Aaron Mulder (ammulder@chariotsolutions.com) */ public class PoolingDataSourceTest extends BaseDataSourceTest { private final static String DS_NAME = "JDBC 2 SE Test DataSource"; @Override public void tearDown() throws Exception { if (bds instanceof PoolingDataSource) { ((PoolingDataSource) bds).close(); } super.tearDown(); } /** * Creates and configures a new SimpleDataSource. */ @Override protected void initializeDataSource() { if (bds == null) { bds = new PoolingDataSource(); setupDataSource(bds); ((PoolingDataSource) bds).setDataSourceName(DS_NAME); ((PoolingDataSource) bds).setInitialConnections(2); ((PoolingDataSource) bds).setMaxConnections(10); } } /** * In this case, we *do* want it to be pooled. */ @Override public void testNotPooledConnection() throws SQLException { con = getDataSourceConnection(); String name = con.toString(); con.close(); con = getDataSourceConnection(); String name2 = con.toString(); con.close(); assertTrue("Pooled DS doesn't appear to be pooling connections!", name.equals(name2)); } /** * In this case, the desired behavior is dereferencing. */ @Override protected void compareJndiDataSource(BaseDataSource oldbds, BaseDataSource bds) { assertTrue("DataSource was serialized or recreated, should have been dereferenced", bds == oldbds); } /** * Check that 2 DS instances can't use the same name. */ @Test public void testCantReuseName() { initializeDataSource(); PoolingDataSource pds = new PoolingDataSource(); try { pds.setDataSourceName(DS_NAME); fail("Should have denied 2nd DataSource with same name"); } catch (IllegalArgumentException e) { } } /** * Closing a Connection twice is not an error. */ @Test public void testDoubleConnectionClose() throws SQLException { con = getDataSourceConnection(); con.close(); con.close(); } /** * Closing a Statement twice is not an error. */ @Test public void testDoubleStatementClose() throws SQLException { con = getDataSourceConnection(); Statement stmt = con.createStatement(); stmt.close(); stmt.close(); con.close(); } @Test public void testConnectionObjectMethods() throws SQLException { con = getDataSourceConnection(); Connection conRef = con; assertEquals(con, conRef); int hc1 = con.hashCode(); con.close(); int hc2 = con.hashCode(); assertEquals(con, conRef); assertEquals(hc1, hc2); } @Test public void testStatementObjectMethods() throws SQLException { con = getDataSourceConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT 1"); Statement stmtRef = stmt; assertEquals(stmt, stmtRef); // Currently we aren't proxying ResultSet, so this doesn't // work, see Bug #1010542. // assertEquals(stmt, rs.getStatement()); int hc1 = stmt.hashCode(); stmt.close(); int hc2 = stmt.hashCode(); assertEquals(stmt, stmtRef); assertEquals(hc1, hc2); } }