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;
+        }
+    }
+}

Reply via email to