package org.hivedb.util.database.test; import org.hivedb.Schema; import org.hivedb.meta.Node; import org.hivedb.util.database.Schemas; import org.junit.After; import org.junit.Before; import javax.sql.DataSource; import java.sql.Connection; import java.util.Collection; import java.util.Collections; @SuppressWarnings("unchecked") public abstract class DatabaseTestCase { protected boolean cleanupAfterEachTest = true; protected boolean cleanupOnExit = true; protected boolean createDatabaseIfNoCleanup = true; // overridden by cleanup* flags protected boolean deleteDatabasesAfterEachTest = false; private Collection<String> databaseNames = Collections.EMPTY_LIST; protected abstract void createDatabase(String name); protected abstract void deleteDatabase(String name); protected abstract boolean databaseExists(String name); protected abstract String getConnectString(String name); protected abstract Connection getConnection(String name); protected abstract DataSource getDataSource(String name); protected abstract Collection<Schema> getSchemas(); protected abstract Collection<Node> getDataNodes(); /** * At the end of this method all databases and tables must exist and be empty */ @Before public void beforeMethod() { if( cleanupAfterEachTest ) { for(String name : getDatabaseNames()){ if(databaseExists(name)) { clearTablesOfDatabase(name); } else createDatabase(name); } } else if (createDatabaseIfNoCleanup) for(String name : getDatabaseNames()) createDatabase(name); } /** * At the end of this method all databases and tables must exist and be empty */ @After public void afterMethod() { if( cleanupAfterEachTest ){ for(String name : getDatabaseNames()){ if(databaseExists(name)) { clearTablesOfDatabase(name); if (deleteDatabasesAfterEachTest) { deleteDatabase(name); } } } } } /** * At the end of this method all databases must be deleted */ // @After // protected void afterAll() { // for(String name : getDatabaseNames()) // if(databaseExists(name)) // deleteDatabase(name); // } /** * The name of all databases that need to be created and deleted by this test * @return */ public Collection<String> getDatabaseNames() { return this.databaseNames; } public void setDatabaseNames(Collection<String> names) { this.databaseNames = names; } protected void clearTablesOfDatabase(String name) { for (Schema schema : getSchemas()) { for (Node node : getDataNodes()) { Schemas.emptyTables(schema, node.getUri()); } } } }