package org.ovirt.engine.core.dao; import java.sql.Connection; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; import org.dbunit.database.DatabaseConfig; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.XmlDataSet; import org.dbunit.operation.DatabaseOperation; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.springframework.beans.factory.DisposableBean; import org.springframework.jdbc.datasource.SingleConnectionDataSource; import org.springframework.test.annotation.NotTransactional; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; import org.springframework.transaction.annotation.Transactional; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionalTestExecutionListener; import org.ovirt.engine.core.common.businessentities.AuditLog; import org.ovirt.engine.core.common.businessentities.DbUser; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageDynamic; import org.ovirt.engine.core.common.businessentities.DiskImageTemplate; import org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map; import org.ovirt.engine.core.common.businessentities.LUNs; import org.ovirt.engine.core.common.businessentities.RoleGroupMap; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VdcOption; import org.ovirt.engine.core.common.businessentities.VdsDynamic; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.VdsStatistics; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.action_version_map; import org.ovirt.engine.core.common.businessentities.ad_groups; import org.ovirt.engine.core.common.businessentities.async_tasks; import org.ovirt.engine.core.common.businessentities.bookmarks; import org.ovirt.engine.core.common.businessentities.event_map; import org.ovirt.engine.core.common.businessentities.event_notification_hist; import org.ovirt.engine.core.common.businessentities.event_notification_methods; import org.ovirt.engine.core.common.businessentities.event_subscriber; import org.ovirt.engine.core.common.businessentities.image_group_storage_domain_map; import org.ovirt.engine.core.common.businessentities.image_vm_map; import org.ovirt.engine.core.common.businessentities.image_vm_pool_map; import org.ovirt.engine.core.common.businessentities.network; import org.ovirt.engine.core.common.businessentities.network_cluster; import org.ovirt.engine.core.common.businessentities.permissions; import org.ovirt.engine.core.common.businessentities.roles; import org.ovirt.engine.core.common.businessentities.stateless_vm_image_map; import org.ovirt.engine.core.common.businessentities.storage_domain_dynamic; import org.ovirt.engine.core.common.businessentities.storage_domain_static; import org.ovirt.engine.core.common.businessentities.storage_pool; import org.ovirt.engine.core.common.businessentities.storage_pool_iso_map; import org.ovirt.engine.core.common.businessentities.storage_server_connections; import org.ovirt.engine.core.common.businessentities.tags; import org.ovirt.engine.core.common.businessentities.tags_user_group_map; import org.ovirt.engine.core.common.businessentities.tags_user_map; import org.ovirt.engine.core.common.businessentities.tags_vds_map; import org.ovirt.engine.core.common.businessentities.tags_vm_map; import org.ovirt.engine.core.common.businessentities.tags_vm_pool_map; import org.ovirt.engine.core.common.businessentities.time_lease_vm_pool_map; import org.ovirt.engine.core.common.businessentities.vm_pool_map; import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.common.businessentities.vm_template_image_map; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.DbFacadeLocator; import org.ovirt.engine.core.dal.dbbroker.user_sessions; import org.ovirt.engine.core.dal.dbbroker.generic.DBConfigUtils; /** * <code>BaseDAOTestCase</code> provides a foundation for creating unit tests for the persistence layer. * * */ @RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({TransactionalTestExecutionListener.class}) @ContextConfiguration(loader=CustomizedContextLoader.class) @Transactional public abstract class BaseDAOTestCase { private static SessionFactory sessionFactory; protected static DbFacade dbFacade; private static Object dataFactory; protected static boolean needInitializationSql = false; protected static String initSql; protected static DataSource dataSource; private static IDataSet dataset; @NotTransactional @BeforeClass public static void initTestCase() throws Exception { dataSource = createDataSource(); dataset = initDataSet(); dbFacade = new DbFacade(); dbFacade.setDbEngineDialect(DbFacadeLocator.loadDbEngineDialect()); dbFacade.setTemplate(dbFacade.getDbEngineDialect().createJdbcTemplate(dataSource)); //load data from fixtures to DB DatabaseOperation.CLEAN_INSERT.execute(getConnection(), dataset); } @NotTransactional @AfterClass public static void tearDownTestCase() throws Exception { ((DisposableBean) getDataSource()).destroy(); } @Before public void setUp() throws Exception { } protected <T> T prepareDAO(T dao) { if (dao instanceof BaseDAOHibernateImpl || dao instanceof BaseDAOWrapperImpl) { if (sessionFactory == null) { sessionFactory = getSessionFactory(); } } if (dao instanceof BaseDAOHibernateImpl) { ((BaseDAOHibernateImpl<?, ?>) dao).setSession(getSession()); } else if (dao instanceof BaseDAOWrapperImpl) { ((BaseDAOWrapperImpl) dao).setSession(getSession()); } return dao; } private static IDataSet initDataSet() throws Exception { return new XmlDataSet(BaseDAOTestCase.class.getResourceAsStream( "/fixtures.xml")); } protected void setUpDatabaseConfig(DatabaseConfig config) { config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, dataFactory); } protected static IDatabaseConnection getConnection() throws Exception { // get connection and setup it's meta data Connection con = dataSource.getConnection(); IDatabaseConnection connection = new DatabaseConnection(con); connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, dataFactory); if (needInitializationSql) { Statement stmt = con.createStatement(); stmt.executeUpdate(initSql); } return connection; } private static DataSource createDataSource() { DataSource result = null; Properties properties = new Properties(); Config.setConfigUtils(new DBConfigUtils(false)); try { String job = System.getProperty("JOB_NAME"); if(job == null) job = ""; String number = System.getProperty("BUILD_NUMBER"); if(number == null) number = ""; String schemaNamePostfix = job + number; properties.load(BaseDAOTestCase.class.getResourceAsStream( "/test-database.properties")); ClassLoader.getSystemClassLoader().loadClass( properties.getProperty("database.driver")); String dbUrl = properties.getProperty("database.url") + schemaNamePostfix; result = new SingleConnectionDataSource( dbUrl, properties.getProperty("database.username"), properties.getProperty("database.password"), true); initSql = properties.getProperty("database.initsql"); loadDataFactory(properties.getProperty("database.testing.datafactory")); if (initSql != null && !initSql.isEmpty()) { needInitializationSql = true; } } catch (Exception error) { error.printStackTrace(); throw new RuntimeException("Cannot create data source", error); } return result; } protected SessionFactory getSessionFactory() { if (sessionFactory == null) { sessionFactory = new AnnotationConfiguration() .addAnnotatedClass(action_version_map.class) .addAnnotatedClass(ad_groups.class) .addAnnotatedClass(async_tasks.class) .addAnnotatedClass(AuditLog.class) .addAnnotatedClass(bookmarks.class) .addAnnotatedClass(DbUser.class) .addAnnotatedClass(DiskImage.class) .addAnnotatedClass(DiskImageDynamic.class) .addAnnotatedClass(DiskImageTemplate.class) .addAnnotatedClass(event_map.class) .addAnnotatedClass(event_notification_hist.class) .addAnnotatedClass(event_notification_methods.class) .addAnnotatedClass(event_subscriber.class) .addAnnotatedClass(image_group_storage_domain_map.class) .addAnnotatedClass(image_vm_map.class) .addAnnotatedClass(image_vm_pool_map.class) .addAnnotatedClass(LUN_storage_server_connection_map.class) .addAnnotatedClass(LUNs.class) .addAnnotatedClass(network_cluster.class) .addAnnotatedClass(network.class) .addAnnotatedClass(permissions.class) .addAnnotatedClass(RoleGroupMap.class) .addAnnotatedClass(roles.class) .addAnnotatedClass(RoleGroupMap.class) .addAnnotatedClass(stateless_vm_image_map.class) .addAnnotatedClass(storage_domain_dynamic.class) .addAnnotatedClass(storage_domain_static.class) .addAnnotatedClass(storage_pool.class) .addAnnotatedClass(storage_pool_iso_map.class) .addAnnotatedClass(storage_server_connections.class) .addAnnotatedClass(tags.class) .addAnnotatedClass(tags_user_group_map.class) .addAnnotatedClass(tags_user_map.class) .addAnnotatedClass(tags_vds_map.class) .addAnnotatedClass(tags_vm_map.class) .addAnnotatedClass(tags_vm_pool_map.class) .addAnnotatedClass(time_lease_vm_pool_map.class) .addAnnotatedClass(user_sessions.class) .addAnnotatedClass(VdcOption.class) .addAnnotatedClass(VdsDynamic.class) .addAnnotatedClass(VDSGroup.class) .addAnnotatedClass(VdsStatic.class) .addAnnotatedClass(VdsStatistics.class) .addAnnotatedClass(vm_pool_map.class) .addAnnotatedClass(vm_pools.class) .addAnnotatedClass(vm_template_image_map.class) .addAnnotatedClass(VmDynamic.class) .addAnnotatedClass(VmStatic.class) .addAnnotatedClass(storage_pool_iso_map.class) .addAnnotatedClass(VmTemplate.class) .configure().buildSessionFactory(); } return sessionFactory; } protected Session getSession() { return sessionFactory.openSession(); } private static void loadDataFactory(String dataFactoryClassname) throws Exception { Class<?> clazz = Class.forName(dataFactoryClassname); dataFactory = clazz.newInstance(); } public static DbFacade getDbFacade() { return dbFacade; } public static DataSource getDataSource() { return dataSource; } }