DELTASPIKE-900 add unit test for multiple BM tx
Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/7bd3c1d5 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/7bd3c1d5 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/7bd3c1d5 Branch: refs/heads/master Commit: 7bd3c1d53eeda4b8bc14656515ba7e885f2f6473 Parents: 779d28b Author: Mark Struberg <strub...@apache.org> Authored: Mon Sep 3 12:29:15 2018 +0200 Committer: Mark Struberg <strub...@apache.org> Committed: Mon Sep 3 12:29:15 2018 +0200 ---------------------------------------------------------------------- .../ManagedUserTransactionResolver.java | 2 + .../test/jpa/api/shared/TestEntityManager.java | 2 +- .../manual/BeanManagedlTransactionTest.java | 101 +++++++++++++++++++ .../manual/ManualTransactionBean.java | 5 + .../manual/MockUserTransactionResolver.java | 99 ++++++++++++++++++ 5 files changed, 208 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7bd3c1d5/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/transaction/ManagedUserTransactionResolver.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/transaction/ManagedUserTransactionResolver.java b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/transaction/ManagedUserTransactionResolver.java index d6657c0..9e55ad0 100644 --- a/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/transaction/ManagedUserTransactionResolver.java +++ b/deltaspike/modules/jpa/impl/src/main/java/org/apache/deltaspike/jpa/impl/transaction/ManagedUserTransactionResolver.java @@ -19,10 +19,12 @@ package org.apache.deltaspike.jpa.impl.transaction; import javax.annotation.Resource; +import javax.enterprise.context.Dependent; import javax.transaction.UserTransaction; //we need to keep it separated, //because the injection of UserTransaction might fail with an exception (see DELTASPIKE-986) +@Dependent public class ManagedUserTransactionResolver { @Resource http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7bd3c1d5/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/shared/TestEntityManager.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/shared/TestEntityManager.java b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/shared/TestEntityManager.java index 343624b..aec822b 100644 --- a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/shared/TestEntityManager.java +++ b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/shared/TestEntityManager.java @@ -243,7 +243,7 @@ public class TestEntityManager implements EntityManager @Override public void joinTransaction() { - throw new IllegalStateException("not implemented"); + // all fine, nothing to do } @Override http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7bd3c1d5/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/BeanManagedlTransactionTest.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/BeanManagedlTransactionTest.java b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/BeanManagedlTransactionTest.java new file mode 100644 index 0000000..b6af93e --- /dev/null +++ b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/BeanManagedlTransactionTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.deltaspike.test.jpa.api.transactional.multipleinjection.manual; + +import org.apache.deltaspike.core.api.projectstage.ProjectStage; +import org.apache.deltaspike.core.util.ProjectStageProducer; +import org.apache.deltaspike.jpa.impl.transaction.context.TransactionContextExtension; +import org.apache.deltaspike.test.category.SeCategory; +import org.apache.deltaspike.test.util.ArchiveUtils; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.Asset; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import javax.enterprise.inject.spi.Extension; +import javax.inject.Inject; + + +/** + * Same test as {@link ManualTransactionTest} but now with a UserTransaction instead + * of manual EM Tx. + */ +@RunWith(Arquillian.class) +@Category(SeCategory.class) +public class BeanManagedlTransactionTest +{ + private static Asset beansXml = new StringAsset( + "<beans>" + + "<alternatives>" + + "<class>org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy</class>" + + "</alternatives>" + + "</beans>" + ); + + + @Inject + private ManualTransactionBean manualTransactionBean; + + @Inject + private MockUserTransactionResolver mockTxResolver; + + @Deployment + public static WebArchive deploy() + { + JavaArchive testJar = ShrinkWrap.create(JavaArchive.class, "manualTransactionTest.jar") + .addPackage(ArchiveUtils.SHARED_PACKAGE) + .addPackage(BeanManagedlTransactionTest.class.getPackage().getName()) + .addAsManifestResource(beansXml, "beans.xml"); + + return ShrinkWrap.create(WebArchive.class) + .addAsLibraries(ArchiveUtils.getDeltaSpikeCoreAndJpaArchive()) + .addAsLibraries(testJar) + .addAsServiceProvider(Extension.class, TransactionContextExtension.class) + .addAsWebInfResource(ArchiveUtils.getBeansXml(), "beans.xml"); + } + + @Before + public void init() + { + ProjectStageProducer.setProjectStage(ProjectStage.UnitTest); + } + + @Test + public void manualTransactionTest() + { + + mockTxResolver.resetTx(); + MockUserTransactionResolver.MockUserTransaction mockTx = mockTxResolver.resolveUserTransaction(); + manualTransactionBean.executeInTransaction(); + + Assert.assertEquals(false, mockTx.isActive()); + Assert.assertEquals(true, mockTx.isBegin()); + Assert.assertEquals(true, mockTx.isCommit()); + Assert.assertEquals(false, mockTx.isRollback()); + Assert.assertEquals(false, mockTx.isRollBackOnly()); + } +} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7bd3c1d5/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/ManualTransactionBean.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/ManualTransactionBean.java b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/ManualTransactionBean.java index d88e095..85b0cb0 100644 --- a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/ManualTransactionBean.java +++ b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/ManualTransactionBean.java @@ -53,4 +53,9 @@ public class ManualTransactionBean public void executeInSecondTransaction() { } + + @Transactional + public void executeInTransaction() + { + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7bd3c1d5/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/MockUserTransactionResolver.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/MockUserTransactionResolver.java b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/MockUserTransactionResolver.java new file mode 100644 index 0000000..f613210 --- /dev/null +++ b/deltaspike/modules/jpa/impl/src/test/java/org/apache/deltaspike/test/jpa/api/transactional/multipleinjection/manual/MockUserTransactionResolver.java @@ -0,0 +1,99 @@ +package org.apache.deltaspike.test.jpa.api.transactional.multipleinjection.manual; + +import org.apache.deltaspike.jpa.impl.transaction.ManagedUserTransactionResolver; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Specializes; +import javax.transaction.HeuristicMixedException; +import javax.transaction.HeuristicRollbackException; +import javax.transaction.NotSupportedException; +import javax.transaction.RollbackException; +import javax.transaction.Status; +import javax.transaction.SystemException; +import javax.transaction.UserTransaction; + +/** + * @author Mark Struberg + */ +@Specializes +@ApplicationScoped +public class MockUserTransactionResolver extends ManagedUserTransactionResolver { + + private MockUserTransaction mockTx; + + @PostConstruct + public void resetTx() { + mockTx = new MockUserTransaction(); + } + + @Override + public MockUserTransaction resolveUserTransaction() { + return mockTx; + } + + public static class MockUserTransaction implements UserTransaction { + private boolean begin = false; + private boolean commit = false; + private boolean rollback = false; + private boolean rollBackOnly =false; + + private int status = Status.STATUS_NO_TRANSACTION; + + + @Override + public void begin() throws NotSupportedException, SystemException { + this.begin = true; + this.status = Status.STATUS_ACTIVE; + } + + @Override + public void commit() throws HeuristicMixedException, HeuristicRollbackException, IllegalStateException, RollbackException, SecurityException, SystemException { + this.commit = true; + this.status = Status.STATUS_COMMITTED; + } + + @Override + public int getStatus() throws SystemException { + return status; + } + + @Override + public void rollback() throws IllegalStateException, SecurityException, SystemException { + this.rollback = true; + this.status = Status.STATUS_ROLLEDBACK; + } + + @Override + public void setRollbackOnly() throws IllegalStateException, SystemException { + this.rollBackOnly = true; + this.status = Status.STATUS_MARKED_ROLLBACK; + } + + @Override + public void setTransactionTimeout(int i) throws SystemException { + // do nothing + } + + public boolean isActive() + { + return begin && !(commit || rollback); + } + + public boolean isBegin() { + return begin; + } + + public boolean isCommit() { + return commit; + } + + public boolean isRollback() { + return rollback; + } + + public boolean isRollBackOnly() { + return rollBackOnly; + } + } +}