/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.core.db; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import java.util.Properties; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; /** * Provides some methods that database tests can use - create a database unit test class and have it extend this class. * * @author John Mazzitelli * */ public class AbstractDatabaseTestUtil { private static final String PROPERTY_PREFIX = "test."; private Properties databaseConnectionInfo; private Connection databaseConnection; /** * Loads in the test .properties file that contains the JDBC connection information to our test databases. * * @throws Exception */ @BeforeClass protected void loadTestDatabaseConnectionInfo() throws Exception { Properties default_info = new Properties(); InputStream is = this.getClass().getClassLoader().getResourceAsStream("test-databases.properties"); default_info.load(is); databaseConnectionInfo = new Properties(default_info); // any properties found in the system properties will override the defaults Properties overrides = System.getProperties(); for (Map.Entry<Object, Object> entry : overrides.entrySet()) { String prop_name = entry.getKey().toString(); if (prop_name.toString().startsWith(PROPERTY_PREFIX)) { String prop_value = entry.getValue().toString(); databaseConnectionInfo.setProperty(prop_name, prop_value); } } return; } /** * If a test opened a connection, close it. */ @AfterMethod protected void closeConnection() { if (databaseConnection != null) { try { if (!databaseConnection.isClosed()) { databaseConnection.close(); } } catch (SQLException e) { e.printStackTrace(System.err); } finally { databaseConnection = null; } } return; } /** * Gets connection to the test h2 database, will be <code>null</code> if not defined. * * @return connection * * @throws Exception */ protected Connection getH2Connection() throws Exception { return getConnection("h2"); } /** * Gets connection to the test h2 database of the specified version, will be <code>null</code> if not * defined. * * @param version * * @return connection * * @throws Exception */ protected Connection getH2Connection(String version) throws Exception { return getConnection("h2" + version); } /** * Gets connection to the test postgresql database, will be <code>null</code> if not defined. * * @return connection * * @throws Exception */ protected Connection getPostgresConnection() throws Exception { return getConnection("postgresql"); } /** * Gets connection to the test postgresql database of the specified version, will be <code>null</code> if not * defined. * * @param version * * @return connection * * @throws Exception */ protected Connection getPostgresConnection(String version) throws Exception { return getConnection("postgresql" + version); } /** * Gets connection to the test oracle database, will be <code>null</code> if not defined. * * @return connection * * @throws Exception */ protected Connection getOracleConnection() throws Exception { return getConnection("oracle"); } /** * Gets connection to the test oracle database of the specified version, will be <code>null</code> if not defined. * * @param version * * @return connection * * @throws Exception */ protected Connection getOracleConnection(String version) throws Exception { return getConnection("oracle" + version); } /** * Gets connection to the test database, will be <code>null</code> if not defined. * * @param database identifies the database (the key to the test .properties file) * * @return connection * * @throws Exception */ protected Connection getConnection(String database) throws Exception { String url = getTestDatabaseConnectionUrl(database); String username = getTestDatabaseConnectionUsername(database); String password = getTestDatabaseConnectionPassword(database); Connection conn = null; try { if (url == null) { throw new Exception("No test database named '" + database + "' defined; cannot run tests that need that DB"); } conn = DbUtil.getConnection(url, username, password); } catch (Exception e) { if (!Boolean.getBoolean("DatabaseTest.nofail")) { throw new UnsupportedOperationException( (database + " is not available; set DatabaseTest.nofail system property if you want to skip the tests"), e); } System.err.println(database + " is not available (" + e.toString() + "). DatabaseTest.nofail is set - skipping test"); } // just do some simple things with the connection to make sure we can use this // this also crudely exercises the jdbc logging if we use the logging jdbc URL if (conn != null) { conn.getAutoCommit(); conn.getCatalog(); conn.getHoldability(); conn.getMetaData(); conn.getTransactionIsolation(); conn.getTypeMap(); conn.getWarnings(); } return conn; } /** * Returns the JDBC URL to be used to connect to the given test database. * * @param database * * @return the JDBC URL */ protected String getTestDatabaseConnectionUrl(String database) { String str = databaseConnectionInfo.getProperty(getTestDatabasePropertyPrefix(database) + "url"); return str; } /** * Returns the username to be used to connect to the given test database. * * @param database * * @return the username */ protected String getTestDatabaseConnectionUsername(String database) { String str = databaseConnectionInfo.getProperty(getTestDatabasePropertyPrefix(database) + "username"); return str; } /** * Returns the password to be used to connect to the given test database. * * @param database * * @return the password */ protected String getTestDatabaseConnectionPassword(String database) { String str = databaseConnectionInfo.getProperty(getTestDatabasePropertyPrefix(database) + "password"); return str; } /** * Returns the property prefix for all database connection property names for the given test database. Use this as * part of the property name when looking up things in {@link #databaseConnectionInfo}. * * @param database * * @return property name prefix to identify those connection properties for the given test database. */ protected String getTestDatabasePropertyPrefix(String database) { return PROPERTY_PREFIX + database + "."; } }