package org.jbpm.persistence.db; import java.sql.Connection; import org.jbpm.AbstractJbpmTestCase; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.JbpmException; import org.jbpm.persistence.JbpmPersistenceException; public class PersistenceDbServiceNoTxTest extends AbstractJbpmTestCase { JbpmConfiguration jbpmConfiguration; JbpmContext jbpmContext; MockSessionFactory mockSessionFactory; protected void setUp() throws Exception { super.setUp(); jbpmConfiguration = JbpmConfiguration.parseXmlString("<jbpm-configuration>" + " <jbpm-context>" + " <service name='tx' factory='org.jbpm.tx.TxServiceFactory' />" + " <service name='persistence'>" + " <factory>" + " <bean class='org.jbpm.persistence.db.DbPersistenceServiceFactory'>" + " <field name='isTransactionEnabled'><false /></field>" + " </bean>" + " </factory>" + " </service>" + " <service name='message' factory='org.jbpm.msg.db.DbMessageServiceFactory' />" + " <service name='scheduler' factory='org.jbpm.scheduler.db.DbSchedulerServiceFactory' />" + " <service name='logging' factory='org.jbpm.logging.db.DbLoggingServiceFactory' />" + " <service name='authentication' factory='org.jbpm.security.authentication.DefaultAuthenticationServiceFactory' />" + " </jbpm-context>" + "</jbpm-configuration>"); jbpmContext = jbpmConfiguration.createJbpmContext(); mockSessionFactory = new MockSessionFactory(); jbpmContext.setSessionFactory(mockSessionFactory); } protected void tearDown() throws Exception { jbpmConfiguration.close(); super.tearDown(); } // with hibernate transactions // hibernate creates connections public void testDefaultCommit() { MockSession mockSession = (MockSession) jbpmContext.getSession(); assertNull(mockSession.transaction); jbpmContext.close(); assertNull(mockSession.transaction); assertTrue(mockSession.isClosed); // FLUSHED ! assertTrue(mockSession.isFlushed); } public void testDefaultRollback() { jbpmContext.getSession(); // no transaction config cannot be combined with calling setRollbackOnly jbpmContext.setRollbackOnly(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmException e) { // OK } } public void testDefaultCommitAfterGetConnection() { MockSession mockSession = (MockSession) jbpmContext.getSession(); jbpmContext.getConnection(); jbpmContext.close(); assertNull(mockSession.transaction); assertTrue(mockSession.isClosed); // FLUSHED ! assertTrue(mockSession.isFlushed); } public void testDefaultRollbackAfterGetConnection() { jbpmContext.getSession(); jbpmContext.setRollbackOnly(); jbpmContext.getConnection(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmException e) { // OK } } // with hibernate transactions // given creates connections public void testGivenConnectionCommit() { // inject given session MockConnectionHelper connectionHelper = new MockConnectionHelper(); Connection mockConnection = connectionHelper.createMockConnection(); jbpmContext.setConnection(mockConnection); MockSession mockSession = (MockSession) jbpmContext.getSession(); jbpmContext.close(); assertNull(mockSession.transaction); assertTrue(mockSession.isClosed); // FLUSHED ! assertTrue(mockSession.isFlushed); assertFalse(connectionHelper.wasClosed); assertFalse(connectionHelper.wasCommitted); assertFalse(connectionHelper.wasRolledBack); } public void testGivenConnectionRollback() { // inject given session MockConnectionHelper connectionHelper = new MockConnectionHelper(); Connection mockConnection = connectionHelper.createMockConnection(); jbpmContext.setConnection(mockConnection); jbpmContext.getSession(); jbpmContext.setRollbackOnly(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmException e) { // OK } } public void testGivenConnectionCommitAfterGetConnection() { // inject given session MockConnectionHelper connectionHelper = new MockConnectionHelper(); Connection mockConnection = connectionHelper.createMockConnection(); jbpmContext.setConnection(mockConnection); MockSession mockSession = (MockSession) jbpmContext.getSession(); jbpmContext.getConnection(); jbpmContext.close(); assertNull(mockSession.transaction); assertTrue(mockSession.isClosed); // FLUSHED ! assertTrue(mockSession.isFlushed); assertFalse(connectionHelper.wasClosed); assertFalse(connectionHelper.wasCommitted); assertFalse(connectionHelper.wasRolledBack); } public void testGivenConnectionRollbackAfterGetConnection() { // inject given session MockConnectionHelper connectionHelper = new MockConnectionHelper(); Connection mockConnection = connectionHelper.createMockConnection(); jbpmContext.setConnection(mockConnection); jbpmContext.getSession(); jbpmContext.getConnection(); jbpmContext.setRollbackOnly(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmException e) { // OK } } public void testFlushException() { mockSessionFactory.setFailOnFlush(true); MockSession mockSession = (MockSession) jbpmContext.getSession(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmPersistenceException e) { assertFalse(mockSession.isFlushed); assertTrue(mockSession.isClosed); } } public void testCloseException() { mockSessionFactory.setFailOnClose(true); MockSession mockSession = (MockSession) jbpmContext.getSession(); try { jbpmContext.close(); fail("expected exception"); } catch (JbpmPersistenceException e) { assertTrue(mockSession.isFlushed); assertFalse(mockSession.isClosed); } } }