/** * */ package org.jboss.test.hibernate.test; import java.io.File; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import junit.framework.TestCase; import org.hibernate.SessionFactory; import org.hibernate.cache.HashtableCacheProvider; import org.hibernate.cfg.Environment; import org.hibernate.cfg.Settings; import org.hibernate.dialect.HSQLDialect; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.transaction.JTATransactionFactory; import org.jboss.hibernate.deployers.metadata.BaseNamedElement; import org.jboss.hibernate.jmx.Hibernate; import org.jboss.test.hibernate.mocks.MockCacheProvider; import org.jboss.test.hibernate.mocks.MockInterceptor; import org.jboss.test.hibernate.mocks.MockListenerInjector; import org.jboss.test.hibernate.mocks.MockRegionFactory; import org.jboss.test.hibernate.mocks.TransactionManagerLookupImpl; /** * A HibernateConfigurationUnitTestCase. * * @author Brian Stansberry * @version $Revision: 1.1 $ */ public class HibernateConfigurationUnitTestCase extends TestCase { private static long testCount = System.currentTimeMillis(); private File tempFile = null; private Hibernate testee; @Override protected void setUp() throws Exception { super.setUp(); tempFile = File.createTempFile(getClass().getSimpleName() + (testCount++), null); tempFile.mkdirs(); } @Override protected void tearDown() throws Exception { try { try { super.tearDown(); } finally { if (testee != null) { testee.stop(); } } } finally { if (tempFile != null && tempFile.exists()) { if (!tempFile.delete()) { tempFile.deleteOnExit(); } } } } public void testDefaults() throws Throwable { testee = new TestableHibernate(); testee.setHarUrl(tempFile.toURI().toURL()); testee.setDialect(HSQLDialect.class.getName()); Set<BaseNamedElement> config = new HashSet<BaseNamedElement>(); config.add(createBaseNamedElement(Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName())); config.add(createBaseNamedElement(Environment.USER_TRANSACTION, JTATransactionFactory.DEFAULT_USER_TRANSACTION_NAME)); testee.setConfigurationElements(config); testee.start(); SessionFactory factory = testee.getInstance(); assertTrue(factory instanceof SessionFactoryImplementor); Settings settings = ((SessionFactoryImplementor) factory).getSettings(); assertTrue(settings.getTransactionFactory() instanceof JTATransactionFactory); assertTrue(settings.isSecondLevelCacheEnabled()); assertTrue(settings.isFlushBeforeCompletionEnabled()); assertTrue(settings.isAutoCloseSessionEnabled()); Properties props = testee.getConfigurationProperties(); assertEquals(HashtableCacheProvider.class.getName(), props.getProperty(Environment.CACHE_PROVIDER)); assertEquals("after_statement", props.getProperty("hibernate.connection.release_mode")); // Disabled, as use of JTA causes hibernate to ignore hibernate.connection.release_mode=after_statement //assertEquals(ConnectionReleaseMode.AFTER_STATEMENT, settings.getConnectionReleaseMode()); } public void testMBeanConfiguration() throws Throwable { testee = new TestableHibernate(); // Non-Hibernate configs testee.setHarUrl(tempFile.toURI().toURL()); testee.setScanForMappingsEnabled(true); testee.setSessionFactoryInterceptor(MockInterceptor.class.getName()); testee.setListenerInjector(MockListenerInjector.class.getName()); testee.setDialect(HSQLDialect.class.getName()); // testee.setDatasourceName("TestDS"); testee.setCacheProviderClass(MockCacheProvider.class.getName()); testee.setCacheRegionFactoryClass(MockRegionFactory.class.getName()); testee.setCacheRegionPrefix("aprefix"); testee.setMinimalPutsEnabled(true); testee.setHbm2ddlAuto("bogus"); testee.setSecondLevelCacheEnabled(Boolean.TRUE); testee.setQueryCacheEnabled(Boolean.TRUE); testee.setUseStructuredCacheEntriesEnabled(Boolean.TRUE); testee.setDefaultSchema("schema"); testee.setDefaultCatalog("catalog"); testee.setJdbcBatchSize(Integer.valueOf(8)); testee.setJdbcFetchSize(Integer.valueOf(9)); testee.setBatchVersionedDataEnabled(Boolean.TRUE); testee.setMaxFetchDepth(Integer.valueOf(13)); testee.setJdbcScrollableResultSetEnabled(Boolean.TRUE); testee.setSqlCommentsEnabled(Boolean.TRUE); testee.setQuerySubstitutions("key=value"); testee.setShowSqlEnabled(Boolean.TRUE); testee.setGetGeneratedKeysEnabled(Boolean.TRUE); testee.setStatGenerationEnabled(Boolean.TRUE); testee.setUsername("Brian"); testee.setPassword("Brian"); testee.setStreamsForBinaryEnabled(Boolean.TRUE); testee.setReflectionOptimizationEnabled(Boolean.TRUE); testee.setDeployedCacheJndiName("java:/test/Cache"); testee.setDeployedCacheManagerJndiName("java:/test/CacheManager"); Set<BaseNamedElement> config = new HashSet<BaseNamedElement>(); config.add(createBaseNamedElement(Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName())); config.add(createBaseNamedElement(Environment.USER_TRANSACTION, JTATransactionFactory.DEFAULT_USER_TRANSACTION_NAME)); config.add(createBaseNamedElement(org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP, "entities-test")); testee.setConfigurationElements(config); testee.start(); validate(testee); } public void testHibernatePropertyConfiguration() throws Throwable { testee = new TestableHibernate(); Set<BaseNamedElement> config = new HashSet<BaseNamedElement>(); config.add(createBaseNamedElement("harUrl", tempFile.toURI().toURL())); config.add(createBaseNamedElement("scanForMappingsEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("sessionFactoryInterceptor", MockInterceptor.class.getName())); config.add(createBaseNamedElement("listenerInjector", MockListenerInjector.class.getName())); config.add(createBaseNamedElement(Environment.DIALECT, HSQLDialect.class.getName())); config.add(createBaseNamedElement(Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName())); config.add(createBaseNamedElement(Environment.USER_TRANSACTION, JTATransactionFactory.DEFAULT_USER_TRANSACTION_NAME)); // config.add(createBaseNamedElement(Environment.DATASOURCE, "TestDS")); config.add(createBaseNamedElement(Environment.CACHE_PROVIDER, MockCacheProvider.class.getName())); config.add(createBaseNamedElement(Environment.CACHE_REGION_FACTORY, MockRegionFactory.class.getName())); config.add(createBaseNamedElement(Environment.CACHE_REGION_PREFIX, "aprefix")); config.add(createBaseNamedElement(Environment.USE_MINIMAL_PUTS, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.HBM2DDL_AUTO, "bogus")); config.add(createBaseNamedElement(Environment.DEFAULT_SCHEMA, "schema")); config.add(createBaseNamedElement(Environment.DEFAULT_CATALOG, "catalog")); config.add(createBaseNamedElement(Environment.USE_SECOND_LEVEL_CACHE, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USE_QUERY_CACHE, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USE_STRUCTURED_CACHE, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.STATEMENT_BATCH_SIZE, Integer.valueOf(8))); config.add(createBaseNamedElement(Environment.STATEMENT_FETCH_SIZE, Integer.valueOf(9))); config.add(createBaseNamedElement(Environment.BATCH_VERSIONED_DATA, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.MAX_FETCH_DEPTH, Integer.valueOf(13))); config.add(createBaseNamedElement(Environment.USE_SCROLLABLE_RESULTSET, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USE_SQL_COMMENTS, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.QUERY_SUBSTITUTIONS, "key=value")); config.add(createBaseNamedElement(Environment.SHOW_SQL, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USE_GET_GENERATED_KEYS, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.GENERATE_STATISTICS, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USER, "Brian")); config.add(createBaseNamedElement(Environment.PASS, "Brian")); config.add(createBaseNamedElement(Environment.USE_STREAMS_FOR_BINARY, Boolean.TRUE)); config.add(createBaseNamedElement(Environment.USE_REFLECTION_OPTIMIZER, Boolean.TRUE)); config.add(createBaseNamedElement(org.hibernate.cache.jbc2.builder.JndiSharedCacheInstanceManager.CACHE_RESOURCE_PROP, "java:/test/Cache")); config.add(createBaseNamedElement(org.hibernate.cache.jbc2.builder.JndiMultiplexingCacheInstanceManager.CACHE_FACTORY_RESOURCE_PROP, "java:/test/CacheManager")); config.add(createBaseNamedElement(org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP, "entities-test")); testee.setConfigurationElements(config); testee.start(); validate(testee); } public void testLegacyPropertyNames() throws Throwable { testee = new TestableHibernate(); Set<BaseNamedElement> config = new HashSet<BaseNamedElement>(); config.add(createBaseNamedElement("harUrl", tempFile.toURI().toURL())); config.add(createBaseNamedElement("scanForMappingsEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("sessionFactoryInterceptor", MockInterceptor.class.getName())); config.add(createBaseNamedElement("listenerInjector", MockListenerInjector.class.getName())); config.add(createBaseNamedElement("dialect", HSQLDialect.class.getName())); config.add(createBaseNamedElement(Environment.TRANSACTION_MANAGER_STRATEGY, TransactionManagerLookupImpl.class.getName())); config.add(createBaseNamedElement(Environment.USER_TRANSACTION, JTATransactionFactory.DEFAULT_USER_TRANSACTION_NAME)); // config.add(createBaseNamedElement("datasourceName", "TestDS")); config.add(createBaseNamedElement("cacheProviderClass", MockCacheProvider.class.getName())); config.add(createBaseNamedElement("cacheRegionFactoryClass", MockRegionFactory.class.getName())); config.add(createBaseNamedElement("cacheRegionPrefix", "aprefix")); config.add(createBaseNamedElement("minimalPutsEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("hbm2ddlAuto", "bogus")); config.add(createBaseNamedElement("defaultSchema", "schema")); config.add(createBaseNamedElement("defaultCatalog", "catalog")); config.add(createBaseNamedElement("secondLevelCacheEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("queryCacheEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("useStructuredCacheEntriesEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("jdbcBatchSize", Integer.valueOf(8))); config.add(createBaseNamedElement("jdbcFetchSize", Integer.valueOf(9))); config.add(createBaseNamedElement("batchVersionedDataEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("maxFetchDepth", Integer.valueOf(13))); config.add(createBaseNamedElement("jdbcScrollableResultSetEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("sqlCommentsEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("querySubstitutions", "key=value")); config.add(createBaseNamedElement("showSqlEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("getGeneratedKeysEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("statGenerationEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("username", "Brian")); config.add(createBaseNamedElement("password", "Brian")); config.add(createBaseNamedElement("streamsForBinaryEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("reflectionOptimizationEnabled", Boolean.TRUE)); config.add(createBaseNamedElement("deployedCacheJndiName", "java:/test/Cache")); config.add(createBaseNamedElement("deployedCacheManagerJndiName", "java:/test/CacheManager")); config.add(createBaseNamedElement(org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP, "entities-test")); testee.setConfigurationElements(config); testee.start(); validate(testee); } private void validate(Hibernate testee) throws Exception { // Validate getter values on Hibernate object assertEquals(TestableHibernate.class.getSimpleName() + testCount, testee.getSessionFactoryName()); assertEquals(tempFile.toURI().toURL(), testee.getHarUrl()); assertTrue(testee.isScanForMappingsEnabled()); assertEquals(MockInterceptor.class.getName(), testee.getSessionFactoryInterceptor()); assertEquals(MockListenerInjector.class.getName(), testee.getListenerInjector()); // Where we can, validate stuff exposed by hibernate Settings SessionFactory factory = testee.getInstance(); assertTrue(factory instanceof SessionFactoryImplementor); Settings settings = ((SessionFactoryImplementor) factory).getSettings(); // assertEquals(TestableHibernate.class.getSimpleName() + testCount, settings.getSessionFactoryName()); assertEquals(HSQLDialect.class.getName(), testee.getDialect()); assertTrue(settings.getDialect() instanceof HSQLDialect); assertTrue(settings.getTransactionFactory() instanceof JTATransactionFactory); assertTrue(settings.getTransactionManagerLookup() instanceof TransactionManagerLookupImpl); assertTrue(settings.getRegionFactory() instanceof MockRegionFactory); assertEquals("aprefix", settings.getCacheRegionPrefix()); assertTrue(settings.isMinimalPutsEnabled()); assertTrue(settings.isSecondLevelCacheEnabled()); assertTrue(settings.isQueryCacheEnabled()); assertTrue(settings.isStructuredCacheEntriesEnabled()); assertEquals("schema", settings.getDefaultSchemaName()); assertEquals("catalog", settings.getDefaultCatalogName()); assertEquals(Integer.valueOf(9), settings.getJdbcFetchSize()); assertTrue(settings.isJdbcBatchVersionedData()); assertEquals(Integer.valueOf(13), settings.getMaximumFetchDepth()); assertTrue(settings.isScrollableResultSetsEnabled()); assertTrue(settings.isCommentsEnabled()); @SuppressWarnings("unchecked") Map substitutions = settings.getQuerySubstitutions(); assertNotNull(substitutions); assertEquals(1, substitutions.size()); assertEquals("value", substitutions.get("key")); assertTrue(settings.getSqlStatementLogger().isLogToStdout()); assertTrue(settings.isGetGeneratedKeysEnabled()); assertTrue(settings.isStatisticsEnabled()); // For stuff not available via Settings, second best is to check the properties exposed by Hibernate object Properties props = testee.getConfigurationProperties(); assertEquals(JTATransactionFactory.DEFAULT_USER_TRANSACTION_NAME, props.getProperty(Environment.USER_TRANSACTION)); assertEquals(MockCacheProvider.class.getName(), props.getProperty(Environment.CACHE_PROVIDER)); assertEquals("bogus", props.getProperty(Environment.HBM2DDL_AUTO)); assertEquals("8", props.getProperty(Environment.STATEMENT_BATCH_SIZE)); assertEquals("Brian", props.getProperty(Environment.USER)); assertEquals("Brian", props.getProperty(Environment.PASS)); assertEquals("true", props.getProperty(Environment.USE_STREAMS_FOR_BINARY)); assertEquals("true", props.getProperty(Environment.USE_REFLECTION_OPTIMIZER)); assertEquals("java:/test/Cache", props.getProperty(org.hibernate.cache.jbc2.builder.JndiSharedCacheInstanceManager.CACHE_RESOURCE_PROP)); assertEquals("java:/test/CacheManager", props.getProperty(org.hibernate.cache.jbc2.builder.JndiMultiplexingCacheInstanceManager.CACHE_FACTORY_RESOURCE_PROP)); assertEquals("entities-test", props.getProperty(org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP)); } private static BaseNamedElement createBaseNamedElement(String name, Object value) { BaseNamedElement element = new BaseNamedElement(); element.setName(name); element.setValue(value); return element; } private static class TestableHibernate extends Hibernate { public TestableHibernate() { super(null, false); setSessionFactoryName(getClass().getSimpleName() + testCount); } } }