/* * Copyright 2008, Unitils.org * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.unitils.database; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.unitils.database.util.TransactionMode.COMMIT; import static org.unitils.database.util.TransactionMode.DISABLED; import static org.unitils.database.util.TransactionMode.ROLLBACK; import java.lang.reflect.Method; import java.sql.Connection; import java.util.Properties; import javax.sql.DataSource; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.springframework.jdbc.datasource.ConnectionProxy; import org.unitils.core.ConfigurationLoader; import org.unitils.core.Unitils; import org.unitils.database.annotations.Transactional; /** * Tests verifying whether the SimpleTransactionManager functions correctly. * * @author Filip Neven * @author Tim Ducheyne */ public class DatabaseModuleTransactionManagerTest extends DatabaseModuleTransactionalTestBase { private DatabaseModule databaseModule; private TransactionsDisabledTest transactionsDisabledTest; private RollbackTest rollbackTest; private CommitTest commitTest; private DataSourceWrapper wrapper; /** * Initializes the test fixture. */ @Before public void setUp() throws Exception { initializeDatabaseModule(); transactionsDisabledTest = new TransactionsDisabledTest(); rollbackTest = new RollbackTest(); commitTest = new CommitTest(); } /** * Cleans up test by resetting the unitils instance. */ @After public void tearDown() throws Exception { Unitils.getInstance().init(); } /** * Tests for a test with transactions disabled */ @Test public void testWithTransactionsDisabled() throws Exception { mockConnection1.close(); mockConnection2.close(); replay(mockConnection1, mockConnection2); Method testMethod = TransactionsDisabledTest.class.getMethod("test", new Class[]{}); databaseModule.startTransactionForTestMethod(transactionsDisabledTest, testMethod); Connection conn1 = wrapper.getDataSourceAndActivateTransactionIfNeeded().getConnection(); conn1.close(); Connection conn2 = wrapper.getDataSourceAndActivateTransactionIfNeeded().getConnection(); conn2.close(); assertNotSame(conn1, conn2); databaseModule.endTransactionForTestMethod(transactionsDisabledTest, testMethod); verify(mockConnection1, mockConnection2); } /** * Tests with a test with transaction rollback configured */ @Test public void testRollback() throws Exception { expect(mockConnection1.getAutoCommit()).andReturn(true).andReturn(false).anyTimes(); mockConnection1.setAutoCommit(false); mockConnection1.rollback(); mockConnection1.close(); replay(mockConnection1, mockConnection2); Method testMethod = RollbackTest.class.getMethod("test", new Class[]{}); DataSource dataSource = wrapper.getTransactionalDataSourceAndActivateTransactionIfNeeded(rollbackTest); databaseModule.startTransactionForTestMethod(rollbackTest, testMethod); Connection connection1 = dataSource.getConnection(); Connection targetConnection1 = ((ConnectionProxy) connection1).getTargetConnection(); connection1.close(); Connection connection2 = dataSource.getConnection(); Connection targetConnection2 = ((ConnectionProxy) connection2).getTargetConnection(); connection2.close(); assertSame(targetConnection1, targetConnection2); databaseModule.endTransactionForTestMethod(rollbackTest, testMethod); verify(mockConnection1, mockConnection2); } /** * Tests with a test with transaction commit configured */ @Test public void testCommit() throws Exception { expect(mockConnection1.getAutoCommit()).andReturn(true).andReturn(false).anyTimes(); mockConnection1.setAutoCommit(false); mockConnection1.commit(); mockConnection1.close(); replay(mockConnection1, mockConnection2); Method testMethod = CommitTest.class.getMethod("test", new Class[]{}); DataSource dataSource = wrapper.getTransactionalDataSourceAndActivateTransactionIfNeeded(commitTest); databaseModule.startTransactionForTestMethod(commitTest, testMethod); Connection connection1 = dataSource.getConnection(); Connection targetConnection1 = ((ConnectionProxy) connection1).getTargetConnection(); connection1.close(); Connection connection2 = dataSource.getConnection(); Connection targetConnection2 = ((ConnectionProxy) connection2).getTargetConnection(); connection2.close(); assertSame(targetConnection1, targetConnection2); databaseModule.endTransactionForTestMethod(commitTest, testMethod); verify(mockConnection1, mockConnection2); } /** * Class that plays the role of a unit test, with transactions disabled */ @Transactional(DISABLED) public static class TransactionsDisabledTest { public void test() { } } /** * Class that plays the role of a unit test, with transaction rollback enabled (=default, so no * * @Transactional annotation required */ @Transactional(ROLLBACK) public static class RollbackTest { public void test() { } } /** * Class that plays the role of a unit test, with transaction commit enabled */ @Transactional(COMMIT) public static class CommitTest { public void test() { } } private void initializeDatabaseModule() { Unitils.getInstance().init(); configuration = (Properties) new ConfigurationLoader().loadConfiguration().clone(); configuration.setProperty("dbMaintainer.autoCreateExecutedScriptsTable", "false"); configuration.setProperty("dbMaintainer.autoCreateDbMaintainScriptsTable", "true"); configuration.setProperty("updateDataBaseSchema.enabled", "false"); configuration.setProperty("dbMaintainer.fromScratch.enabled", "false"); configuration.setProperty("dbMaintainer.updateSequences.enabled", "true"); configuration.setProperty("dbMaintainer.keepRetryingAfterError.enabled","true"); configuration.setProperty("org.unitils.dbmaintainer.script.ScriptSource.implClassName", "org.unitils.dbmaintainer.script.impl.DefaultScriptSource"); databaseModule = Unitils.getInstance().getModulesRepository().getModuleOfType(DatabaseModule.class); databaseModule.init(configuration); databaseModule.afterInit(); configuration.setProperty("org.unitils.database.config.DataSourceFactory.implClassName", MockDataSourceFactory.class.getName()); databaseModule = getDatabaseModule(); databaseModule.init(configuration); databaseModule.afterInit(); wrapper = databaseModule.getWrapper(""); databaseModule.getTransactionManager(); } }