From 0fa4b50188f435aeecf2c2d7150dd27a25ab2931 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Mon, 5 Nov 2018 10:33:14 +0000 Subject: [PATCH] HHH-13076 - Add test for issue --- .../jdbc/AlreadyStartedTransactionTest.java | 37 ++++++++ ...mplianceAlreadyStartedTransactionTest.java | 66 ++++++++++++++ ...mplianceAlreadyStartedTransactionTest.java | 90 +++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jdbc/AlreadyStartedTransactionTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/JpaComplianceAlreadyStartedTransactionTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/NonJpaComplianceAlreadyStartedTransactionTest.java diff --git a/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jdbc/AlreadyStartedTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jdbc/AlreadyStartedTransactionTest.java new file mode 100644 index 0000000000..9ec157d08b --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jdbc/AlreadyStartedTransactionTest.java @@ -0,0 +1,37 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.test.resource.transaction.jdbc; + +import org.hibernate.Session; +import org.hibernate.Transaction; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; +import org.junit.Test; + +/** + * @author Andrea Boriero + */ +@TestForIssue(jiraKey = "HHH-13076") +public class AlreadyStartedTransactionTest extends BaseNonConfigCoreFunctionalTestCase { + + @Test(expected = IllegalStateException.class) + public void anIllegalStateExceptionShouldBeThrownWhenBeginTxIsCalledWithAnAlreadyActiveTX() { + Transaction transaction = null; + try (Session session = openSession()) { + transaction = session.getTransaction(); + transaction.begin(); + // A call to begin() with an active Tx should cause an IllegalStateException + transaction.begin(); + } + finally { + if ( transaction != null && transaction.isActive() ) { + transaction.rollback(); + } + } + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/JpaComplianceAlreadyStartedTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/JpaComplianceAlreadyStartedTransactionTest.java new file mode 100644 index 0000000000..ac12f10b34 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/JpaComplianceAlreadyStartedTransactionTest.java @@ -0,0 +1,66 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.test.resource.transaction.jta; + +import java.util.Map; +import javax.transaction.Status; +import javax.transaction.TransactionManager; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.cfg.AvailableSettings; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.jta.TestingJtaBootstrap; +import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Andrea Boriero + */ +@TestForIssue(jiraKey = "HHH-13076") +public class JpaComplianceAlreadyStartedTransactionTest extends BaseNonConfigCoreFunctionalTestCase { + private TransactionManager tm; + + @Override + protected void addSettings(Map settings) { + super.addSettings( settings ); + TestingJtaBootstrap.prepare( settings ); + settings.put( AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY, "jta" ); + settings.put( AvailableSettings.JPA_TRANSACTION_COMPLIANCE, "true" ); + } + + @Before + public void setUp() { + tm = JtaPlatformStandardTestingImpl.INSTANCE.transactionManager(); + } + + @Test(expected = IllegalStateException.class) + public void anIllegalStateExceptionShouldBeThrownWhenBeginTxIsCalledWithAnAlreadyActiveTX() throws Exception { + try (Session s = openSession()) { + tm.begin(); + Transaction tx = null; + try { + // A call to begin() with an active Tx should cause an IllegalStateException + tx = s.beginTransaction(); + } + catch (Exception e) { + if ( tx != null && tx.isActive() ) { + tx.rollback(); + } + throw e; + } + } + catch (Exception e) { + if ( tm.getStatus() == Status.STATUS_ACTIVE ) { + tm.rollback(); + } + throw e; + } + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/NonJpaComplianceAlreadyStartedTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/NonJpaComplianceAlreadyStartedTransactionTest.java new file mode 100644 index 0000000000..78e501c6f2 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/resource/transaction/jta/NonJpaComplianceAlreadyStartedTransactionTest.java @@ -0,0 +1,90 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.test.resource.transaction.jta; + +import java.util.Map; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.transaction.Status; +import javax.transaction.TransactionManager; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.cfg.AvailableSettings; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.jta.TestingJtaBootstrap; +import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; +import org.junit.Before; +import org.junit.Test; + +/** + * @author Andrea Boriero + */ +@TestForIssue(jiraKey = "HHH-13076") +public class NonJpaComplianceAlreadyStartedTransactionTest extends BaseNonConfigCoreFunctionalTestCase { + private TransactionManager tm; + + @Override + protected void addSettings(Map settings) { + super.addSettings( settings ); + TestingJtaBootstrap.prepare( settings ); + settings.put( AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY, "jta" ); + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { TestEntity.class }; + } + + @Before + public void setUp() { + tm = JtaPlatformStandardTestingImpl.INSTANCE.transactionManager(); + } + + @Test + public void noIllegalStateExceptionShouldBeThrownWhenBeginTxIsCalledWithAnAlreadyActiveTx() throws Exception { + tm.begin(); + try (Session s = openSession()) { + Transaction tx = s.beginTransaction(); + try { + s.saveOrUpdate( new TestEntity( "ABC" ) ); + tx.commit(); + } + catch (Exception e) { + if ( tx.isActive() ) { + tx.rollback(); + } + throw e; + } + } + try { + tm.commit(); + } + catch (Exception e) { + if ( tm.getStatus() == Status.STATUS_ACTIVE ) { + tm.rollback(); + } + throw e; + } + } + + + @Entity(name = "TestEntity") + public static class TestEntity { + @Id + @GeneratedValue + private Long id; + + private String stringAttribute; + + public TestEntity(String stringAttribute) { + this.stringAttribute = stringAttribute; + } + } +}